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	"github.com/stretchr/testify/require"
 11	"gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
 12)
 13
 14func TestOpenRouterCommon(t *testing.T) {
 15	testCommon(t, []builderPair{
 16		{"kimi-k2", builderOpenRouterKimiK2, nil},
 17		{"grok-code-fast-1", builderOpenRouterGrokCodeFast1, nil},
 18		{"claude-sonnet-4", builderOpenRouterClaudeSonnet4, nil},
 19		{"grok-4-fast-free", builderOpenRouterGrok4FastFree, nil},
 20		{"gemini-2.5-flash", builderOpenRouterGemini25Flash, nil},
 21		{"gemini-2.0-flash", builderOpenRouterGemini20Flash, nil},
 22		{"deepseek-chat-v3.1-free", builderOpenRouterDeepseekV31Free, nil},
 23		{"qwen3-235b-a22b-2507", builderOpenRouterQwen3Instruct, nil},
 24		{"gpt-5", builderOpenRouterGPT5, nil},
 25		{"glm-4.5", builderOpenRouterGLM45, nil},
 26	})
 27	opts := ai.ProviderOptions{
 28		openrouter.Name: &openrouter.ProviderOptions{
 29			Reasoning: &openrouter.ReasoningOptions{
 30				Effort: openrouter.ReasoningEffortOption(openrouter.ReasoningEffortMedium),
 31			},
 32		},
 33	}
 34	testThinking(t, []builderPair{
 35		{"gpt-5", builderOpenRouterGPT5, opts},
 36		{"glm-4.5", builderOpenRouterGLM45, opts},
 37	}, testOpenrouterThinking)
 38}
 39
 40func testOpenrouterThinking(t *testing.T, result *ai.AgentResult) {
 41	reasoningContentCount := 0
 42	for _, step := range result.Steps {
 43		for _, msg := range step.Messages {
 44			for _, content := range msg.Content {
 45				if content.GetType() == ai.ContentTypeReasoning {
 46					reasoningContentCount += 1
 47				}
 48			}
 49		}
 50	}
 51	require.Greater(t, reasoningContentCount, 0)
 52}
 53
 54func builderOpenRouterKimiK2(r *recorder.Recorder) (ai.LanguageModel, error) {
 55	provider := openrouter.New(
 56		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 57		openrouter.WithHTTPClient(&http.Client{Transport: r}),
 58	)
 59	return provider.LanguageModel("moonshotai/kimi-k2-0905")
 60}
 61
 62func builderOpenRouterGrokCodeFast1(r *recorder.Recorder) (ai.LanguageModel, error) {
 63	provider := openrouter.New(
 64		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 65		openrouter.WithHTTPClient(&http.Client{Transport: r}),
 66	)
 67	return provider.LanguageModel("x-ai/grok-code-fast-1")
 68}
 69
 70func builderOpenRouterGrok4FastFree(r *recorder.Recorder) (ai.LanguageModel, error) {
 71	provider := openrouter.New(
 72		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 73		openrouter.WithHTTPClient(&http.Client{Transport: r}),
 74	)
 75	return provider.LanguageModel("x-ai/grok-4-fast:free")
 76}
 77
 78func builderOpenRouterGemini25Flash(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("google/gemini-2.5-flash")
 84}
 85
 86func builderOpenRouterGemini20Flash(r *recorder.Recorder) (ai.LanguageModel, error) {
 87	provider := openrouter.New(
 88		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
 89		openrouter.WithHTTPClient(&http.Client{Transport: r}),
 90	)
 91	return provider.LanguageModel("google/gemini-2.0-flash-001")
 92}
 93
 94func builderOpenRouterDeepseekV31Free(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("deepseek/deepseek-chat-v3.1:free")
100}
101
102func builderOpenRouterClaudeSonnet4(r *recorder.Recorder) (ai.LanguageModel, error) {
103	provider := openrouter.New(
104		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
105		openrouter.WithHTTPClient(&http.Client{Transport: r}),
106	)
107	return provider.LanguageModel("anthropic/claude-sonnet-4")
108}
109
110func builderOpenRouterGPT5(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("openai/gpt-5")
116}
117
118func builderOpenRouterGLM45(r *recorder.Recorder) (ai.LanguageModel, error) {
119	provider := openrouter.New(
120		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
121		openrouter.WithHTTPClient(&http.Client{Transport: r}),
122	)
123	return provider.LanguageModel("z-ai/glm-4.5")
124}
125
126func builderOpenRouterQwen3Instruct(r *recorder.Recorder) (ai.LanguageModel, error) {
127	provider := openrouter.New(
128		openrouter.WithAPIKey(os.Getenv("OPENROUTER_API_KEY")),
129		openrouter.WithHTTPClient(&http.Client{Transport: r}),
130	)
131	return provider.LanguageModel("qwen/qwen3-235b-a22b-2507")
132}