1package providertests
2
3import (
4 "cmp"
5 "net/http"
6 "os"
7
8 "github.com/charmbracelet/fantasy/ai"
9 "github.com/charmbracelet/fantasy/anthropic"
10 "github.com/charmbracelet/fantasy/google"
11 "github.com/charmbracelet/fantasy/openai"
12 "gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
13)
14
15type builderFunc func(r *recorder.Recorder) (ai.LanguageModel, error)
16
17type builderPair struct {
18 name string
19 builder builderFunc
20}
21
22var languageModelBuilders = []builderPair{
23 {"openai-gpt-4o", builderOpenaiGpt4o},
24 {"openai-gpt-4o-mini", builderOpenaiGpt4oMini},
25 {"anthropic-claude-sonnet", builderAnthropicClaudeSonnet4},
26 {"google-gemini-2.5-flash", builderGoogleGemini25Flash},
27 {"google-gemini-2.5-pro", builderGoogleGemini25Pro},
28}
29
30var thinkingLanguageModelBuilders = []builderPair{
31 {"openai-gpt-5", builderOpenaiGpt5},
32 {"anthropic-claude-sonnet", builderAnthropicClaudeSonnet4},
33 {"google-gemini-2.5-pro", builderGoogleGemini25Pro},
34}
35
36func builderOpenaiGpt4o(r *recorder.Recorder) (ai.LanguageModel, error) {
37 provider := openai.New(
38 openai.WithAPIKey(os.Getenv("OPENAI_API_KEY")),
39 openai.WithHTTPClient(&http.Client{Transport: r}),
40 )
41 return provider.LanguageModel("gpt-4o")
42}
43
44func builderOpenaiGpt4oMini(r *recorder.Recorder) (ai.LanguageModel, error) {
45 provider := openai.New(
46 openai.WithAPIKey(os.Getenv("OPENAI_API_KEY")),
47 openai.WithHTTPClient(&http.Client{Transport: r}),
48 )
49 return provider.LanguageModel("gpt-4o-mini")
50}
51
52func builderOpenaiGpt5(r *recorder.Recorder) (ai.LanguageModel, error) {
53 provider := openai.New(
54 openai.WithAPIKey(os.Getenv("OPENAI_API_KEY")),
55 openai.WithHTTPClient(&http.Client{Transport: r}),
56 )
57 return provider.LanguageModel("gpt-5")
58}
59
60func builderAnthropicClaudeSonnet4(r *recorder.Recorder) (ai.LanguageModel, error) {
61 provider := anthropic.New(
62 anthropic.WithAPIKey(os.Getenv("ANTHROPIC_API_KEY")),
63 anthropic.WithHTTPClient(&http.Client{Transport: r}),
64 )
65 return provider.LanguageModel("claude-sonnet-4-20250514")
66}
67
68func builderGoogleGemini25Flash(r *recorder.Recorder) (ai.LanguageModel, error) {
69 provider := google.New(
70 google.WithAPIKey(cmp.Or(os.Getenv("GEMINI_API_KEY"), "(missing)")),
71 google.WithHTTPClient(&http.Client{Transport: r}),
72 )
73 return provider.LanguageModel("gemini-2.5-flash")
74}
75
76func builderGoogleGemini25Pro(r *recorder.Recorder) (ai.LanguageModel, error) {
77 provider := google.New(
78 google.WithAPIKey(cmp.Or(os.Getenv("GEMINI_API_KEY"), "(missing)")),
79 google.WithHTTPClient(&http.Client{Transport: r}),
80 )
81 return provider.LanguageModel("gemini-2.5-pro")
82}