You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The session transport matrix already declares openrouter: {audio_turns}, but audio_turns has no handler anywhere in the control plane — realtime-offer hard-gates to provider=openai+transport=webrtc and posts to api.openai.com/v1/realtime/calls. So today the matrix advertises an OpenRouter capability that does nothing.
This issue tracks making OpenRouter a real, working session provider, including its voice-capable models.
Why
Add AgentField realtime sessions for WebRTC voice ingress #654 ships a deliberately provider-agnostic session DX (provider is an explicit, required knob) but only OpenAI is actually wired. OpenRouter is the declared second provider; it should either work or not be advertised.
OpenRouter brokers many voice/realtime-capable models; supporting it makes AgentField sessions genuinely multi-provider rather than OpenAI-locked.
Scope / open design questions
Decide what audio_turns actually is (turn-based audio request/response) vs. whether OpenRouter exposes a realtime/WebRTC path, and implement the matching control-plane handler — not just a matrix entry.
Wire the provider boundary (OpenRouter API key server-side, same "client never holds the key" model as OpenAI).
Surface OpenRouter's voice-capable models so @app.session(provider="openrouter", ...) can select them.
Acceptance criteria (behavior)
@app.session(provider="openrouter", transport="audio_turns", ...) produces a working session against a real OpenRouter voice model (audio in → response), with the provider key staying server-side.
Follow-up from #654 / discussion.
The session transport matrix already declares
openrouter: {audio_turns}, butaudio_turnshas no handler anywhere in the control plane —realtime-offerhard-gates toprovider=openai+transport=webrtcand posts toapi.openai.com/v1/realtime/calls. So today the matrix advertises an OpenRouter capability that does nothing.This issue tracks making OpenRouter a real, working session provider, including its voice-capable models.
Why
provideris an explicit, required knob) but only OpenAI is actually wired. OpenRouter is the declared second provider; it should either work or not be advertised.Scope / open design questions
audio_turnsactually is (turn-based audio request/response) vs. whether OpenRouter exposes a realtime/WebRTC path, and implement the matching control-plane handler — not just a matrix entry.@app.session(provider="openrouter", ...)can select them.Acceptance criteria (behavior)
@app.session(provider="openrouter", transport="audio_turns", ...)produces a working session against a real OpenRouter voice model (audio in → response), with the provider key staying server-side.audio_turnsworks, or it's removed until it does (ties into Sessions: implement websocket transport + wire RealtimeSession.input()/say() live loop (currently scaffolding) #664).execute/asyncwithX-Session-ID, consistent with the OpenAI path.Related: #662 (sideband tools), #663 (VAD/turn-detection config), #664 (websocket transport + live loop scaffolding).