chore: update Claude model references to claude-sonnet-4.6

Replace all claude-sonnet-4 references with claude-sonnet-4.6 across
codebase including documentation, tests, and configuration examples.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
yinwm 2026-02-20 12:15:04 +08:00
parent 7572e3b95d
commit dc9fb327c2
21 changed files with 79 additions and 79 deletions

View file

@ -838,8 +838,8 @@ Cette conception permet également le **support multi-agent** avec une sélectio
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -879,8 +879,8 @@ Cette conception permet également le **support multi-agent** avec une sélectio
**Anthropic (avec OAuth)** **Anthropic (avec OAuth)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -774,8 +774,8 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -815,8 +815,8 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
**Anthropic (OAuth使用)** **Anthropic (OAuth使用)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -222,8 +222,8 @@ picoclaw onboard
"api_key": "your-api-key" "api_key": "your-api-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4", "model": "anthropic/claude-sonnet-4.6",
"api_key": "your-anthropic-key" "api_key": "your-anthropic-key"
} }
], ],
@ -733,8 +733,8 @@ This design also enables **multi-agent support** with flexible provider selectio
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -783,8 +783,8 @@ This design also enables **multi-agent support** with flexible provider selectio
**Anthropic (with OAuth)** **Anthropic (with OAuth)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -839,8 +839,8 @@ Este design também possibilita o **suporte multi-agent** com seleção flexíve
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -880,8 +880,8 @@ Este design também possibilita o **suporte multi-agent** com seleção flexíve
**Anthropic (com OAuth)** **Anthropic (com OAuth)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -816,8 +816,8 @@ Thiết kế này cũng cho phép **hỗ trợ đa tác nhân** với lựa ch
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -857,8 +857,8 @@ Thiết kế này cũng cho phép **hỗ trợ đa tác nhân** với lựa ch
**Anthropic (với OAuth)** **Anthropic (với OAuth)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -231,8 +231,8 @@ picoclaw onboard
"api_key": "your-api-key" "api_key": "your-api-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4", "model": "anthropic/claude-sonnet-4.6",
"api_key": "your-anthropic-key" "api_key": "your-anthropic-key"
} }
], ],
@ -610,8 +610,8 @@ Agent 读取 HEARTBEAT.md
"api_key": "sk-your-openai-key" "api_key": "sk-your-openai-key"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -660,8 +660,8 @@ Agent 读取 HEARTBEAT.md
**Anthropic (使用 OAuth)** **Anthropic (使用 OAuth)**
```json ```json
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"auth_method": "oauth" "auth_method": "oauth"
} }
``` ```

View file

@ -284,13 +284,13 @@ func authLoginPasteToken(provider string) {
} }
if !found { if !found {
appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{ appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{
ModelName: "claude-sonnet-4", ModelName: "claude-sonnet-4.6",
Model: "anthropic/claude-sonnet-4-20250514", Model: "anthropic/claude-sonnet-4.6",
AuthMethod: "token", AuthMethod: "token",
}) })
} }
// Update default model // Update default model
appCfg.Agents.Defaults.Model = "claude-sonnet-4" appCfg.Agents.Defaults.Model = "claude-sonnet-4.6"
case "openai": case "openai":
appCfg.Providers.OpenAI.AuthMethod = "token" appCfg.Providers.OpenAI.AuthMethod = "token"
// Update ModelList // Update ModelList

View file

@ -17,8 +17,8 @@
"api_base": "https://api.openai.com/v1" "api_base": "https://api.openai.com/v1"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key", "api_key": "sk-ant-your-key",
"api_base": "https://api.anthropic.com/v1" "api_base": "https://api.anthropic.com/v1"
}, },

View file

