provider.go

v0.2.0
Doc Versions Source
1
package provider
2
3
// StaticModel represents a model available from a provider (no API fetch needed).
4
type StaticModel struct {
5
	ID     string
6
	Name   string
7
	Family string
8
}
9
10
// Plan describes one billing/access plan for a provider with multiple base URLs.
11
type Plan struct {
12
	Key         string // e.g. "api", "coding"
13
	Name        string // display name, e.g. "API (pay per token)"
14
	Description string
15
	BaseURL     string
16
}
17
18
var zaiModels = []StaticModel{
19
	{ID: "GLM-5", Name: "GLM-5", Family: "GLM-5"},
20
	{ID: "GLM-4.7", Name: "GLM-4.7", Family: "GLM-4.7"},
21
	{ID: "GLM-4.6", Name: "GLM-4.6", Family: "GLM-4.6"},
22
	{ID: "GLM-4.5", Name: "GLM-4.5", Family: "GLM-4.5"},
23
	{ID: "GLM-4.5-Air", Name: "GLM-4.5 Air", Family: "GLM-4.5"},
24
	{ID: "GLM-4.5-X", Name: "GLM-4.5 X", Family: "GLM-4.5"},
25
	{ID: "GLM-4.5-AirX", Name: "GLM-4.5 AirX", Family: "GLM-4.5"},
26
	{ID: "GLM-4.5-Flash", Name: "GLM-4.5 Flash", Family: "GLM-4.5"},
27
	{ID: "GLM-4-32B-0414-128K", Name: "GLM-4 32B", Family: "GLM-4"},
28
}
29
30
// StaticModels maps provider keys to their available models.
31
var StaticModels = map[string][]StaticModel{
32
	"deepseek": {
33
		{ID: "deepseek-reasoner", Name: "DeepSeek Reasoner (R1)", Family: "Reasoner"},
34
		{ID: "deepseek-chat", Name: "DeepSeek Chat (V3)", Family: "Chat"},
35
	},
36
	"zai": zaiModels,
37
	"kimi": {
38
		{ID: "kimi-k2.5", Name: "Kimi K2.5", Family: "K2.5"},
39
		{ID: "kimi-k2-turbo-preview", Name: "Kimi K2 Turbo", Family: "K2"},
40
		{ID: "kimi-k2-thinking", Name: "Kimi K2 Thinking", Family: "K2"},
41
		{ID: "kimi-k2-0711-preview", Name: "Kimi K2", Family: "K2"},
42
		{ID: "kimi-latest", Name: "Kimi Latest", Family: "Latest"},
43
	},
44
}
45
46
// Provider defines an alternative Claude Code API provider.
47
type Provider struct {
48
	Name        string
49
	Description string
50
	BaseURL     string
51
	Model       string
52
	SmallModel  string
53
	SonnetModel string
54
	OpusModel   string
55
	HaikuModel  string
56
	TimeoutMS   string
57
	// AuthEnvVar is the env var name used for the API key (some use AUTH_TOKEN, some API_KEY).
58
	AuthEnvVar string
59
	// Compat is "anthropic" (default) or "openai". When "openai", a local
60
	// translation proxy is started to convert Anthropic ↔ OpenAI API format.
61
	Compat string
62
	// ContextWindow is the model's context window size in tokens.
63
	// Claude Code assumes 200k by default; when this is smaller,
64
	// CLAUDE_AUTOCOMPACT_PCT_OVERRIDE is set so compaction triggers before
65
	// the real limit is hit.
66
	ContextWindow int
67
	// NoAuth indicates the provider does not require an API key (e.g. local Ollama).
68
	NoAuth bool
69
	// Plans lists alternative billing/access plans with different base URLs.
70
	// When non-empty, the TUI prompts the user to choose a plan.
71
	// BaseURL holds the default plan's URL.
72
	Plans []Plan
73
}
74
75
var Registry = map[string]Provider{
76
	"deepseek": {
77
		Name:          "DeepSeek",
78
		Description:   "DeepSeek Reasoner / V3 via Anthropic-compatible API",
79
		BaseURL:       "https://api.deepseek.com/anthropic",
80
		Model:         "deepseek-reasoner",
81
		SmallModel:    "deepseek-chat",
82
		SonnetModel:   "deepseek-reasoner",
83
		OpusModel:     "deepseek-reasoner",
84
		HaikuModel:    "deepseek-chat",
85
		TimeoutMS:     "600000",
86
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
87
		ContextWindow: 128_000,
88
	},
89
	"zai": {
90
		Name:          "z.AI",
91
		Description:   "GLM-5 / GLM-4.7 via z.AI (API or Coding Plan)",
92
		BaseURL:       "https://api.z.ai/api/anthropic",
93
		Model:         "GLM-5",
94
		SmallModel:    "GLM-4.5-Air",
95
		SonnetModel:   "GLM-5",
96
		OpusModel:     "GLM-5",
97
		HaikuModel:    "GLM-4.5-Air",
98
		TimeoutMS:     "3000000",
99
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
100
		ContextWindow: 205_000,
101
		Plans: []Plan{
102
			{Key: "api", Name: "API (pay per token)", Description: "Pay-per-token access", BaseURL: "https://api.z.ai/api/anthropic"},
103
			{Key: "coding", Name: "Coding Plan (subscription)", Description: "Subscription-based access", BaseURL: "https://api.z.ai/api/coding/anthropic"},
104
		},
105
	},
106
	"minimax": {
107
		Name:          "MiniMax",
108
		Description:   "MiniMax-M2.5 via MiniMax Anthropic gateway",
109
		BaseURL:       "https://api.minimax.io/anthropic",
110
		Model:         "MiniMax-M2.5",
111
		SmallModel:    "MiniMax-M2.5",
112
		SonnetModel:   "MiniMax-M2.5",
113
		OpusModel:     "MiniMax-M2.5",
114
		HaikuModel:    "MiniMax-M2.5",
115
		TimeoutMS:     "3000000",
116
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
117
		ContextWindow: 205_000,
118
	},
119
	"kimi": {
120
		Name:          "Kimi",
121
		Description:   "Kimi K2.5 / K2 via Moonshot Anthropic gateway",
122
		BaseURL:       "https://api.moonshot.cn/anthropic/",
123
		Model:         "kimi-k2.5",
124
		SmallModel:    "kimi-k2-turbo-preview",
125
		SonnetModel:   "kimi-k2.5",
126
		OpusModel:     "kimi-k2.5",
127
		HaikuModel:    "kimi-k2-turbo-preview",
128
		TimeoutMS:     "600000",
129
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
130
		ContextWindow: 256_000,
131
	},
132
	"copilot": {
133
		Name:          "GitHub Copilot",
134
		Description:   "Claude via GitHub Copilot",
135
		BaseURL:       "https://api.githubcopilot.com",
136
		Model:         "claude-sonnet-4.6",
137
		SmallModel:    "claude-haiku-4.5",
138
		SonnetModel:   "claude-sonnet-4.6",
139
		OpusModel:     "claude-opus-4.6",
140
		HaikuModel:    "claude-haiku-4.5",
141
		TimeoutMS:     "600000",
142
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
143
		Compat:        "openai",
144
		ContextWindow: 200_000,
145
	},
146
	"nvidia": {
147
		Name:          "NVIDIA NIM",
148
		Description:   "Access NVIDIA NIM models via OpenAI-compatible API",
149
		BaseURL:       "https://integrate.api.nvidia.com/v1",
150
		Model:         "nvidia/llama-3.1-nemotron-ultra-253b-v1",
151
		SmallModel:    "nvidia/llama-3.3-nemotron-super-49b-v1.5",
152
		SonnetModel:   "nvidia/llama-3.1-nemotron-ultra-253b-v1",
153
		OpusModel:     "nvidia/llama-3.1-nemotron-ultra-253b-v1",
154
		HaikuModel:    "nvidia/llama-3.3-nemotron-super-49b-v1.5",
155
		TimeoutMS:     "600000",
156
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
157
		Compat:        "openai",
158
		ContextWindow: 128_000,
159
	},
160
	"openrouter": {
161
		Name:          "OpenRouter",
162
		Description:   "Access multiple models via OpenRouter",
163
		BaseURL:       "https://openrouter.ai/api/v1",
164
		Model:         "anthropic/claude-sonnet-4.6",
165
		SmallModel:    "anthropic/claude-haiku-4.5",
166
		SonnetModel:   "anthropic/claude-sonnet-4.6",
167
		OpusModel:     "anthropic/claude-opus-4.6",
168
		HaikuModel:    "anthropic/claude-haiku-4.5",
169
		TimeoutMS:     "600000",
170
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
171
		Compat:        "openai",
172
		ContextWindow: 200_000,
173
	},
174
	"vkproxy": {
175
		Name:          "VK LLM Proxy",
176
		Description:   "Import models from claude-code-config.zip",
177
		BaseURL:       "https://llm-proxy.vkteam.ru",
178
		Model:         "deepseek-reasoner",
179
		SmallModel:    "deepseek-reasoner",
180
		SonnetModel:   "deepseek-reasoner",
181
		OpusModel:     "deepseek-reasoner",
182
		HaikuModel:    "deepseek-reasoner",
183
		TimeoutMS:     "600000",
184
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
185
		ContextWindow: 128_000,
186
	},
187
	"ollama": {
188
		Name:          "Ollama (local)",
189
		Description:   "Local Ollama with native Anthropic-compatible API",
190
		BaseURL:       "http://localhost:11434",
191
		Model:         "qwen3-coder",
192
		SmallModel:    "qwen3-coder",
193
		SonnetModel:   "qwen3-coder",
194
		OpusModel:     "qwen3-coder",
195
		HaikuModel:    "qwen3-coder",
196
		TimeoutMS:     "600000",
197
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
198
		ContextWindow: 32_000,
199
		NoAuth:        true,
200
	},
201
	"ollama-cloud": {
202
		Name:          "Ollama Cloud",
203
		Description:   "Cloud models via ollama.com API",
204
		BaseURL:       "https://ollama.com",
205
		Model:         "qwen3.5:397b",
206
		SmallModel:    "devstral-small-2:24b",
207
		SonnetModel:   "devstral-2:123b",
208
		OpusModel:     "qwen3.5:397b",
209
		HaikuModel:    "devstral-small-2:24b",
210
		TimeoutMS:     "600000",
211
		AuthEnvVar:    "ANTHROPIC_AUTH_TOKEN",
212
		ContextWindow: 32_000,
213
	},
214
}
215
216
// Order defines the display order of providers.
217
var Order = []string{"deepseek", "zai", "minimax", "kimi", "copilot", "nvidia", "openrouter", "ollama", "ollama-cloud", "vkproxy"}
218

Source Files