Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ Advanced and source-build guides:
| Codex OAuth | `/provider` | Opens ChatGPT sign-in in your browser and stores Codex credentials securely |
| Codex | `/provider` | Uses existing Codex CLI auth, OpenClaude secure storage, or env credentials |
| Gitlawb Opengateway | Startup default, `/provider`, or env vars | Smart gateway at `https://opengateway.gitlawb.com/v1`; requires an API key from https://gitlawb.com/opengateway/keys and routes Xiaomi MiMo and GMI Cloud partner models by `OPENAI_MODEL` |
| OpenCode Zen | `/provider` or env vars | Pay-as-you-go AI gateway (43 models); uses `OPENCODE_API_KEY` via `https://opencode.ai/zen/v1`; shared key with OpenCode Go |
| OpenCode Go | `/provider` or env vars | $10/mo subscription for open models (13 models); uses `OPENCODE_API_KEY` via `https://opencode.ai/zen/go/v1`; shared key with OpenCode Zen |
| OpenCode Zen | `/provider` or env vars | Pay-as-you-go AI gateway (48 models); uses `OPENCODE_API_KEY` via `https://opencode.ai/zen/v1`; shared key with OpenCode Go |
| OpenCode Go | `/provider` or env vars | $10/mo subscription for open models (20 models); uses `OPENCODE_API_KEY` via `https://opencode.ai/zen/go/v1`; shared key with OpenCode Zen |
| Xiaomi MiMo | `/provider` or env vars | OpenAI-compatible API at `https://mimo.mi.com`; uses `MIMO_API_KEY` and defaults to `mimo-v2.5-pro` |
| NEAR AI | `/provider` or env vars | Unified gateway (Claude, GPT, Gemini + TEE open models); uses `NEARAI_API_KEY` at `https://cloud-api.near.ai/v1` |
| Ollama | `/provider` or env vars | Local inference with no API key |
Expand Down
4 changes: 2 additions & 2 deletions docs/advanced-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ export OPENAI_MODEL=gpt-5.4
openclaude
```

OpenCode Zen is a pay-as-you-go AI gateway with 43 models (GPT, Claude, Gemini,
OpenCode Zen is a pay-as-you-go AI gateway with 48 models (GPT, Claude, Gemini,
Qwen, MiniMax, GLM, Kimi, Grok, Big Pickle, DeepSeek, Nemotron). Uses the same
`OPENCODE_API_KEY` as OpenCode Go. Get your key from https://opencode.ai.

Expand All @@ -212,7 +212,7 @@ export OPENAI_MODEL=glm-5.1
openclaude
```

OpenCode Go is a $10/mo subscription for 13 open models (GLM, Kimi, DeepSeek,
OpenCode Go is a $10/mo subscription for 20 open models (GLM, Kimi, DeepSeek,
MiMo, MiniMax, Qwen). Uses the same `OPENCODE_API_KEY` as OpenCode Zen.

### Gitlawb Opengateway
Expand Down
6 changes: 6 additions & 0 deletions src/integrations/gateways/nvidia-nim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ export default defineGateway({
label: 'Llama 3.1 Nemotron 70B',
modelDescriptorId: 'nvidia/llama-3.1-nemotron-70b-instruct',
},
{
id: 'nvidia-deepseek-v4-pro',
apiName: 'deepseek-ai/deepseek-v4-pro',
label: 'DeepSeek V4 Pro',
modelDescriptorId: 'deepseek-v4-pro',
},
],
},
usage: { supported: false },
Expand Down
69 changes: 51 additions & 18 deletions src/integrations/gateways/opencode-go.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,54 @@
import { defineGateway } from '../define.js'

type OpenCodeGoCatalogSpec = {
id: string
apiName: string
label: string
endpointPath?: string
}

function catalogEntry(spec: OpenCodeGoCatalogSpec) {
return {
id: `opencode-go-${spec.id}`,
apiName: spec.apiName,
label: spec.label,
modelDescriptorId: `opencode-go-${spec.id}`,
...(spec.endpointPath
? {
transportOverrides: {
openaiShim: {
endpointPath: spec.endpointPath,
defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' as const },
},
},
}
: {}),
}
}

