Remove reasoning format (#8484)

This isn't very useful parameter. 

logic:
```
if model puts `**` in their reasoning, trim it and visualize the header.
if couldn't trim: don't render
if model doesn't support: don't render
```

We can simplify to:
```
if could trim, visualize header.
if not, don't render
```
This commit is contained in:
Ahmed Ibrahim authored and GitHub committed 2025-12-23 16:01:46 -08:00
1 parent 972b5853a0
commit 40de81e7af
15 files changed
+54 -188

No files matched your search

@@ -5,7 +5,6 @@ use codex_protocol::openai_models::ConfigShellToolType;
use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelInfo;
use codex_protocol::openai_models::ModelPreset; use codex_protocol::openai_models::ModelPreset;
use codex_protocol::openai_models::ModelVisibility; use codex_protocol::openai_models::ModelVisibility;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::openai_models::TruncationPolicyConfig; use codex_protocol::openai_models::TruncationPolicyConfig;
use serde_json::json; use serde_json::json;
use std::path::Path; use std::path::Path;
@@ -35,7 +34,6 @@ fn preset_to_info(preset: &ModelPreset, priority: i32) -> ModelInfo {
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
} }
} }
@@ -227,7 +227,6 @@ mod tests {
"truncation_policy": {"mode": "bytes", "limit": 10_000}, "truncation_policy": {"mode": "bytes", "limit": 10_000},
"supports_parallel_tool_calls": false, "supports_parallel_tool_calls": false,
"context_window": null, "context_window": null,
"reasoning_summary_format": "none",
"experimental_supported_tools": [], "experimental_supported_tools": [],
})) }))
.unwrap(), .unwrap(),
@@ -10,7 +10,6 @@ use codex_protocol::openai_models::ModelVisibility;
use codex_protocol::openai_models::ModelsResponse; use codex_protocol::openai_models::ModelsResponse;
use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::openai_models::ReasoningEffortPreset; use codex_protocol::openai_models::ReasoningEffortPreset;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::openai_models::TruncationPolicyConfig; use codex_protocol::openai_models::TruncationPolicyConfig;
use http::HeaderMap; use http::HeaderMap;
use http::Method; use http::Method;
@@ -85,7 +84,6 @@ async fn models_client_hits_models_endpoint() {
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
}], }],
etag: String::new(), etag: String::new(),
-12
View File
@@ -38,7 +38,6 @@ use codex_protocol::config_types::SandboxMode;
use codex_protocol::config_types::TrustLevel; use codex_protocol::config_types::TrustLevel;
use codex_protocol::config_types::Verbosity; use codex_protocol::config_types::Verbosity;
use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_rmcp_client::OAuthCredentialsStoreMode; use codex_rmcp_client::OAuthCredentialsStoreMode;
use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_absolute_path::AbsolutePathBuf;
use codex_utils_absolute_path::AbsolutePathBufGuard; use codex_utils_absolute_path::AbsolutePathBufGuard;
@@ -303,9 +302,6 @@ pub struct Config {
/// Optional override to force-enable reasoning summaries for the configured model. /// Optional override to force-enable reasoning summaries for the configured model.
pub model_supports_reasoning_summaries: Option<bool>, pub model_supports_reasoning_summaries: Option<bool>,
/// Optional override to force reasoning summary format for the configured model.
pub model_reasoning_summary_format: Option<ReasoningSummaryFormat>,
/// Optional verbosity control for GPT-5 models (Responses API `text.verbosity`). /// Optional verbosity control for GPT-5 models (Responses API `text.verbosity`).
pub model_verbosity: Option<Verbosity>, pub model_verbosity: Option<Verbosity>,
@@ -786,9 +782,6 @@ pub struct ConfigToml {
/// Override to force-enable reasoning summaries for the configured model. /// Override to force-enable reasoning summaries for the configured model.
pub model_supports_reasoning_summaries: Option<bool>, pub model_supports_reasoning_summaries: Option<bool>,
/// Override to force reasoning summary format for the configured model.
pub model_reasoning_summary_format: Option<ReasoningSummaryFormat>,
/// Base URL for requests to ChatGPT (as opposed to the OpenAI API). /// Base URL for requests to ChatGPT (as opposed to the OpenAI API).
pub chatgpt_base_url: Option<String>, pub chatgpt_base_url: Option<String>,
@@ -1379,7 +1372,6 @@ impl Config {
.or(cfg.model_reasoning_summary) .or(cfg.model_reasoning_summary)
.unwrap_or_default(), .unwrap_or_default(),
model_supports_reasoning_summaries: cfg.model_supports_reasoning_summaries, model_supports_reasoning_summaries: cfg.model_supports_reasoning_summaries,
model_reasoning_summary_format: cfg.model_reasoning_summary_format.clone(),
model_verbosity: config_profile.model_verbosity.or(cfg.model_verbosity), model_verbosity: config_profile.model_verbosity.or(cfg.model_verbosity),
chatgpt_base_url: config_profile chatgpt_base_url: config_profile
.chatgpt_base_url .chatgpt_base_url
@@ -3189,7 +3181,6 @@ model_verbosity = "high"
model_reasoning_effort: Some(ReasoningEffort::High), model_reasoning_effort: Some(ReasoningEffort::High),
model_reasoning_summary: ReasoningSummary::Detailed, model_reasoning_summary: ReasoningSummary::Detailed,
model_supports_reasoning_summaries: None, model_supports_reasoning_summaries: None,
model_reasoning_summary_format: None,
model_verbosity: None, model_verbosity: None,
chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(),
base_instructions: None, base_instructions: None,
@@ -3273,7 +3264,6 @@ model_verbosity = "high"
model_reasoning_effort: None, model_reasoning_effort: None,
model_reasoning_summary: ReasoningSummary::default(), model_reasoning_summary: ReasoningSummary::default(),
model_supports_reasoning_summaries: None, model_supports_reasoning_summaries: None,
model_reasoning_summary_format: None,
model_verbosity: None, model_verbosity: None,
chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(),
base_instructions: None, base_instructions: None,
@@ -3372,7 +3362,6 @@ model_verbosity = "high"
model_reasoning_effort: None, model_reasoning_effort: None,
model_reasoning_summary: ReasoningSummary::default(), model_reasoning_summary: ReasoningSummary::default(),
model_supports_reasoning_summaries: None, model_supports_reasoning_summaries: None,
model_reasoning_summary_format: None,
model_verbosity: None, model_verbosity: None,
chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(),
base_instructions: None, base_instructions: None,
@@ -3457,7 +3446,6 @@ model_verbosity = "high"
model_reasoning_effort: Some(ReasoningEffort::High), model_reasoning_effort: Some(ReasoningEffort::High),
model_reasoning_summary: ReasoningSummary::Detailed, model_reasoning_summary: ReasoningSummary::Detailed,
model_supports_reasoning_summaries: None, model_supports_reasoning_summaries: None,
model_reasoning_summary_format: None,
model_verbosity: Some(Verbosity::High), model_verbosity: Some(Verbosity::High),
chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(),
base_instructions: None, base_instructions: None,
@@ -354,7 +354,6 @@ mod tests {
"truncation_policy": {"mode": "bytes", "limit": 10_000}, "truncation_policy": {"mode": "bytes", "limit": 10_000},
"supports_parallel_tool_calls": false, "supports_parallel_tool_calls": false,
"context_window": null, "context_window": null,
"reasoning_summary_format": "none",
"experimental_supported_tools": [], "experimental_supported_tools": [],
})) }))
.expect("valid model") .expect("valid model")
@@ -3,7 +3,6 @@ use codex_protocol::openai_models::ApplyPatchToolType;
use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ConfigShellToolType;
use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelInfo;
use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use crate::config::Config; use crate::config::Config;
use crate::truncate::TruncationPolicy; use crate::truncate::TruncationPolicy;
@@ -48,9 +47,6 @@ pub struct ModelFamily {
// The reasoning effort to use for this model family when none is explicitly chosen. // The reasoning effort to use for this model family when none is explicitly chosen.
pub default_reasoning_effort: Option<ReasoningEffort>, pub default_reasoning_effort: Option<ReasoningEffort>,
// Define if we need a special handling of reasoning summary
pub reasoning_summary_format: ReasoningSummaryFormat,
/// Whether this model supports parallel tool calls when using the /// Whether this model supports parallel tool calls when using the
/// Responses API. /// Responses API.
pub supports_parallel_tool_calls: bool, pub supports_parallel_tool_calls: bool,
@@ -88,9 +84,6 @@ impl ModelFamily {
if let Some(supports_reasoning_summaries) = config.model_supports_reasoning_summaries { if let Some(supports_reasoning_summaries) = config.model_supports_reasoning_summaries {
self.supports_reasoning_summaries = supports_reasoning_summaries; self.supports_reasoning_summaries = supports_reasoning_summaries;
} }
if let Some(reasoning_summary_format) = config.model_reasoning_summary_format.as_ref() {
self.reasoning_summary_format = reasoning_summary_format.clone();
}
if let Some(context_window) = config.model_context_window { if let Some(context_window) = config.model_context_window {
self.context_window = Some(context_window); self.context_window = Some(context_window);
} }
@@ -128,7 +121,6 @@ impl ModelFamily {
truncation_policy, truncation_policy,
supports_parallel_tool_calls, supports_parallel_tool_calls,
context_window, context_window,
reasoning_summary_format,
experimental_supported_tools, experimental_supported_tools,
} = model; } = model;
@@ -144,7 +136,6 @@ impl ModelFamily {
self.truncation_policy = truncation_policy.into(); self.truncation_policy = truncation_policy.into();
self.supports_parallel_tool_calls = supports_parallel_tool_calls; self.supports_parallel_tool_calls = supports_parallel_tool_calls;
self.context_window = context_window; self.context_window = context_window;
self.reasoning_summary_format = reasoning_summary_format;
self.experimental_supported_tools = experimental_supported_tools; self.experimental_supported_tools = experimental_supported_tools;
} }
@@ -175,7 +166,6 @@ macro_rules! model_family {
context_window: Some(CONTEXT_WINDOW_272K), context_window: Some(CONTEXT_WINDOW_272K),
auto_compact_token_limit: None, auto_compact_token_limit: None,
supports_reasoning_summaries: false, supports_reasoning_summaries: false,
reasoning_summary_format: ReasoningSummaryFormat::None,
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
apply_patch_tool_type: None, apply_patch_tool_type: None,
base_instructions: BASE_INSTRUCTIONS.to_string(), base_instructions: BASE_INSTRUCTIONS.to_string(),
@@ -250,7 +240,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_CODEX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_CODEX_INSTRUCTIONS.to_string(),
experimental_supported_tools: vec![ experimental_supported_tools: vec![
"grep_files".to_string(), "grep_files".to_string(),
@@ -270,7 +259,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(),
apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), apply_patch_tool_type: Some(ApplyPatchToolType::Freeform),
shell_type: ConfigShellToolType::ShellCommand, shell_type: ConfigShellToolType::ShellCommand,
@@ -299,7 +287,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(),
apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), apply_patch_tool_type: Some(ApplyPatchToolType::Freeform),
shell_type: ConfigShellToolType::ShellCommand, shell_type: ConfigShellToolType::ShellCommand,
@@ -312,7 +299,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_2_CODEX_INSTRUCTIONS.to_string(),
apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), apply_patch_tool_type: Some(ApplyPatchToolType::Freeform),
shell_type: ConfigShellToolType::ShellCommand, shell_type: ConfigShellToolType::ShellCommand,
@@ -325,7 +311,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_1_CODEX_MAX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_1_CODEX_MAX_INSTRUCTIONS.to_string(),
apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), apply_patch_tool_type: Some(ApplyPatchToolType::Freeform),
shell_type: ConfigShellToolType::ShellCommand, shell_type: ConfigShellToolType::ShellCommand,
@@ -341,7 +326,6 @@ pub(super) fn find_family_for_model(slug: &str) -> ModelFamily {
model_family!( model_family!(
slug, slug, slug, slug,
supports_reasoning_summaries: true, supports_reasoning_summaries: true,
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
base_instructions: GPT_5_CODEX_INSTRUCTIONS.to_string(), base_instructions: GPT_5_CODEX_INSTRUCTIONS.to_string(),
apply_patch_tool_type: Some(ApplyPatchToolType::Freeform), apply_patch_tool_type: Some(ApplyPatchToolType::Freeform),
shell_type: ConfigShellToolType::ShellCommand, shell_type: ConfigShellToolType::ShellCommand,
@@ -416,7 +400,6 @@ fn derive_default_model_family(model: &str) -> ModelFamily {
context_window: None, context_window: None,
auto_compact_token_limit: None, auto_compact_token_limit: None,
supports_reasoning_summaries: false, supports_reasoning_summaries: false,
reasoning_summary_format: ReasoningSummaryFormat::None,
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
apply_patch_tool_type: None, apply_patch_tool_type: None,
base_instructions: BASE_INSTRUCTIONS.to_string(), base_instructions: BASE_INSTRUCTIONS.to_string(),
@@ -460,7 +443,6 @@ mod tests {
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
} }
} }
@@ -524,7 +506,6 @@ mod tests {
experimental_supported_tools: vec!["local".to_string()], experimental_supported_tools: vec!["local".to_string()],
truncation_policy: TruncationPolicy::Bytes(10_000), truncation_policy: TruncationPolicy::Bytes(10_000),
context_window: Some(100), context_window: Some(100),
reasoning_summary_format: ReasoningSummaryFormat::None,
); );
let updated = family.with_remote_overrides(vec![ModelInfo { let updated = family.with_remote_overrides(vec![ModelInfo {
@@ -549,7 +530,6 @@ mod tests {
truncation_policy: TruncationPolicyConfig::tokens(2_000), truncation_policy: TruncationPolicyConfig::tokens(2_000),
supports_parallel_tool_calls: true, supports_parallel_tool_calls: true,
context_window: Some(400_000), context_window: Some(400_000),
reasoning_summary_format: ReasoningSummaryFormat::Experimental,
experimental_supported_tools: vec!["alpha".to_string(), "beta".to_string()], experimental_supported_tools: vec!["alpha".to_string(), "beta".to_string()],
}]); }]);
@@ -568,10 +548,6 @@ mod tests {
assert_eq!(updated.truncation_policy, TruncationPolicy::Tokens(2_000)); assert_eq!(updated.truncation_policy, TruncationPolicy::Tokens(2_000));
assert!(updated.supports_parallel_tool_calls); assert!(updated.supports_parallel_tool_calls);
assert_eq!(updated.context_window, Some(400_000)); assert_eq!(updated.context_window, Some(400_000));
assert_eq!(
updated.reasoning_summary_format,
ReasoningSummaryFormat::Experimental
);
assert_eq!( assert_eq!(
updated.experimental_supported_tools, updated.experimental_supported_tools,
vec!["alpha".to_string(), "beta".to_string()] vec!["alpha".to_string(), "beta".to_string()]
-2
View File
@@ -14,7 +14,6 @@ use codex_core::models_manager::manager::ModelsManager;
use codex_otel::otel_manager::OtelManager; use codex_otel::otel_manager::OtelManager;
use codex_protocol::ConversationId; use codex_protocol::ConversationId;
use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::ReasoningSummary;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SessionSource;
use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::SubAgentSource;
use core_test_support::load_default_config_for_test; use core_test_support::load_default_config_for_test;
@@ -246,7 +245,6 @@ async fn responses_respects_model_family_overrides_from_config() {
config.model_provider_id = provider.name.clone(); config.model_provider_id = provider.name.clone();
config.model_provider = provider.clone(); config.model_provider = provider.clone();
config.model_supports_reasoning_summaries = Some(true); config.model_supports_reasoning_summaries = Some(true);
config.model_reasoning_summary_format = Some(ReasoningSummaryFormat::Experimental);
config.model_reasoning_summary = ReasoningSummary::Detailed; config.model_reasoning_summary = ReasoningSummary::Detailed;
let effort = config.model_reasoning_effort; let effort = config.model_reasoning_effort;
let summary = config.model_reasoning_summary; let summary = config.model_reasoning_summary;
@@ -24,7 +24,6 @@ use codex_protocol::openai_models::ModelVisibility;
use codex_protocol::openai_models::ModelsResponse; use codex_protocol::openai_models::ModelsResponse;
use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::openai_models::ReasoningEffortPreset; use codex_protocol::openai_models::ReasoningEffortPreset;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::openai_models::TruncationPolicyConfig; use codex_protocol::openai_models::TruncationPolicyConfig;
use codex_protocol::user_input::UserInput; use codex_protocol::user_input::UserInput;
use core_test_support::load_default_config_for_test; use core_test_support::load_default_config_for_test;
@@ -83,7 +82,6 @@ async fn remote_models_remote_model_uses_unified_exec() -> Result<()> {
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
}; };
@@ -222,7 +220,6 @@ async fn remote_models_apply_remote_base_instructions() -> Result<()> {
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
}; };
mount_models_once( mount_models_once(
@@ -486,7 +483,6 @@ fn test_remote_model(slug: &str, visibility: ModelVisibility, priority: i32) ->
truncation_policy: TruncationPolicyConfig::bytes(10_000), truncation_policy: TruncationPolicyConfig::bytes(10_000),
supports_parallel_tool_calls: false, supports_parallel_tool_calls: false,
context_window: None, context_window: None,
reasoning_summary_format: ReasoningSummaryFormat::None,
experimental_supported_tools: Vec::new(), experimental_supported_tools: Vec::new(),
} }
} }
-9
View File
@@ -125,14 +125,6 @@ pub enum ApplyPatchToolType {
Function, Function,
} }
#[derive(Deserialize, Debug, Clone, PartialEq, Eq, Default, Hash, TS, JsonSchema, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReasoningSummaryFormat {
#[default]
None,
Experimental,
}
/// Server-provided truncation policy metadata for a model. /// Server-provided truncation policy metadata for a model.
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, TS, JsonSchema)] #[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, TS, JsonSchema)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
@@ -188,7 +180,6 @@ pub struct ModelInfo {
pub truncation_policy: TruncationPolicyConfig, pub truncation_policy: TruncationPolicyConfig,
pub supports_parallel_tool_calls: bool, pub supports_parallel_tool_calls: bool,
pub context_window: Option<i64>, pub context_window: Option<i64>,
pub reasoning_summary_format: ReasoningSummaryFormat,
pub experimental_supported_tools: Vec<String>, pub experimental_supported_tools: Vec<String>,
} }
+2 -5
View File
@@ -537,14 +537,11 @@ impl ChatWidget {
} }
fn on_agent_reasoning_final(&mut self) { fn on_agent_reasoning_final(&mut self) {
let reasoning_summary_format = self.get_model_family().reasoning_summary_format;
// At the end of a reasoning block, record transcript-only content. // At the end of a reasoning block, record transcript-only content.
self.full_reasoning_buffer.push_str(&self.reasoning_buffer); self.full_reasoning_buffer.push_str(&self.reasoning_buffer);
if !self.full_reasoning_buffer.is_empty() { if !self.full_reasoning_buffer.is_empty() {
let cell = history_cell::new_reasoning_summary_block( let cell =
self.full_reasoning_buffer.clone(), history_cell::new_reasoning_summary_block(self.full_reasoning_buffer.clone());
reasoning_summary_format,
);
self.add_boxed_history(cell); self.add_boxed_history(cell);
} }
self.reasoning_buffer.clear(); self.reasoning_buffer.clear();
+22 -59
View File
@@ -33,7 +33,6 @@ use codex_core::protocol::McpAuthStatus;
use codex_core::protocol::McpInvocation; use codex_core::protocol::McpInvocation;
use codex_core::protocol::SessionConfiguredEvent; use codex_core::protocol::SessionConfiguredEvent;
use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::plan_tool::PlanItemArg; use codex_protocol::plan_tool::PlanItemArg;
use codex_protocol::plan_tool::StepStatus; use codex_protocol::plan_tool::StepStatus;
use codex_protocol::plan_tool::UpdatePlanArgs; use codex_protocol::plan_tool::UpdatePlanArgs;
@@ -1661,39 +1660,28 @@ pub(crate) fn new_view_image_tool_call(path: PathBuf, cwd: &Path) -> PlainHistor
PlainHistoryCell { lines } PlainHistoryCell { lines }
} }
pub(crate) fn new_reasoning_summary_block( pub(crate) fn new_reasoning_summary_block(full_reasoning_buffer: String) -> Box<dyn HistoryCell> {
full_reasoning_buffer: String, let full_reasoning_buffer = full_reasoning_buffer.trim();
reasoning_summary_format: ReasoningSummaryFormat, if let Some(open) = full_reasoning_buffer.find("**") {
) -> Box<dyn HistoryCell> { let after_open = &full_reasoning_buffer[(open + 2)..];
if reasoning_summary_format == ReasoningSummaryFormat::Experimental { if let Some(close) = after_open.find("**") {
// Experimental format is following: let after_close_idx = open + 2 + close + 2;
// ** header ** // if we don't have anything beyond `after_close_idx`
// // then we don't have a summary to inject into history
// reasoning summary if after_close_idx < full_reasoning_buffer.len() {
// let header_buffer = full_reasoning_buffer[..after_close_idx].to_string();
// So we need to strip header from reasoning summary let summary_buffer = full_reasoning_buffer[after_close_idx..].to_string();
let full_reasoning_buffer = full_reasoning_buffer.trim(); return Box::new(ReasoningSummaryCell::new(
if let Some(open) = full_reasoning_buffer.find("**") { header_buffer,
let after_open = &full_reasoning_buffer[(open + 2)..]; summary_buffer,
if let Some(close) = after_open.find("**") { false,
let after_close_idx = open + 2 + close + 2; ));
// if we don't have anything beyond `after_close_idx`
// then we don't have a summary to inject into history
if after_close_idx < full_reasoning_buffer.len() {
let header_buffer = full_reasoning_buffer[..after_close_idx].to_string();
let summary_buffer = full_reasoning_buffer[after_close_idx..].to_string();
return Box::new(ReasoningSummaryCell::new(
header_buffer,
summary_buffer,
false,
));
}
} }
} }
} }
Box::new(ReasoningSummaryCell::new( Box::new(ReasoningSummaryCell::new(
"".to_string(), "".to_string(),
full_reasoning_buffer, full_reasoning_buffer.to_string(),
true, true,
)) ))
} }
@@ -1759,7 +1747,6 @@ mod tests {
use codex_core::config::ConfigBuilder; use codex_core::config::ConfigBuilder;
use codex_core::config::types::McpServerConfig; use codex_core::config::types::McpServerConfig;
use codex_core::config::types::McpServerTransportConfig; use codex_core::config::types::McpServerTransportConfig;
use codex_core::models_manager::manager::ModelsManager;
use codex_core::protocol::McpAuthStatus; use codex_core::protocol::McpAuthStatus;
use codex_protocol::parse_command::ParsedCommand; use codex_protocol::parse_command::ParsedCommand;
use dirs::home_dir; use dirs::home_dir;
@@ -2672,10 +2659,8 @@ mod tests {
} }
#[test] #[test]
fn reasoning_summary_block() { fn reasoning_summary_block() {
let reasoning_format = ReasoningSummaryFormat::Experimental;
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(), "**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
reasoning_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
@@ -2687,11 +2672,7 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_returns_reasoning_cell_when_feature_disabled() { fn reasoning_summary_block_returns_reasoning_cell_when_feature_disabled() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell = new_reasoning_summary_block("Detailed reasoning goes here.".to_string());
let cell = new_reasoning_summary_block(
"Detailed reasoning goes here.".to_string(),
reasoning_format,
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• Detailed reasoning goes here."]); assert_eq!(rendered, vec!["• Detailed reasoning goes here."]);
@@ -2702,17 +2683,8 @@ mod tests {
let mut config = test_config().await; let mut config = test_config().await;
config.model = Some("gpt-3.5-turbo".to_string()); config.model = Some("gpt-3.5-turbo".to_string());
config.model_supports_reasoning_summaries = Some(true); config.model_supports_reasoning_summaries = Some(true);
config.model_reasoning_summary_format = Some(ReasoningSummaryFormat::Experimental);
let model_family =
ModelsManager::construct_model_family_offline(&config.model.clone().unwrap(), &config);
assert_eq!(
model_family.reasoning_summary_format,
ReasoningSummaryFormat::Experimental
);
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(), "**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
model_family.reasoning_summary_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
@@ -2721,11 +2693,8 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_falls_back_when_header_is_missing() { fn reasoning_summary_block_falls_back_when_header_is_missing() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell =
let cell = new_reasoning_summary_block( new_reasoning_summary_block("**High level reasoning without closing".to_string());
"**High level reasoning without closing".to_string(),
reasoning_format,
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• **High level reasoning without closing"]); assert_eq!(rendered, vec!["• **High level reasoning without closing"]);
@@ -2733,18 +2702,14 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_falls_back_when_summary_is_missing() { fn reasoning_summary_block_falls_back_when_summary_is_missing() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell =
let cell = new_reasoning_summary_block( new_reasoning_summary_block("**High level reasoning without closing**".to_string());
"**High level reasoning without closing**".to_string(),
reasoning_format.clone(),
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• High level reasoning without closing"]); assert_eq!(rendered, vec!["• High level reasoning without closing"]);
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning without closing**\n\n ".to_string(), "**High level reasoning without closing**\n\n ".to_string(),
reasoning_format,
); );
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
@@ -2753,10 +2718,8 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_splits_header_and_summary_when_present() { fn reasoning_summary_block_splits_header_and_summary_when_present() {
let reasoning_format = ReasoningSummaryFormat::Experimental;
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level plan**\n\nWe should fix the bug next.".to_string(), "**High level plan**\n\nWe should fix the bug next.".to_string(),
reasoning_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
+2 -5
View File
@@ -503,14 +503,11 @@ impl ChatWidget {
} }
fn on_agent_reasoning_final(&mut self) { fn on_agent_reasoning_final(&mut self) {
let reasoning_summary_format = self.get_model_family().reasoning_summary_format;
// At the end of a reasoning block, record transcript-only content. // At the end of a reasoning block, record transcript-only content.
self.full_reasoning_buffer.push_str(&self.reasoning_buffer); self.full_reasoning_buffer.push_str(&self.reasoning_buffer);
if !self.full_reasoning_buffer.is_empty() { if !self.full_reasoning_buffer.is_empty() {
let cell = history_cell::new_reasoning_summary_block( let cell =
self.full_reasoning_buffer.clone(), history_cell::new_reasoning_summary_block(self.full_reasoning_buffer.clone());
reasoning_summary_format,
);
self.add_boxed_history(cell); self.add_boxed_history(cell);
} }
self.reasoning_buffer.clear(); self.reasoning_buffer.clear();
+28 -58
View File
@@ -29,7 +29,6 @@ use codex_core::protocol::McpAuthStatus;
use codex_core::protocol::McpInvocation; use codex_core::protocol::McpInvocation;
use codex_core::protocol::SessionConfiguredEvent; use codex_core::protocol::SessionConfiguredEvent;
use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig;
use codex_protocol::openai_models::ReasoningSummaryFormat;
use codex_protocol::plan_tool::PlanItemArg; use codex_protocol::plan_tool::PlanItemArg;
use codex_protocol::plan_tool::StepStatus; use codex_protocol::plan_tool::StepStatus;
use codex_protocol::plan_tool::UpdatePlanArgs; use codex_protocol::plan_tool::UpdatePlanArgs;
@@ -1544,39 +1543,34 @@ pub(crate) fn new_view_image_tool_call(path: PathBuf, cwd: &Path) -> PlainHistor
PlainHistoryCell { lines } PlainHistoryCell { lines }
} }
pub(crate) fn new_reasoning_summary_block( pub(crate) fn new_reasoning_summary_block(full_reasoning_buffer: String) -> Box<dyn HistoryCell> {
full_reasoning_buffer: String, // Experimental format is following:
reasoning_summary_format: ReasoningSummaryFormat, // ** header **
) -> Box<dyn HistoryCell> { //
if reasoning_summary_format == ReasoningSummaryFormat::Experimental { // reasoning summary
// Experimental format is following: //
// ** header ** // So we need to strip header from reasoning summary
// let full_reasoning_buffer = full_reasoning_buffer.trim();
// reasoning summary if let Some(open) = full_reasoning_buffer.find("**") {
// let after_open = &full_reasoning_buffer[(open + 2)..];
// So we need to strip header from reasoning summary if let Some(close) = after_open.find("**") {
let full_reasoning_buffer = full_reasoning_buffer.trim(); let after_close_idx = open + 2 + close + 2;
if let Some(open) = full_reasoning_buffer.find("**") { // if we don't have anything beyond `after_close_idx`
let after_open = &full_reasoning_buffer[(open + 2)..]; // then we don't have a summary to inject into history
if let Some(close) = after_open.find("**") { if after_close_idx < full_reasoning_buffer.len() {
let after_close_idx = open + 2 + close + 2; let header_buffer = full_reasoning_buffer[..after_close_idx].to_string();
// if we don't have anything beyond `after_close_idx` let summary_buffer = full_reasoning_buffer[after_close_idx..].to_string();
// then we don't have a summary to inject into history return Box::new(ReasoningSummaryCell::new(
if after_close_idx < full_reasoning_buffer.len() { header_buffer,
let header_buffer = full_reasoning_buffer[..after_close_idx].to_string(); summary_buffer,
let summary_buffer = full_reasoning_buffer[after_close_idx..].to_string(); false,
return Box::new(ReasoningSummaryCell::new( ));
header_buffer,
summary_buffer,
false,
));
}
} }
} }
} }
Box::new(ReasoningSummaryCell::new( Box::new(ReasoningSummaryCell::new(
"".to_string(), "".to_string(),
full_reasoning_buffer, full_reasoning_buffer.to_string(),
true, true,
)) ))
} }
@@ -1642,7 +1636,6 @@ mod tests {
use codex_core::config::ConfigBuilder; use codex_core::config::ConfigBuilder;
use codex_core::config::types::McpServerConfig; use codex_core::config::types::McpServerConfig;
use codex_core::config::types::McpServerTransportConfig; use codex_core::config::types::McpServerTransportConfig;
use codex_core::models_manager::manager::ModelsManager;
use codex_core::protocol::McpAuthStatus; use codex_core::protocol::McpAuthStatus;
use codex_protocol::parse_command::ParsedCommand; use codex_protocol::parse_command::ParsedCommand;
use dirs::home_dir; use dirs::home_dir;
@@ -2489,10 +2482,8 @@ mod tests {
} }
#[test] #[test]
fn reasoning_summary_block() { fn reasoning_summary_block() {
let reasoning_format = ReasoningSummaryFormat::Experimental;
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(), "**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
reasoning_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
@@ -2504,11 +2495,7 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_returns_reasoning_cell_when_feature_disabled() { fn reasoning_summary_block_returns_reasoning_cell_when_feature_disabled() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell = new_reasoning_summary_block("Detailed reasoning goes here.".to_string());
let cell = new_reasoning_summary_block(
"Detailed reasoning goes here.".to_string(),
reasoning_format,
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• Detailed reasoning goes here."]); assert_eq!(rendered, vec!["• Detailed reasoning goes here."]);
@@ -2519,17 +2506,9 @@ mod tests {
let mut config = test_config().await; let mut config = test_config().await;
config.model = Some("gpt-3.5-turbo".to_string()); config.model = Some("gpt-3.5-turbo".to_string());
config.model_supports_reasoning_summaries = Some(true); config.model_supports_reasoning_summaries = Some(true);
config.model_reasoning_summary_format = Some(ReasoningSummaryFormat::Experimental);
let model_family =
ModelsManager::construct_model_family_offline(&config.model.clone().unwrap(), &config);
assert_eq!(
model_family.reasoning_summary_format,
ReasoningSummaryFormat::Experimental
);
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(), "**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
model_family.reasoning_summary_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
@@ -2538,11 +2517,8 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_falls_back_when_header_is_missing() { fn reasoning_summary_block_falls_back_when_header_is_missing() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell =
let cell = new_reasoning_summary_block( new_reasoning_summary_block("**High level reasoning without closing".to_string());
"**High level reasoning without closing".to_string(),
reasoning_format,
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• **High level reasoning without closing"]); assert_eq!(rendered, vec!["• **High level reasoning without closing"]);
@@ -2550,18 +2526,14 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_falls_back_when_summary_is_missing() { fn reasoning_summary_block_falls_back_when_summary_is_missing() {
let reasoning_format = ReasoningSummaryFormat::Experimental; let cell =
let cell = new_reasoning_summary_block( new_reasoning_summary_block("**High level reasoning without closing**".to_string());
"**High level reasoning without closing**".to_string(),
reasoning_format.clone(),
);
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• High level reasoning without closing"]); assert_eq!(rendered, vec!["• High level reasoning without closing"]);
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level reasoning without closing**\n\n ".to_string(), "**High level reasoning without closing**\n\n ".to_string(),
reasoning_format,
); );
let rendered = render_transcript(cell.as_ref()); let rendered = render_transcript(cell.as_ref());
@@ -2570,10 +2542,8 @@ mod tests {
#[test] #[test]
fn reasoning_summary_block_splits_header_and_summary_when_present() { fn reasoning_summary_block_splits_header_and_summary_when_present() {
let reasoning_format = ReasoningSummaryFormat::Experimental;
let cell = new_reasoning_summary_block( let cell = new_reasoning_summary_block(
"**High level plan**\n\nWe should fix the bug next.".to_string(), "**High level plan**\n\nWe should fix the bug next.".to_string(),
reasoning_format,
); );
let rendered_display = render_lines(&cell.display_lines(80)); let rendered_display = render_lines(&cell.display_lines(80));
-1
View File
@@ -1060,7 +1060,6 @@ Valid values:
| `model_reasoning_summary` | `auto` \| `concise` \| `detailed` \| `none` | Reasoning summaries. | | `model_reasoning_summary` | `auto` \| `concise` \| `detailed` \| `none` | Reasoning summaries. |
| `model_verbosity` | `low` \| `medium` \| `high` | GPT‑5 text verbosity (Responses API). | | `model_verbosity` | `low` \| `medium` \| `high` | GPT‑5 text verbosity (Responses API). |
| `model_supports_reasoning_summaries` | boolean | Force‑enable reasoning summaries. | | `model_supports_reasoning_summaries` | boolean | Force‑enable reasoning summaries. |
| `model_reasoning_summary_format` | `none` \| `experimental` | Force reasoning summary format. |
| `chatgpt_base_url` | string | Base URL for ChatGPT auth flow. | | `chatgpt_base_url` | string | Base URL for ChatGPT auth flow. |
| `experimental_instructions_file` | string (path) | Replace built‑in instructions (experimental). | | `experimental_instructions_file` | string (path) | Replace built‑in instructions (experimental). |
| `experimental_use_exec_command_tool` | boolean | Use experimental exec command tool. | | `experimental_use_exec_command_tool` | boolean | Use experimental exec command tool. |
-3
View File
@@ -49,9 +49,6 @@ model_verbosity = "medium"
# Force-enable reasoning summaries for current model (default: false) # Force-enable reasoning summaries for current model (default: false)
model_supports_reasoning_summaries = false model_supports_reasoning_summaries = false
# Force reasoning summary format: none | experimental (default: none)
model_reasoning_summary_format = "none"
################################################################################ ################################################################################
# Instruction Overrides # Instruction Overrides
################################################################################ ################################################################################