Create a new session
(request: Request, supabase: AsyncSupabaseClient)
| 17 | |
| 18 | @router.post("/sessions") |
| 19 | async def create_session(request: Request, supabase: AsyncSupabaseClient): |
| 20 | """Create a new session""" |
| 21 | try: |
| 22 | api_key = request.headers.get("X-Agentops-Auth") |
| 23 | parent_key = request.headers.get("X-Agentops-Parent-Key") |
| 24 | |
| 25 | tasks = [ |
| 26 | supabase.table("projects").select("id").eq("api_key", api_key).limit(1).single().execute(), |
| 27 | request.json(), |
| 28 | ] |
| 29 | |
| 30 | if parent_key: |
| 31 | tasks.append( |
| 32 | supabase.table("projects").select("id").eq("api_key", parent_key).limit(1).single().execute() |
| 33 | ) |
| 34 | project, data, project_secondary = await asyncio.gather(*tasks) |
| 35 | else: |
| 36 | project, data = await asyncio.gather(*tasks) |
| 37 | project_secondary = None |
| 38 | |
| 39 | logger.debug(data) |
| 40 | |
| 41 | if project is None: |
| 42 | raise RuntimeError("Invalid API Key") |
| 43 | |
| 44 | except RuntimeError as e: |
| 45 | message = {"message": f"/sessions: Error posting session: {e}"} |
| 46 | logger.error(message) |
| 47 | return JSONResponse(message, status_code=401) |
| 48 | |
| 49 | try: |
| 50 | session = { |
| 51 | "id": data["session"]["session_id"], |
| 52 | "project_id": project["id"], |
| 53 | "init_timestamp": data["session"]["init_timestamp"], |
| 54 | "end_timestamp": data["session"].get("end_timestamp", None), |
| 55 | "tags": data["session"].get("tags", None), |
| 56 | "end_state": data["session"].get("end_state", None), |
| 57 | "end_state_reason": data["session"].get("end_state_reason", None), |
| 58 | "video": data["session"].get("video", None), |
| 59 | "host_env": data["session"].get("host_env", None), |
| 60 | } |
| 61 | |
| 62 | if project_secondary: |
| 63 | session["project_id_secondary"] = project_secondary["id"] |
| 64 | |
| 65 | await supabase.table("sessions").upsert(session).execute() |
| 66 | await supabase.table("stats").upsert({"session_id": session["id"]}).execute() |
| 67 | |
| 68 | cost = await ( |
| 69 | supabase.table("stats").select("cost").eq("session_id", session["id"]).limit(1).single().execute() |
| 70 | ) |
| 71 | |
| 72 | logger.info(f"/session: Completed POST request for {session['id']}") |
| 73 | if cost is not None: |
| 74 | return JSONResponse( |
| 75 | { |
| 76 | "status": "success", |