(req: RunAgentRequest, request: Request)
| 1458 | |
| 1459 | @app.post("/run", response_model_exclude_none=True) |
| 1460 | async def run_agent(req: RunAgentRequest, request: Request) -> list[Event]: |
| 1461 | app_name = req.app_name or self.default_app_name |
| 1462 | if not app_name: |
| 1463 | raise HTTPException( |
| 1464 | status_code=400, |
| 1465 | detail="app_name is required when ADK_DEFAULT_APP_NAME is not set", |
| 1466 | ) |
| 1467 | req.app_name = app_name |
| 1468 | self.current_app_name_ref.value = req.app_name |
| 1469 | runner = await self.get_runner_async(req.app_name) |
| 1470 | _set_telemetry_context_if_needed(runner) |
| 1471 | run_config = ( |
| 1472 | RunConfig(custom_metadata=req.custom_metadata) |
| 1473 | if req.custom_metadata |
| 1474 | else None |
| 1475 | ) |
| 1476 | |
| 1477 | async def worker(): |
| 1478 | try: |
| 1479 | async with Aclosing( |
| 1480 | runner.run_async( |
| 1481 | user_id=req.user_id, |
| 1482 | session_id=req.session_id, |
| 1483 | new_message=req.new_message, |
| 1484 | state_delta=req.state_delta, |
| 1485 | invocation_id=req.invocation_id, |
| 1486 | run_config=run_config, |
| 1487 | ) |
| 1488 | ) as agen: |
| 1489 | return [event async for event in agen] |
| 1490 | except SessionNotFoundError as e: |
| 1491 | raise HTTPException(status_code=404, detail=str(e)) from e |
| 1492 | |
| 1493 | worker_task = asyncio.create_task(worker()) |
| 1494 | |
| 1495 | async def monitor(): |
| 1496 | try: |
| 1497 | while True: |
| 1498 | message = await request.receive() |
| 1499 | if message.get("type") == "http.disconnect": |
| 1500 | logger.warning( |
| 1501 | "Client disconnected. Aborting agent run for session %s.", |
| 1502 | req.session_id, |
| 1503 | ) |
| 1504 | worker_task.cancel() |
| 1505 | break |
| 1506 | except asyncio.CancelledError: |
| 1507 | pass |
| 1508 | except Exception as e: # pylint: disable=broad-exception-caught |
| 1509 | logger.error("Exception in disconnect monitor: %s", e, exc_info=True) |
| 1510 | |
| 1511 | monitor_task = asyncio.create_task(monitor()) |
| 1512 | |
| 1513 | try: |
| 1514 | events = await worker_task |
| 1515 | logger.info("Generated %s events in agent run", len(events)) |
| 1516 | logger.debug("Events generated: %s", events) |
| 1517 | return events |
nothing calls this directly
no test coverage detected