remove model_family from `config (#7571)

- Remove `model_family` from `config`
- Make sure to still override config elements related to `model_family`
like supporting reasoning
This commit is contained in:
Ahmed Ibrahim authored and GitHub committed 2025-12-04 11:57:58 -08:00
1 parent ce0b38c056
commit 9b2055586d
18 files changed
+339 -158

No files matched your search

+1 -5
View File
@@ -26,7 +26,6 @@ use codex_core::ConversationManager;
use codex_core::config::Config;
use codex_core::config::edit::ConfigEditsBuilder;
use codex_core::features::Feature;
use codex_core::openai_models::model_family::find_family_for_model;
use codex_core::openai_models::model_presets::HIDE_GPT_5_1_CODEX_MAX_MIGRATION_PROMPT_CONFIG;
use codex_core::openai_models::model_presets::HIDE_GPT5_1_MIGRATION_PROMPT_CONFIG;
use codex_core::openai_models::models_manager::ModelsManager;
@@ -162,7 +161,6 @@ async fn handle_model_migration_prompt_if_needed(
migration_config: migration_config_key.to_string(),
});
config.model = target_model.to_string();
config.model_family = find_family_for_model(&target_model);
let mapped_effort = if let Some(reasoning_effort_mapping) = reasoning_effort_mapping
&& let Some(reasoning_effort) = config.model_reasoning_effort
@@ -680,9 +678,7 @@ impl App {
}
AppEvent::UpdateModel(model) => {
self.chat_widget.set_model(&model);
self.config.model = model.clone();
let family = find_family_for_model(&model);
self.config.model_family = family;
self.config.model = model;
}
AppEvent::OpenReasoningPopup { model } => {
self.chat_widget.open_reasoning_popup(model);
+4 -1
View File
@@ -465,10 +465,13 @@ impl ChatWidget {
fn on_agent_reasoning_final(&mut self) {
// At the end of a reasoning block, record transcript-only content.
self.full_reasoning_buffer.push_str(&self.reasoning_buffer);
let model_family = self
.models_manager
.construct_model_family(&self.config.model, &self.config);
if !self.full_reasoning_buffer.is_empty() {
let cell = history_cell::new_reasoning_summary_block(
self.full_reasoning_buffer.clone(),
&self.config,
&model_family,
);
self.add_boxed_history(cell);
}
+49 -22
View File
@@ -27,6 +27,7 @@ use codex_common::format_env_display::format_env_display;
use codex_core::config::Config;
use codex_core::config::types::McpServerTransportConfig;
use codex_core::config::types::ReasoningSummaryFormat;
use codex_core::openai_models::model_family::ModelFamily;
use codex_core::protocol::FileChange;
use codex_core::protocol::McpAuthStatus;
use codex_core::protocol::McpInvocation;
@@ -1420,9 +1421,9 @@ pub(crate) fn new_view_image_tool_call(path: PathBuf, cwd: &Path) -> PlainHistor
pub(crate) fn new_reasoning_summary_block(
full_reasoning_buffer: String,
config: &Config,
model_family: &ModelFamily,
) -> Box<dyn HistoryCell> {
if config.model_family.reasoning_summary_format == ReasoningSummaryFormat::Experimental {
if model_family.reasoning_summary_format == ReasoningSummaryFormat::Experimental {
// Experimental format is following:
// ** header **
//
@@ -1517,12 +1518,15 @@ mod tests {
use codex_core::config::ConfigToml;
use codex_core::config::types::McpServerConfig;
use codex_core::config::types::McpServerTransportConfig;
use codex_core::openai_models::models_manager::ModelsManager;
use codex_core::protocol::McpAuthStatus;
use codex_login::AuthMode;
use codex_protocol::parse_command::ParsedCommand;
use dirs::home_dir;
use pretty_assertions::assert_eq;
use serde_json::json;
use std::collections::HashMap;
use std::sync::Arc;
use codex_core::protocol::ExecCommandSource;
use mcp_types::CallToolResult;
@@ -2320,12 +2324,12 @@ mod tests {
}
#[test]
fn reasoning_summary_block() {
let mut config = test_config();
config.model_family.reasoning_summary_format = ReasoningSummaryFormat::Experimental;
let config = test_config();
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
&config,
&model_family,
);
let rendered_display = render_lines(&cell.display_lines(80));
@@ -2337,24 +2341,47 @@ mod tests {
#[test]
fn reasoning_summary_block_returns_reasoning_cell_when_feature_disabled() {
let mut config = test_config();
config.model_family.reasoning_summary_format = ReasoningSummaryFormat::Experimental;
let config = test_config();
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
let cell =
new_reasoning_summary_block("Detailed reasoning goes here.".to_string(), &config);
new_reasoning_summary_block("Detailed reasoning goes here.".to_string(), &model_family);
let rendered = render_transcript(cell.as_ref());
assert_eq!(rendered, vec!["• Detailed reasoning goes here."]);
}
#[test]
fn reasoning_summary_block_falls_back_when_header_is_missing() {
fn reasoning_summary_block_respects_config_overrides() {
let mut config = test_config();
config.model_family.reasoning_summary_format = ReasoningSummaryFormat::Experimental;
config.model = "gpt-3.5-turbo".to_string();
config.model_supports_reasoning_summaries = Some(true);
config.model_reasoning_summary_format = Some(ReasoningSummaryFormat::Experimental);
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
assert_eq!(
model_family.reasoning_summary_format,
ReasoningSummaryFormat::Experimental
);
let cell = new_reasoning_summary_block(
"**High level reasoning**\n\nDetailed reasoning goes here.".to_string(),
&model_family,
);
let rendered_display = render_lines(&cell.display_lines(80));
assert_eq!(rendered_display, vec!["• Detailed reasoning goes here."]);
}
#[test]
fn reasoning_summary_block_falls_back_when_header_is_missing() {
let config = test_config();
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
let cell = new_reasoning_summary_block(
"**High level reasoning without closing".to_string(),
&config,
&model_family,
);
let rendered = render_transcript(cell.as_ref());
@@ -2363,12 +2390,12 @@ mod tests {
#[test]
fn reasoning_summary_block_falls_back_when_summary_is_missing() {
let mut config = test_config();
config.model_family.reasoning_summary_format = ReasoningSummaryFormat::Experimental;
let config = test_config();
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
let cell = new_reasoning_summary_block(
"**High level reasoning without closing**".to_string(),
&config,
&model_family,
);
let rendered = render_transcript(cell.as_ref());
@@ -2376,7 +2403,7 @@ mod tests {
let cell = new_reasoning_summary_block(
"**High level reasoning without closing**\n\n ".to_string(),
&config,
&model_family,
);
let rendered = render_transcript(cell.as_ref());
@@ -2385,12 +2412,12 @@ mod tests {
#[test]
fn reasoning_summary_block_splits_header_and_summary_when_present() {
let mut config = test_config();
config.model_family.reasoning_summary_format = ReasoningSummaryFormat::Experimental;
let config = test_config();
let models_manager = Arc::new(ModelsManager::new(Some(AuthMode::ApiKey)));
let model_family = models_manager.construct_model_family(&config.model, &config);
let cell = new_reasoning_summary_block(
"**High level plan**\n\nWe should fix the bug next.".to_string(),
&config,
&model_family,
);
let rendered_display = render_lines(&cell.display_lines(80));