on main help sign in
chore: fix bedrock
a43e3e0Kujtim Hoxha
go.mod+5−5
@@ -3,7 +3,7 @@ module github.com/charmbracelet/crush
3go 1.25.0
3go 1.25.0
4
4
5require (
5require (
6− charm.land/fantasy v0.1.0
6+ charm.land/fantasy v0.1.1-0.20251024115258-bc777ca882e2
7 github.com/JohannesKaufmann/html-to-markdown v1.6.0
7 github.com/JohannesKaufmann/html-to-markdown v1.6.0
8 github.com/MakeNowJust/heredoc v1.0.0
8 github.com/MakeNowJust/heredoc v1.0.0
9 github.com/PuerkitoBio/goquery v1.10.3
9 github.com/PuerkitoBio/goquery v1.10.3
@@ -14,7 +14,7 @@ require (
14 github.com/charlievieth/fastwalk v1.0.14
14 github.com/charlievieth/fastwalk v1.0.14
15 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
15 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
16 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5
16 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5
17− github.com/charmbracelet/catwalk v0.7.1-0.20251023112313-048e47f1399c
17+ github.com/charmbracelet/catwalk v0.7.1-0.20251024112336-5ba234a3a372
18 github.com/charmbracelet/fang v0.4.3
18 github.com/charmbracelet/fang v0.4.3
19 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
19 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
20 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
20 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
@@ -58,6 +58,7 @@ require (
58 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
58 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
59 github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
59 github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
60 github.com/andybalholm/cascadia v1.3.3 // indirect
60 github.com/andybalholm/cascadia v1.3.3 // indirect
61+ github.com/anthropics/anthropic-sdk-go v1.14.0 // indirect
61 github.com/aws/aws-sdk-go-v2 v1.39.3 // indirect
62 github.com/aws/aws-sdk-go-v2 v1.39.3 // indirect
62 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
63 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
63 github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect
64 github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect
@@ -76,9 +77,7 @@ require (
76 github.com/aymerick/douceur v0.2.0 // indirect
77 github.com/aymerick/douceur v0.2.0 // indirect
77 github.com/bahlo/generic-list-go v0.2.0 // indirect
78 github.com/bahlo/generic-list-go v0.2.0 // indirect
78 github.com/buger/jsonparser v1.1.1 // indirect
79 github.com/buger/jsonparser v1.1.1 // indirect
79− github.com/charmbracelet/anthropic-sdk-go v0.0.0-20251022202715-ec1499142678 // indirect
80 github.com/charmbracelet/colorprofile v0.3.2
80 github.com/charmbracelet/colorprofile v0.3.2
81− github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97 // indirect
82 github.com/charmbracelet/ultraviolet v0.0.0-20251017140847-d4ace4d6e731
81 github.com/charmbracelet/ultraviolet v0.0.0-20251017140847-d4ace4d6e731
83 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect
82 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect
84 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5
83 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5
@@ -121,7 +120,7 @@ require (
121 github.com/muesli/mango-pflag v0.1.0 // indirect
120 github.com/muesli/mango-pflag v0.1.0 // indirect
122 github.com/muesli/roff v0.1.0 // indirect
121 github.com/muesli/roff v0.1.0 // indirect
123 github.com/ncruces/julianday v1.0.0 // indirect
122 github.com/ncruces/julianday v1.0.0 // indirect
124− github.com/openai/openai-go/v2 v2.7.1 // indirect
123+ github.com/openai/openai-go/v2 v2.7.1
125 github.com/pierrec/lz4/v4 v4.1.22 // indirect
124 github.com/pierrec/lz4/v4 v4.1.22 // indirect
126 github.com/pmezard/go-difflib v1.0.0 // indirect
125 github.com/pmezard/go-difflib v1.0.0 // indirect
127 github.com/posthog/posthog-go v1.6.11
126 github.com/posthog/posthog-go v1.6.11
@@ -159,6 +158,7 @@ require (
159 golang.org/x/text v0.30.0
158 golang.org/x/text v0.30.0
160 golang.org/x/time v0.12.0 // indirect
159 golang.org/x/time v0.12.0 // indirect
161 google.golang.org/api v0.239.0 // indirect
160 google.golang.org/api v0.239.0 // indirect
161+ google.golang.org/genai v1.32.0 // indirect
162 google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
162 google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
163 google.golang.org/grpc v1.74.2 // indirect
163 google.golang.org/grpc v1.74.2 // indirect
164 google.golang.org/protobuf v1.36.10 // indirect
164 google.golang.org/protobuf v1.36.10 // indirect
go.sum+8−8
@@ -1,5 +1,5 @@
1−charm.land/fantasy v0.1.0 h1:F+k1zmmqMllM/VpVFy+BY6lDmE0SsJ3LUWGQm+o20Bg=
1+charm.land/fantasy v0.1.1-0.20251024115258-bc777ca882e2 h1:iKwZI73UeIzMR0Gy5OjDouHJJgdWjQ2WQ0D1rYSWT6Y=
2−charm.land/fantasy v0.1.0/go.mod h1:lR8tV9VQlH/HOHs9ilSzBkcN9I+o639jpVPs4MI/Jyk=
2+charm.land/fantasy v0.1.1-0.20251024115258-bc777ca882e2/go.mod h1:KsQ0bgpcUhCeGTVUxlC9aDY8Zm0q41qa2r334sVncdk=
3cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
3cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
4cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
4cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
5cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
5cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
@@ -32,6 +32,8 @@ github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW5
32github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
32github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
33github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
33github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
34github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
34github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
35+github.com/anthropics/anthropic-sdk-go v1.14.0 h1:EzNQvnZlaDHe2UPkoUySDz3ixRgNbwKdH8KtFpv7pi4=
36+github.com/anthropics/anthropic-sdk-go v1.14.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE=
35github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
37github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
36github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
38github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
37github.com/aws/aws-sdk-go-v2 v1.39.3 h1:h7xSsanJ4EQJXG5iuW4UqgP7qBopLpj84mpkNx3wPjM=
39github.com/aws/aws-sdk-go-v2 v1.39.3 h1:h7xSsanJ4EQJXG5iuW4UqgP7qBopLpj84mpkNx3wPjM=
@@ -76,22 +78,18 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
76github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
78github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
77github.com/charlievieth/fastwalk v1.0.14 h1:3Eh5uaFGwHZd8EGwTjJnSpBkfwfsak9h6ICgnWlhAyg=
79github.com/charlievieth/fastwalk v1.0.14 h1:3Eh5uaFGwHZd8EGwTjJnSpBkfwfsak9h6ICgnWlhAyg=
78github.com/charlievieth/fastwalk v1.0.14/go.mod h1:diVcUreiU1aQ4/Wu3NbxxH4/KYdKpLDojrQ1Bb2KgNY=
80github.com/charlievieth/fastwalk v1.0.14/go.mod h1:diVcUreiU1aQ4/Wu3NbxxH4/KYdKpLDojrQ1Bb2KgNY=
79−github.com/charmbracelet/anthropic-sdk-go v0.0.0-20251022202715-ec1499142678 h1:ruB8GXJ6K6lbuU+NhHKsqoHbU/+E+/+0kfUxhWPLvFs=
80−github.com/charmbracelet/anthropic-sdk-go v0.0.0-20251022202715-ec1499142678/go.mod h1:8TIYxZxsuCqqeJ0lga/b91tBwrbjoHDC66Sq5t8N2R4=
81github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2 h1:973OHYuq2Jx9deyuPwe/6lsuQrDCatOsjP8uCd02URE=
81github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2 h1:973OHYuq2Jx9deyuPwe/6lsuQrDCatOsjP8uCd02URE=
82github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
82github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
83github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5 h1:oAChAeh730gtLKK/BpaTeJHzmj3KFuEfQ7AZgf2VGHM=
83github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5 h1:oAChAeh730gtLKK/BpaTeJHzmj3KFuEfQ7AZgf2VGHM=
84github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5/go.mod h1:SUTLq+/pGQ5qntHgt0JswfVJFfgJgWDqyvyiSLVlmbo=
84github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.5/go.mod h1:SUTLq+/pGQ5qntHgt0JswfVJFfgJgWDqyvyiSLVlmbo=
85−github.com/charmbracelet/catwalk v0.7.1-0.20251023112313-048e47f1399c h1:FVx5lHa+uGmr3GmShsQWhrpmU8RutJm0+To9rU804Ws=
85+github.com/charmbracelet/catwalk v0.7.1-0.20251024112336-5ba234a3a372 h1:dI3KLG7HaqijbVI7FbBribSTEr5ntQ02ia2JqY0/I8s=
86−github.com/charmbracelet/catwalk v0.7.1-0.20251023112313-048e47f1399c/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
86+github.com/charmbracelet/catwalk v0.7.1-0.20251024112336-5ba234a3a372/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
87github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
87github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
88github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
88github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
89github.com/charmbracelet/fang v0.4.3 h1:qXeMxnL4H6mSKBUhDefHu8NfikFbP/MBNTfqTrXvzmY=
89github.com/charmbracelet/fang v0.4.3 h1:qXeMxnL4H6mSKBUhDefHu8NfikFbP/MBNTfqTrXvzmY=
90github.com/charmbracelet/fang v0.4.3/go.mod h1:wHJKQYO5ReYsxx+yZl+skDtrlKO/4LLEQ6EXsdHhRhg=
90github.com/charmbracelet/fang v0.4.3/go.mod h1:wHJKQYO5ReYsxx+yZl+skDtrlKO/4LLEQ6EXsdHhRhg=
91github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w=
91github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w=
92github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018/go.mod h1:Z/GLmp9fzaqX4ze3nXG7StgWez5uBM5XtlLHK8V/qSk=
92github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018/go.mod h1:Z/GLmp9fzaqX4ze3nXG7StgWez5uBM5XtlLHK8V/qSk=
93−github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97 h1:HK7B5Q+0FidxjQD5CovniMw7axkUeMHwgVkxkbmiW/s=
94−github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97/go.mod h1:ZagL2esO4qxlOJBj0d4PVvLM82akQFtne8s3ivxBnTQ=
95github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea h1:g1HfUgSMvye8mgecMD1mPscpt+pzJoDEiSA+p2QXzdQ=
93github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea h1:g1HfUgSMvye8mgecMD1mPscpt+pzJoDEiSA+p2QXzdQ=
96github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea/go.mod h1:ngHerf1JLJXBrDXdphn5gFrBPriCL437uwukd5c93pM=
94github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea/go.mod h1:ngHerf1JLJXBrDXdphn5gFrBPriCL437uwukd5c93pM=
97github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
95github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
@@ -437,6 +435,8 @@ golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w
437golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
435golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
438google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo=
436google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo=
439google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50=
437google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50=
438+google.golang.org/genai v1.32.0 h1:kku/m3kWOncjnw8EIa2sgmrPLhaxFHaP+uqOq5ZckvI=
439+google.golang.org/genai v1.32.0/go.mod h1:7pAilaICJlQBonjKKJNhftDFv3SREhZcTe9F6nRcjbg=
440google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
440google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
441google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
441google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
442google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
442google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
internal/agent/coordinator.go+6−10
@@ -9,6 +9,7 @@ import (
9 "fmt"
9 "fmt"
10 "io"
10 "io"
11 "log/slog"
11 "log/slog"
12+ "os"
12 "slices"
13 "slices"
13 "strings"
14 "strings"
14
15
@@ -424,15 +425,6 @@ func (c *coordinator) buildAgentModels(ctx context.Context) (Model, Model, error
424 smallModelID += ":exacto"
425 smallModelID += ":exacto"
425 }
426 }
426
427
427− // FIXME(@andreynering): Temporary fix to get it working.
428− // We need to prefix the model with with `{region}.`
429− if largeModelCfg.Provider == bedrock.Name {
430− largeModelID = fmt.Sprintf("us.%s", largeModelID)
431− }
432− if smallModelCfg.Provider == bedrock.Name {
433− smallModelID = fmt.Sprintf("us.%s", smallModelID)
434− }
435−
436 largeModel, err := largeProvider.LanguageModel(ctx, largeModelID)
428 largeModel, err := largeProvider.LanguageModel(ctx, largeModelID)
437 if err != nil {
429 if err != nil {
438 return Model{}, Model{}, err
430 return Model{}, Model{}, err
@@ -577,6 +569,10 @@ func (c *coordinator) buildBedrockProvider(headers map[string]string) (fantasy.P
577 if len(headers) > 0 {
569 if len(headers) > 0 {
578 opts = append(opts, bedrock.WithHeaders(headers))
570 opts = append(opts, bedrock.WithHeaders(headers))
579 }
571 }
572+ bearerToken := os.Getenv("AWS_BEARER_TOKEN_BEDROCK")
573+ if bearerToken != "" {
574+ opts = append(opts, bedrock.WithAPIKey(bearerToken))
575+ }
580 return bedrock.New(opts...)
576 return bedrock.New(opts...)
581}
577}
582
578
@@ -657,7 +653,7 @@ func (c *coordinator) buildProvider(providerCfg config.ProviderConfig, model con
657 return c.buildBedrockProvider(headers)
653 return c.buildBedrockProvider(headers)
658 case google.Name:
654 case google.Name:
659 return c.buildGoogleProvider(baseURL, apiKey, headers)
655 return c.buildGoogleProvider(baseURL, apiKey, headers)
660− case "google-vertex", "vertexai":
656+ case "google-vertex":
661 return c.buildGoogleVertexProvider(headers, providerCfg.ExtraParams)
657 return c.buildGoogleVertexProvider(headers, providerCfg.ExtraParams)
662 case openaicompat.Name:
658 case openaicompat.Name:
663 return c.buildOpenaiCompatProvider(baseURL, apiKey, headers, providerCfg.ExtraBody)
659 return c.buildOpenaiCompatProvider(baseURL, apiKey, headers, providerCfg.ExtraBody)