@ -66,7 +66,7 @@ Problem: Agent needs to know both `provider` and `model`, adding complexity.
Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design: Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design:
1. **Model-centric**: Users care about models, not providers 1. **Model-centric**: Users care about models, not providers
2. **Protocol prefix**: Use `protocol/model_name` format, e.g., `openai/gpt-5.2`, `anthropic/claude-sonnet-4` 2. **Protocol prefix**: Use `protocol/model_name` format, e.g., `openai/gpt-5.2`, `anthropic/claude-sonnet-4.6`
3. **Configuration-driven**: Adding new Providers only requires config changes, no code changes 3. **Configuration-driven**: Adding new Providers only requires config changes, no code changes
### 2.2 New Configuration Structure ### 2.2 New Configuration Structure
@ -86,8 +86,8 @@ Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design:
"api_key": "sk-xxx" "api_key": "sk-xxx"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4-20250514", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-xxx" "api_key": "sk-xxx"
}, },
{ {
@ -184,7 +184,7 @@ Identify protocol via prefix in `model` field:
"system_prompt": "You are a coding assistant..." "system_prompt": "You are a coding assistant..."
}, },
"translator": { "translator": {
"model": "claude-sonnet-4" "model": "claude-sonnet-4.6"
} }
} }
} }

View file

@ -58,8 +58,8 @@ The new `model_list` configuration offers several advantages:
"api_base": "https://api.openai.com/v1" "api_base": "https://api.openai.com/v1"
}, },
{ {
"model_name": "claude-sonnet-4", "model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4", "model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-ant-your-key" "api_key": "sk-ant-your-key"
}, },
{ {
@ -85,10 +85,10 @@ The `model` field uses a protocol prefix format: `[protocol/]model-identifier`
| `openai/` | OpenAI API (default) | `openai/gpt-5.2` | | `openai/` | OpenAI API (default) | `openai/gpt-5.2` |
| `anthropic/` | Anthropic API | `anthropic/claude-opus-4` | | `anthropic/` | Anthropic API | `anthropic/claude-opus-4` |
| `antigravity/` | Google via Antigravity OAuth | `antigravity/gemini-2.0-flash` | | `antigravity/` | Google via Antigravity OAuth | `antigravity/gemini-2.0-flash` |
| `claude-cli/` | Claude CLI (local) | `claude-cli/claude-sonnet-4` | | `claude-cli/` | Claude CLI (local) | `claude-cli/claude-sonnet-4.6` |
| `codex-cli/` | Codex CLI (local) | `codex-cli/codex-4` | | `codex-cli/` | Codex CLI (local) | `codex-cli/codex-4` |
| `github-copilot/` | GitHub Copilot | `github-copilot/gpt-4o` | | `github-copilot/` | GitHub Copilot | `github-copilot/gpt-4o` |
| `openrouter/` | OpenRouter | `openrouter/anthropic/claude-sonnet-4` | | `openrouter/` | OpenRouter | `openrouter/anthropic/claude-sonnet-4.6` |
| `groq/` | Groq API | `groq/llama-3.1-70b` | | `groq/` | Groq API | `groq/llama-3.1-70b` |
| `deepseek/` | DeepSeek API | `deepseek/deepseek-chat` | | `deepseek/` | DeepSeek API | `deepseek/deepseek-chat` |
| `cerebras/` | Cerebras API | `cerebras/llama-3.3-70b` | | `cerebras/` | Cerebras API | `cerebras/llama-3.3-70b` |

View file

@ -350,7 +350,7 @@ type OpenAIProviderConfig struct {
type ModelConfig struct { type ModelConfig struct {
// Required fields // Required fields
ModelName string `json:"model_name"` // User-facing alias for the model ModelName string `json:"model_name"` // User-facing alias for the model
Model string `json:"model"` // Protocol/model-identifier (e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4") Model string `json:"model"` // Protocol/model-identifier (e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4.6")
// HTTP-based providers // HTTP-based providers
APIBase string `json:"api_base,omitempty"` // API endpoint URL APIBase string `json:"api_base,omitempty"` // API endpoint URL

View file

@ -113,8 +113,8 @@ func DefaultConfig() *Config {
// Anthropic Claude - https://console.anthropic.com/settings/keys // Anthropic Claude - https://console.anthropic.com/settings/keys
{ {
ModelName: "claude-sonnet-4", ModelName: "claude-sonnet-4.6",
Model: "anthropic/claude-sonnet-4-20250514", Model: "anthropic/claude-sonnet-4.6",
APIBase: "https://api.anthropic.com/v1", APIBase: "https://api.anthropic.com/v1",
APIKey: "", APIKey: "",
}, },

View file

@ -78,7 +78,7 @@ func ConvertProvidersToModelList(cfg *Config) []ModelConfig {
} }
return ModelConfig{ return ModelConfig{
ModelName: "anthropic", ModelName: "anthropic",
Model: "anthropic/claude-sonnet-4", Model: "anthropic/claude-sonnet-4.6",
APIKey: p.Anthropic.APIKey, APIKey: p.Anthropic.APIKey,
APIBase: p.Anthropic.APIBase, APIBase: p.Anthropic.APIBase,
Proxy: p.Anthropic.Proxy, Proxy: p.Anthropic.Proxy,

View file

@ -58,8 +58,8 @@ func TestConvertProvidersToModelList_Anthropic(t *testing.T) {
if result[0].ModelName != "anthropic" { if result[0].ModelName != "anthropic" {
t.Errorf("ModelName = %q, want %q", result[0].ModelName, "anthropic") t.Errorf("ModelName = %q, want %q", result[0].ModelName, "anthropic")
} }
if result[0].Model != "anthropic/claude-sonnet-4" { if result[0].Model != "anthropic/claude-sonnet-4.6" {
t.Errorf("Model = %q, want %q", result[0].Model, "anthropic/claude-sonnet-4") t.Errorf("Model = %q, want %q", result[0].Model, "anthropic/claude-sonnet-4.6")
} }
} }
@ -513,9 +513,9 @@ func TestBuildModelWithProtocol_AlreadyHasPrefix(t *testing.T) {
} }
func TestBuildModelWithProtocol_DifferentPrefix(t *testing.T) { func TestBuildModelWithProtocol_DifferentPrefix(t *testing.T) {
result := buildModelWithProtocol("anthropic", "openrouter/claude-sonnet-4") result := buildModelWithProtocol("anthropic", "openrouter/claude-sonnet-4.6")
if result != "openrouter/claude-sonnet-4" { if result != "openrouter/claude-sonnet-4.6" {
t.Errorf("buildModelWithProtocol(anthropic, openrouter/claude-sonnet-4) = %q, want %q", result, "openrouter/claude-sonnet-4") t.Errorf("buildModelWithProtocol(anthropic, openrouter/claude-sonnet-4.6) = %q, want %q", result, "openrouter/claude-sonnet-4.6")
} }
} }

View file

@ -85,7 +85,7 @@ func (p *Provider) Chat(ctx context.Context, messages []Message, tools []ToolDef
} }
func (p *Provider) GetDefaultModel() string { func (p *Provider) GetDefaultModel() string {
return "claude-sonnet-4-5-20250929" return "claude-sonnet-4.6"
} }
func (p *Provider) BaseURL() string { func (p *Provider) BaseURL() string {

View file

@ -15,14 +15,14 @@ func TestBuildParams_BasicMessage(t *testing.T) {
messages := []Message{ messages := []Message{
{Role: "user", Content: "Hello"}, {Role: "user", Content: "Hello"},
} }
params, err := buildParams(messages, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{ params, err := buildParams(messages, nil, "claude-sonnet-4.6", map[string]interface{}{
"max_tokens": 1024, "max_tokens": 1024,
}) })
if err != nil { if err != nil {
t.Fatalf("buildParams() error: %v", err) t.Fatalf("buildParams() error: %v", err)
} }
if string(params.Model) != "claude-sonnet-4-5-20250929" { if string(params.Model) != "claude-sonnet-4.6" {
t.Errorf("Model = %q, want %q", params.Model, "claude-sonnet-4-5-20250929") t.Errorf("Model = %q, want %q", params.Model, "claude-sonnet-4.6")
} }
if params.MaxTokens != 1024 { if params.MaxTokens != 1024 {
t.Errorf("MaxTokens = %d, want 1024", params.MaxTokens) t.Errorf("MaxTokens = %d, want 1024", params.MaxTokens)
@ -37,7 +37,7 @@ func TestBuildParams_SystemMessage(t *testing.T) {
{Role: "system", Content: "You are helpful"}, {Role: "system", Content: "You are helpful"},
{Role: "user", Content: "Hi"}, {Role: "user", Content: "Hi"},
} }
params, err := buildParams(messages, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{}) params, err := buildParams(messages, nil, "claude-sonnet-4.6", map[string]interface{}{})
if err != nil { if err != nil {
t.Fatalf("buildParams() error: %v", err) t.Fatalf("buildParams() error: %v", err)
} }
@ -68,7 +68,7 @@ func TestBuildParams_ToolCallMessage(t *testing.T) {
}, },
{Role: "tool", Content: `{"temp": 72}`, ToolCallID: "call_1"}, {Role: "tool", Content: `{"temp": 72}`, ToolCallID: "call_1"},
} }
params, err := buildParams(messages, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{}) params, err := buildParams(messages, nil, "claude-sonnet-4.6", map[string]interface{}{})
if err != nil { if err != nil {
t.Fatalf("buildParams() error: %v", err) t.Fatalf("buildParams() error: %v", err)
} }
@ -94,7 +94,7 @@ func TestBuildParams_WithTools(t *testing.T) {
}, },
}, },
} }
params, err := buildParams([]Message{{Role: "user", Content: "Hi"}}, tools, "claude-sonnet-4-5-20250929", map[string]interface{}{}) params, err := buildParams([]Message{{Role: "user", Content: "Hi"}}, tools, "claude-sonnet-4.6", map[string]interface{}{})
if err != nil { if err != nil {
t.Fatalf("buildParams() error: %v", err) t.Fatalf("buildParams() error: %v", err)
} }
@ -178,7 +178,7 @@ func TestProvider_ChatRoundTrip(t *testing.T) {
provider := NewProviderWithClient(createAnthropicTestClient(server.URL, "test-token")) provider := NewProviderWithClient(createAnthropicTestClient(server.URL, "test-token"))
messages := []Message{{Role: "user", Content: "Hello"}} messages := []Message{{Role: "user", Content: "Hello"}}
resp, err := provider.Chat(t.Context(), messages, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{"max_tokens": 1024}) resp, err := provider.Chat(t.Context(), messages, nil, "claude-sonnet-4.6", map[string]interface{}{"max_tokens": 1024})
if err != nil { if err != nil {
t.Fatalf("Chat() error: %v", err) t.Fatalf("Chat() error: %v", err)
} }
@ -195,8 +195,8 @@ func TestProvider_ChatRoundTrip(t *testing.T) {
func TestProvider_GetDefaultModel(t *testing.T) { func TestProvider_GetDefaultModel(t *testing.T) {
p := NewProvider("test-token") p := NewProvider("test-token")
if got := p.GetDefaultModel(); got != "claude-sonnet-4-5-20250929" { if got := p.GetDefaultModel(); got != "claude-sonnet-4.6" {
t.Errorf("GetDefaultModel() = %q, want %q", got, "claude-sonnet-4-5-20250929") t.Errorf("GetDefaultModel() = %q, want %q", got, "claude-sonnet-4.6")
} }
} }
@ -247,7 +247,7 @@ func TestProvider_ChatUsesTokenSource(t *testing.T) {
return "refreshed-token", nil return "refreshed-token", nil
}, server.URL) }, server.URL)
_, err := p.Chat(t.Context(), []Message{{Role: "user", Content: "hello"}}, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{}) _, err := p.Chat(t.Context(), []Message{{Role: "user", Content: "hello"}}, nil, "claude-sonnet-4.6", map[string]interface{}{})
if err != nil { if err != nil {
t.Fatalf("Chat() error: %v", err) t.Fatalf("Chat() error: %v", err)
} }

