FUCAT's picture
Deploy grok2api to HF Spaces (Docker)
7e55e53
Raw
History Blame Contribute Delete
4.86 kB
"""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
# ------------------------------------------------------------------
# Token fetch
# ------------------------------------------------------------------
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
# ------------------------------------------------------------------
# WebSocket connect
# ------------------------------------------------------------------
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"]