openrouter_test.go

  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		grok4FastFree(),
 26	}
 27
 28	for _, model := range models {
 29		for _, provider := range model.providers {
 30			pairs = append(
 31				pairs,
 32				builderPair{
 33					model.name + "_" + provider,
 34					model.builderFunc,
 35					ai.ProviderOptions{
 36						openrouter.Name: &openrouter.ProviderOptions{
 37							Provider: &openrouter.Provider{
 38								Only: []string{provider},
 39							},
 40						},
 41					},
 42				})
 43		}
 44	}
 45
 46	testCommon(t, pairs)
 47}
 48
 49func kimiK2() openrouterModel {
 50	return openrouterModel{
 51		name: "kimi-k2",
 52		builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
 53			provider := openrouter.New(
 54				openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 55				openrouter.WithHTTPClient(&http.Client{Transport: r}),
 56			)
 57			return provider.LanguageModel("moonshotai/kimi-k2-0905")
 58		},
 59		providers: []string{
 60			"chutes",
 61			"deepinfra",
 62			"siliconflow",
 63			"fireworks",
 64			"moonshotai",
 65			"novita",
 66			"baseten",
 67			"together",
 68			"groq",
 69			"moonshotai/turbo",
 70			"wandb",
 71		},
 72	}
 73}
 74
 75func grokCodeFast1() openrouterModel {
 76	return openrouterModel{
 77		name: "grok-code-fast-1",
 78		builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
 79			provider := openrouter.New(
 80				openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 81				openrouter.WithHTTPClient(&http.Client{Transport: r}),
 82			)
 83			return provider.LanguageModel("x-ai/grok-code-fast-1")
 84		},
 85		providers: []string{
 86			"xai",
 87		},
 88	}
 89}
 90
 91func grok4FastFree() openrouterModel {
 92	return openrouterModel{
 93		name: "grok-4-fast-free",
 94		builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
 95			provider := openrouter.New(
 96				openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 97				openrouter.WithHTTPClient(&http.Client{Transport: r}),
 98			)
 99			return provider.LanguageModel("x-ai/grok-4-fast:free")
100		},
101		providers: []string{
102			"xai",
103		},
104	}
105}
106
107func claudeSonnet4() openrouterModel {
108	return openrouterModel{
109		name: "claude-sonnet-4",
110		builderFunc: func(r *recorder.Recorder) (ai.LanguageModel, error) {
111			provider := openrouter.New(
112				openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
113				openrouter.WithHTTPClient(&http.Client{Transport: r}),
114			)
115			return provider.LanguageModel("anthropic/claude-sonnet-4")
116		},
117		providers: []string{
118			"google-vertex",
119			"google-vertex/global",
120			"anthropic",
121			"google-vertex/europe",
122			"amazon-bedrock",
123		},
124	}
125}