(
websocket: WebSocket,
user_id: str,
session_id: str,
app_name: Optional[str] = Query(default=None),
modalities: List[Literal["TEXT", "AUDIO"]] = Query(
default=["AUDIO"]
), # Only allows "TEXT" or "AUDIO"
proactive_audio: bool | None = Query(default=None),
enable_affective_dialog: bool | None = Query(default=None),
enable_session_resumption: bool | None = Query(default=None),
save_live_blob: bool = Query(default=False),
)
| 1609 | |
| 1610 | @app.websocket("/run_live") |
| 1611 | async def run_agent_live( |
| 1612 | websocket: WebSocket, |
| 1613 | user_id: str, |
| 1614 | session_id: str, |
| 1615 | app_name: Optional[str] = Query(default=None), |
| 1616 | modalities: List[Literal["TEXT", "AUDIO"]] = Query( |
| 1617 | default=["AUDIO"] |
| 1618 | ), # Only allows "TEXT" or "AUDIO" |
| 1619 | proactive_audio: bool | None = Query(default=None), |
| 1620 | enable_affective_dialog: bool | None = Query(default=None), |
| 1621 | enable_session_resumption: bool | None = Query(default=None), |
| 1622 | save_live_blob: bool = Query(default=False), |
| 1623 | ) -> None: |
| 1624 | resolved_app_name = app_name or self.default_app_name |
| 1625 | if not resolved_app_name: |
| 1626 | await websocket.close( |
| 1627 | code=1008, |
| 1628 | reason=( |
| 1629 | "app_name query parameter is required when ADK_DEFAULT_APP_NAME" |
| 1630 | " is not set" |
| 1631 | ), |
| 1632 | ) |
| 1633 | return |
| 1634 | app_name = resolved_app_name |
| 1635 | |
| 1636 | ws_origin = websocket.headers.get("origin") |
| 1637 | if ws_origin is not None and not _is_request_origin_allowed( |
| 1638 | ws_origin, |
| 1639 | websocket.scope, |
| 1640 | literal_origins, |
| 1641 | compiled_origin_regex, |
| 1642 | has_configured_allowed_origins, |
| 1643 | ): |
| 1644 | await websocket.close(code=1008, reason="Origin not allowed") |
| 1645 | return |
| 1646 | |
| 1647 | await websocket.accept() |
| 1648 | self.current_app_name_ref.value = app_name |
| 1649 | runner_for_context = await self.get_runner_async(app_name) |
| 1650 | _set_telemetry_context_if_needed(runner_for_context) |
| 1651 | |
| 1652 | session = await self.session_service.get_session( |
| 1653 | app_name=app_name, user_id=user_id, session_id=session_id |
| 1654 | ) |
| 1655 | if not session: |
| 1656 | await websocket.close(code=1002, reason="Session not found") |
| 1657 | return |
| 1658 | |
| 1659 | live_request_queue = LiveRequestQueue() |
| 1660 | |
| 1661 | async def forward_events(): |
| 1662 | runner = await self.get_runner_async(app_name) |
| 1663 | run_config = RunConfig( |
| 1664 | response_modalities=modalities, |
| 1665 | proactivity=( |
| 1666 | types.ProactivityConfig(proactive_audio=proactive_audio) |
| 1667 | if proactive_audio is not None |
| 1668 | else None |
nothing calls this directly
no test coverage detected