const goModels: OpenCodeGoCatalogSpec[] = [
{ id: 'minimax-m3', apiName: 'minimax-m3', label: 'MiniMax M3', endpointPath: '/messages' },
{ id: 'minimax-m2.7', apiName: 'minimax-m2.7', label: 'MiniMax M2.7', endpointPath: '/messages' },
{ id: 'minimax-m2.5', apiName: 'minimax-m2.5', label: 'MiniMax M2.5', endpointPath: '/messages' },
{ id: 'kimi-k2.7-code', apiName: 'kimi-k2.7-code', label: 'Kimi K2.7 Code' },
{ id: 'kimi-k2.6', apiName: 'kimi-k2.6', label: 'Kimi K2.6' },
{ id: 'kimi-k2.5', apiName: 'kimi-k2.5', label: 'Kimi K2.5' },
{ id: 'glm-5.2', apiName: 'glm-5.2', label: 'GLM 5.2' },
{ id: 'glm-5.1', apiName: 'glm-5.1', label: 'GLM 5.1' },
{ id: 'glm-5', apiName: 'glm-5', label: 'GLM 5' },
{ id: 'deepseek-v4-pro', apiName: 'deepseek-v4-pro', label: 'DeepSeek V4 Pro' },
{ id: 'deepseek-v4-flash', apiName: 'deepseek-v4-flash', label: 'DeepSeek V4 Flash' },
{ id: 'qwen3.7-max', apiName: 'qwen3.7-max', label: 'Qwen3.7 Max', endpointPath: '/messages' },
{ id: 'qwen3.7-plus', apiName: 'qwen3.7-plus', label: 'Qwen3.7 Plus', endpointPath: '/messages' },
{ id: 'qwen3.6-plus', apiName: 'qwen3.6-plus', label: 'Qwen3.6 Plus', endpointPath: '/messages' },
{ id: 'qwen3.5-plus', apiName: 'qwen3.5-plus', label: 'Qwen3.5 Plus', endpointPath: '/messages' },
Comment thread
coderabbitai[bot] marked this conversation as resolved.
{ id: 'mimo-v2-pro', apiName: 'mimo-v2-pro', label: 'MiMo V2 Pro' },
{ id: 'mimo-v2-omni', apiName: 'mimo-v2-omni', label: 'MiMo V2 Omni' },
{ id: 'mimo-v2.5-pro', apiName: 'mimo-v2.5-pro', label: 'MiMo V2.5 Pro' },
{ id: 'mimo-v2.5', apiName: 'mimo-v2.5', label: 'MiMo V2.5' },
{ id: 'hy3-preview', apiName: 'hy3-preview', label: 'HY3 Preview' },
]

