| """LiveKit transport — fetch session token and open the WebSocket. |
| |
| ``fetch_livekit_token`` POSTs to /rest/livekit/tokens with proxy support. |
| ``connect_livekit_ws`` opens the wss:// connection and returns a |
| ``WebSocketConnection`` that the products layer can read/write. |
| """ |
|
|
| from typing import Any, Dict, Optional |
|
|
| import orjson |
|
|
| from app.platform.logging.logger import logger |
| from app.platform.config.snapshot import get_config |
| from app.platform.errors import UpstreamError |
| from app.control.proxy.models import ProxyFeedback, ProxyFeedbackKind, ProxyScope, RequestKind |
| from app.dataplane.proxy import get_proxy_runtime |
| from app.dataplane.proxy.adapters.headers import build_http_headers, build_ws_headers |
| from app.dataplane.reverse.protocol.xai_livekit import ( |
| LIVEKIT_TOKEN_URL, |
| build_token_request_payload, |
| build_ws_url, |
| ) |
| from app.dataplane.reverse.transport.http import post_json |
| from app.dataplane.reverse.transport.websocket import WebSocketClient, WebSocketConnection |
| from app.dataplane.reverse.transport._proxy_feedback import upstream_feedback |
|
|
|
|
| |
| |
| |
|
|
| async def fetch_livekit_token( |
| token: str, |
| *, |
| voice: str = "ara", |
| personality: str = "assistant", |
| speed: float = 1.0, |
| custom_instruction: str = "", |
| ) -> Dict[str, Any]: |
| """Fetch a LiveKit session token for *token*. |
| |
| Returns the parsed JSON body from /rest/livekit/tokens. |
| Raises ``UpstreamError`` on failure. |
| """ |
| cfg = get_config() |
| timeout_s = cfg.get_float("voice.timeout", 60.0) |
|
|
| proxy = await get_proxy_runtime() |
| lease = await proxy.acquire(scope=ProxyScope.APP, kind=RequestKind.HTTP) |
|
|
| payload = build_token_request_payload( |
| voice = voice, |
| personality = personality, |
| speed = speed, |
| custom_instruction = custom_instruction, |
| ) |
|
|
| try: |
| result = await post_json( |
| LIVEKIT_TOKEN_URL, |
| token, |
| payload, |
| lease = lease, |
| timeout_s = timeout_s, |
| origin = "https://grok.com", |
| referer = "https://grok.com/", |
| ) |
| except UpstreamError as exc: |
| await proxy.feedback(lease, upstream_feedback(exc)) |
| raise |
| except Exception as exc: |
| await proxy.feedback(lease, ProxyFeedback(kind=ProxyFeedbackKind.TRANSPORT_ERROR)) |
| raise UpstreamError(f"fetch_livekit_token: transport error: {exc}") from exc |
|
|
| await proxy.feedback( |
| lease, |
| ProxyFeedback(kind=ProxyFeedbackKind.SUCCESS, status_code=200), |
| ) |
| logger.debug("livekit session token fetched") |
| return result |
|
|
|
|
| |
| |
| |
|
|
| async def connect_livekit_ws( |
| token: str, |
| access_token: str, |
| *, |
| timeout_s: Optional[float] = None, |
| ) -> WebSocketConnection: |
| """Open a WebSocket connection to the LiveKit RTC endpoint. |
| |
| Args: |
| token: SSO session cookie — used for WebSocket headers. |
| access_token: Short-lived LiveKit token from ``fetch_livekit_token``. |
| timeout_s: Connection + read timeout; defaults to ``voice.timeout`` config. |
| |
| Returns: |
| ``WebSocketConnection`` wrapping the live aiohttp WS connection. |
| |
| Raises: |
| ``UpstreamError`` on connection failure. |
| """ |
| cfg = get_config() |
| timeout = timeout_s if timeout_s is not None else cfg.get_float("voice.timeout", 120.0) |
|
|
| proxy = await get_proxy_runtime() |
| lease = await proxy.acquire(scope=ProxyScope.APP, kind=RequestKind.WEBSOCKET) |
|
|
| url = build_ws_url(access_token) |
| headers = build_ws_headers(token=token, lease=lease) |
| client = WebSocketClient() |
|
|
| async def _on_close() -> None: |
| try: |
| await proxy.feedback( |
| lease, |
| ProxyFeedback(kind=ProxyFeedbackKind.SUCCESS, status_code=200), |
| ) |
| except Exception: |
| pass |
|
|
| try: |
| connection = await client.connect( |
| url, |
| headers = headers, |
| timeout = timeout, |
| lease = lease, |
| on_close = _on_close, |
| ) |
| except Exception as exc: |
| await proxy.feedback( |
| lease, |
| ProxyFeedback(kind=ProxyFeedbackKind.TRANSPORT_ERROR), |
| ) |
| logger.error("livekit websocket connect failed: error={}", exc) |
| raise UpstreamError(f"connect_livekit_ws: {exc}") from exc |
|
|
| logger.debug("livekit websocket connected: url={}", url) |
| return connection |
|
|
|
|
| __all__ = ["fetch_livekit_token", "connect_livekit_ws"] |
|
|