Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions crates/adapter-smith/src/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down Expand Up @@ -1700,10 +1700,10 @@ pub fn resolve_model(params: &SessionStartParams) -> Result<ResolvedModel> {
/// error rather than silently picking a provider that isn't configured.
fn default_auto_detect_spec() -> Result<String> {
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());
Expand Down Expand Up @@ -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");
}
}
4 changes: 2 additions & 2 deletions crates/adapter-smith/src/interactive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -3451,7 +3451,7 @@ fn default_monitor_spec(provider_name: &str, minibuffer_model: &str) -> Option<S
// startup health-check falls back if an account lacks it.
"codex-oauth" => 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,
}
Expand Down
4 changes: 2 additions & 2 deletions crates/adapter-smith/src/provider/claude_oauth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions crates/daemon/src/availability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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()
Expand Down
8 changes: 4 additions & 4 deletions crates/daemon/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions crates/daemon/src/router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
20 changes: 15 additions & 5 deletions crates/protocol/src/slash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,13 +397,21 @@ pub fn popup_names() -> impl Iterator<Item = &'static str> {
/// 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",
"codex-oauth:gpt-5.5",
"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",
Expand All @@ -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",
Expand Down Expand Up @@ -487,8 +496,8 @@ pub fn models_for_provider(provider: &str) -> Vec<String> {
/// 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(),
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions docs/model-routing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` |
Expand Down Expand Up @@ -222,15 +222,15 @@ 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]
# Models each subscription login offers. Optional — the default list is
# 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"
```

Expand Down
4 changes: 2 additions & 2 deletions docs/smith.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`,
Expand Down
Loading