Add per-session realtime model and version overrides (#24999)

## Why

Clients need to select a realtime session configuration for an
individual start without rewriting persisted configuration or restarting
the app-server process.

## What Changed

- Add optional `model` and `version` fields to `thread/realtime/start`
- Forward those optional values through the realtime start operation and
apply them only for that session
- Preserve existing configured/default behavior when the new fields are
omitted
- Update generated protocol schema and app-server documentation

## Validation

- Added/updated protocol serialization coverage for the new optional
request fields
- Added focused core coverage for a session override taking precedence
over configured realtime selection
- Added focused app-server coverage that a request override reaches the
realtime WebSocket handshake
This commit is contained in:
guinness-oai
2026-06-09 17:54:32 -07:00
committed by GitHub
Unverified
parent 5ac640ac49
commit 4a3eac2144
11 changed files with 145 additions and 13 deletions
@@ -2942,10 +2942,12 @@ mod tests {
request_id: RequestId::Integer(9),
params: v2::ThreadRealtimeStartParams {
thread_id: "thr_123".to_string(),
model: Some("realtime-treatment-model".to_string()),
output_modality: RealtimeOutputModality::Audio,
prompt: Some(Some("You are on a call".to_string())),
realtime_session_id: Some("sess_456".to_string()),
transport: None,
version: Some(RealtimeConversationVersion::V1),
voice: Some(RealtimeVoice::Marin),
},
};
@@ -2955,10 +2957,12 @@ mod tests {
"id": 9,
"params": {
"threadId": "thr_123",
"model": "realtime-treatment-model",
"outputModality": "audio",
"prompt": "You are on a call",
"realtimeSessionId": "sess_456",
"transport": null,
"version": "v1",
"voice": "marin"
}
}),
@@ -2973,10 +2977,12 @@ mod tests {
request_id: RequestId::Integer(9),
params: v2::ThreadRealtimeStartParams {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
prompt: None,
realtime_session_id: None,
transport: None,
version: None,
voice: None,
},
};
@@ -2986,9 +2992,11 @@ mod tests {
"id": 9,
"params": {
"threadId": "thr_123",
"model": null,
"outputModality": "audio",
"realtimeSessionId": null,
"transport": null,
"version": null,
"voice": null
}
}),
@@ -2999,10 +3007,12 @@ mod tests {
request_id: RequestId::Integer(9),
params: v2::ThreadRealtimeStartParams {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
prompt: Some(None),
realtime_session_id: None,
transport: None,
version: None,
voice: None,
},
};
@@ -3012,10 +3022,12 @@ mod tests {
"id": 9,
"params": {
"threadId": "thr_123",
"model": null,
"outputModality": "audio",
"prompt": null,
"realtimeSessionId": null,
"transport": null,
"version": null,
"voice": null
}
}),
@@ -3168,10 +3180,12 @@ mod tests {
request_id: RequestId::Integer(1),
params: v2::ThreadRealtimeStartParams {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
prompt: Some(Some("You are on a call".to_string())),
realtime_session_id: None,
transport: None,
version: None,
voice: None,
},
};