diff --git a/codex-rs/core/tests/suite/personality.rs b/codex-rs/core/tests/suite/personality.rs index 4c51253085..876c4a6edc 100644 --- a/codex-rs/core/tests/suite/personality.rs +++ b/codex-rs/core/tests/suite/personality.rs @@ -114,7 +114,7 @@ async fn base_instructions_override_disables_personality_template() { config.base_instructions = Some("override instructions".to_string()); let model_info = - codex_core::test_support::construct_model_info_offline("gpt-5.3-codex", &config); + codex_core::test_support::construct_model_info_offline("exp-codex-personality", &config); assert_eq!(model_info.model_messages, None); assert_eq!(model_info.get_model_instructions(config.personality), ""); @@ -443,7 +443,7 @@ async fn user_turn_personality_same_value_does_not_add_update_message() -> anyho } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn instructions_are_empty_if_feature_disabled() -> anyhow::Result<()> { +async fn instructions_use_default_if_feature_disabled() -> anyhow::Result<()> { let codex_home = TempDir::new().expect("create temp dir"); let mut config = load_default_config_for_test(&codex_home).await; config @@ -453,8 +453,13 @@ async fn instructions_are_empty_if_feature_disabled() -> anyhow::Result<()> { config.personality = Some(Personality::Friendly); let model_info = - codex_core::test_support::construct_model_info_offline("gpt-5.3-codex", &config); - assert_eq!(model_info.get_model_instructions(config.personality), ""); + codex_core::test_support::construct_model_info_offline("exp-codex-personality", &config); + let default_instructions = model_info.get_model_instructions(/*personality*/ None); + assert!(!default_instructions.is_empty()); + assert_eq!( + model_info.get_model_instructions(config.personality), + default_instructions + ); Ok(()) } @@ -512,6 +517,11 @@ async fn user_turn_personality_skips_if_feature_disabled() -> anyhow::Result<()> let requests = resp_mock.requests(); assert_eq!(requests.len(), 2, "expected two requests"); + assert!(!requests[0].instructions_text().is_empty()); + assert_eq!( + requests[0].instructions_text(), + requests[1].instructions_text() + ); let request = requests .last() .expect("expected personality update request"); diff --git a/codex-rs/models-manager/src/model_info.rs b/codex-rs/models-manager/src/model_info.rs index a0bd8ea8dd..1fb7b6e9c8 100644 --- a/codex-rs/models-manager/src/model_info.rs +++ b/codex-rs/models-manager/src/model_info.rs @@ -52,8 +52,19 @@ pub fn with_config_overrides(mut model: ModelInfo, config: &ModelsManagerConfig) }; } - if config.base_instructions.is_some() || !config.personality_enabled { + if config.base_instructions.is_some() { model.model_messages = None; + } else if !config.personality_enabled + && let Some(model_messages) = model.model_messages.as_mut() + { + let personality_default = model_messages + .get_personality_message(/*personality*/ None) + .unwrap_or_default(); + if let Some(instructions_template) = model_messages.instructions_template.as_mut() { + *instructions_template = + instructions_template.replace(PERSONALITY_PLACEHOLDER, &personality_default); + } + model_messages.instructions_variables = None; } model diff --git a/codex-rs/models-manager/src/model_info_tests.rs b/codex-rs/models-manager/src/model_info_tests.rs index a77c2e5f70..382a601e58 100644 --- a/codex-rs/models-manager/src/model_info_tests.rs +++ b/codex-rs/models-manager/src/model_info_tests.rs @@ -90,8 +90,16 @@ fn base_instructions_override_disables_model_messages() { } #[test] -fn disabled_personality_clears_model_messages() { - let model = model_info_from_slug("gpt-5.2-codex"); +fn disabled_personality_uses_default_model_messages() { + let mut model = model_info_from_slug("gpt-5.2-codex"); + model + .model_messages + .as_mut() + .expect("model messages") + .instructions_variables + .as_mut() + .expect("instruction variables") + .personality_default = Some("default personality".to_string()); let config = ModelsManagerConfig { personality_enabled: false, ..Default::default() @@ -99,7 +107,12 @@ fn disabled_personality_clears_model_messages() { let updated = with_config_overrides(model.clone(), &config); let mut expected = model; - expected.model_messages = None; + expected.model_messages = Some(ModelMessages { + instructions_template: Some(format!( + "{DEFAULT_PERSONALITY_HEADER}\n\ndefault personality\n\n{BASE_INSTRUCTIONS}" + )), + instructions_variables: None, + }); assert_eq!(updated, expected); }