1package providertests
2
3import (
4 "net/http"
5 "os"
6 "testing"
7
8 "github.com/charmbracelet/fantasy/ai"
9 "github.com/charmbracelet/fantasy/openrouter"
10 "gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
11)
12
13type openrouterModel struct {
14 name string
15 builderFunc builderFunc
16 providers []string
17}
18
19func TestOpenRouterCommon(t *testing.T) {
20 var pairs []builderPair
21 models := []openrouterModel{
22 kimiK2(),
23 grokCodeFast1(),
24 claudeSonnet4(),
25 }
26
27 for _, model := range models {
28 for _, provider := range model.providers {
29 pairs = append(
30 pairs,
31 builderPair{
32 model.name + "_" + provider,
33 model.builderFunc,
34 ai.ProviderOptions{
35 openrouter.Name: &openrouter.ProviderOptions{
36 Provider: &openrouter.Provider{
37 Only: []string{provider},
38 },
39 },
40 },
41 })
42 }
43 }
44
45 testCommon(t, pairs)
46}
47
48func kimiK2() openrouterModel {
49 return openrouterModel{
50 name: "kimi-k2",
51 builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
52 provider := openrouter.New(
53 openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
54 openrouter.WithHTTPClient(&http.Client{Transport: r}),
55 )
56 return provider.LanguageModel("moonshotai/kimi-k2-0905")
57 },
58 providers: []string{
59 "chutes",
60 "deepinfra",
61 "siliconflow",
62 "fireworks",
63 "moonshotai",
64 "novita",
65 "baseten",
66 "together",
67 "groq",
68 "moonshotai/turbo",
69 "wandb",
70 },
71 }
72}
73
74func grokCodeFast1() openrouterModel {
75 return openrouterModel{
76 name: "grok-code-fast-1",
77 builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
78 provider := openrouter.New(
79 openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
80 openrouter.WithHTTPClient(&http.Client{Transport: r}),
81 )
82 return provider.LanguageModel("x-ai/grok-code-fast-1")
83 },
84 providers: []string{
85 "xai",
86 },
87 }
88}
89
90func claudeSonnet4() openrouterModel {
91 return openrouterModel{
92 name: "claude-sonnet-4",
93 builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
94 provider := openrouter.New(
95 openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
96 openrouter.WithHTTPClient(&http.Client{Transport: r}),
97 )
98 return provider.LanguageModel("anthropic/claude-sonnet-4")
99 },
100 providers: []string{
101 "google-vertex",
102 "google-vertex/global",
103 "anthropic",
104 "google-vertex/europe",
105 "amazon-bedrock",
106 },
107 }
108}