(event, session_id, supabase: AsyncSupabaseClient = None)
| 15 | |
| 16 | |
| 17 | async def handle_actions(event, session_id, supabase: AsyncSupabaseClient = None): |
| 18 | if supabase is None: |
| 19 | supabase = await get_async_supabase() |
| 20 | |
| 21 | async def process_screenshot(screenshot, session_id): |
| 22 | if screenshot is None: |
| 23 | return None |
| 24 | |
| 25 | if screenshot.startswith("http://") or screenshot.startswith("https://"): |
| 26 | return screenshot |
| 27 | |
| 28 | # screenshot is a base64 string |
| 29 | base64_img_bytes = screenshot.replace("data:image/png;base64,", "") |
| 30 | base64_img_bytes += "=" * ((4 - len(base64_img_bytes) % 4) % 4) |
| 31 | img_bytes = base64.b64decode(base64_img_bytes) |
| 32 | timestamp_utc = datetime.datetime.now(datetime.timezone.utc).isoformat() |
| 33 | |
| 34 | try: |
| 35 | await supabase.storage.from_("screenshots").upload(f"{session_id}/{timestamp_utc}.png", img_bytes) |
| 36 | except RuntimeError as e: |
| 37 | logger.warning(f"Error posting screenshot: {e}") |
| 38 | return None |
| 39 | |
| 40 | return f"{SUPABASE_URL}/storage/v1/object/screenshots/{session_id}/{timestamp_utc}.png" |
| 41 | |
| 42 | action = { |
| 43 | "id": event.get("id", str(uuid.uuid4())), |
| 44 | "session_id": session_id, |
| 45 | "agent_id": event.get("agent_id", None), |
| 46 | "action_type": event.get("action_type", None), |
| 47 | "logs": event.get("logs", None), |
| 48 | "screenshot": await process_screenshot(event.get("screenshot", None), session_id), |
| 49 | "params": event.get("params", None), |
| 50 | "returns": event.get("returns", None), |
| 51 | "init_timestamp": event["init_timestamp"], |
| 52 | "end_timestamp": event["end_timestamp"], |
| 53 | } |
| 54 | return action |
| 55 | |
| 56 | |
| 57 | async def handle_llms(event, premium, session_id, supabase: AsyncSupabaseClient = None): |
nothing calls this directly
no test coverage detected
searching dependent graphs…