TokenLab for DeepSeek Harness
@tokenlabai/dsh-provider is an installable DeepSeek Harness profile bundle. It provides TokenLab model routes plus catalog, creation, and task tools.
The bundle keeps model traffic on the most native protocol DeepSeek Harness currently supports:
- OpenAI-owned models that declare
openai_responses use /v1/responses.
- Anthropic-owned models that declare
anthropic_messages use /v1/messages.
- All remaining compatible chat models use
/v1/chat/completions.
- Gemini-native
generateContent is not configurable in the current Harness custom-provider adapter, so Gemini models use their declared Chat Completions compatibility path.
Protocol eligibility comes from each model's public TokenLab detail contract at GET /v1/models/{id}. The generator never classifies a model by substring or provider-internal route data.
What is included
| Surface | Implementation | Current bundled contract |
|---|
| Model picker | Existing DSH llm-pi-ai adapter | 124 public chat models on three exclusive protocol routes |
| Responses | Native openai-responses route | 23 models |
| Messages | Native anthropic-messages route | 9 models |
| Chat | OpenAI Chat Completions route | 92 models |
| Multimodal and developer tools | Official DSH MCP bridge + @tokenlabai/mcp-server@0.6.19 core profile | 31 MCP tools by default; catalog 6 / full 80 available |
| Async completion | Native tokenlab_wait_task tool | image, video, music, and 3D task polling with cancellation and bounded retries |
The full MCP profile covers public model discovery and pricing, Chat Completions, Responses, Anthropic Messages, Gemini generateContent, image generation/edit/variation, video, music, 3D, TTS, STT, files, tasks, embeddings, rerank, translation, response lifecycle, batches, Seedance assets/groups, worlds, and other allowlisted developer operations in the pinned TokenLab MCP contract.
Requirements
- DeepSeek Harness
0.1.5-rc.1 (the verified target for bundle 0.1.3)
- Node.js
22.19+ or 24+
- A TokenLab API key for inference, media, files, tasks, embeddings, rerank, and translation
Public catalog and pricing tools remain available without a key, but this bundle starts the core tool profile and is intended for authenticated use.
Install
Version 0.1.2 was tagged but was not published to npm because its release workflow stopped at the dependency-age check. Install 0.1.3 for the current bundle.
Put the key in the project .env or the Harness-home .env. DSH loads those files into the launch environment before resolving bundle configuration and before starting the MCP child process.
TOKENLAB_API_KEY=sk-your-tokenlab-key
Then install the bundle into the profile you use:
dsh plugin --profile web add --workspace-root @tokenlabai/dsh-provider@0.1.3
For a headless profile:
dsh plugin --profile headless add --workspace-root @tokenlabai/dsh-provider@0.1.3
Restart that profile after installation. In the model picker, TokenLab appears as three provider routes:
TokenLab · Responses
TokenLab · Messages
TokenLab · Chat
Each model ID appears on exactly one route.
Dependency release age
Harness forwards plugin commands to your installed pnpm. The normal pnpm 11 fresh-add flow records exact exceptions for selected releases that are less than a day old. A frozen install or an explicitly strict age policy can still reject them; this package's repository settings do not configure your Harness profile.
If an age check rejects this release, wait for your configured age window, or review the exact published versions and merge only these entries into the profile's existing pnpm-workspace.yaml (under $DSH_HOME/profiles/web for the web profile):
minimumReleaseAgeExclude:
- '@tokenlabai/dsh-provider@0.1.3'
- '@tokenlabai/mcp-server@0.6.19'
Replace older exclusions for these same two package names instead of adding duplicate selectors; preserve unrelated settings and exclusions, then repeat the same dsh plugin command. This does not disable age checks for other packages or versions.
Use multimedia and async tasks
The model sees TokenLab MCP tools under the mcp__tokenlab__... namespace. A typical async media flow is:
- Discover a currently enabled model with
mcp__tokenlab__list_models or mcp__tokenlab__compare_models.
- Submit with
mcp__tokenlab__create_video, create_music, create_3d_model, or an image tool.
- Read
delivery.mode; do not assume every image result is synchronous.
- If
delivery.mode is async, pass delivery.task_id to tokenlab_wait_task.
- Use the returned
status, full response, and result_urls. A timed-out wait returns the latest state so another call can resume polling.
tokenlab_wait_task forwards the Harness caller's AbortSignal through every fetch and cancellable delay. It treats completed, failed, succeeded, cancelled, and expired as terminal, retries only bounded transient HTTP failures, and never changes task state. Use the generated mcp__tokenlab__cancel_task tool when cancellation is supported and intended.
Configuration
Optional environment variables:
| Variable | Default | Purpose |
|---|
TOKENLAB_MCP_TOOL_PROFILE | core | catalog for discovery only (6 tools), core for common creation and task workflows (31), full for all pinned developer operations (80) |
TOKENLAB_MCP_SCHEMA_MODE | portable | portable, exact, or strict; execution still validates the complete API contract |
TOKENLAB_API_KEY | none | Shared TokenLab credential for model routes, MCP tools, and async wait |
TOKENLAB_API_BASE | https://api.tokenlab.sh | MCP and async-task API root |
TOKENLAB_OPENAI_BASE_URL | https://api.tokenlab.sh/v1 | Responses and Chat adapter base URL |
TOKENLAB_ANTHROPIC_BASE_URL | https://api.tokenlab.sh | Messages adapter base URL; the adapter appends /v1/messages |
The default core profile includes catalog and pricing, native chat protocols, images, video, music, 3D, audio, files, task status/cancellation, embeddings, rerank, and translation. Use TOKENLAB_MCP_TOOL_PROFILE=full when you need the additional response lifecycle, batches, Seedance assets/groups, or worlds tools. Use catalog for discovery without generation tools. The separate tokenlab_wait_task poller remains available in every profile.
Existing llm-pi-ai settings
Harness 0.1.5-rc.1 merges saved llm-pi-ai.providers by provider key. Existing providers with different keys remain alongside the three bundled TokenLab routes. Saved entries using tokenlab-responses, tokenlab-messages, or tokenlab-chat take precedence for that route; review those entries when upgrading an older catalog. Do not replace your entire settings document with the bundle patch.
Reasoning levels
The current TokenLab public model-detail response identifies reasoning capability but does not enumerate supported effort values per model. The bundle therefore leaves reasoningEfforts undeclared instead of guessing levels from model names or enabling every level. With custom provider keys, Harness has no matching built-in catalog to inherit; its effort picker will not offer levels for those entries. This does not disable a model's server-side reasoning behavior.
If you have separately verified a model's effort contract, configure reasoningEfforts on that model entry in its provider's models list. Harness maps each displayed level to the wire value, for example high: high only when that model accepts high; off: null means omit an effort value, not proof that the server disables reasoning. Preserve the other models when overriding a saved route. Do not add modelOverrides to these routes: Harness reserves that field for catalog-backed routes without an explicit models list. xhigh or max must not be enabled merely because a model supports reasoning.
Security and side effects
- Keep
TOKENLAB_API_KEY in .env or another trusted launch environment. Never commit it.
- The MCP server runs locally over stdio with the same Node executable as Harness. No credential is sent to a hosted MCP service, and startup does not use
npx or a shell.
- DSH treats MCP commands as trusted executables outside the agent sandbox. This bundle pins
@tokenlabai/mcp-server@0.6.19; review an upgrade before changing the pin.
- Core and full tools include billable generation and destructive operations such as file deletion or task cancellation. Keep Harness approval policy enabled for those calls.
- Tool and model outputs are untrusted external content. Do not treat returned text or URLs as instructions.
- The async waiter includes request IDs in diagnostics but never includes the API key in errors or tool results.
Model catalog maintenance
The checked-in generated/model-routes.json is the machine-readable route snapshot, and cordis.patch.yml is generated from it.
npm run routes:source-check # read-only comparison with the live public model contract
npm run routes:sync # refresh the snapshot and generated bundle patch
npm run routes:check # offline generated-file consistency check
The routing policy is deterministic:
- Prefer the exact
owned_by native format when both TokenLab and Harness declare it.
- Otherwise use a declared Harness-supported compatibility format.
- Never place one model on more than one provider route.
- Fail the source check when an active model has no Harness-supported format.
Development and verification
corepack pnpm install
pnpm peers check
pnpm run check
pnpm run build
npm pack --dry-run
The test suite covers native-route selection, route exclusivity, generated patch consistency, core-default MCP configuration and explicit profile selection, structured HTTP failures, task-id fencing, result URL extraction, transient retry limits, and caller cancellation.
Uninstall
dsh plugin --profile web remove --workspace-root @tokenlabai/dsh-provider
Restart the profile. Removing the bundle removes its TokenLab routes, MCP tool namespace, and async waiter; it does not delete your TokenLab account or API key.
Links
License
MIT