From 3f36ea91e30fadaba49298bc066ce1af439d6664 Mon Sep 17 00:00:00 2001 From: ychhabria Date: Mon, 23 Mar 2026 23:36:03 -0700 Subject: [PATCH] Add codex-exp-2 tuned CLI entrypoint --- codex-rs/cli/Cargo.toml | 4 +++ codex-rs/cli/src/main.rs | 67 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index a7e88cd1b4..5f62bc48e6 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -8,6 +8,10 @@ license.workspace = true name = "codex" path = "src/main.rs" +[[bin]] +name = "codex-exp-2" +path = "src/main.rs" + [lib] name = "codex_cli" path = "src/lib.rs" diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 698035feaf..8e00c6bb79 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -31,6 +31,7 @@ use codex_tui::update_action::UpdateAction; use codex_utils_cli::CliConfigOverrides; use owo_colors::OwoColorize; use std::io::IsTerminal; +use std::path::Path; use std::path::PathBuf; use supports_color::Stream; @@ -84,6 +85,15 @@ struct MultitoolCli { subcommand: Option, } +const CODEX_EXP_2_BIN_NAME: &str = "codex-exp-2"; +const CODEX_EXP_2_DEFAULT_OVERRIDES: [&str; 5] = [ + r#"model="gpt-5.4""#, + r#"model_reasoning_effort="xhigh""#, + r#"service_tier="fast""#, + "agents.max_threads=16", + "agents.max_depth=3", +]; + #[derive(Debug, clap::Subcommand)] enum Subcommand { /// Run Codex non-interactively. @@ -607,6 +617,11 @@ async fn cli_main(arg0_paths: Arg0DispatchPaths) -> anyhow::Result<()> { subcommand, } = MultitoolCli::parse(); + prepend_bin_tuned_defaults( + &mut root_config_overrides, + current_invocation_name().as_deref(), + ); + // Fold --enable/--disable into config overrides so they flow to all subcommands. let toggle_overrides = feature_toggles.to_overrides()?; root_config_overrides.raw_overrides.extend(toggle_overrides); @@ -1045,6 +1060,28 @@ fn prepend_config_flags( .splice(0..0, cli_config_overrides.raw_overrides); } +fn current_invocation_name() -> Option { + std::env::args_os() + .next() + .and_then(|arg0| Path::new(&arg0).file_stem()?.to_str().map(str::to_owned)) +} + +fn prepend_bin_tuned_defaults( + root_config_overrides: &mut CliConfigOverrides, + invocation_name: Option<&str>, +) { + if invocation_name != Some(CODEX_EXP_2_BIN_NAME) { + return; + } + + root_config_overrides.raw_overrides.splice( + 0..0, + CODEX_EXP_2_DEFAULT_OVERRIDES + .into_iter() + .map(ToString::to_string), + ); +} + fn reject_remote_mode_for_subcommand(remote: Option<&str>, subcommand: &str) -> anyhow::Result<()> { if let Some(remote) = remote { anyhow::bail!( @@ -1774,4 +1811,34 @@ mod tests { .expect_err("feature should be rejected"); assert_eq!(err.to_string(), "Unknown feature flag: does_not_exist"); } + + #[test] + fn exp_2_defaults_apply_only_for_exp_2_bin() { + let mut overrides = CliConfigOverrides::default(); + prepend_bin_tuned_defaults(&mut overrides, Some("codex-exp-2")); + assert_eq!( + overrides.raw_overrides, + CODEX_EXP_2_DEFAULT_OVERRIDES.map(str::to_string).to_vec() + ); + + let mut regular_overrides = CliConfigOverrides::default(); + prepend_bin_tuned_defaults(&mut regular_overrides, Some("codex")); + assert!(regular_overrides.raw_overrides.is_empty()); + } + + #[test] + fn exp_2_defaults_stay_lower_precedence_than_user_overrides() { + let mut overrides = CliConfigOverrides { + raw_overrides: vec!["agents.max_threads=99".to_string()], + }; + prepend_bin_tuned_defaults(&mut overrides, Some("codex-exp-2")); + assert_eq!( + overrides.raw_overrides, + CODEX_EXP_2_DEFAULT_OVERRIDES + .map(str::to_string) + .into_iter() + .chain(std::iter::once("agents.max_threads=99".to_string())) + .collect::>() + ); + } }