diff --git a/crates/adapter-smith/src/agent.rs b/crates/adapter-smith/src/agent.rs index 72f3394e..53876373 100644 --- a/crates/adapter-smith/src/agent.rs +++ b/crates/adapter-smith/src/agent.rs @@ -1663,8 +1663,8 @@ impl ResolvedModel { /// model name. Order of precedence: /// 1. `params.model` if provided. /// 2. `CONSTRUCT_SMITH_MODEL`. -/// 3. ANTHROPIC_API_KEY set → `claude-opus-4-8`. -/// 4. OPENAI_API_KEY set → `gpt-5`. +/// 3. ANTHROPIC_API_KEY set → `claude-opus-5`. +/// 4. OPENAI_API_KEY set → `gpt-6-astra`. /// 5. GEMINI_API_KEY (or GOOGLE_API_KEY) set → `gemini-2.5-pro`. /// 6. META_API_KEY (or MODEL_API_KEY) set → `muse-spark-1.1`. /// 7. DEEPSEEK_API_KEY set → `deepseek-v4-pro`. @@ -1700,10 +1700,10 @@ pub fn resolve_model(params: &SessionStartParams) -> Result { /// error rather than silently picking a provider that isn't configured. fn default_auto_detect_spec() -> Result { if std::env::var("ANTHROPIC_API_KEY").is_ok() { - return Ok("anthropic:claude-opus-4-8".to_string()); + return Ok("anthropic:claude-opus-5".to_string()); } if std::env::var("OPENAI_API_KEY").is_ok() { - return Ok("openai:gpt-5".to_string()); + return Ok("openai:gpt-6-astra".to_string()); } if std::env::var("GEMINI_API_KEY").is_ok() || std::env::var("GOOGLE_API_KEY").is_ok() { return Ok("gemini:gemini-2.5-pro".to_string()); @@ -2467,7 +2467,7 @@ mod tests { assert_eq!(deepseek_over_openrouter, "deepseek:deepseek-v4-pro"); assert_eq!(meta_only, "meta:muse-spark-1.1"); assert_eq!(gemini_over_meta, "gemini:gemini-2.5-pro"); - assert_eq!(openai_over_gemini, "openai:gpt-5"); - assert_eq!(anthropic_over_both, "anthropic:claude-opus-4-8"); + assert_eq!(openai_over_gemini, "openai:gpt-6-astra"); + assert_eq!(anthropic_over_both, "anthropic:claude-opus-5"); } } diff --git a/crates/adapter-smith/src/interactive.rs b/crates/adapter-smith/src/interactive.rs index 524b834f..0317a44e 100644 --- a/crates/adapter-smith/src/interactive.rs +++ b/crates/adapter-smith/src/interactive.rs @@ -1205,7 +1205,7 @@ mod tests { ); assert_eq!( default_monitor_spec("anthropic", "claude-opus-4-8").as_deref(), - Some("anthropic:claude-sonnet-4-5") + Some("anthropic:claude-sonnet-5") ); // Already-small minibuffer models → keep them (no downgrade). assert_eq!(default_monitor_spec("openai", "gpt-5-mini"), None); @@ -3451,7 +3451,7 @@ fn default_monitor_spec(provider_name: &str, minibuffer_model: &str) -> Option Some("codex-oauth:gpt-5.4-mini".to_string()), "openai" => Some("openai:gpt-5-mini".to_string()), - "anthropic" if !m.contains("sonnet") => Some("anthropic:claude-sonnet-4-5".to_string()), + "anthropic" if !m.contains("sonnet") => Some("anthropic:claude-sonnet-5".to_string()), // anthropic already on sonnet, or gemini/ollama/unknown → keep minibuffer's. _ => None, } diff --git a/crates/adapter-smith/src/provider/claude_oauth.rs b/crates/adapter-smith/src/provider/claude_oauth.rs index c92e5943..bfa6ac2d 100644 --- a/crates/adapter-smith/src/provider/claude_oauth.rs +++ b/crates/adapter-smith/src/provider/claude_oauth.rs @@ -397,8 +397,8 @@ mod tests { #[test] fn resolve_model_maps_aliases_and_passes_through() { - assert_eq!(resolve_model("opus"), "claude-opus-4-8"); - assert_eq!(resolve_model("sonnet"), "claude-sonnet-4-6"); + assert_eq!(resolve_model("opus"), "claude-opus-5"); + assert_eq!(resolve_model("sonnet"), "claude-sonnet-5"); assert_eq!(resolve_model("haiku"), "claude-haiku-4-5"); assert_eq!(resolve_model("fable"), "claude-fable-5-1"); // Concrete ids pass through untouched. diff --git a/crates/daemon/src/availability.rs b/crates/daemon/src/availability.rs index b33abf29..749b14f5 100644 --- a/crates/daemon/src/availability.rs +++ b/crates/daemon/src/availability.rs @@ -418,14 +418,14 @@ pub async fn smith_auth_methods( "anthropic_api_key", "Anthropic API key", "anthropic", - "claude-opus-4-8", + "claude-opus-5", &["ANTHROPIC_API_KEY"], ); let openai = env_key_method( "openai_api_key", "OpenAI API key", "openai", - "gpt-5", + "gpt-6-astra", &["OPENAI_API_KEY"], ); let gemini = env_key_method( @@ -468,7 +468,7 @@ pub async fn smith_auth_methods( id: "claude_subscription", label: "Claude subscription", model_prefix: "claude-oauth", - default_model: "claude-sonnet-4-6", + default_model: "claude-sonnet-5", available: claude_sub_present, detail: if claude_sub_present { "Claude Code credentials found".to_string() diff --git a/crates/daemon/src/config.rs b/crates/daemon/src/config.rs index c7b1a4da..a505659c 100644 --- a/crates/daemon/src/config.rs +++ b/crates/daemon/src/config.rs @@ -226,8 +226,8 @@ enabled = true # Every direct-API-key provider below is BUILT IN: export its key and it is # already a route target, with nothing to declare here (spec 0179). # -# ANTHROPIC_API_KEY -> anthropic (claude-opus-4-8) -# OPENAI_API_KEY -> openai (gpt-5) +# ANTHROPIC_API_KEY -> anthropic (claude-opus-5) +# OPENAI_API_KEY -> openai (gpt-6-astra) # GEMINI_API_KEY / GOOGLE_API_KEY-> gemini (gemini-2.5-pro) # META_API_KEY / MODEL_API_KEY -> meta (muse-spark-1.1) # GROK_API_KEY / XAI_API_KEY -> grok (grok-4.6) @@ -747,14 +747,14 @@ pub const BUILTIN_TARGETS: &[BuiltinTarget] = &[ provider: "anthropic", base_url: "https://api.anthropic.com/v1", key_envs: &["ANTHROPIC_API_KEY"], - default_model: "claude-opus-4-8", + default_model: "claude-opus-5", }, BuiltinTarget { route: "openai", provider: "openai", base_url: "https://api.openai.com/v1", key_envs: &["OPENAI_API_KEY"], - default_model: "gpt-5", + default_model: "gpt-6-astra", }, BuiltinTarget { route: "gemini", diff --git a/crates/daemon/src/router.rs b/crates/daemon/src/router.rs index d5becd68..8b9018bd 100644 --- a/crates/daemon/src/router.rs +++ b/crates/daemon/src/router.rs @@ -3992,8 +3992,8 @@ mod tests { r.attach_session("s1", "codex", None).unwrap(); let cases = [ - ("sonnet", "claude-sonnet-4-6"), - ("opus", "claude-opus-4-8"), + ("sonnet", "claude-sonnet-5"), + ("opus", "claude-opus-5"), ("fable", "claude-fable-5-1"), ]; for (alias, concrete) in cases { diff --git a/crates/protocol/src/slash.rs b/crates/protocol/src/slash.rs index e4b0a936..47ed4124 100644 --- a/crates/protocol/src/slash.rs +++ b/crates/protocol/src/slash.rs @@ -397,6 +397,10 @@ pub fn popup_names() -> impl Iterator { /// models that are not listed here yet. pub const MODEL_COMPLETIONS: &[&str] = &[ // ChatGPT subscription / Codex CLI OAuth path. + "codex-oauth:gpt-6-astra", + "codex-oauth:gpt-6.1-sol", + "codex-oauth:gpt-6-sol", + "codex-oauth:gpt-6-luna", "codex-oauth:gpt-5.6-sol", "codex-oauth:gpt-5.6-terra", "codex-oauth:gpt-5.6-luna", @@ -404,6 +408,10 @@ pub const MODEL_COMPLETIONS: &[&str] = &[ "codex-oauth:gpt-5.4-mini", "codex-oauth:gpt-5.3-codex-spark", // OpenAI platform API path. + "openai:gpt-6-astra", + "openai:gpt-6.1-sol", + "openai:gpt-6-sol", + "openai:gpt-6-luna", "openai:gpt-5.6-sol", "openai:gpt-5.6-terra", "openai:gpt-5.6-luna", @@ -415,6 +423,7 @@ pub const MODEL_COMPLETIONS: &[&str] = &[ "claude-oauth:opus", "claude-oauth:fable", // Anthropic API path. + "anthropic:claude-opus-5", "anthropic:claude-sonnet-5", "anthropic:claude-fable-5-1", "anthropic:claude-fable-5", @@ -487,8 +496,8 @@ pub fn models_for_provider(provider: &str) -> Vec { /// alias cannot be wired on one side and forgotten on the other. pub fn resolve_claude_oauth_model(model: &str) -> String { match model.trim() { - "opus" => "claude-opus-4-8".to_string(), - "sonnet" => "claude-sonnet-4-6".to_string(), + "opus" => "claude-opus-5".to_string(), + "sonnet" => "claude-sonnet-5".to_string(), "haiku" => "claude-haiku-4-5".to_string(), "fable" => "claude-fable-5-1".to_string(), other => other.to_string(), @@ -627,6 +636,7 @@ mod tests { assert_eq!( models_for_provider("anthropic"), vec![ + "claude-opus-5", "claude-sonnet-5", "claude-fable-5-1", "claude-fable-5", @@ -665,15 +675,15 @@ mod tests { #[test] fn claude_oauth_aliases_expand_to_concrete_anthropic_ids() { - assert_eq!(resolve_claude_oauth_model("sonnet"), "claude-sonnet-4-6"); - assert_eq!(resolve_claude_oauth_model("opus"), "claude-opus-4-8"); + assert_eq!(resolve_claude_oauth_model("sonnet"), "claude-sonnet-5"); + assert_eq!(resolve_claude_oauth_model("opus"), "claude-opus-5"); assert_eq!(resolve_claude_oauth_model("haiku"), "claude-haiku-4-5"); assert_eq!(resolve_claude_oauth_model("fable"), "claude-fable-5-1"); assert_eq!( resolve_claude_oauth_model("claude-sonnet-4-6"), "claude-sonnet-4-6" ); - assert_eq!(resolve_claude_oauth_model(" sonnet "), "claude-sonnet-4-6"); + assert_eq!(resolve_claude_oauth_model(" sonnet "), "claude-sonnet-5"); } /// The leak fix in action: a `/zoom` ClientCommand event is hidden from diff --git a/docs/model-routing.md b/docs/model-routing.md index bba640e3..183ef99c 100644 --- a/docs/model-routing.md +++ b/docs/model-routing.md @@ -33,8 +33,8 @@ A target is somewhere the router can send a model request: | Key | Route | Default model | | :--- | :--- | :--- | - | `ANTHROPIC_API_KEY` | `anthropic` | `claude-opus-4-8` | - | `OPENAI_API_KEY` | `openai` | `gpt-5` | + | `ANTHROPIC_API_KEY` | `anthropic` | `claude-opus-5` | + | `OPENAI_API_KEY` | `openai` | `gpt-6-astra` | | `GEMINI_API_KEY` / `GOOGLE_API_KEY` | `gemini` | `gemini-2.5-pro` | | `META_API_KEY` / `MODEL_API_KEY` | `meta` | `muse-spark-1.1` | | `GROK_API_KEY` / `XAI_API_KEY` | `grok` | `grok-4.6` | @@ -222,7 +222,7 @@ publish_models = true # default; false keeps redirects, stops augmenting pick # spawn_agent; this list chooses that roster. featured_models = [ "claude-oauth/opus", - "codex-oauth/gpt-5.6-sol", + "codex-oauth/gpt-6-sol", ] [router.oauth] @@ -230,7 +230,7 @@ featured_models = [ # the same curated one behind smith's /model completion. One string pins # a single model; a list becomes the picker's second step. claude-oauth = ["opus", "sonnet"] -codex-oauth = ["gpt-5.6-sol", "gpt-5.5"] +codex-oauth = ["gpt-6-sol", "gpt-5.5"] grok-oauth = "grok-4.6" ``` diff --git a/docs/smith.md b/docs/smith.md index 7585571b..8b097c92 100644 --- a/docs/smith.md +++ b/docs/smith.md @@ -95,8 +95,8 @@ CLI uses. Models: `k3`, `k3-256k`, `kimi-for-coding`, `kimi-for-coding-highspeed`. If you don't pass a model and `CONSTRUCT_SMITH_MODEL` isn't set, smith -picks: `ANTHROPIC_API_KEY` → `claude-opus-4-8`, else `OPENAI_API_KEY` -→ `gpt-5`, else `GEMINI_API_KEY` (or `GOOGLE_API_KEY`) → +picks: `ANTHROPIC_API_KEY` → `claude-opus-5`, else `OPENAI_API_KEY` +→ `gpt-6-astra`, else `GEMINI_API_KEY` (or `GOOGLE_API_KEY`) → `gemini-2.5-pro`, else `META_API_KEY` (or `MODEL_API_KEY`) → `muse-spark-1.1`, else `DEEPSEEK_API_KEY` → `deepseek-v4-pro`, else `OPENROUTER_API_KEY` → `openrouter/auto`,