返回 DeepSeek-Reasonix
provider_presets_opencode_go.go
根目录 / internal / config / provider_presets_opencode_go.go
1 package config
2
3 import "reasonix/internal/provider"
4
5 var (
6 opencodeGoAnthropicModels = provider.OpenCodeGoModelIDs(provider.OpenCodeGoRouteAnthropic)
7 opencodeGoAnthropicVisionModels = provider.OpenCodeGoVisionModelIDs(provider.OpenCodeGoRouteAnthropic)
8 opencodeGoResponsesModels = provider.OpenCodeGoModelIDs(provider.OpenCodeGoRouteResponses)
9 opencodeGoResponsesVisionModels = provider.OpenCodeGoVisionModelIDs(provider.OpenCodeGoRouteResponses)
10 )
11
12 // Chat preset lists v1.37.0-v1.39.1 shipped while minimax-m2.7 sat on the chat route.
13 var shippedMiniMaxChatOpenCodeGoModels = [][]string{
14 {"deepseek-v4-flash", "deepseek-v4-flash-vision-exp", "deepseek-v4-pro", "glm-5.1", "glm-5.2", "glm-5.3", "glm-5.3-flash", "hy3", "hy4-preview", "kimi-k2.6", "kimi-k2.7-code", "kimi-k3", "longcat-2.0", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2.7", "qwen3.6-plus", "qwen3.7-max", "qwen3.7-plus", "qwen3.8-max"},
15 {"deepseek-flash", "deepseek-v4-flash", "deepseek-v4-flash-vision-exp", "deepseek-v4-pro", "glm-5.1", "glm-5.2", "glm-5.3", "glm-5.3-flash", "hy3", "hy4-preview", "kimi-k2.6", "kimi-k2.7-code", "kimi-k3", "longcat-2.0", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2.7", "qwen3.6-plus", "qwen3.7-max", "qwen3.7-plus", "qwen3.8-max"},
16 }
17
18 func withOpenCodeGoChatContextOverrides(base map[string]ProviderModelOverride) map[string]ProviderModelOverride {
19 if base == nil {
20 base = map[string]ProviderModelOverride{}
21 }
22 for id, lim := range provider.OpenCodeGoChatModels() {
23 ov := base[id]
24 ov.ContextWindow = lim.Context
25 if provider.OpenCodeGoDeepSeekModel(id) {
26 contract, _ := provider.OpenCodeGoContractForRoute(provider.OpenCodeGoRouteChat, id)
27 ov.ReasoningProtocol, ov.SupportedEfforts, ov.DefaultEffort = contract.ReasoningProtocol, contract.Reasoning.IDs(), contract.Reasoning.Default
28 }
29 base[id] = ov
30 }
31 return base
32 }
33
34 func openCodeGoAnthropicContextOverrides() map[string]ProviderModelOverride {
35 out := map[string]ProviderModelOverride{}
36 for id, lim := range provider.OpenCodeGoAnthropicModels() {
37 out[id] = ProviderModelOverride{ContextWindow: lim.Context}
38 }
39 return out
40 }
41
42 func openCodeGoResponsesContextOverrides() map[string]ProviderModelOverride {
43 out := map[string]ProviderModelOverride{}
44 for id, lim := range provider.OpenCodeGoResponsesModels() {
45 out[id] = ProviderModelOverride{ContextWindow: lim.Context}
46 }
47 out["grok-4.5"] = ProviderModelOverride{ContextWindow: 500_000, SupportedEfforts: []string{"low", "medium", "high"}, DefaultEffort: "high"}
48 out["gpt-5.6-luna"] = ProviderModelOverride{ContextWindow: 1_050_000, SupportedEfforts: []string{"none", "low", "medium", "high", "xhigh", "max"}, DefaultEffort: "high"}
49 out["muse-spark-1.2-contributor"] = ProviderModelOverride{ContextWindow: 1_048_576, SupportedEfforts: []string{"minimal", "low", "medium", "high", "xhigh"}, DefaultEffort: "high"}
50 return out
51 }
52
53 // openCodeGoRecommendedChatOverrides keeps the one-click setup conservative:
54 // most coding turns stay on a low reasoning effort and a bounded output cap.
55 // Users can still raise the effort or output budget on the editable provider
56 // entry when a task genuinely needs it.
57 func openCodeGoRecommendedChatOverrides() map[string]ProviderModelOverride {
58 out := map[string]ProviderModelOverride{}
59 for id, lim := range provider.OpenCodeGoChatModels() {
60 out[id] = ProviderModelOverride{ContextWindow: lim.Context, MaxOutputTokens: minPositive(lim.MaxOutput, 32_768)}
61 }
62 for id, ov := range map[string]ProviderModelOverride{
63 "deepseek-v4-flash-vision-exp": {
64 ReasoningProtocol: ReasoningProtocolDeepSeek,
65 SupportedEfforts: []string{"disabled", "low", "high", "max"},
66 DefaultEffort: "high",
67 },
68 "glm-5.3": {
69 ReasoningProtocol: ReasoningProtocolOpenAI,
70 SupportedEfforts: []string{"low", "high", "max"},
71 DefaultEffort: "low",
72 },
73 "glm-5.2": {
74 ReasoningProtocol: ReasoningProtocolOpenAI,
75 SupportedEfforts: []string{"high", "max"},
76 DefaultEffort: "high",
77 },
78 "glm-5.1": {
79 ReasoningProtocol: ReasoningProtocolOpenAI,
80 SupportedEfforts: []string{"low", "high"},
81 DefaultEffort: "low",
82 },
83 "deepseek-v4-flash": {
84 ReasoningProtocol: ReasoningProtocolDeepSeek,
85 SupportedEfforts: []string{"disabled", "low", "high", "max"},
86 DefaultEffort: "high",
87 },
88 "deepseek-v4-pro": {
89 ReasoningProtocol: ReasoningProtocolDeepSeek,
90 SupportedEfforts: []string{"disabled", "low", "high", "max"},
91 DefaultEffort: "high",
92 },
93 "kimi-k2.6": {
94 ReasoningProtocol: ReasoningProtocolOpenAI,
95 SupportedEfforts: []string{"low", "medium", "high"},
96 DefaultEffort: "low",
97 },
98 "kimi-k2.7-code": {
99 ReasoningProtocol: ReasoningProtocolOpenAI,
100 SupportedEfforts: []string{"low", "medium", "high"},
101 DefaultEffort: "low",
102 },
103 "kimi-k3": kimiK3DirectOverride(),
104 "hy3": {
105 ReasoningProtocol: ReasoningProtocolOpenAI,
106 SupportedEfforts: []string{"none", "low", "high"},
107 DefaultEffort: "low",
108 },
109 } {
110 base := out[id]
111 base.ReasoningProtocol = ov.ReasoningProtocol
112 base.SupportedEfforts = append([]string(nil), ov.SupportedEfforts...)
113 base.DefaultEffort = ov.DefaultEffort
114 if ov.ContextWindow > 0 {
115 base.ContextWindow = ov.ContextWindow
116 }
117 out[id] = base
118 }
119 return out
120 }
121
122 func openCodeGoRecommendedAnthropicOverrides() map[string]ProviderModelOverride {
123 out := map[string]ProviderModelOverride{}
124 for id, lim := range provider.OpenCodeGoAnthropicModels() {
125 out[id] = ProviderModelOverride{ContextWindow: lim.Context, MaxOutputTokens: minPositive(lim.MaxOutput, 32_768)}
126 }
127 return out
128 }
129
130 func openCodeGoRecommendedResponsesOverrides() map[string]ProviderModelOverride {
131 out := map[string]ProviderModelOverride{}
132 for id, lim := range provider.OpenCodeGoResponsesModels() {
133 out[id] = ProviderModelOverride{ContextWindow: lim.Context, MaxOutputTokens: minPositive(lim.MaxOutput, 32_768)}
134 }
135 for id, levels := range map[string][]string{
136 "grok-4.5": {"low", "medium", "high"},
137 "gpt-5.6-luna": {"none", "low", "medium", "high", "xhigh", "max"},
138 "muse-spark-1.2-contributor": {"minimal", "low", "medium", "high", "xhigh"},
139 } {
140 ov := out[id]
141 ov.SupportedEfforts = append([]string(nil), levels...)
142 ov.DefaultEffort = "low"
143 out[id] = ov
144 }
145 return out
146 }
147
148 func minPositive(value, cap int) int {
149 if value <= 0 {
150 return cap
151 }
152 if value < cap {
153 return value
154 }
155 return cap
156 }
157
158 // opencodeGoRecommendedPreset is the low-friction entry point for new users.
159 // It installs all three official wire routes under one shared credential while
160 // keeping each route's model catalog isolated. The entries remain ordinary
161 // editable providers after installation.
162 var opencodeGoRecommendedPreset = ProviderPreset{
163 ID: "opencode-go-recommended",
164 Label: "OpenCode Go (Recommended)",
165 Description: "One key, three safe routes: Chat, Anthropic Messages, and Responses. Defaults use a low-cost effort and a 32K output cap.",
166 KeyEnv: "OPENCODE_GO_API_KEY",
167 Recommended: true,
168 BillingMode: "subscription_equivalent",
169 DisplayGroup: "opencode",
170 DisplaySection: "go",
171 DisplayTier: "primary",
172 RouteKind: "bundle",
173 DisplayOrder: 0,
174 Entries: []ProviderEntry{
175 {
176 Name: "opencode-go",
177 Kind: "openai",
178 BaseURL: "https://opencode.ai/zen/go/v1",
179 Models: opencodeGoModels,
180 VisionModels: opencodeGoVisionModels,
181 Default: "glm-5.3",
182 APIKeyEnv: "OPENCODE_GO_API_KEY",
183 ContextWindow: 128_000,
184 MaxOutputTokens: 32_768,
185 BillingMode: "subscription_equivalent",
186 ModelOverrides: openCodeGoRecommendedChatOverrides(),
187 },
188 {
189 Name: "opencode-go-anthropic",
190 Kind: "anthropic",
191 BaseURL: "https://opencode.ai/zen/go",
192 Models: opencodeGoAnthropicModels,
193 VisionModels: opencodeGoAnthropicVisionModels,
194 Default: "qwen3.7-plus",
195 APIKeyEnv: "OPENCODE_GO_API_KEY",
196 Thinking: "adaptive",
197 ContextWindow: 262_144,
198 MaxOutputTokens: 32_768,
199 BillingMode: "subscription_equivalent",
200 ModelOverrides: openCodeGoRecommendedAnthropicOverrides(),
201 },
202 {
203 Name: "opencode-go-responses",
204 Kind: "responses",
205 BaseURL: "https://opencode.ai/zen/go/v1",
206 Models: opencodeGoResponsesModels,
207 VisionModels: opencodeGoResponsesVisionModels,
208 Default: "grok-4.5",
209 APIKeyEnv: "OPENCODE_GO_API_KEY",
210 ResponsesMode: "stateless",
211 ContextWindow: 500_000,
212 MaxOutputTokens: 32_768,
213 SupportedEfforts: []string{"low", "medium", "high"},
214 DefaultEffort: "low",
215 BillingMode: "subscription_equivalent",
216 ModelOverrides: openCodeGoRecommendedResponsesOverrides(),
217 },
218 },
219 }
220
221 var opencodeGoAnthropicPreset = ProviderPreset{
222 ID: "opencode-go-anthropic",
223 Label: "OpenCode Go Anthropic",
224 Description: "OpenCode Go subscription Anthropic-compatible route for Qwen and MiniMax models.",
225 KeyEnv: "OPENCODE_GO_API_KEY",
226 BillingMode: "subscription_equivalent",
227 DisplayGroup: "opencode",
228 DisplaySection: "go",
229 DisplayTier: "advanced",
230 RouteKind: "anthropic",
231 DisplayOrder: 20,
232 Entries: []ProviderEntry{{
233 Name: "opencode-go-anthropic",
234 Kind: "anthropic",
235 BaseURL: "https://opencode.ai/zen/go",
236 Models: opencodeGoAnthropicModels,
237 VisionModels: opencodeGoAnthropicVisionModels,
238 Default: "qwen3.7-plus",
239 APIKeyEnv: "OPENCODE_GO_API_KEY",
240 Thinking: "adaptive",
241 ContextWindow: 262144,
242 MaxOutputTokens: 32_768,
243 BillingMode: "subscription_equivalent",
244 ModelOverrides: openCodeGoAnthropicContextOverrides(),
245 }},
246 }
247
248 var opencodeGoResponsesPreset = ProviderPreset{
249 ID: "opencode-go-responses",
250 Label: "OpenCode Go Responses",
251 Description: "OpenCode Go Responses API route for Grok 4.5, GPT 5.6 Luna, and Muse Spark.",
252 KeyEnv: "OPENCODE_GO_API_KEY",
253 BillingMode: "subscription_equivalent",
254 DisplayGroup: "opencode",
255 DisplaySection: "go",
256 DisplayTier: "advanced",
257 RouteKind: "responses",
258 DisplayOrder: 30,
259 Entries: []ProviderEntry{{
260 Name: "opencode-go-responses",
261 Kind: "responses",
262 BaseURL: "https://opencode.ai/zen/go/v1",
263 Models: opencodeGoResponsesModels,
264 VisionModels: opencodeGoResponsesVisionModels,
265 Default: "grok-4.5",
266 APIKeyEnv: "OPENCODE_GO_API_KEY",
267 ResponsesMode: "stateless",
268 ContextWindow: 500_000,
269 MaxOutputTokens: 32_768,
270 SupportedEfforts: []string{"low", "medium", "high"},
271 DefaultEffort: "high",
272 BillingMode: "subscription_equivalent",
273 ModelOverrides: openCodeGoResponsesContextOverrides(),
274 }},
275 }
276
277 var opencodeGoDeepSeekAnthropicPreset = ProviderPreset{
278 ID: "opencode-go-deepseek-anthropic",
279 Label: "OpenCode Go DeepSeek Anthropic",
280 Description: "OpenCode Go Anthropic Messages route for DeepSeek Flash with server-side web search.",
281 KeyEnv: "OPENCODE_GO_API_KEY",
282 BillingMode: "subscription_equivalent",
283 DisplayGroup: "opencode",
284 DisplaySection: "go",
285 DisplayTier: "advanced",
286 RouteKind: "search-anthropic",
287 Optional: true,
288 DisplayOrder: 40,
289 Entries: []ProviderEntry{{
290 Name: "opencode-go-deepseek-anthropic",
291 ReasoningProtocol: ReasoningProtocolDeepSeek,
292 Kind: "anthropic",
293 BaseURL: "https://opencode.ai/zen/go",
294 Models: []string{"deepseek-v4-flash"},
295 Default: "deepseek-v4-flash",
296 APIKeyEnv: "OPENCODE_GO_API_KEY",
297 Thinking: "adaptive",
298 WebSearch: boolPointer(true),
299 ContextWindow: 1_000_000,
300 MaxOutputTokens: 32_768,
301 SupportedEfforts: []string{"disabled", "low", "high", "max"},
302 DefaultEffort: "high",
303 BillingMode: "subscription_equivalent",
304 }},
305 }
306
307 var opencodeGoDeepSeekResponsesPreset = ProviderPreset{
308 ID: "opencode-go-deepseek-responses",
309 Label: "OpenCode Go DeepSeek Responses",
310 Description: "OpenCode Go stateless Responses API route for DeepSeek Flash with server-side web search.",
311 KeyEnv: "OPENCODE_GO_API_KEY",
312 BillingMode: "subscription_equivalent",
313 DisplayGroup: "opencode",
314 DisplaySection: "go",
315 DisplayTier: "advanced",
316 RouteKind: "search-responses",
317 Optional: true,
318 DisplayOrder: 50,
319 Entries: []ProviderEntry{{
320 Name: "opencode-go-deepseek-responses",
321 ReasoningProtocol: ReasoningProtocolDeepSeek,
322 Kind: "responses",
323 BaseURL: "https://opencode.ai/zen/go/v1",
324 Models: []string{"deepseek-v4-flash"},
325 Default: "deepseek-v4-flash",
326 APIKeyEnv: "OPENCODE_GO_API_KEY",
327 ResponsesMode: "stateless",
328 WebSearch: boolPointer(true),
329 ContextWindow: 1_000_000,
330 MaxOutputTokens: 32_768,
331 SupportedEfforts: []string{"none", "low", "high", "max"},
332 DefaultEffort: "high",
333 BillingMode: "subscription_equivalent",
334 }},
335 }
336
336 lines GO