Detailed changes
@@ -3,10 +3,8 @@ module charm.land/fantasy
go 1.24.5
require (
- cloud.google.com/go/auth v0.17.0
github.com/anthropics/anthropic-sdk-go v1.14.0
github.com/aws/aws-sdk-go-v2/config v1.27.27
- github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97
github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5
github.com/charmbracelet/x/json v0.2.0
github.com/go-viper/mapstructure/v2 v2.4.0
@@ -18,11 +16,13 @@ require (
github.com/tidwall/sjson v1.2.5
go.yaml.in/yaml/v4 v4.0.0-rc.2
golang.org/x/oauth2 v0.32.0
+ google.golang.org/genai v1.32.0
gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20250923044825-7b4892dd3117
)
require (
cloud.google.com/go v0.116.0 // indirect
+ cloud.google.com/go/auth v0.17.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.8.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
@@ -44,8 +44,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudr
github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ=
github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M=
github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
-github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97 h1:HK7B5Q+0FidxjQD5CovniMw7axkUeMHwgVkxkbmiW/s=
-github.com/charmbracelet/go-genai v0.0.0-20251021165952-9befde14ce97/go.mod h1:ZagL2esO4qxlOJBj0d4PVvLM82akQFtne8s3ivxBnTQ=
github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI=
github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms=
github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ=
@@ -139,6 +137,8 @@ golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo=
google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50=
+google.golang.org/genai v1.32.0 h1:kku/m3kWOncjnw8EIa2sgmrPLhaxFHaP+uqOq5ZckvI=
+google.golang.org/genai v1.32.0/go.mod h1:7pAilaICJlQBonjKKJNhftDFv3SREhZcTe9F6nRcjbg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
@@ -39,7 +39,6 @@ type options struct {
vertexProject string
vertexLocation string
- skipAuth bool
useBedrock bool
}
@@ -87,13 +86,6 @@ func WithVertex(project, location string) Option {
}
}
-// WithSkipAuth configures whether to skip authentication for the Anthropic provider.
-func WithSkipAuth(skip bool) Option {
- return func(o *options) {
- o.skipAuth = skip
- }
-}
-
// WithBedrock configures the Anthropic provider to use AWS Bedrock with default config.
func WithBedrock() Option {
return func(o *options) {
@@ -137,15 +129,9 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L
clientOptions = append(clientOptions, option.WithHTTPClient(a.options.client))
}
if a.options.vertexProject != "" && a.options.vertexLocation != "" {
- var credentials *google.Credentials
- if a.options.skipAuth {
- credentials = &google.Credentials{TokenSource: &googleDummyTokenSource{}}
- } else {
- var err error
- credentials, err = google.FindDefaultCredentials(ctx)
- if err != nil {
- return nil, err
- }
+ credentials, err := google.FindDefaultCredentials(ctx)
+ if err != nil {
+ return nil, err
}
clientOptions = append(
@@ -1,11 +0,0 @@
-package anthropic
-
-import (
- "golang.org/x/oauth2"
-)
-
-type googleDummyTokenSource struct{}
-
-func (googleDummyTokenSource) Token() (*oauth2.Token, error) {
- return &oauth2.Token{AccessToken: "dummy-token"}, nil
-}
@@ -8,7 +8,6 @@ import (
)
type options struct {
- skipAuth bool
anthropicOptions []anthropic.Option
}
@@ -31,7 +30,6 @@ func New(opts ...Option) (fantasy.Provider, error) {
o.anthropicOptions,
anthropic.WithName(Name),
anthropic.WithBedrock(),
- anthropic.WithSkipAuth(o.skipAuth),
)...,
)
}
@@ -1,15 +0,0 @@
-// Package google provides an implementation of the fantasy AI SDK for Google's language models.
-package google
-
-import (
- "context"
-
- "cloud.google.com/go/auth"
-)
-
-type dummyTokenProvider struct{}
-
-// Token implements the auth.TokenProvider interface.
-func (dummyTokenProvider) Token(_ context.Context) (*auth.Token, error) {
- return &auth.Token{Value: "dummy-token"}, nil
-}
@@ -12,10 +12,9 @@ import (
"charm.land/fantasy"
"charm.land/fantasy/providers/anthropic"
- "cloud.google.com/go/auth"
- "github.com/charmbracelet/go-genai"
"github.com/charmbracelet/x/exp/slice"
"github.com/google/uuid"
+ "google.golang.org/genai"
)
// Name is the name of the Google provider.
@@ -37,7 +36,6 @@ type options struct {
backend genai.Backend
project string
location string
- skipAuth bool
toolCallIDFunc ToolCallIDFunc
}
@@ -93,13 +91,6 @@ func WithVertex(project, location string) Option {
}
}
-// WithSkipAuth configures whether to skip authentication for the Google provider.
-func WithSkipAuth(skipAuth bool) Option {
- return func(o *options) {
- o.skipAuth = skipAuth
- }
-}
-
// WithName sets the name for the Google provider.
func WithName(name string) Option {
return func(o *options) {
@@ -145,7 +136,6 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L
p, err := anthropic.New(
anthropic.WithVertex(a.options.project, a.options.location),
anthropic.WithHTTPClient(a.options.client),
- anthropic.WithSkipAuth(a.options.skipAuth),
)
if err != nil {
return nil, err
@@ -160,9 +150,6 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L
Project: a.options.project,
Location: a.options.location,
}
- if a.options.skipAuth {
- cc.Credentials = &auth.Credentials{TokenProvider: dummyTokenProvider{}}
- }
if a.options.baseURL != "" || len(a.options.headers) > 0 {
headers := http.Header{}
@@ -30,8 +30,6 @@ func TestGoogleCommon(t *testing.T) {
pairs = append(pairs, builderPair{m.name, geminiBuilder(m.model), nil, nil})
}
for _, m := range vertexTestModels {
- // TODO: fixme
- continue
pairs = append(pairs, builderPair{m.name, vertexBuilder(m.model), nil, nil})
}
testCommon(t, pairs)
@@ -99,7 +97,6 @@ func vertexBuilder(model string) builderFunc {
provider, err := google.New(
google.WithVertex(os.Getenv("FANTASY_VERTEX_PROJECT"), os.Getenv("FANTASY_VERTEX_LOCATION")),
google.WithHTTPClient(&http.Client{Transport: r}),
- google.WithSkipAuth(!r.IsRecording()),
google.WithToolCallIDFunc(generateIDMock()),
)
if err != nil {