Background
Tracked in the operational memory reference_openai_realtime_beta_ga_shape_mismatch:
OpenAI Realtime GA token (ek_*) connects fine, gets session.created, then WS close 4000 beta_api_shape_disabled once beta-shape session.update lands. OpenAI .NET SDK 2.9.1 RealtimeConversationSessionOptions is beta-shape; aevatar VoicePresence.OpenAI needs GA migration before ek_ flow works end-to-end.
This blocks the voice convergence stage of #808 (ADR-0026 Stage 5). Stages 1–4 of #808 do not depend on this issue.
Scope
Migrate Aevatar.Foundation.VoicePresence.OpenAI from the beta-shape session.update payload to the GA shape that ek_ ephemeral tokens require. Confirm:
ek_* ephemeral token mint via NyxID (reference_openai_realtime_ephemeral_via_nyxid) → WS open
session.update GA payload accepted (no beta_api_shape_disabled 4000 close)
- audio in/out works against
wss://api.openai.com/v1/realtime
- session-level
tools declaration via GA shape works (this is what ADR-0026 Stage 5 will exercise)
Out of scope
Why it isn't folded into #808
External-dependency surface change with its own validation matrix (audio quality, latency, codec). Keeping it independent avoids coupling its release cycle to the routing refactor.
References
Background
Tracked in the operational memory
reference_openai_realtime_beta_ga_shape_mismatch:This blocks the voice convergence stage of #808 (ADR-0026 Stage 5). Stages 1–4 of #808 do not depend on this issue.
Scope
Migrate
Aevatar.Foundation.VoicePresence.OpenAIfrom the beta-shapesession.updatepayload to the GA shape thatek_ephemeral tokens require. Confirm:ek_*ephemeral token mint via NyxID (reference_openai_realtime_ephemeral_via_nyxid) → WS opensession.updateGA payload accepted (nobeta_api_shape_disabled4000 close)wss://api.openai.com/v1/realtimetoolsdeclaration via GA shape works (this is what ADR-0026 Stage 5 will exercise)Out of scope
VoiceSessionActor,/ws/voiceresolver change, tool-set declaration logic) — done in epic: collapse chat route actions to ForwardToModel + tools (ADR-0026) #808 once this is unblocked/ws/voice/{actorId}dev bypass behaviorWhy it isn't folded into #808
External-dependency surface change with its own validation matrix (audio quality, latency, codec). Keeping it independent avoids coupling its release cycle to the routing refactor.
References
reference_openai_realtime_beta_ga_shape_mismatch(operational memory)reference_openai_realtime_ephemeral_via_nyxid(ek_ mint recipe)