From 74b84f6968fde0d80562be9f31f56cbc8cf35cf7 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 22 May 2026 15:33:36 -0300 Subject: [PATCH] fix(bedrock): enforce `us-east-1` as region for bedrock (#2985) This is the only region with access to all models. Having a fixed region should avoid confusion as some users might have `AWS_REGION` or `AWS_DEFAULT_REGION` set, but other regions won't really work. * Catwalk PR: https://github.com/charmbracelet/catwalk/pull/289 * Fantasy PR: https://github.com/charmbracelet/fantasy/pull/248 * Closes #2568 * Closes #2759 --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- internal/config/load.go | 11 +---------- internal/config/load_test.go | 23 ----------------------- 4 files changed, 13 insertions(+), 45 deletions(-) diff --git a/go.mod b/go.mod index 10004cef4cd20c9237382a0ba7db7b4e291faa24..79ef0226a911b9fc779f9b9a397dc22e51f858f9 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.26.3 require ( charm.land/bubbles/v2 v2.1.0 charm.land/bubbletea/v2 v2.0.6 - charm.land/catwalk v0.41.3 + charm.land/catwalk v0.41.7 charm.land/fang/v2 v2.0.1 - charm.land/fantasy v0.25.1 + charm.land/fantasy v0.25.2 charm.land/glamour/v2 v2.0.0 charm.land/lipgloss/v2 v2.0.3 charm.land/log/v2 v2.0.0 @@ -67,9 +67,9 @@ require ( github.com/tidwall/sjson v1.2.5 github.com/zeebo/xxh3 v1.1.0 go.uber.org/goleak v1.3.0 - golang.org/x/net v0.54.0 + golang.org/x/net v0.55.0 golang.org/x/sync v0.20.0 - golang.org/x/sys v0.44.0 + golang.org/x/sys v0.45.0 golang.org/x/text v0.37.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 4e52b966ad5a6391d54ac5ab3be87de8c90ba459..56cb04ebd7694928ee0d27f9c743f409398b1a33 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,12 @@ charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g= charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY= charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo= charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g= -charm.land/catwalk v0.41.3 h1:Ft02rkrPVrgWnaGAllcPx7+6yki7/cL7h2f3Bv1aRCM= -charm.land/catwalk v0.41.3/go.mod h1:LmMFJdRqF5F7qKa+xqD9SBq7tph7L98GU3ZFa1TxftA= +charm.land/catwalk v0.41.7 h1:zUlnSxJGaw0c3UWnzbX/oP9qqw5KLwP1qCbEvL/Skeg= +charm.land/catwalk v0.41.7/go.mod h1:dtK2+UfdsFJgIriRPodMsSJw0XefrFOq6fdvuS57v3s= charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY= charm.land/fang/v2 v2.0.1/go.mod h1:S1GmkpcvK+OB5w9caywUnJcsMew45Ot8FXqoz8ALrII= -charm.land/fantasy v0.25.1 h1:xGDRDC9R/h72A67ACbZcJ8vP2zgF4qTJbKX4SnzUNiw= -charm.land/fantasy v0.25.1/go.mod h1:qQasIyQ0QBH2EYb4JLuPGDggha9Gw7u1mX9hFfQv84M= +charm.land/fantasy v0.25.2 h1:K7ZOM3UEay//NHfiFAeIMRaOqhspxe0UyccIJOYrjuo= +charm.land/fantasy v0.25.2/go.mod h1:9ykD5gjn8BCjpZqA66vet7H1KsmR+kP0Q0qw1FiqCk0= charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U= charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w= charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU= @@ -488,8 +488,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -516,8 +516,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/internal/config/load.go b/internal/config/load.go index f816d2692e14c9baf2e281d852003088ffbe8a5d..08fa3cf2c7b24204146d9790c96e3936761933df 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -298,22 +298,13 @@ func (c *Config) configureProviders(store *ConfigStore, env env.Env, resolver Va prepared.BaseURL = endpoint prepared.ExtraParams["apiVersion"] = env.Get("AZURE_OPENAI_API_VERSION") case catwalk.InferenceProviderBedrock: - if !hasAWSCredentials(env) { + if p.APIKey == "" && !hasAWSCredentials(env) { if configExists { slog.Warn("Skipping Bedrock provider due to missing AWS credentials") c.Providers.Del(string(p.ID)) } continue } - prepared.ExtraParams["region"] = env.Get("AWS_REGION") - if prepared.ExtraParams["region"] == "" { - prepared.ExtraParams["region"] = env.Get("AWS_DEFAULT_REGION") - } - for _, model := range p.Models { - if !strings.HasPrefix(model.ID, "anthropic.") { - return fmt.Errorf("bedrock provider only supports anthropic models for now, found: %s", model.ID) - } - } case catwalk.InferenceProvider("hyper"): if apiKey := env.Get("HYPER_API_KEY"); apiKey != "" { prepared.APIKey = apiKey diff --git a/internal/config/load_test.go b/internal/config/load_test.go index 026c8971555f49d910f658ff9a0c61f4c0438b11..1a56d6e6120ab1212bbfa6254e695d571926e40d 100644 --- a/internal/config/load_test.go +++ b/internal/config/load_test.go @@ -470,29 +470,6 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) { require.Equal(t, cfg.Providers.Len(), 0) } -func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) { - knownProviders := []catwalk.Provider{ - { - ID: catwalk.InferenceProviderBedrock, - APIKey: "", - APIEndpoint: "", - Models: []catwalk.Model{{ - ID: "some-random-model", - }}, - }, - } - - cfg := &Config{} - cfg.setDefaults("/tmp", "") - env := env.NewFromMap(map[string]string{ - "AWS_ACCESS_KEY_ID": "test-key-id", - "AWS_SECRET_ACCESS_KEY": "test-secret-key", - }) - resolver := NewShellVariableResolver(env) - err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders) - require.Error(t, err) -} - func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) { knownProviders := []catwalk.Provider{ {