dsh-opencode-zen
开发工具 活跃维护

dsh-opencode-zen

keman-ai/dsh-opencode-zen

无需API密钥与额外配置,实时同步上游OpenCode Zen免费模型目录,直接接入目标平台使用,开箱即可调用各类免费模型资源,使用流程简洁无额外负担。

1
Stars 标星
2
Forks 分支
1
Watchers 关注
0
Open Issues
TypeScript
主要语言
MIT
开源协议
84 KB
仓库大小
25 天前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:keman-ai/dsh-opencode-zen
git clone https://github.com/keman-ai/dsh-opencode-zen.git
git clone git@github.com:keman-ai/dsh-opencode-zen.git
README.md main

DSH OpenCode Zen

Bring OpenCode Zen's free models to DeepSeek Harness.
No signup, no API key, no balance to top up.

Stars MIT License

English · 简体中文

If this is useful to you, a Star goes a long way

Install it and configure nothing. Zen's free models accept anonymous calls, so once the
plugin boots, a group of working models simply appears in the model picker.

Model picker
├─ nemotron-3-ultra-free         1M context
├─ nemotron-3.5-lightning-free   256K context, 256K output too
├─ laguna-s-2.1-free             256K context
├─ deepseek-v4-flash-free        200K context, 128K output
├─ big-pickle                    Zen's own anonymous evaluation model
├─ mimo-v2.5-free                200K context
└─ hy3-free                      190K context

All seven support tool calls and reasoning content, enough to run a full agent
loop — not a chat-only cut-down.

The list is not hardcoded; it is fetched at runtime: models.dev decides which are free
and how large
, Zen's model endpoint decides which still exist, and the plugin takes
the intersection. Free models are offered for a limited time, so any hardcoded list is
guaranteed to go stale.

Install

Not published to npm — install from GitHub:

dsh plugin --profile web add -w github:keman-ai/dsh-opencode-zen

Then restart dsh once, and the opencode-zen group appears in the model picker.

Three notes:

  • -w is not optional. The profile directory ships a pnpm-workspace.yaml, so pnpm
    treats it as a workspace root; without the flag you get ERR_PNPM_ADDING_TO_ROOT.
  • No build-script authorisation needed. The repository ships its build output and has
    no prepare script, so pnpm runs no build for a git source. You do not need
    allowBuilds, nor a build toolchain on your machine.
  • --profile is whichever you already use (web or headless). This is an LLM
    provider; it does not depend on the web GUI.

To confirm it really entered the Loader tree:

dsh --profile web --dump-config | grep -A 1 opencode-zen
# - id: opencode-zen
#   name: dsh-opencode-zen

To hack on it, install locally:

git clone https://github.com/keman-ai/dsh-opencode-zen
cd dsh-opencode-zen && pnpm install && pnpm build
dsh plugin --profile web add <absolute path to that directory>

Do I need an API key

No. Anonymous calls draw on Zen's shared free quota. It is rate-limited by source —
plenty for trying things out, though sustained volume will hit FreeUsageLimitError.

For a private quota, grab a key at opencode.ai/zen:

export OPENCODE_API_KEY=<your key>

The variable name matches opencode's own, so if you already use opencode, one key serves
both. You can also store it in the credentials service from dsh's Models page; the
plugin reads that first.

When the quota runs out, the plugin does not just say Rate limit exceeded — it tells you
whether you are anonymous or keyed, and what to do next.

Configuration

All optional. An empty config gives the behaviour described above.

plugins:
  dsh-opencode-zen:
    apiKeyEnv: OPENCODE_API_KEY        # credential reference (an env var name)
    baseURL: https://opencode.ai/zen/v1
    catalogUrl: https://models.dev/api.json
    catalogTtlMs: 3600000              # catalog TTL, one hour by default
    catalogTimeoutMs: 8000             # catalog request timeout
    maxTokens: 32000                   # output cap; the model's own lower cap wins
    defaultContextWindow: 128000       # assumed when the catalog has no entry

Known limits

  • The free quota is shared, and anonymous calls hit the limiter most easily. That is
    Zen's policy; all the plugin can do is state the reason clearly.
  • Reasoning is not sent back. OpenAI-compatible chat/completions has no request
    field to carry the previous turn's thinking, so reasoning blocks are displayed, not replayed.
  • Text only. All seven models take text alone; an image in a tool result is replaced
    with a one-line placeholder rather than dropped silently.
  • Paid models are excluded. Zen also offers Claude, GPT and others, but this plugin
    exists so that things run with zero configuration — mixing paid models into the same
    list makes it unclear which choice costs money. To use them, add an llm-deepseek
    entry pointing at the same endpoint.

Development

pnpm install
pnpm check      # type check
pnpm test       # unit tests
pnpm build      # bundle to lib/

lib/ is committed on purpose. This package is not published to npm; everyone
installs from a git source, and whether pnpm can build a git source depends on the other
machine's toolchain and allowBuilds grants. Shipping the output removes that variable —
commit the pnpm build output along with your code changes.

File Responsibility
src/index.ts Plugin entry: config validation, credential resolution, provider registration on ctx.llm
src/adapter.ts LlmAdapter implementation: requests, error mapping, model metadata
src/stream.ts State machine turning SSE deltas into the harness block sequence
src/discovery.ts Two-source merge, caching and fallback for the free catalog

Related

License

MIT © 2026 Science Roam Limited


If this is useful to you, a Star goes a long way