Filter saved reasoning overrides from requests when disabled (#46291)

## Why

Resuming a thread after disabling reasoning effort overrides still sent saved `configuration_update` items until compaction. Disabling the feature should also apply to requests built from existing history.

## What changed

Pass the `ReasoningEffortOverride` feature state into `ModelClient` and filter `configuration_update` items from request input when disabled. Preserve persisted history and other input items while using the request-level reasoning effort.

## Testing

Add regression coverage for resumed threads, compaction, and WebSocket warmup and turn requests. Verify that saved updates remain in history and `agent_message` items remain in request input.

GitOrigin-RevId: aac3257da1ca38a0744807c4f7cb12565bd7fe53
This commit is contained in:
felixxia-oai
2026-09-17 19:42:56 +00:00
committed by copyberry
parent 0fd1cd8d99
commit 47915cee7a
9 changed files with 136 additions and 15 deletions
+8
View File
@@ -203,6 +203,7 @@ struct ModelClientState {
originator: String,
model_verbosity: Option<VerbosityConfig>,
content_item_kinds_enabled: bool,
reasoning_effort_override_enabled: bool,
enable_request_compression: bool,
include_timing_metrics: bool,
beta_features_header: Option<String>,
@@ -476,6 +477,7 @@ impl ModelClient {
originator: String,
model_verbosity: Option<VerbosityConfig>,
content_item_kinds_enabled: bool,
reasoning_effort_override_enabled: bool,
enable_request_compression: bool,
include_timing_metrics: bool,
beta_features_header: Option<String>,
@@ -502,6 +504,7 @@ impl ModelClient {
originator,
model_verbosity,
content_item_kinds_enabled,
reasoning_effort_override_enabled,
enable_request_compression,
include_timing_metrics,
beta_features_header,
@@ -856,6 +859,11 @@ impl ModelClient {
responses_metadata: &CodexResponsesMetadata,
) -> Result<ResponsesApiRequest> {
let mut input = prompt.get_formatted_input_for_request(model_info);
if !self.state.reasoning_effort_override_enabled {
// Disabling overrides must also recover threads with saved updates.
// Filter only the request copy; persisted history remains unchanged.
input.retain(|item| !matches!(item, ResponseItem::ConfigurationUpdate { .. }));
}
let is_openai = self.state.provider.info().is_openai();
let (instructions, tools) = if model_info.use_responses_lite {
// These prompt-only items are rebuilt on every request. Hash their visible payloads
+2
View File
@@ -115,6 +115,7 @@ fn test_model_client_with_thread_id(
"test_originator".to_string(),
/*model_verbosity*/ None,
/*content_item_kinds_enabled*/ true,
/*reasoning_effort_override_enabled*/ false,
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -1631,6 +1632,7 @@ fn model_client_with_counting_attestation(
"test_originator".to_string(),
/*model_verbosity*/ None,
/*content_item_kinds_enabled*/ true,
/*reasoning_effort_override_enabled*/ false,
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
+1
View File
@@ -1677,6 +1677,7 @@ impl Session {
session_configuration.originator.clone(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
config.features.enabled(Feature::ReasoningEffortOverride),
config.features.enabled(Feature::EnableRequestCompression),
config.features.enabled(Feature::RuntimeMetrics),
Self::build_model_client_beta_features_header(config.as_ref()),
+3
View File
@@ -794,6 +794,7 @@ fn test_model_client_session() -> crate::client::ModelClientSession {
"test_originator".to_string(),
/*model_verbosity*/ None,
/*content_item_kinds_enabled*/ true,
/*reasoning_effort_override_enabled*/ false,
/*enable_request_compression*/ false,
/*include_timing_metrics*/ false,
/*beta_features_header*/ None,
@@ -6177,6 +6178,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) {
session_configuration.originator.clone(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
config.features.enabled(Feature::ReasoningEffortOverride),
config.features.enabled(Feature::EnableRequestCompression),
config.features.enabled(Feature::RuntimeMetrics),
Session::build_model_client_beta_features_header(config.as_ref()),
@@ -8363,6 +8365,7 @@ where
session_configuration.originator.clone(),
config.model_verbosity,
config.features.enabled(Feature::ContentItemKinds),
config.features.enabled(Feature::ReasoningEffortOverride),
config.features.enabled(Feature::EnableRequestCompression),
config.features.enabled(Feature::RuntimeMetrics),
Session::build_model_client_beta_features_header(config.as_ref()),