Add a toggle for realtime startup context (#28405)

## Summary
- Add `includeStartupContext` to realtime start requests so callers can
explicitly skip Codex startup context while keeping the backend prompt
- Thread the new flag through protocol types, request processing, and
realtime session config
- Update app-server docs and coverage for the new default and opt-out
behavior

## Testing
- Added protocol serialization coverage for `includeStartupContext`
- Added realtime integration coverage for starting a session with
startup context disabled
This commit is contained in:
guinness-oai authored and GitHub committed 2026-06-15 17:14:22 -07:00
1 parent 7e0dce91df
commit d5b4b98370
10 files changed
+167 -28

No files matched your search

@@ -3043,6 +3043,7 @@ mod tests {
thread_id: "thr_123".to_string(),
model: Some("realtime-treatment-model".to_string()),
output_modality: RealtimeOutputModality::Audio,
include_startup_context: Some(false),
prompt: Some(Some("You are on a call".to_string())),
realtime_session_id: Some("sess_456".to_string()),
transport: None,
@@ -3061,6 +3062,7 @@ mod tests {
"codexResponseItemPrefix": null,
"model": "realtime-treatment-model",
"outputModality": "audio",
"includeStartupContext": false,
"prompt": "You are on a call",
"realtimeSessionId": "sess_456",
"transport": null,
@@ -3084,6 +3086,7 @@ mod tests {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
include_startup_context: None,
prompt: None,
realtime_session_id: None,
transport: None,
@@ -3102,6 +3105,7 @@ mod tests {
"codexResponseItemPrefix": null,
"model": null,
"outputModality": "audio",
"includeStartupContext": null,
"realtimeSessionId": null,
"transport": null,
"version": null,
@@ -3120,6 +3124,7 @@ mod tests {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
include_startup_context: None,
prompt: Some(None),
realtime_session_id: None,
transport: None,
@@ -3138,6 +3143,7 @@ mod tests {
"codexResponseItemPrefix": null,
"model": null,
"outputModality": "audio",
"includeStartupContext": null,
"prompt": null,
"realtimeSessionId": null,
"transport": null,
@@ -3322,6 +3328,7 @@ mod tests {
thread_id: "thr_123".to_string(),
model: None,
output_modality: RealtimeOutputModality::Audio,
include_startup_context: None,
prompt: Some(Some("You are on a call".to_string())),
realtime_session_id: None,
transport: None,
@@ -82,6 +82,9 @@ pub struct ThreadRealtimeStartParams {
/// Selects text or audio output for the realtime session. Transport and voice stay
/// independent so clients can choose how they connect separately from what the model emits.
pub output_modality: RealtimeOutputModality,
/// Set to false to start without Codex's startup context. Omitted or null includes it.
#[ts(optional = nullable)]
pub include_startup_context: Option<bool>,
#[serde(
default,
deserialize_with = "crate::protocol::serde_helpers::deserialize_double_option",