Claude-skill-registry add-opencode-model
Fetch OpenCode Zen model details and provide guidance for adding models to acai-ts provider configuration.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/add-opencode-model" ~/.claude/skills/majiayu000-claude-skill-registry-add-opencode-model && rm -rf "$T"
manifest:
skills/data/add-opencode-model/SKILL.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- references .env files
- references API keys
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
Add OpenCode Zen Model
Fetches model details from both OpenCode and OpenRouter APIs to provide structured information for the agent to add the model to
source/models/opencode-zen-provider.ts.
Usage
Run this script from this file's directory.
./add-model.js google/gemini-3-flash-preview
How It Works
- Confirms model exists in OpenCode API (
)https://opencode.ai/zen/v1/models - Searches OpenRouter API (
) for matching model to get:https://openrouter.ai/api/v1/models- Context window length
- Max output tokens
- Pricing information
- Supported features (reasoning/tool calling)
- Determines client type based on model provider:
→ usesopenai
(Responses API)@ai-sdk/openai
→ usesgoogle
(custom base URL)@ai-sdk/google
→ usesanthropic@ai-sdk/anthropic
→ usesopenai-compatiblecreateOpenAICompatible
- Outputs JSON with all details needed to add the model
JSON Output Format
The script outputs a JSON object wrapped in markers:
--- MODEL_DETAILS_JSON_START --- {...} --- MODEL_DETAILS_JSON_END ---
JSON Structure
{ "modelKey": "gemini-3-flash-preview", "opencodeId": "google/gemini-3-flash-preview", "openrouterId": "google/gemini-3-flash-preview", "providerFile": "./source/models/opencode-zen-provider.ts", "registryId": "opencode:gemini-3-flash-preview", "clientType": "google", "registryEntry": { "id": "opencode:gemini-3-flash-preview", "provider": "OpenCode", "contextWindow": 1048576, "maxOutputTokens": 65535, "defaultTemperature": 0.5, "promptFormat": "markdown", "supportsReasoning": true, "supportsToolCalling": true, "costPerInputToken": 0.0000005, "costPerOutputToken": 0.000003 }, "clientConfig": { "key": "gemini-3-flash-preview", "opencodeId": "google/gemini-3-flash-preview", "clientType": "google", "openrouterId": "google/gemini-3-flash-preview" }, "modelInfo": { "opencodeId": "google/gemini-3-flash-preview", "opencodeName": "Gemini 3 Flash Preview", "openrouterId": "google/gemini-3-flash-preview", "openrouterName": "Google: Gemini 3 Flash Preview", "contextLength": 1048576, "maxCompletionTokens": 65535, "pricing": {...}, "supportedParameters": [...] } }
Client Type Reference
| Client Type | Library | Base URL | Example Models |
|---|---|---|---|
| | Responses API | |
| | | |
| | Messages API | |
| | | All other models |
How to Add Model to Provider File
Step 1: Add client if needed
In
source/models/opencode-zen-provider.ts, check if you need to add a new client based on clientType:
// For OpenAI models (Responses API) import { createOpenAI } from "@ai-sdk/openai"; const openaiClient = createOpenAI({ apiKey: process.env["OPENCODE_ZEN_API_TOKEN"] ?? "", baseURL: "https://opencode.ai/zen/v1", }); // For Google models import { createGoogle } from "@ai-sdk/google"; const googleClient = createGoogle({ apiKey: process.env["OPENCODE_ZEN_API_TOKEN"] ?? "", baseURL: "https://opencode.ai/zen/v1/models/<model-id>", });
Step 2: Add to opencodeZenModels
object
opencodeZenModelsFind the
opencodeZenModels const object and add the new model entry in alphabetical order by key, using the appropriate client:
const opencodeZenModels = { "glm-4-7": completionsClient("glm-4.7-free"), "minimax-m2-1": messagesClient("minimax-m2.1-free"), // For OpenAI-compatible models: "new-model": completionsClient("provider/new-model"), // For Anthropic models: "claude-model": messagesClient("anthropic/claude-model"), // For Google models: "gemini-flash": googleClient("google/gemini-3-flash-preview"), } as const;
Step 3: Add to opencodeZenModelRegistry
object
opencodeZenModelRegistryFind the
opencodeZenModelRegistry object and add the registry entry in alphabetical order by registryId:
export const opencodeZenModelRegistry: { [K in ModelName]: ModelMetadata<ModelName>; } = { "opencode:glm-4-7": { id: "opencode:glm-4-7", provider: "opencode", // ... existing entry ... }, // ... existing entries ... "opencode:new-model": { id: "opencode:new-model", provider: "opencode", contextWindow: 1048576, maxOutputTokens: 65535, defaultTemperature: 0.5, promptFormat: "markdown", supportsReasoning: true, supportsToolCalling: true, costPerInputToken: 0.0000005, costPerOutputToken: 0.000003, }, // ... };
Step 4: Validate changes
Run the project's validation commands:
npm run typecheck npm run lint npm run format
Field Mapping Reference
| JSON Field | Registry Field | Notes |
|---|---|---|
| | Full registry ID |
| | Always "opencode" |
| | From OpenRouter API |
| | From OpenRouter API |
| | Inferred from model ID |
| | Inferred from model family |
| | From OpenRouter API |
| | From OpenRouter API |
| | From OpenRouter API |
| | From OpenRouter API |
Matching Strategy
The script uses multiple strategies to find a matching OpenRouter model:
- Direct key match: Match by model key (e.g.,
matchesglm-4.7
)glm-4.7 - Provider + name match: Match by provider prefix and model name (e.g.,
matchesgoogle/gemini-3-flash
)google/gemini-3-flash-preview - Partial name match: Match by partial model name (fallback)
If no match is found, defaults are used for pricing and capability fields.
Default Value Inferences
| Field | Logic |
|---|---|
| Returns if model ID contains "codex", "coder", or "code"; otherwise |
| Maps model family to format: gemini/claude/qwen/mistral/moonshotai → "markdown", gpt/openai → "xml", deepseek → "bracket", defaults to "markdown" |
| Falls back to if not available from OpenRouter |
| Defaults to if no OpenRouter match |
| Defaults to if no OpenRouter match |
Error Handling
- Validates model ID exists in OpenCode API
- Shows first 10 available OpenCode models if ID not found
- Warns if no matching OpenRouter model found
- Provides clear error messages with suggestions
Examples
# Add Google Gemini Flash ./add-model.js google/gemini-3-flash-preview # Add OpenAI GPT model ./add-model.js openai/gpt-4o # Add Anthropic Claude model ./add-model.js anthropic/claude-3-5-sonnet # Add other provider model ./add-model.js deepseek/deepseek-v3