diff --git a/pkg/providers/anthropic_messages/provider.go b/pkg/providers/anthropic_messages/provider.go index 8a83a7058..e4afb853b 100644 --- a/pkg/providers/anthropic_messages/provider.go +++ b/pkg/providers/anthropic_messages/provider.go @@ -161,8 +161,11 @@ func buildRequestBody( return nil, fmt.Errorf("max_tokens is required in options") } + // Normalize model ID: Anthropic API uses hyphens (claude-sonnet-4-6), + // but config may use dots (claude-sonnet-4.6). + apiModel := strings.ReplaceAll(model, ".", "-") result := map[string]any{ - "model": model, + "model": apiModel, "max_tokens": int64(maxTokens), "messages": []any{}, } diff --git a/pkg/providers/factory_provider.go b/pkg/providers/factory_provider.go index b7567f9fc..05cf87b26 100644 --- a/pkg/providers/factory_provider.go +++ b/pkg/providers/factory_provider.go @@ -134,6 +134,9 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err ), modelID, nil case "anthropic": + // Normalize model ID: Anthropic API uses hyphens (claude-sonnet-4-6), + // but config may use dots (claude-sonnet-4.6). + modelID = strings.ReplaceAll(modelID, ".", "-") if cfg.AuthMethod == "oauth" || cfg.AuthMethod == "token" { // Use OAuth credentials from auth store provider, err := createClaudeAuthProvider() diff --git a/pkg/providers/factory_provider_test.go b/pkg/providers/factory_provider_test.go index b678a7eb6..2771eda98 100644 --- a/pkg/providers/factory_provider_test.go +++ b/pkg/providers/factory_provider_test.go @@ -236,8 +236,8 @@ func TestCreateProviderFromConfig_Anthropic(t *testing.T) { if provider == nil { t.Fatal("CreateProviderFromConfig() returned nil provider") } - if modelID != "claude-sonnet-4.6" { - t.Errorf("modelID = %q, want %q", modelID, "claude-sonnet-4.6") + if modelID != "claude-sonnet-4-6" { + t.Errorf("modelID = %q, want %q", modelID, "claude-sonnet-4-6") } }