on main help sign in
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

commit74b84f6968fde0d80562be9f31f56cbc8cf35cf7 authorAndrey Nering <andreynering@users.noreply.github.com> dateFri 22 May 2026, 15:33 (5 months ago) parentce39583
4 files changed+13−45
go.mod+4−4 go.sum+8−8 internal/config/load.go+1−10 internal/config/load_test.go−23
go.mod+4−4
@@ -5,9 +5,9 @@ go 1.26.3
55require (
66 charm.land/bubbles/v2 v2.1.0
77 charm.land/bubbletea/v2 v2.0.6
8− charm.land/catwalk v0.41.3
8+ charm.land/catwalk v0.41.7
99 charm.land/fang/v2 v2.0.1
10− charm.land/fantasy v0.25.1
10+ charm.land/fantasy v0.25.2
1111 charm.land/glamour/v2 v2.0.0
1212 charm.land/lipgloss/v2 v2.0.3
1313 charm.land/log/v2 v2.0.0
@@ -67,9 +67,9 @@ require (
6767 github.com/tidwall/sjson v1.2.5
6868 github.com/zeebo/xxh3 v1.1.0
6969 go.uber.org/goleak v1.3.0
70− golang.org/x/net v0.54.0
70+ golang.org/x/net v0.55.0
7171 golang.org/x/sync v0.20.0
72− golang.org/x/sys v0.44.0
72+ golang.org/x/sys v0.45.0
7373 golang.org/x/text v0.37.0
7474 gopkg.in/natefinch/lumberjack.v2 v2.2.1
7575 gopkg.in/yaml.v3 v3.0.1
go.sum+8−8
@@ -2,12 +2,12 @@ charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
22charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
33charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo=
44charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g=
5−charm.land/catwalk v0.41.3 h1:Ft02rkrPVrgWnaGAllcPx7+6yki7/cL7h2f3Bv1aRCM=
6−charm.land/catwalk v0.41.3/go.mod h1:LmMFJdRqF5F7qKa+xqD9SBq7tph7L98GU3ZFa1TxftA=
5+charm.land/catwalk v0.41.7 h1:zUlnSxJGaw0c3UWnzbX/oP9qqw5KLwP1qCbEvL/Skeg=
6+charm.land/catwalk v0.41.7/go.mod h1:dtK2+UfdsFJgIriRPodMsSJw0XefrFOq6fdvuS57v3s=
77charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY=
88charm.land/fang/v2 v2.0.1/go.mod h1:S1GmkpcvK+OB5w9caywUnJcsMew45Ot8FXqoz8ALrII=
9−charm.land/fantasy v0.25.1 h1:xGDRDC9R/h72A67ACbZcJ8vP2zgF4qTJbKX4SnzUNiw=
10−charm.land/fantasy v0.25.1/go.mod h1:qQasIyQ0QBH2EYb4JLuPGDggha9Gw7u1mX9hFfQv84M=
9+charm.land/fantasy v0.25.2 h1:K7ZOM3UEay//NHfiFAeIMRaOqhspxe0UyccIJOYrjuo=
10+charm.land/fantasy v0.25.2/go.mod h1:9ykD5gjn8BCjpZqA66vet7H1KsmR+kP0Q0qw1FiqCk0=
1111charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U=
1212charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w=
1313charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU=
@@ -488,8 +488,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
488488golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
489489golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
490490golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
491−golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
492−golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
491+golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
492+golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
493493golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
494494golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
495495golang.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=
516516golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
517517golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
518518golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
519−golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
520−golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
519+golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
520+golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
521521golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
522522golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
523523golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
internal/config/load.go+1−10
@@ -298,22 +298,13 @@ func (c *Config) configureProviders(store *ConfigStore, env env.Env, resolver Va
298298 prepared.BaseURL = endpoint
299299 prepared.ExtraParams["apiVersion"] = env.Get("AZURE_OPENAI_API_VERSION")
300300 case catwalk.InferenceProviderBedrock:
301− if !hasAWSCredentials(env) {
301+ if p.APIKey == "" && !hasAWSCredentials(env) {
302302 if configExists {
303303 slog.Warn("Skipping Bedrock provider due to missing AWS credentials")
304304 c.Providers.Del(string(p.ID))
305305 }
306306 continue
307307 }
308− prepared.ExtraParams["region"] = env.Get("AWS_REGION")
309− if prepared.ExtraParams["region"] == "" {
310− prepared.ExtraParams["region"] = env.Get("AWS_DEFAULT_REGION")
311− }
312− for _, model := range p.Models {
313− if !strings.HasPrefix(model.ID, "anthropic.") {
314− return fmt.Errorf("bedrock provider only supports anthropic models for now, found: %s", model.ID)
315− }
316− }
317308 case catwalk.InferenceProvider("hyper"):
318309 if apiKey := env.Get("HYPER_API_KEY"); apiKey != "" {
319310 prepared.APIKey = apiKey
internal/config/load_test.go−23
@@ -470,29 +470,6 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
470470 require.Equal(t, cfg.Providers.Len(), 0)
471471}
472472
473−func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
474− knownProviders := []catwalk.Provider{
475− {
476− ID: catwalk.InferenceProviderBedrock,
477− APIKey: "",
478− APIEndpoint: "",
479− Models: []catwalk.Model{{
480− ID: "some-random-model",
481− }},
482− },
483− }
484−
485− cfg := &Config{}
486− cfg.setDefaults("/tmp", "")
487− env := env.NewFromMap(map[string]string{
488− "AWS_ACCESS_KEY_ID": "test-key-id",
489− "AWS_SECRET_ACCESS_KEY": "test-secret-key",
490− })
491− resolver := NewShellVariableResolver(env)
492− err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
493− require.Error(t, err)
494−}
495−
496473func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
497474 knownProviders := []catwalk.Provider{
498475 {