View file

@ -336,7 +336,7 @@ func TestChat_PassesModelFlag(t *testing.T) {
_, err := p.Chat(context.Background(), []Message{ _, err := p.Chat(context.Background(), []Message{
{Role: "user", Content: "Hi"}, {Role: "user", Content: "Hi"},
}, nil, "claude-sonnet-4-5-20250929", nil) }, nil, "claude-sonnet-4.6", nil)
if err != nil { if err != nil {
t.Fatalf("Chat() error = %v", err) t.Fatalf("Chat() error = %v", err)
} }
@ -346,7 +346,7 @@ func TestChat_PassesModelFlag(t *testing.T) {
if !strings.Contains(args, "--model") { if !strings.Contains(args, "--model") {
t.Errorf("CLI args missing --model, got: %s", args) t.Errorf("CLI args missing --model, got: %s", args)
} }
if !strings.Contains(args, "claude-sonnet-4-5-20250929") { if !strings.Contains(args, "claude-sonnet-4.6") {
t.Errorf("CLI args missing model name, got: %s", args) t.Errorf("CLI args missing model name, got: %s", args)
} }
} }
@ -417,9 +417,9 @@ func TestChat_EmptyWorkspaceDoesNotSetDir(t *testing.T) {
func TestCreateProvider_ClaudeCli(t *testing.T) { func TestCreateProvider_ClaudeCli(t *testing.T) {
cfg := config.DefaultConfig() cfg := config.DefaultConfig()
cfg.ModelList = []config.ModelConfig{ cfg.ModelList = []config.ModelConfig{
{ModelName: "claude-sonnet-4", Model: "claude-cli/claude-sonnet-4-20250514", Workspace: "/test/ws"}, {ModelName: "claude-sonnet-4.6", Model: "claude-cli/claude-sonnet-4.6", Workspace: "/test/ws"},
} }
cfg.Agents.Defaults.Model = "claude-sonnet-4" cfg.Agents.Defaults.Model = "claude-sonnet-4.6"
provider, _, err := CreateProvider(cfg) provider, _, err := CreateProvider(cfg)
if err != nil { if err != nil {

View file

@ -48,7 +48,7 @@ func TestClaudeProvider_ChatRoundTrip(t *testing.T) {
provider := newClaudeProviderWithDelegate(delegate) provider := newClaudeProviderWithDelegate(delegate)
messages := []Message{{Role: "user", Content: "Hello"}} messages := []Message{{Role: "user", Content: "Hello"}}
resp, err := provider.Chat(t.Context(), messages, nil, "claude-sonnet-4-5-20250929", map[string]interface{}{"max_tokens": 1024}) resp, err := provider.Chat(t.Context(), messages, nil, "claude-sonnet-4.6", map[string]interface{}{"max_tokens": 1024})
if err != nil { if err != nil {
t.Fatalf("Chat() error: %v", err) t.Fatalf("Chat() error: %v", err)
} }
@ -65,8 +65,8 @@ func TestClaudeProvider_ChatRoundTrip(t *testing.T) {
func TestClaudeProvider_GetDefaultModel(t *testing.T) { func TestClaudeProvider_GetDefaultModel(t *testing.T) {
p := NewClaudeProvider("test-token") p := NewClaudeProvider("test-token")
if got := p.GetDefaultModel(); got != "claude-sonnet-4-5-20250929" { if got := p.GetDefaultModel(); got != "claude-sonnet-4.6" {
t.Errorf("GetDefaultModel() = %q, want %q", got, "claude-sonnet-4-5-20250929") t.Errorf("GetDefaultModel() = %q, want %q", got, "claude-sonnet-4.6")
} }
} }

View file

@ -40,7 +40,7 @@ func createCodexAuthProvider() (LLMProvider, error) {
// If no prefix is specified, it defaults to "openai". // If no prefix is specified, it defaults to "openai".
// Examples: // Examples:
// - "openai/gpt-4o" -> ("openai", "gpt-4o") // - "openai/gpt-4o" -> ("openai", "gpt-4o")
// - "anthropic/claude-3" -> ("anthropic", "claude-3") // - "anthropic/claude-sonnet-4.6" -> ("anthropic", "claude-sonnet-4.6")
// - "gpt-4o" -> ("openai", "gpt-4o") // default protocol // - "gpt-4o" -> ("openai", "gpt-4o") // default protocol
func ExtractProtocol(model string) (protocol, modelID string) { func ExtractProtocol(model string) (protocol, modelID string) {
model = strings.TrimSpace(model) model = strings.TrimSpace(model)

View file

@ -26,9 +26,9 @@ func TestExtractProtocol(t *testing.T) {
}, },
{ {
name: "anthropic with prefix", name: "anthropic with prefix",
model: "anthropic/claude-3-sonnet", model: "anthropic/claude-sonnet-4.6",
wantProtocol: "anthropic", wantProtocol: "anthropic",
wantModelID: "claude-3-sonnet", wantModelID: "claude-sonnet-4.6",
}, },
{ {
name: "no prefix - defaults to openai", name: "no prefix - defaults to openai",
@ -134,7 +134,7 @@ func TestCreateProviderFromConfig_DefaultAPIBase(t *testing.T) {
func TestCreateProviderFromConfig_Anthropic(t *testing.T) { func TestCreateProviderFromConfig_Anthropic(t *testing.T) {
cfg := &config.ModelConfig{ cfg := &config.ModelConfig{
ModelName: "test-anthropic", ModelName: "test-anthropic",
Model: "anthropic/claude-3-sonnet", Model: "anthropic/claude-sonnet-4.6",
APIKey: "test-key", APIKey: "test-key",
} }
@ -145,8 +145,8 @@ func TestCreateProviderFromConfig_Anthropic(t *testing.T) {
if provider == nil { if provider == nil {
t.Fatal("CreateProviderFromConfig() returned nil provider") t.Fatal("CreateProviderFromConfig() returned nil provider")
} }
if modelID != "claude-3-sonnet" { if modelID != "claude-sonnet-4.6" {
t.Errorf("modelID = %q, want %q", modelID, "claude-3-sonnet") t.Errorf("modelID = %q, want %q", modelID, "claude-sonnet-4.6")
} }
} }
@ -171,7 +171,7 @@ func TestCreateProviderFromConfig_Antigravity(t *testing.T) {
func TestCreateProviderFromConfig_ClaudeCLI(t *testing.T) { func TestCreateProviderFromConfig_ClaudeCLI(t *testing.T) {
cfg := &config.ModelConfig{ cfg := &config.ModelConfig{
ModelName: "test-claude-cli", ModelName: "test-claude-cli",
Model: "claude-cli/claude-sonnet-4-20250514", Model: "claude-cli/claude-sonnet-4.6",
} }
provider, modelID, err := CreateProviderFromConfig(cfg) provider, modelID, err := CreateProviderFromConfig(cfg)
@ -181,8 +181,8 @@ func TestCreateProviderFromConfig_ClaudeCLI(t *testing.T) {
if provider == nil { if provider == nil {
t.Fatal("CreateProviderFromConfig() returned nil provider") t.Fatal("CreateProviderFromConfig() returned nil provider")
} }
if modelID != "claude-sonnet-4-20250514" { if modelID != "claude-sonnet-4.6" {
t.Errorf("modelID = %q, want %q", modelID, "claude-sonnet-4-20250514") t.Errorf("modelID = %q, want %q", modelID, "claude-sonnet-4.6")
} }
} }

View file

@ -79,7 +79,7 @@ func TestResolveProviderSelection(t *testing.T) {
{ {
name: "anthropic oauth routes to claude auth provider", name: "anthropic oauth routes to claude auth provider",
setup: func(cfg *config.Config) { setup: func(cfg *config.Config) {
cfg.Agents.Defaults.Model = "claude-sonnet-4-5-20250929" cfg.Agents.Defaults.Model = "claude-sonnet-4.6"
cfg.Providers.Anthropic.AuthMethod = "oauth" cfg.Providers.Anthropic.AuthMethod = "oauth"
}, },
wantType: providerTypeClaudeAuth, wantType: providerTypeClaudeAuth,
@ -276,7 +276,7 @@ func TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {
cfg.ModelList = []config.ModelConfig{ cfg.ModelList = []config.ModelConfig{
{ {
ModelName: "test-claude-oauth", ModelName: "test-claude-oauth",
Model: "anthropic/claude-3-sonnet", Model: "anthropic/claude-sonnet-4.6",
AuthMethod: "oauth", AuthMethod: "oauth",
}, },
} }