diff --git a/docs/user-manual/en/4-proxy/4.4-usage.md b/docs/user-manual/en/4-proxy/4.4-usage.md index 4f1c6ad50..f52cf9988 100644 --- a/docs/user-manual/en/4-proxy/4.4-usage.md +++ b/docs/user-manual/en/4-proxy/4.4-usage.md @@ -243,6 +243,8 @@ CC Switch includes preset official prices for common models (per million tokens) | Model | Input | Output | Cache Read | Cache Creation | |-------|-------|--------|------------|----------------| +| **Claude 4.8 Series** | | | | | +| claude-opus-4-8 | $5 | $25 | $0.50 | $6.25 | | **Claude 4.5 Series** | | | | | | claude-opus-4-5 | $5 | $25 | $0.50 | $6.25 | | claude-sonnet-4-5 | $3 | $15 | $0.30 | $3.75 | diff --git a/docs/user-manual/ja/4-proxy/4.4-usage.md b/docs/user-manual/ja/4-proxy/4.4-usage.md index 8a229c900..dd8e659b5 100644 --- a/docs/user-manual/ja/4-proxy/4.4-usage.md +++ b/docs/user-manual/ja/4-proxy/4.4-usage.md @@ -243,6 +243,8 @@ CC Switch は一般的なモデルの公式価格(100 万 Token あたり) | モデル | 入力 | 出力 | キャッシュ読取 | キャッシュ作成 | |------|------|------|----------|----------| +| **Claude 4.8 シリーズ** | | | | | +| claude-opus-4-8 | $5 | $25 | $0.50 | $6.25 | | **Claude 4.5 シリーズ** | | | | | | claude-opus-4-5 | $5 | $25 | $0.50 | $6.25 | | claude-sonnet-4-5 | $3 | $15 | $0.30 | $3.75 | diff --git a/docs/user-manual/zh/4-proxy/4.4-usage.md b/docs/user-manual/zh/4-proxy/4.4-usage.md index c8ad42276..e7181159a 100644 --- a/docs/user-manual/zh/4-proxy/4.4-usage.md +++ b/docs/user-manual/zh/4-proxy/4.4-usage.md @@ -243,6 +243,8 @@ CC Switch 预设了常用模型的官方价格(每百万 Token)。v3.13.0 | 模型 | 输入 | 输出 | 缓存读取 | 缓存创建 | |------|------|------|----------|----------| +| **Claude 4.8 系列** | | | | | +| claude-opus-4-8 | $5 | $25 | $0.50 | $6.25 | | **Claude 4.5 系列** | | | | | | claude-opus-4-5 | $5 | $25 | $0.50 | $6.25 | | claude-sonnet-4-5 | $3 | $15 | $0.30 | $3.75 | diff --git a/src-tauri/src/claude_desktop_config.rs b/src-tauri/src/claude_desktop_config.rs index fec2cd09f..2e2c15ceb 100644 --- a/src-tauri/src/claude_desktop_config.rs +++ b/src-tauri/src/claude_desktop_config.rs @@ -32,6 +32,9 @@ pub const ANTHROPIC_CLAUDE_ROUTE_PREFIX: &str = "anthropic/claude-"; /// Claude Desktop schema 不接受此后缀,import 边界翻译为 `supports1m` 字段。 pub const ONE_M_CONTEXT_MARKER: &str = "[1m]"; +const CURRENT_OPUS_ROUTE_ID: &str = "claude-opus-4-8"; +const LEGACY_OPUS_ROUTE_ID: &str = "claude-opus-4-7"; + const NON_ANTHROPIC_ROUTE_MARKERS: &[&str] = &[ "ark-code", "astron", @@ -87,7 +90,7 @@ pub const DEFAULT_PROXY_ROUTES: &[ClaudeDesktopDefaultRoute] = &[ supports_1m: true, }, ClaudeDesktopDefaultRoute { - route_id: "claude-opus-4-7", + route_id: CURRENT_OPUS_ROUTE_ID, env_key: "ANTHROPIC_DEFAULT_OPUS_MODEL", supports_1m: true, }, @@ -710,7 +713,11 @@ pub fn map_proxy_request_model(mut body: Value, provider: &Provider) -> Result Result bool { + matches!( + (route_id, requested), + (CURRENT_OPUS_ROUTE_ID, LEGACY_OPUS_ROUTE_ID) + | (LEGACY_OPUS_ROUTE_ID, CURRENT_OPUS_ROUTE_ID) + ) +} + fn should_normalize_mimo_anthropic_thinking_history( provider: &Provider, upstream_model: &str, @@ -1520,9 +1535,55 @@ mod tests { assert_eq!(models["data"][0]["id"], json!("claude-sonnet-4-6")); assert_eq!(models["data"][0]["supports1m"], json!(true)); - let err = map_proxy_request_model(json!({"model": "claude-opus-4-7"}), &provider) + let err = map_proxy_request_model(json!({"model": "claude-opus-4-8"}), &provider) .expect_err("unknown route should fail"); - assert!(err.to_string().contains("claude-opus-4-7")); + assert!(err.to_string().contains("claude-opus-4-8")); + } + + #[test] + fn claude_desktop_proxy_accepts_opus_4_7_4_8_alias_during_rollout() { + let mut provider = proxy_provider("proxy"); + let current_routes = std::collections::HashMap::from([( + "claude-opus-4-8".to_string(), + ClaudeDesktopModelRoute { + model: "upstream-opus-new".to_string(), + label_override: None, + supports_1m: Some(true), + }, + )]); + provider + .meta + .as_mut() + .expect("meta") + .claude_desktop_model_routes = current_routes; + + let mapped = map_proxy_request_model( + json!({"model": "claude-opus-4-7", "messages": []}), + &provider, + ) + .expect("legacy Opus route should map to current route"); + assert_eq!(mapped["model"], json!("upstream-opus-new")); + + let legacy_routes = std::collections::HashMap::from([( + "claude-opus-4-7".to_string(), + ClaudeDesktopModelRoute { + model: "upstream-opus-legacy".to_string(), + label_override: None, + supports_1m: Some(true), + }, + )]); + provider + .meta + .as_mut() + .expect("meta") + .claude_desktop_model_routes = legacy_routes; + + let mapped = map_proxy_request_model( + json!({"model": "claude-opus-4-8", "messages": []}), + &provider, + ) + .expect("current Opus route should map to legacy saved route"); + assert_eq!(mapped["model"], json!("upstream-opus-legacy")); } #[test] @@ -1652,12 +1713,12 @@ mod tests { .iter() .find(|route| route.upstream_model == "deepseek-v4-pro") .expect("repaired route"); - assert_eq!(repaired.route_id, "claude-opus-4-7"); + assert_eq!(repaired.route_id, "claude-opus-4-8"); assert_eq!(repaired.label_override.as_deref(), Some("deepseek-v4-pro")); assert!(repaired.supports_1m); let mapped = map_proxy_request_model( - json!({"model": "claude-opus-4-7", "messages": []}), + json!({"model": "claude-opus-4-8", "messages": []}), &provider, ) .expect("map repaired route"); diff --git a/src-tauri/src/commands/provider.rs b/src-tauri/src/commands/provider.rs index ab55167b9..815c19e94 100644 --- a/src-tauri/src/commands/provider.rs +++ b/src-tauri/src/commands/provider.rs @@ -907,7 +907,7 @@ mod import_claude_desktop_tests { let routes = suggested_claude_desktop_routes(&p).expect("routes built"); assert_eq!(routes.len(), 3); assert_eq!(routes.get("claude-sonnet-4-6").unwrap().model, "GLM-4.6"); - assert_eq!(routes.get("claude-opus-4-7").unwrap().model, "GLM-4-Air"); + assert_eq!(routes.get("claude-opus-4-8").unwrap().model, "GLM-4-Air"); assert_eq!(routes.get("claude-haiku-4-5").unwrap().model, "GLM-4-Flash"); assert_eq!( routes diff --git a/src-tauri/src/database/schema.rs b/src-tauri/src/database/schema.rs index d28ccdca5..f6df634bb 100644 --- a/src-tauri/src/database/schema.rs +++ b/src-tauri/src/database/schema.rs @@ -1205,6 +1205,15 @@ impl Database { /// 注意: model_id 使用短横线格式(如 claude-haiku-4-5),与 API 返回的模型名称标准化后一致 fn seed_model_pricing(conn: &Connection) -> Result<(), AppError> { let pricing_data = [ + // Claude 4.8 系列 + ( + "claude-opus-4-8", + "Claude Opus 4.8", + "5", + "25", + "0.50", + "6.25", + ), // Claude 4.7 系列 ( "claude-opus-4-7", diff --git a/src-tauri/src/deeplink/provider.rs b/src-tauri/src/deeplink/provider.rs index 6235c1f85..84f467cd0 100644 --- a/src-tauri/src/deeplink/provider.rs +++ b/src-tauri/src/deeplink/provider.rs @@ -805,7 +805,7 @@ mod tests { name: Some("MyHermes".to_string()), endpoint: Some("https://api.example.com/v1".to_string()), api_key: Some("sk-test".to_string()), - model: Some("anthropic/claude-opus-4-7".to_string()), + model: Some("anthropic/claude-opus-4-8".to_string()), ..Default::default() } } @@ -827,7 +827,7 @@ mod tests { // models array with the deeplink model id let models = obj.get("models").unwrap().as_array().unwrap(); assert_eq!(models.len(), 1); - assert_eq!(models[0]["id"], "anthropic/claude-opus-4-7"); + assert_eq!(models[0]["id"], "anthropic/claude-opus-4-8"); } #[test] diff --git a/src-tauri/src/hermes_config.rs b/src-tauri/src/hermes_config.rs index 30f24267c..cba95617d 100644 --- a/src-tauri/src/hermes_config.rs +++ b/src-tauri/src/hermes_config.rs @@ -7,7 +7,7 @@ //! //! ```yaml //! model: -//! default: "anthropic/claude-opus-4-7" +//! default: "anthropic/claude-opus-4-8" //! provider: "openrouter" //! base_url: "https://openrouter.ai/api/v1" //! @@ -19,9 +19,9 @@ //! - name: openrouter //! base_url: https://openrouter.ai/api/v1 //! api_key: sk-or-... -//! model: anthropic/claude-opus-4-7 +//! model: anthropic/claude-opus-4-8 //! models: -//! anthropic/claude-opus-4-7: +//! anthropic/claude-opus-4-8: //! context_length: 200000 //! //! mcp_servers: @@ -185,7 +185,7 @@ fn find_yaml_section_range(raw: &str, section_key: &str) -> Option<(usize, usize /// /// ```yaml /// model: -/// default: "anthropic/claude-opus-4-7" +/// default: "anthropic/claude-opus-4-8" /// provider: "openrouter" /// ``` fn serialize_yaml_section(key: &str, value: &serde_yaml::Value) -> Result { @@ -1219,7 +1219,7 @@ agent: let mut m = serde_yaml::Mapping::new(); m.insert( serde_yaml::Value::String("default".to_string()), - serde_yaml::Value::String("claude-opus-4-7".to_string()), + serde_yaml::Value::String("claude-opus-4-8".to_string()), ); m.insert( serde_yaml::Value::String("provider".to_string()), @@ -1233,7 +1233,7 @@ agent: assert!(result.contains("agent:")); assert!(result.contains("max_turns")); // And the model section should be updated - assert!(result.contains("claude-opus-4-7")); + assert!(result.contains("claude-opus-4-8")); assert!(result.contains("anthropic")); assert!(!result.contains("gpt-4")); assert!(!result.contains("openai")); @@ -1517,7 +1517,7 @@ custom_providers: assert!(get_model_config().unwrap().is_none()); let model = HermesModelConfig { - default: Some("anthropic/claude-opus-4-7".to_string()), + default: Some("anthropic/claude-opus-4-8".to_string()), provider: Some("openrouter".to_string()), base_url: Some("https://openrouter.ai/api/v1".to_string()), context_length: Some(200000), @@ -1529,7 +1529,7 @@ custom_providers: let read_model = get_model_config().unwrap().unwrap(); assert_eq!( read_model.default.as_deref(), - Some("anthropic/claude-opus-4-7") + Some("anthropic/claude-opus-4-8") ); assert_eq!(read_model.provider.as_deref(), Some("openrouter")); assert_eq!(read_model.context_length, Some(200000)); diff --git a/src-tauri/src/proxy/providers/copilot_model_map.rs b/src-tauri/src/proxy/providers/copilot_model_map.rs index e4ca4355d..fb3570535 100644 --- a/src-tauri/src/proxy/providers/copilot_model_map.rs +++ b/src-tauri/src/proxy/providers/copilot_model_map.rs @@ -324,14 +324,14 @@ mod tests { #[test] fn resolve_falls_back_to_highest_family_version() { - // 用户请求 opus 4.7 但 Copilot 账号只有 opus 4.6 + // 用户请求 opus 4.8 但 Copilot 账号只有 opus 4.6 let models = vec![ model("claude-opus-4.5"), model("claude-opus-4.6"), model("claude-sonnet-4.6"), ]; assert_eq!( - resolve_against_models("claude-opus-4.7", &models), + resolve_against_models("claude-opus-4.8", &models), Some("claude-opus-4.6".to_string()) ); } diff --git a/src-tauri/src/proxy/providers/transform_gemini.rs b/src-tauri/src/proxy/providers/transform_gemini.rs index ab1e8e2d8..7320e6e5b 100644 --- a/src-tauri/src/proxy/providers/transform_gemini.rs +++ b/src-tauri/src/proxy/providers/transform_gemini.rs @@ -57,11 +57,17 @@ pub fn anthropic_to_gemini_with_shadow( .map(|snapshot| snapshot.turns) .unwrap_or_default(); - if let Some(system) = build_system_instruction(body.get("system"))? { + let messages = body.get("messages").and_then(|value| value.as_array()); + + let system_instruction = build_system_instruction( + body.get("system"), + messages.map(|messages| messages.as_slice()), + )?; + if let Some(system) = system_instruction { result["systemInstruction"] = system; } - if let Some(messages) = body.get("messages").and_then(|value| value.as_array()) { + if let Some(messages) = messages { result["contents"] = json!(convert_messages_to_contents(messages, &shadow_turns)?); } @@ -269,31 +275,26 @@ pub fn extract_gemini_model(body: &Value) -> Option<&str> { body.get("model").and_then(|value| value.as_str()) } -fn build_system_instruction(system: Option<&Value>) -> Result, ProxyError> { - let Some(system) = system else { - return Ok(None); - }; +fn build_system_instruction( + system: Option<&Value>, + messages: Option<&[Value]>, +) -> Result, ProxyError> { + let mut texts = Vec::new(); - if let Some(text) = system.as_str() { - if text.is_empty() { - return Ok(None); - } - return Ok(Some(json!({ - "parts": [{ "text": text }] - }))); + if let Some(system) = system { + collect_system_texts(system, &mut texts)?; } - let Some(blocks) = system.as_array() else { - return Err(ProxyError::TransformError( - "Anthropic system must be a string or an array".to_string(), - )); - }; - - let texts: Vec<&str> = blocks - .iter() - .filter_map(|block| block.get("text").and_then(|value| value.as_str())) - .filter(|text| !text.is_empty()) - .collect(); + if let Some(messages) = messages { + for message in messages { + if message.get("role").and_then(|value| value.as_str()) != Some("system") { + continue; + } + if let Some(content) = message.get("content") { + collect_system_texts(content, &mut texts)?; + } + } + } if texts.is_empty() { return Ok(None); @@ -304,6 +305,31 @@ fn build_system_instruction(system: Option<&Value>) -> Result, Pro }))) } +fn collect_system_texts(value: &Value, texts: &mut Vec) -> Result<(), ProxyError> { + if let Some(text) = value.as_str() { + if !text.is_empty() { + texts.push(text.to_string()); + } + return Ok(()); + } + + let Some(blocks) = value.as_array() else { + return Err(ProxyError::TransformError( + "Anthropic system must be a string or an array".to_string(), + )); + }; + + texts.extend( + blocks + .iter() + .filter_map(|block| block.get("text").and_then(|value| value.as_str())) + .filter(|text| !text.is_empty()) + .map(ToString::to_string), + ); + + Ok(()) +} + fn build_generation_config(body: &Value) -> Option { let mut config = Map::new(); @@ -383,6 +409,9 @@ fn convert_messages_to_contents( .get("role") .and_then(|value| value.as_str()) .unwrap_or("user"); + if role == "system" { + continue; + } let gemini_role = if role == "assistant" { "model" } else { "user" }; @@ -1149,6 +1178,32 @@ mod tests { assert_eq!(result["generationConfig"]["maxOutputTokens"], 128); } + #[test] + fn anthropic_to_gemini_merges_system_messages_into_system_instruction() { + let input = json!({ + "model": "gemini-3-pro", + "system": [{ "type": "text", "text": "Top level system." }], + "messages": [ + { "role": "system", "content": "Message system." }, + { + "role": "system", + "content": [{ "type": "text", "text": "Block system." }] + }, + { "role": "user", "content": "Hello" } + ] + }); + + let result = anthropic_to_gemini(input).unwrap(); + + assert_eq!( + result["systemInstruction"]["parts"][0]["text"], + "Top level system.\n\nMessage system.\n\nBlock system." + ); + assert_eq!(result["contents"].as_array().unwrap().len(), 1); + assert_eq!(result["contents"][0]["role"], "user"); + assert_eq!(result["contents"][0]["parts"][0]["text"], "Hello"); + } + #[test] fn anthropic_to_gemini_maps_tools_and_tool_results() { let input = json!({ diff --git a/src-tauri/src/proxy/thinking_optimizer.rs b/src-tauri/src/proxy/thinking_optimizer.rs index 972b1924f..7bbe5d3ba 100644 --- a/src-tauri/src/proxy/thinking_optimizer.rs +++ b/src-tauri/src/proxy/thinking_optimizer.rs @@ -7,7 +7,7 @@ use serde_json::{json, Value}; /// /// 三路径分发: /// - skip: haiku 模型直接跳过 -/// - adaptive: opus-4-7 / opus-4-6 / sonnet-4-6 使用 adaptive thinking +/// - adaptive: opus-4-8 / opus-4-7 / opus-4-6 / sonnet-4-6 使用 adaptive thinking /// - legacy: 其他模型注入 enabled thinking + budget_tokens pub fn optimize(body: &mut Value, config: &OptimizerConfig) { if !config.thinking_optimizer { @@ -24,7 +24,7 @@ pub fn optimize(body: &mut Value, config: &OptimizerConfig) { return; } - if model.contains("opus-4-7") || model.contains("opus-4-6") || model.contains("sonnet-4-6") { + if uses_adaptive_thinking(&model) { log::info!("[OPT] thinking: adaptive({model})"); body["thinking"] = json!({"type": "adaptive"}); body["output_config"] = json!({"effort": "max"}); @@ -73,6 +73,13 @@ pub fn optimize(body: &mut Value, config: &OptimizerConfig) { } } +fn uses_adaptive_thinking(model: &str) -> bool { + let normalized = model.replace('.', "-"); + ["opus-4-8", "opus-4-7", "opus-4-6", "sonnet-4-6"] + .iter() + .any(|needle| normalized.contains(needle)) +} + /// 追加 beta 标识到 anthropic_beta 数组(去重) fn append_beta(body: &mut Value, beta: &str) { match body.get_mut("anthropic_beta") { @@ -114,6 +121,24 @@ mod tests { } } + #[test] + fn test_adaptive_opus_4_8() { + let mut body = json!({ + "model": "anthropic/claude-opus-4.8", + "max_tokens": 16384, + "thinking": {"type": "enabled", "budget_tokens": 8000}, + "messages": [{"role": "user", "content": "hello"}] + }); + + optimize(&mut body, &enabled_config()); + + assert_eq!(body["thinking"]["type"], "adaptive"); + assert!(body["thinking"].get("budget_tokens").is_none()); + assert_eq!(body["output_config"]["effort"], "max"); + let betas = body["anthropic_beta"].as_array().unwrap(); + assert!(betas.iter().any(|v| v == "context-1m-2025-08-07")); + } + #[test] fn test_adaptive_opus_4_6() { let mut body = json!({ diff --git a/src-tauri/src/services/proxy.rs b/src-tauri/src/services/proxy.rs index 60dc25e60..b7286179f 100644 --- a/src-tauri/src/services/proxy.rs +++ b/src-tauri/src/services/proxy.rs @@ -41,7 +41,7 @@ const CLAUDE_MODEL_OVERRIDE_ENV_KEYS: [&str; 9] = [ const CLAUDE_TAKEOVER_HAIKU_MODEL: &str = "claude-haiku-4-5"; const CLAUDE_TAKEOVER_SONNET_MODEL: &str = "claude-sonnet-4-6"; -const CLAUDE_TAKEOVER_OPUS_MODEL: &str = "claude-opus-4-7"; +const CLAUDE_TAKEOVER_OPUS_MODEL: &str = "claude-opus-4-8"; // 写给 Claude Code 时沿用文档示例的大写形式;解析侧大小写不敏感。 const CLAUDE_ONE_M_MARKER_FOR_CLIENT: &str = "[1M]"; @@ -2451,7 +2451,7 @@ mod tests { "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", Some("claude-sonnet-4.6"), ); - assert_env_str(env, "ANTHROPIC_DEFAULT_OPUS_MODEL", Some("claude-opus-4-7")); + assert_env_str(env, "ANTHROPIC_DEFAULT_OPUS_MODEL", Some("claude-opus-4-8")); assert_env_str( env, "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME", @@ -2522,7 +2522,7 @@ mod tests { Some("claude-sonnet-4-6"), ); assert_env_str(env, "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME", Some("gpt-5.4")); - assert_env_str(env, "ANTHROPIC_DEFAULT_OPUS_MODEL", Some("claude-opus-4-7")); + assert_env_str(env, "ANTHROPIC_DEFAULT_OPUS_MODEL", Some("claude-opus-4-8")); assert_env_str(env, "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME", Some("gpt-5.4")); assert_env_str(env, "ANTHROPIC_API_KEY", Some(PROXY_TOKEN_PLACEHOLDER)); assert_env_str(env, "ANTHROPIC_AUTH_TOKEN", None); @@ -3170,7 +3170,7 @@ model = "gpt-5.1-codex" live_env .get("ANTHROPIC_DEFAULT_OPUS_MODEL") .and_then(|v| v.as_str()), - Some("claude-opus-4-7[1M]"), + Some("claude-opus-4-8[1M]"), "Opus role should preserve the current provider 1M capability marker" ); assert_eq!( diff --git a/src-tauri/src/services/usage_stats.rs b/src-tauri/src/services/usage_stats.rs index 24dc7edba..b2e22c6ea 100644 --- a/src-tauri/src/services/usage_stats.rs +++ b/src-tauri/src/services/usage_stats.rs @@ -3214,6 +3214,11 @@ mod tests { result.is_some(), "Claude Desktop 短路由 claude-haiku-4-5 应能匹配到 claude-haiku-4-5-20251001" ); + let result = find_model_pricing_row(&conn, "anthropic/claude-opus-4.8")?; + assert!( + result.is_some(), + "聚合商点号格式 anthropic/claude-opus-4.8 应能匹配到 claude-opus-4-8" + ); // Claude Desktop 旧版/异常包装的非 Anthropic route:claude-gpt-5.5 → gpt-5.5 let result = find_model_pricing_row(&conn, "claude-gpt-5.5")?; @@ -3229,6 +3234,16 @@ mod tests { result.is_some(), "Bedrock/Vertex 风格 Claude 模型 ID 应能归一化到基础 Claude 模型定价" ); + let result = find_model_pricing_row(&conn, "global.anthropic.claude-opus-4-8-v1:0")?; + assert!( + result.is_some(), + "Bedrock 风格 Claude Opus 4.8 模型 ID 应能归一化到基础 Claude 模型定价" + ); + let result = find_model_pricing_row(&conn, "claude-opus-4-8@20260527")?; + assert!( + result.is_some(), + "Vertex 风格 Claude Opus 4.8 模型 ID 应能归一化到基础 Claude 模型定价" + ); // Reasoning effort 后缀:没有专门价格时回退到基础模型 let result = find_model_pricing_row(&conn, "gpt-5.4@low")?; diff --git a/src/components/providers/forms/HermesFormFields.tsx b/src/components/providers/forms/HermesFormFields.tsx index a33178f67..2cf6cb86c 100644 --- a/src/components/providers/forms/HermesFormFields.tsx +++ b/src/components/providers/forms/HermesFormFields.tsx @@ -415,7 +415,7 @@ export function HermesFormFields({ handleModelChange(index, "id", e.target.value) } placeholder={t("hermes.form.modelIdPlaceholder", { - defaultValue: "anthropic/claude-opus-4-7", + defaultValue: "anthropic/claude-opus-4-8", })} className="flex-1" /> @@ -471,7 +471,7 @@ export function HermesFormFields({ handleModelChange(index, "name", e.target.value) } placeholder={t("hermes.form.modelNamePlaceholder", { - defaultValue: "Claude Opus 4.7", + defaultValue: "Claude Opus 4.8", })} /> diff --git a/src/config/claudeDesktopProviderPresets.ts b/src/config/claudeDesktopProviderPresets.ts index d3afde14b..7ed37db9e 100644 --- a/src/config/claudeDesktopProviderPresets.ts +++ b/src/config/claudeDesktopProviderPresets.ts @@ -31,7 +31,7 @@ export interface ClaudeDesktopRoutePreset { */ export const CLAUDE_DESKTOP_ROLE_ROUTE_IDS = { sonnet: "claude-sonnet-4-6", - opus: "claude-opus-4-7", + opus: "claude-opus-4-8", haiku: "claude-haiku-4-5", } as const; @@ -160,7 +160,7 @@ export const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [ apiFormat: "anthropic", modelRoutes: mappedRoutes( "anthropic/claude-sonnet-4.6", - "anthropic/claude-opus-4.7", + "anthropic/claude-opus-4.8", "anthropic/claude-haiku-4.5", ), isPartner: true, @@ -888,7 +888,7 @@ export const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [ apiFormat: "anthropic", modelRoutes: mappedRoutes( "anthropic/claude-sonnet-4.6", - "anthropic/claude-opus-4.7", + "anthropic/claude-opus-4.8", "anthropic/claude-haiku-4.5", true, ), @@ -905,7 +905,7 @@ export const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [ apiFormat: "anthropic", modelRoutes: mappedRoutes( "anthropic/claude-sonnet-4.6", - "anthropic/claude-opus-4.7", + "anthropic/claude-opus-4.8", "anthropic/claude-haiku-4.5", true, ), diff --git a/src/config/claudeProviderPresets.ts b/src/config/claudeProviderPresets.ts index 9a24235ed..f0f298daf 100644 --- a/src/config/claudeProviderPresets.ts +++ b/src/config/claudeProviderPresets.ts @@ -101,7 +101,7 @@ export const providerPresets: ProviderPreset[] = [ ANTHROPIC_MODEL: "anthropic/claude-sonnet-4.6", ANTHROPIC_DEFAULT_HAIKU_MODEL: "anthropic/claude-haiku-4.5", ANTHROPIC_DEFAULT_SONNET_MODEL: "anthropic/claude-sonnet-4.6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.8", }, }, category: "aggregator", @@ -975,7 +975,7 @@ export const providerPresets: ProviderPreset[] = [ ANTHROPIC_MODEL: "anthropic/claude-sonnet-4.6", ANTHROPIC_DEFAULT_HAIKU_MODEL: "anthropic/claude-haiku-4.5", ANTHROPIC_DEFAULT_SONNET_MODEL: "anthropic/claude-sonnet-4.6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.8", }, }, category: "aggregator", @@ -994,7 +994,7 @@ export const providerPresets: ProviderPreset[] = [ ANTHROPIC_MODEL: "anthropic/claude-sonnet-4.6", ANTHROPIC_DEFAULT_HAIKU_MODEL: "anthropic/claude-haiku-4.5", ANTHROPIC_DEFAULT_SONNET_MODEL: "anthropic/claude-sonnet-4.6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "anthropic/claude-opus-4.8", }, }, category: "aggregator", @@ -1102,10 +1102,10 @@ export const providerPresets: ProviderPreset[] = [ env: { ANTHROPIC_BASE_URL: "https://cc-api.pipellm.ai", ANTHROPIC_AUTH_TOKEN: "", - ANTHROPIC_MODEL: "claude-opus-4-7", + ANTHROPIC_MODEL: "claude-opus-4-8", ANTHROPIC_DEFAULT_HAIKU_MODEL: "claude-haiku-4-5-20251001", ANTHROPIC_DEFAULT_SONNET_MODEL: "claude-sonnet-4-6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "claude-opus-4-7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "claude-opus-4-8", }, includeCoAuthoredBy: false, }, @@ -1158,11 +1158,11 @@ export const providerPresets: ProviderPreset[] = [ AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}", AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}", AWS_REGION: "${AWS_REGION}", - ANTHROPIC_MODEL: "global.anthropic.claude-opus-4-7", + ANTHROPIC_MODEL: "global.anthropic.claude-opus-4-8", ANTHROPIC_DEFAULT_HAIKU_MODEL: "global.anthropic.claude-haiku-4-5-20251001-v1:0", ANTHROPIC_DEFAULT_SONNET_MODEL: "global.anthropic.claude-sonnet-4-6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "global.anthropic.claude-opus-4-7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "global.anthropic.claude-opus-4-8", CLAUDE_CODE_USE_BEDROCK: "1", }, }, @@ -1196,11 +1196,11 @@ export const providerPresets: ProviderPreset[] = [ ANTHROPIC_BASE_URL: "https://bedrock-runtime.${AWS_REGION}.amazonaws.com", AWS_REGION: "${AWS_REGION}", - ANTHROPIC_MODEL: "global.anthropic.claude-opus-4-7", + ANTHROPIC_MODEL: "global.anthropic.claude-opus-4-8", ANTHROPIC_DEFAULT_HAIKU_MODEL: "global.anthropic.claude-haiku-4-5-20251001-v1:0", ANTHROPIC_DEFAULT_SONNET_MODEL: "global.anthropic.claude-sonnet-4-6", - ANTHROPIC_DEFAULT_OPUS_MODEL: "global.anthropic.claude-opus-4-7", + ANTHROPIC_DEFAULT_OPUS_MODEL: "global.anthropic.claude-opus-4-8", CLAUDE_CODE_USE_BEDROCK: "1", }, }, diff --git a/src/config/hermesProviderPresets.ts b/src/config/hermesProviderPresets.ts index 639bda798..4cd7af18c 100644 --- a/src/config/hermesProviderPresets.ts +++ b/src/config/hermesProviderPresets.ts @@ -35,7 +35,7 @@ export function isHermesReadOnlyProvider(settingsConfig: unknown): boolean { * * ```yaml * models: - * anthropic/claude-opus-4-7: + * anthropic/claude-opus-4-8: * context_length: 200000 * ``` * @@ -250,8 +250,8 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_mode: "chat_completions", models: [ { - id: "anthropic/claude-opus-4-7", - name: "Claude Opus 4.7", + id: "anthropic/claude-opus-4-8", + name: "Claude Opus 4.8", context_length: 1000000, }, { @@ -280,7 +280,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "openrouter", iconColor: "#6366F1", suggestedDefaults: { - model: { default: "anthropic/claude-opus-4-7", provider: "openrouter" }, + model: { default: "anthropic/claude-opus-4-8", provider: "openrouter" }, }, }, { @@ -733,7 +733,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -743,7 +743,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ partnerPromotionKey: "packycode", icon: "packycode", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "packycode" }, + model: { default: "claude-opus-4-8", provider: "packycode" }, }, }, { @@ -757,8 +757,8 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_mode: "anthropic_messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", context_length: 1000000, }, { @@ -778,7 +778,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ partnerPromotionKey: "apikeyfun", icon: "apikeyfun", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "apikeyfun" }, + model: { default: "claude-opus-4-8", provider: "apikeyfun" }, }, }, { @@ -863,7 +863,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -874,7 +874,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "cubence", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "cubence" }, + model: { default: "claude-opus-4-8", provider: "cubence" }, }, }, { @@ -887,7 +887,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5", name: "Claude Haiku 4.5" }, ], @@ -917,7 +917,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5", name: "Claude Haiku 4.5" }, ], @@ -947,7 +947,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -958,7 +958,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "aigocode", iconColor: "#5B7FFF", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "aigocode" }, + model: { default: "claude-opus-4-8", provider: "aigocode" }, }, }, { @@ -971,7 +971,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -982,7 +982,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "rc", iconColor: "#E96B2C", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "rightcode" }, + model: { default: "claude-opus-4-8", provider: "rightcode" }, }, }, { @@ -995,7 +995,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1006,7 +1006,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "aicodemirror", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "aicodemirror" }, + model: { default: "claude-opus-4-8", provider: "aicodemirror" }, }, }, { @@ -1019,7 +1019,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1030,7 +1030,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "crazyrouter", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "crazyrouter" }, + model: { default: "claude-opus-4-8", provider: "crazyrouter" }, }, }, { @@ -1043,7 +1043,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1054,7 +1054,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "sssaicode", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "sssaicode" }, + model: { default: "claude-opus-4-8", provider: "sssaicode" }, }, }, { @@ -1111,7 +1111,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1122,7 +1122,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "micu", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "micu" }, + model: { default: "claude-opus-4-8", provider: "micu" }, }, }, { @@ -1135,7 +1135,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1146,7 +1146,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "ctok", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "ctok" }, + model: { default: "claude-opus-4-8", provider: "ctok" }, }, }, { @@ -1159,7 +1159,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" }, ], @@ -1168,7 +1168,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ icon: "eflowcode", iconColor: "#000000", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "eflowcode" }, + model: { default: "claude-opus-4-8", provider: "eflowcode" }, }, }, { @@ -1259,7 +1259,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ api_key: "", api_mode: "anthropic_messages", models: [ - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-haiku-4-5-20251001", @@ -1270,7 +1270,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ category: "aggregator", icon: "pipellm", suggestedDefaults: { - model: { default: "claude-opus-4-7", provider: "pipellm" }, + model: { default: "claude-opus-4-8", provider: "pipellm" }, }, }, { diff --git a/src/config/openclawProviderPresets.ts b/src/config/openclawProviderPresets.ts index ba9c90771..a1f09a6f9 100644 --- a/src/config/openclawProviderPresets.ts +++ b/src/config/openclawProviderPresets.ts @@ -109,8 +109,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "anthropic/claude-opus-4.7", - name: "Claude Opus 4.7", + id: "anthropic/claude-opus-4.8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -135,11 +135,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "shengsuanyun/anthropic/claude-opus-4.7", + primary: "shengsuanyun/anthropic/claude-opus-4.8", fallbacks: ["shengsuanyun/anthropic/claude-sonnet-4.6"], }, modelCatalog: { - "shengsuanyun/anthropic/claude-opus-4.7": { alias: "Opus" }, + "shengsuanyun/anthropic/claude-opus-4.8": { alias: "Opus" }, "shengsuanyun/anthropic/claude-sonnet-4.6": { alias: "Sonnet" }, }, }, @@ -866,8 +866,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -891,11 +891,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "aihubmix/claude-opus-4-7", + primary: "aihubmix/claude-opus-4-8", fallbacks: ["aihubmix/claude-sonnet-4-6"], }, modelCatalog: { - "aihubmix/claude-opus-4-7": { alias: "Opus" }, + "aihubmix/claude-opus-4-8": { alias: "Opus" }, "aihubmix/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -910,8 +910,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -935,11 +935,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "dmxapi/claude-opus-4-7", + primary: "dmxapi/claude-opus-4-8", fallbacks: ["dmxapi/claude-sonnet-4-6"], }, modelCatalog: { - "dmxapi/claude-opus-4-7": { alias: "Opus" }, + "dmxapi/claude-opus-4-8": { alias: "Opus" }, "dmxapi/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -954,8 +954,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, }, { @@ -986,7 +986,7 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ primary: "claudecn/claude-sonnet-4-6", }, modelCatalog: { - "claudecn/claude-opus-4-7": { alias: "Opus" }, + "claudecn/claude-opus-4-8": { alias: "Opus" }, "claudecn/claude-sonnet-4-6": { alias: "Sonnet" }, "claudecn/claude-haiku-4-5": { alias: "Haiku" }, }, @@ -1002,8 +1002,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, }, { @@ -1034,7 +1034,7 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ primary: "runapi/claude-sonnet-4-6", }, modelCatalog: { - "runapi/claude-opus-4-7": { alias: "Opus" }, + "runapi/claude-opus-4-8": { alias: "Opus" }, "runapi/claude-sonnet-4-6": { alias: "Sonnet" }, "runapi/claude-haiku-4-5": { alias: "Haiku" }, }, @@ -1050,8 +1050,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "openai-completions", models: [ { - id: "anthropic/claude-opus-4.7", - name: "Claude Opus 4.7", + id: "anthropic/claude-opus-4.8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1075,11 +1075,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "openrouter/anthropic/claude-opus-4.7", + primary: "openrouter/anthropic/claude-opus-4.8", fallbacks: ["openrouter/anthropic/claude-sonnet-4.6"], }, modelCatalog: { - "openrouter/anthropic/claude-opus-4.7": { alias: "Opus" }, + "openrouter/anthropic/claude-opus-4.8": { alias: "Opus" }, "openrouter/anthropic/claude-sonnet-4.6": { alias: "Sonnet" }, }, }, @@ -1336,8 +1336,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "claude-opus-4-7", + id: "claude-opus-4-8", + name: "claude-opus-4-8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1366,11 +1366,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "pipellm/claude-opus-4-7", + primary: "pipellm/claude-opus-4-8", fallbacks: ["pipellm/claude-sonnet-4-6"], }, modelCatalog: { - "pipellm/claude-opus-4-7": { alias: "Opus" }, + "pipellm/claude-opus-4-8": { alias: "Opus" }, "pipellm/claude-sonnet-4-6": { alias: "Sonnet" }, "pipellm/claude-haiku-4-5-20251001": { alias: "Haiku" }, }, @@ -1388,8 +1388,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1414,11 +1414,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "packycode/claude-opus-4-7", + primary: "packycode/claude-opus-4-8", fallbacks: ["packycode/claude-sonnet-4-6"], }, modelCatalog: { - "packycode/claude-opus-4-7": { alias: "Opus" }, + "packycode/claude-opus-4-8": { alias: "Opus" }, "packycode/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1433,8 +1433,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, }, { @@ -1462,11 +1462,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "apikeyfun/claude-opus-4-7", + primary: "apikeyfun/claude-opus-4-8", fallbacks: ["apikeyfun/claude-sonnet-4-6"], }, modelCatalog: { - "apikeyfun/claude-opus-4-7": { alias: "Opus" }, + "apikeyfun/claude-opus-4-8": { alias: "Opus" }, "apikeyfun/claude-sonnet-4-6": { alias: "Sonnet" }, "apikeyfun/claude-haiku-4-5": { alias: "Haiku" }, }, @@ -1578,8 +1578,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1605,11 +1605,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "cubence/claude-opus-4-7", + primary: "cubence/claude-opus-4-8", fallbacks: ["cubence/claude-sonnet-4-6"], }, modelCatalog: { - "cubence/claude-opus-4-7": { alias: "Opus" }, + "cubence/claude-opus-4-8": { alias: "Opus" }, "cubence/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1624,8 +1624,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1651,11 +1651,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "aigocode/claude-opus-4-7", + primary: "aigocode/claude-opus-4-8", fallbacks: ["aigocode/claude-sonnet-4-6"], }, modelCatalog: { - "aigocode/claude-opus-4-7": { alias: "Opus" }, + "aigocode/claude-opus-4-8": { alias: "Opus" }, "aigocode/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1670,8 +1670,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1697,11 +1697,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "rightcode/claude-opus-4-7", + primary: "rightcode/claude-opus-4-8", fallbacks: ["rightcode/claude-sonnet-4-6"], }, modelCatalog: { - "rightcode/claude-opus-4-7": { alias: "Opus" }, + "rightcode/claude-opus-4-8": { alias: "Opus" }, "rightcode/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1716,8 +1716,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1743,11 +1743,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "aicodemirror/claude-opus-4-7", + primary: "aicodemirror/claude-opus-4-8", fallbacks: ["aicodemirror/claude-sonnet-4-6"], }, modelCatalog: { - "aicodemirror/claude-opus-4-7": { alias: "Opus" }, + "aicodemirror/claude-opus-4-8": { alias: "Opus" }, "aicodemirror/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1762,8 +1762,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1789,11 +1789,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "crazyrouter/claude-opus-4-7", + primary: "crazyrouter/claude-opus-4-8", fallbacks: ["crazyrouter/claude-sonnet-4-6"], }, modelCatalog: { - "crazyrouter/claude-opus-4-7": { alias: "Opus" }, + "crazyrouter/claude-opus-4-8": { alias: "Opus" }, "crazyrouter/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1808,8 +1808,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1835,11 +1835,11 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "sssaicode/claude-opus-4-7", + primary: "sssaicode/claude-opus-4-8", fallbacks: ["sssaicode/claude-sonnet-4-6"], }, modelCatalog: { - "sssaicode/claude-opus-4-7": { alias: "Opus" }, + "sssaicode/claude-opus-4-8": { alias: "Opus" }, "sssaicode/claude-sonnet-4-6": { alias: "Sonnet" }, }, }, @@ -1856,8 +1856,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1877,10 +1877,10 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "compshare/claude-opus-4-7", + primary: "compshare/claude-opus-4-8", }, modelCatalog: { - "compshare/claude-opus-4-7": { alias: "Opus" }, + "compshare/claude-opus-4-8": { alias: "Opus" }, }, }, }, @@ -1896,8 +1896,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1917,10 +1917,10 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "compshare-coding/claude-opus-4-7", + primary: "compshare-coding/claude-opus-4-8", }, modelCatalog: { - "compshare-coding/claude-opus-4-7": { alias: "Opus" }, + "compshare-coding/claude-opus-4-8": { alias: "Opus" }, }, }, }, @@ -1934,8 +1934,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1955,10 +1955,10 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "micu/claude-opus-4-7", + primary: "micu/claude-opus-4-8", }, modelCatalog: { - "micu/claude-opus-4-7": { alias: "Opus" }, + "micu/claude-opus-4-8": { alias: "Opus" }, }, }, }, @@ -1972,8 +1972,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "anthropic-messages", models: [ { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25 }, }, @@ -1993,10 +1993,10 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, suggestedDefaults: { model: { - primary: "ctok/claude-opus-4-7", + primary: "ctok/claude-opus-4-8", }, modelCatalog: { - "ctok/claude-opus-4-7": { alias: "Opus" }, + "ctok/claude-opus-4-8": { alias: "Opus" }, }, }, }, @@ -2109,8 +2109,8 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ api: "bedrock-converse-stream", models: [ { - id: "anthropic.claude-opus-4-7", - name: "Claude Opus 4.7", + id: "anthropic.claude-opus-4-8", + name: "Claude Opus 4.8", contextWindow: 1000000, cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }, }, diff --git a/src/config/opencodeProviderPresets.ts b/src/config/opencodeProviderPresets.ts index f068c7dfd..e2fe5b5c2 100644 --- a/src/config/opencodeProviderPresets.ts +++ b/src/config/opencodeProviderPresets.ts @@ -166,8 +166,8 @@ export const OPENCODE_PRESET_MODEL_VARIANTS: Record< ], "@ai-sdk/amazon-bedrock": [ { - id: "global.anthropic.claude-opus-4-7", - name: "Claude Opus 4.7", + id: "global.anthropic.claude-opus-4-8", + name: "Claude Opus 4.8", contextLimit: 1000000, outputLimit: 128000, modalities: { input: ["text", "image", "pdf"], output: ["text"] }, @@ -234,8 +234,8 @@ export const OPENCODE_PRESET_MODEL_VARIANTS: Record< }, }, { - id: "claude-opus-4-7", - name: "Claude Opus 4.7", + id: "claude-opus-4-8", + name: "Claude Opus 4.8", contextLimit: 1000000, outputLimit: 128000, modalities: { input: ["text", "image", "pdf"], output: ["text"] }, @@ -310,7 +310,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "anthropic/claude-opus-4.7": { name: "Claude Opus 4.7" }, + "anthropic/claude-opus-4.8": { name: "Claude Opus 4.8" }, "anthropic/claude-sonnet-4.6": { name: "Claude Sonnet 4.6" }, }, }, @@ -993,7 +993,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "aggregator", @@ -1021,7 +1021,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "aggregator", @@ -1049,7 +1049,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "anthropic/claude-sonnet-4.6": { name: "Claude Sonnet 4.6" }, - "anthropic/claude-opus-4.7": { name: "Claude Opus 4.7" }, + "anthropic/claude-opus-4.8": { name: "Claude Opus 4.8" }, }, }, category: "aggregator", @@ -1161,7 +1161,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "claude-opus-4-7": { name: "claude-opus-4-7" }, + "claude-opus-4-8": { name: "claude-opus-4-8" }, "claude-sonnet-4-6": { name: "claude-sonnet-4-6" }, "claude-haiku-4-5-20251001": { name: "claude-haiku-4-5-20251001" }, }, @@ -1191,7 +1191,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1219,7 +1219,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, "claude-haiku-4-5": { name: "Claude Haiku 4.5" }, }, @@ -1334,7 +1334,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1364,7 +1364,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1423,7 +1423,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4.6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4.7": { name: "Claude Opus 4.7" }, + "claude-opus-4.8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1453,7 +1453,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, "claude-haiku-4-5": { name: "Claude Haiku 4.5" }, }, }, @@ -1483,7 +1483,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, "claude-haiku-4-5": { name: "Claude Haiku 4.5" }, }, }, @@ -1513,7 +1513,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1543,7 +1543,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, models: { "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, }, }, category: "third_party", @@ -1572,7 +1572,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, }, }, @@ -1602,7 +1602,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "claude-opus-4-7": { name: "Claude Opus 4.7" }, + "claude-opus-4-8": { name: "Claude Opus 4.8" }, "claude-sonnet-4-6": { name: "Claude Sonnet 4.6" }, }, }, @@ -1690,7 +1690,7 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ setCacheKey: true, }, models: { - "global.anthropic.claude-opus-4-7": { name: "Claude Opus 4.7" }, + "global.anthropic.claude-opus-4-8": { name: "Claude Opus 4.8" }, "global.anthropic.claude-sonnet-4-6": { name: "Claude Sonnet 4.6", }, diff --git a/src/config/universalProviderPresets.ts b/src/config/universalProviderPresets.ts index 55f73fe5f..3c8d31b31 100644 --- a/src/config/universalProviderPresets.ts +++ b/src/config/universalProviderPresets.ts @@ -44,7 +44,7 @@ const NEWAPI_DEFAULT_MODELS: UniversalProviderModels = { model: "claude-sonnet-4-6", haikuModel: "claude-haiku-4-5-20251001", sonnetModel: "claude-sonnet-4-6", - opusModel: "claude-opus-4-7", + opusModel: "claude-opus-4-8", }, codex: { model: "gpt-5.4", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index bf82dcf5f..4c59b86d0 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -1818,9 +1818,9 @@ "addModel": "Add model", "noModels": "No models configured. Switching to this provider won't change the default model.", "modelId": "Model ID", - "modelIdPlaceholder": "anthropic/claude-opus-4-7", + "modelIdPlaceholder": "anthropic/claude-opus-4-8", "modelName": "Display name", - "modelNamePlaceholder": "Claude Opus 4.7", + "modelNamePlaceholder": "Claude Opus 4.8", "contextLength": "Context length", "advancedOptions": "Advanced options", "modelsHint": "On switch, the first model is written to top-level model.default.", @@ -2623,7 +2623,7 @@ "artistry": "Highly creative and artistic task category that inspires novel ideas and creative solutions. Defaults to Gemini 3 Pro max variant.", "quick": "Lightweight task category for single-file modifications, typo fixes, and simple adjustments. Defaults to Claude Haiku 4.5 fast model.", "unspecifiedLow": "Uncategorized low-effort task category for tasks that don't fit other categories with small workload. Defaults to Claude Sonnet 4.5.", - "unspecifiedHigh": "Uncategorized high-effort task category for tasks that don't fit other categories with large workload. Defaults to Claude Opus 4.7 max variant.", + "unspecifiedHigh": "Uncategorized high-effort task category for tasks that don't fit other categories with large workload. Defaults to Claude Opus 4.8 max variant.", "writing": "Writing category for documentation, prose and technical writing. Defaults to Gemini 3 Flash fast generation model." }, "slimAgentDesc": { diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index a2dfe0cd8..c3b248000 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -1818,9 +1818,9 @@ "addModel": "モデルを追加", "noModels": "モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。", "modelId": "モデル ID", - "modelIdPlaceholder": "anthropic/claude-opus-4-7", + "modelIdPlaceholder": "anthropic/claude-opus-4-8", "modelName": "表示名", - "modelNamePlaceholder": "Claude Opus 4.7", + "modelNamePlaceholder": "Claude Opus 4.8", "contextLength": "コンテキスト長", "advancedOptions": "詳細オプション", "modelsHint": "切り替え時、最初のモデルが model.default に書き込まれます。", @@ -2623,7 +2623,7 @@ "artistry": "高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3 Pro の max バリアントを使用。", "quick": "軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。", "unspecifiedLow": "未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。", - "unspecifiedHigh": "未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.7 の max バリアントを使用。", + "unspecifiedHigh": "未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。", "writing": "ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Gemini 3 Flash 高速生成モデルを使用。" }, "slimAgentDesc": { diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index de3e20e2d..ee3eb721e 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -1764,9 +1764,9 @@ "addModel": "新增模型", "noModels": "暫無模型設定。切換至此供應商時將不會更新預設模型。", "modelId": "模型 ID", - "modelIdPlaceholder": "anthropic/claude-opus-4-7", + "modelIdPlaceholder": "anthropic/claude-opus-4-8", "modelName": "顯示名稱", - "modelNamePlaceholder": "Claude Opus 4.7", + "modelNamePlaceholder": "Claude Opus 4.8", "contextLength": "上下文長度", "advancedOptions": "進階選項", "modelsHint": "切換至此供應商時,第一個模型會寫入頂層 model.default。", @@ -2569,7 +2569,7 @@ "artistry": "高度創意與藝術性任務類別,激發新穎想法和創造性解決方案,預設使用 Gemini 3 Pro 的最大變體。", "quick": "輕量任務類別,用於單檔案修改、錯別字修復、簡單調整等瑣碎工作,預設使用 Claude Haiku 4.5 快速模型。", "unspecifiedLow": "未分類低工作量任務類別,適用於不適合其他類別且工作量較小的任務,預設使用 Claude Sonnet 4.5。", - "unspecifiedHigh": "未分類高工作量任務類別,適用於不適合其他類別且工作量較大的任務,預設使用 Claude Opus 4.7 的最大變體。", + "unspecifiedHigh": "未分類高工作量任務類別,適用於不適合其他類別且工作量較大的任務,預設使用 Claude Opus 4.8 的最大變體。", "writing": "寫作類別,專注於文件、散文和技術寫作,預設使用 Gemini 3 Flash 快速產生模型。" }, "slimAgentDesc": { diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 3757ce551..c66fa3fe7 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -1818,9 +1818,9 @@ "addModel": "添加模型", "noModels": "暂无模型配置。切换到此供应商时将不会更新默认模型。", "modelId": "模型 ID", - "modelIdPlaceholder": "anthropic/claude-opus-4-7", + "modelIdPlaceholder": "anthropic/claude-opus-4-8", "modelName": "显示名称", - "modelNamePlaceholder": "Claude Opus 4.7", + "modelNamePlaceholder": "Claude Opus 4.8", "contextLength": "上下文长度", "advancedOptions": "高级选项", "modelsHint": "切换到此供应商时,第一个模型会写入顶层 model.default。", @@ -2623,7 +2623,7 @@ "artistry": "高度创意与艺术性任务类别,激发新颖想法和创造性解决方案,默认使用 Gemini 3 Pro 的最大变体。", "quick": "轻量任务类别,用于单文件修改、错别字修复、简单调整等琐碎工作,默认使用 Claude Haiku 4.5 快速模型。", "unspecifiedLow": "未归类低工作量任务类别,适用于不适合其他类别且工作量较小的任务,默认使用 Claude Sonnet 4.5。", - "unspecifiedHigh": "未归类高工作量任务类别,适用于不适合其他类别且工作量较大的任务,默认使用 Claude Opus 4.7 的最大变体。", + "unspecifiedHigh": "未归类高工作量任务类别,适用于不适合其他类别且工作量较大的任务,默认使用 Claude Opus 4.8 的最大变体。", "writing": "写作类别,专注于文档、散文和技术写作,默认使用 Gemini 3 Flash 快速生成模型。" }, "slimAgentDesc": { diff --git a/src/types/omo.ts b/src/types/omo.ts index d516339c7..886e8486a 100644 --- a/src/types/omo.ts +++ b/src/types/omo.ts @@ -29,7 +29,7 @@ export const OMO_BUILTIN_AGENTS: OmoAgentDef[] = [ display: "Sisyphus", descKey: "omo.agentDesc.sisyphus", tooltipKey: "omo.agentTooltip.sisyphus", - recommended: "claude-opus-4-7", + recommended: "claude-opus-4-8", group: "main", }, { @@ -45,7 +45,7 @@ export const OMO_BUILTIN_AGENTS: OmoAgentDef[] = [ display: "Prometheus", descKey: "omo.agentDesc.prometheus", tooltipKey: "omo.agentTooltip.prometheus", - recommended: "claude-opus-4-7", + recommended: "claude-opus-4-8", group: "main", }, { @@ -162,7 +162,7 @@ export const OMO_BUILTIN_CATEGORIES: OmoCategoryDef[] = [ display: "Unspecified High", descKey: "omo.categoryDesc.unspecifiedHigh", tooltipKey: "omo.categoryTooltip.unspecifiedHigh", - recommended: "claude-opus-4-7", + recommended: "claude-opus-4-8", }, { key: "writing", @@ -281,7 +281,7 @@ export const OMO_BACKGROUND_TASK_PLACEHOLDER = `{ "google": 10 }, "modelConcurrency": { - "anthropic/claude-opus-4-7": 2, + "anthropic/claude-opus-4-8": 2, "google/gemini-3-flash": 10 } }`; @@ -320,7 +320,7 @@ export const OMO_SLIM_BUILTIN_AGENTS: OmoAgentDef[] = [ display: "Orchestrator", descKey: "omo.slimAgentDesc.orchestrator", tooltipKey: "omo.slimAgentTooltip.orchestrator", - recommended: "claude-opus-4-7", + recommended: "claude-opus-4-8", group: "main", }, { diff --git a/tests/config/opencodeProviderPresets.test.ts b/tests/config/opencodeProviderPresets.test.ts index d033561d9..9e120a028 100644 --- a/tests/config/opencodeProviderPresets.test.ts +++ b/tests/config/opencodeProviderPresets.test.ts @@ -20,7 +20,7 @@ describe("AWS Bedrock OpenCode Provider Presets", () => { expect(variants.length).toBeGreaterThan(0); const opusModel = variants.find((v) => - v.id.includes("anthropic.claude-opus-4-7"), + v.id.includes("anthropic.claude-opus-4-8"), ); expect(opusModel).toBeDefined(); }); @@ -34,9 +34,7 @@ describe("AWS Bedrock OpenCode Provider Presets", () => { }); it("Bedrock preset should use @ai-sdk/amazon-bedrock npm package", () => { - expect(bedrockPreset!.settingsConfig.npm).toBe( - "@ai-sdk/amazon-bedrock", - ); + expect(bedrockPreset!.settingsConfig.npm).toBe("@ai-sdk/amazon-bedrock"); }); it("Bedrock preset should have region in options", () => { @@ -50,9 +48,7 @@ describe("AWS Bedrock OpenCode Provider Presets", () => { it("Bedrock preset should have template values for AWS credentials", () => { expect(bedrockPreset!.templateValues).toBeDefined(); expect(bedrockPreset!.templateValues!.region).toBeDefined(); - expect(bedrockPreset!.templateValues!.region.editorValue).toBe( - "us-west-2", - ); + expect(bedrockPreset!.templateValues!.region.editorValue).toBe("us-west-2"); expect(bedrockPreset!.templateValues!.accessKeyId).toBeDefined(); expect(bedrockPreset!.templateValues!.secretAccessKey).toBeDefined(); }); @@ -61,9 +57,7 @@ describe("AWS Bedrock OpenCode Provider Presets", () => { const models = bedrockPreset!.settingsConfig.models; expect(models).toBeDefined(); const modelIds = Object.keys(models!); - expect( - modelIds.some((id) => id.includes("anthropic.claude")), - ).toBe(true); + expect(modelIds.some((id) => id.includes("anthropic.claude"))).toBe(true); }); it("Kimi For Coding preset should use Anthropic with the coding endpoint", () => { diff --git a/tests/config/therouterProviderPresets.test.ts b/tests/config/therouterProviderPresets.test.ts index aa3a4dbf7..33511e1ad 100644 --- a/tests/config/therouterProviderPresets.test.ts +++ b/tests/config/therouterProviderPresets.test.ts @@ -24,7 +24,7 @@ describe("TheRouter provider presets", () => { expect(env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe( "anthropic/claude-sonnet-4.6", ); - expect(env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe("anthropic/claude-opus-4.7"); + expect(env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe("anthropic/claude-opus-4.8"); }); it("uses the OpenAI-compatible v1 endpoint for Codex", () => {