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