opencode-blablador
v0.1.3
Published
Blablador (Helmholtz / JSC) provider plugin for OpenCode: measured context windows, live catalog, and reasoning effort mapping
Maintainers
Readme
opencode-blablador
Blablador provider for OpenCode v2. It registers the Helmholtz / JSC Blablador gateway with the models, context ceilings, and reasoning levels the service actually supports.
- All chat aliases, with a verified 21-model fallback catalog and live
/v1/modelsdiscovery. - Measured context windows: 1,048,576 / 262,144 / 131,072 tokens instead of a blanket 98k cap.
- 16,384-token output ceiling, matching the gateway limit that otherwise causes HTTP 400s.
- Per-family reasoning variants that translate OpenCode's levels into each backend's
reasoning_effortvocabulary. - Env or
/connectauthentication, with no plaintext token in the config file. - Uses OpenCode's native
@opencode/ai/providers/openai-compatibledriver for streaming and tools.
Requirements
- OpenCode v2 with
@opencode/plugin2.1.4 or newer. - Node.js 22 or newer.
Install
opencode plugin add opencode-blabladorOr add it to opencode.jsonc:
{
"plugins": ["opencode-blablador"]
}Authenticate
Either store a token through OpenCode:
/connect -> Blablador -> API keyOr export it before starting OpenCode:
export BLABLADOR_API_TOKEN="your-jsc-blablador-token"The provider is auto-activated: it appears once OpenCode can see an env or /connect
connection. Discovery and requests use the stored /connect key when one exists and the env var
otherwise; keys are trimmed, because a pasted token with surrounding whitespace is what the gateway
401s on. On first load the plugin queries /v1/models with that credential. If discovery fails or
returns fewer than five chat models, the bundled catalog is used and a warning is logged. Switching
the credential with /connect re-runs discovery without a restart.
Use
Select Blablador in the model picker. Rows read <deployment> (<alias>) so the aliases of one
model sort together: alias-large and alias-qwen3.8-flash-next both serve
nvidia/Qwen3.8-Flash-Next-NVFP4 and show up side by side. Models that reason expose variants such
as low, medium, high, and xhigh. Picking no variant leaves the field unset, so the backend
default applies.
The output cap is 16,384 tokens, including reasoning tokens.
Context ceilings
These numbers are the ceilings the gateway actually enforces.
| Context | Models |
| --- | --- |
| 1,048,576 | alias-huge, alias-kimi-k3-1m, alias-glm-5.3-flash, alias-deepseek-v41-flash-booster, alias-mimo-v2.6-flash, alias-mimo-v2.6-pro, alias-muse-spark, deepseek-v4.1-flash-at-hzdr |
| 262,144 | alias-code, alias-large, alias-qwen3.8-27b, alias-qwen3.8-flash-next, alias-qwen38-27b, alias-qwen38-quick, alias-aleph-kolibri-1, alias-apertus, alias-apertus-70b, alias-ocr, Swift-Qwen3.8-27b |
| 131,072 | alias-fast, alias-eve |
Reasoning levels
Blablador backends accept different reasoning_effort values. Sending a value a backend does not
know returns HTTP 400, so the plugin maps OpenCode's levels per family:
| Family | Models | Backend vocabulary |
| --- | --- | --- |
| Qwen | alias-code, alias-large, alias-qwen*, Swift-Qwen3.8-27b | none, low, medium, xhigh |
| gpt-oss | alias-fast | low, medium, high |
| Kimi | alias-kimi-k3-1m | none, low, high, max |
| DeepSeek | alias-deepseek-*, deepseek-v4.1-flash-at-hzdr | none, low, high, xhigh, max |
| Muse | alias-muse-spark | low, medium, high, xhigh |
| Mistral | alias-mistral-large | low, medium, high, xhigh, max |
| Generic | unlisted aliases | none, minimal, low, medium, high, xhigh, max |
| None | Apertus, Eve, OCR | the field is never sent |
The mapping preserves intent where definitions differ: high becomes xhigh on Qwen, while
xhigh and max clamp to high on gpt-oss.
If JSC adds a family with its own vocabulary, add a pattern to FAMILY and an entry to EFFORT
in blablador-core, the shared catalog this plugin depends on; until then it uses the generic map.
Live catalog
GET /v1/models carries no capability metadata and JSC says aliases come and go without notice.
At startup the plugin:
- Keeps
alias-*chat models plus the two verified unaliased chat models. - Drops embeddings, rerankers, image/video/voice endpoints, and other non-chat models.
- Fills missing roots and context windows from the bundled catalog.
- Replaces the fallback list only if at least five chat models remain.
Discovery runs at startup, whenever the Blablador credential changes, and on a ten-minute timer; the provider is republished only when the alias list actually moved. The output cap shrinks below 16,384 for any model whose live window is smaller than the gateway ceiling, so the prompt always keeps room inside the window.
Limitations
- The live catalog is refreshed every ten minutes, not on every model-picker open.
- Vision support is a fixed allowlist because
/v1/modelsdoes not report modalities. - Blablador returns no prompt-cache accounting, so the plugin does not configure caching.
- Blablador is a shared research service; rate limits and alias availability are controlled by JSC.
Development
The catalog rules (fallback list, family/effort maps, live merge, token trimming) live in blablador-core; this package is the OpenCode adapter around them. It lives in a monorepo, so install from the repo root — the workspace links the core, no symlinks:
npm install # at the monorepo root
npm run typecheck
npm test # builds dist/ and runs the host tests (catalog rules are tested in the core)
npm run test:live # loads dist/ in an isolated real OpenCode and checks its catalog against /v1/models,
# runs one #high completion (the effort word end-to-end) and one red-PNG image via -f;
# needs BLABLADOR_API_TOKEN and the opencode binary, skips without themTo point a local OpenCode at the built plugin, "plugins": ["./dist"] in this repo's
opencode.jsonc does it — a path plugin entry must be a directory (a .ts file path is
ignored with a warning), and relative paths resolve against the config file's directory.
License
MIT