export default defineGateway({
id: 'opencode-go',
label: 'OpenCode Go',
Expand Down Expand Up @@ -29,29 +78,13 @@ export default defineGateway({
preset: {
id: 'opencode-go',
vendorId: 'openai',
description: 'OpenCode Go — $10/mo subscription for open models (13 models)',
description: 'OpenCode Go - $10/mo subscription for open models (20 models)',
apiKeyEnvVars: ['OPENCODE_API_KEY'],
modelEnvVars: ['OPENAI_MODEL'],
},
catalog: {
source: 'static',
models: [
// OpenAI-compatible — /zen/go/v1/chat/completions
{ id: 'opencode-go-glm-5.1', apiName: 'glm-5.1', label: 'GLM 5.1', modelDescriptorId: 'opencode-go-glm-5.1' },
{ id: 'opencode-go-glm-5', apiName: 'glm-5', label: 'GLM 5', modelDescriptorId: 'opencode-go-glm-5' },
{ id: 'opencode-go-kimi-k2.5', apiName: 'kimi-k2.5', label: 'Kimi K2.5', modelDescriptorId: 'opencode-go-kimi-k2.5' },
{ id: 'opencode-go-kimi-k2.6', apiName: 'kimi-k2.6', label: 'Kimi K2.6', modelDescriptorId: 'opencode-go-kimi-k2.6' },
{ id: 'opencode-go-deepseek-v4-pro', apiName: 'deepseek-v4-pro', label: 'DeepSeek V4 Pro', modelDescriptorId: 'opencode-go-deepseek-v4-pro' },
{ id: 'opencode-go-deepseek-v4-flash', apiName: 'deepseek-v4-flash', label: 'DeepSeek V4 Flash', modelDescriptorId: 'opencode-go-deepseek-v4-flash' },
{ id: 'opencode-go-mimo-v2.5', apiName: 'mimo-v2.5', label: 'MiMo V2.5', modelDescriptorId: 'opencode-go-mimo-v2.5' },
{ id: 'opencode-go-mimo-v2.5-pro', apiName: 'mimo-v2.5-pro', label: 'MiMo V2.5 Pro', modelDescriptorId: 'opencode-go-mimo-v2.5-pro' },
// Anthropic Messages API — /zen/go/v1/messages with x-api-key auth
{ id: 'opencode-go-minimax-m2.7', apiName: 'minimax-m2.7', label: 'MiniMax M2.7', modelDescriptorId: 'opencode-go-minimax-m2.7', transportOverrides: { openaiShim: { endpointPath: '/messages', defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' } } } },
{ id: 'opencode-go-minimax-m2.5', apiName: 'minimax-m2.5', label: 'MiniMax M2.5', modelDescriptorId: 'opencode-go-minimax-m2.5', transportOverrides: { openaiShim: { endpointPath: '/messages', defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' } } } },
{ id: 'opencode-go-qwen3.6-plus', apiName: 'qwen3.6-plus', label: 'Qwen3.6 Plus', modelDescriptorId: 'opencode-go-qwen3.6-plus', transportOverrides: { openaiShim: { endpointPath: '/messages', defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' } } } },
{ id: 'opencode-go-qwen3.5-plus', apiName: 'qwen3.5-plus', label: 'Qwen3.5 Plus', modelDescriptorId: 'opencode-go-qwen3.5-plus', transportOverrides: { openaiShim: { endpointPath: '/messages', defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' } } } },
{ id: 'opencode-go-minimax-m3', apiName: 'minimax-m3', label: 'MiniMax M3', modelDescriptorId: 'opencode-go-minimax-m3', transportOverrides: { openaiShim: { endpointPath: '/messages', defaultAuthHeader: { name: 'x-api-key', scheme: 'raw' } } } },
],
models: goModels.map(catalogEntry),
},
usage: { supported: false },
})
19 changes: 17 additions & 2 deletions src/integrations/gateways/opencode.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,12 @@ describe('OpenCode model catalog', () => {

test('zen model count matches expected', () => {
const models = getCatalogEntriesForRoute('opencode')
expect(models.length).toBe(43)
expect(models.length).toBe(48)
})

test('go model count matches expected', () => {
const models = getCatalogEntriesForRoute('opencode-go')
expect(models.length).toBe(13)
expect(models.length).toBe(20)
})

test('all zen gpt models have modelDescriptorId', () => {
Expand Down Expand Up @@ -324,6 +324,8 @@ describe('OpenCode model catalog', () => {
'opencode-go-minimax-m3',
'opencode-go-minimax-m2.7',
'opencode-go-minimax-m2.5',
'opencode-go-qwen3.7-max',
'opencode-go-qwen3.7-plus',
'opencode-go-qwen3.6-plus',
'opencode-go-qwen3.5-plus',
]
Expand Down Expand Up @@ -466,6 +468,19 @@ describe('OpenCode edge cases', () => {
}
})

test('model descriptors preserve OpenCode provider limit metadata', () => {
const models = new Map(
getAllModels()
.filter(m => m.id.startsWith('opencode-'))
.map(model => [model.id, model]),
)

expect(models.get('opencode-qwen3.6-plus')?.contextWindow).toBe(262_144)
expect(models.get('opencode-deepseek-v4-pro')?.maxOutputTokens).toBe(384_000)
expect(models.get('opencode-go-minimax-m2.5')?.maxOutputTokens).toBe(65_536)
expect(models.get('opencode-go-hy3-preview')?.contextWindow).toBe(256_000)
})

test('zen gateway validation message mentions OPENCODE_API_KEY', () => {
const gateway = getGateway('opencode')
expect(gateway!.validation!.missingCredentialMessage).toContain('OPENCODE_API_KEY')
Expand Down
Loading