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}