Back to home

PerryLink

dsh-local-ai

Local-model (Ollama) integration for DeepSeek Harness: discover, pull, remove, and inspect local models, route requests to them by task type or keyword with automatic fallback to the cloud, and get a one-shot status overview via /ollama.

Stars
0
Language
TypeScript
Created
Aug 17, 2026
Updated
Aug 17, 2026

Introduction

🤖 dsh-local-ai

Local-model (Ollama) integration for DeepSeek Harness.

Discover, pull, remove, and inspect local models, route requests to them by task type or keyword with automatic fallback to the cloud, and get a one-shot status overview via /ollama.

License DSH plugin Node CI Version npm version npm downloads

English · 简体中文 · Español · Português · हिन्दी


Compatibility

SurfaceStatus
HarnessDeepSeek Harness 0.1.0-rc.6
Node^22.19.0 || >=24.0.0
BackendOllama (local HTTP API + CLI probe)
ModelText-only route (inputModalities: ['text']); tool calls and tool results are supported

What you get

dsh-local-ai makes Ollama a first-class local provider in DeepSeek Harness:

  • Discovery & managementollama_list (installed models, running models, disk usage), ollama_show (parameter size, quantization, context length), ollama_pull, and ollama_remove.
  • Health check — process liveness (via the ollama CLI) and API responsiveness (via /api/version), reported as two independent signals.
  • Official adapter — the ollama provider route is registered through ctx.llm.registerAdapter (LlmAdapter), with configurable model mapping and temperature / max-tokens / stop translation.
  • Local routingmodel_route rules route requests to a local model by task type (purpose), case-insensitive keyword, or always, with automatic fallback to the cloud when the local route fails before producing content.
  • /ollama command — a one-shot status overview: models, disk usage, health, and suggestions.
  • Zero dependencies, HTTP first — everything talks to Ollama's HTTP API (the CLI is used only for the process probe); no model files are bundled.
request (loop)
   │ llm/stream waterfall
   ├─ rule matches? ──▶ route to ollama ──▶ Ollama /api/chat (NDJSON stream)
   │                        └─ fails first ─▶ fall back to cloud (next())
   └─ no match ──▶ cloud provider
tools ──▶ /api/tags · /api/ps · /api/show · /api/pull · /api/delete
health ──▶ /api/version (API) + ollama list (process)

Quick start

# 1. install the bundle into your profile
dsh plugin --profile web add "github:PerryLink/dsh-local-ai#main"

# or from npm (published releases)
dsh plugin --profile web add dsh-local-ai

# 2. configure routing in your profile patch (cordis.yml) and restart
dsh --profile web

Minimal routing configuration (the rule ships commented out in cordis.patch.yml):

- insert:
    - id: dsh-local-ai
      name: dsh-local-ai
      config:
        route:
          - model: llama3.2
            keywords: ["confidential", "offline"]

Then verify the row mounts:

dsh --profile web --dump-config | grep -A2 'id: dsh-local-ai'

Install & uninstall

  • git channel (latest main): dsh plugin --profile web add "github:PerryLink/dsh-local-ai#main" — the prepare script builds with production dependencies only.
  • npm channel (published releases): dsh plugin --profile web add dsh-local-ai.
  • tarball channel: pnpm pack in this repo, then dsh plugin --profile web add ./dsh-local-ai-<version>.tgz.
  • uninstall: dsh plugin --profile web remove dsh-local-ai (or remove the row from the profile patch).

If pnpm reports ERR_PNPM_IGNORED_BUILDS for this package, add allowBuilds: { esbuild: true } to your pnpm-workspace.yaml — the dsh CLI prints the exact snippet.

Configuration

All tunables are Schemastery Config fields (changeable from cordis.yml). An id-targeted override replaces the whole row — restate every key you need. cordis.patch.yml documents each key inline.

KeyDefaultMeaning
baseURLhttp://127.0.0.1:11434Ollama HTTP API base URL; /api/* paths are appended
requestTimeoutMs30000Per-request HTTP timeout (milliseconds)
graceMs15000Subprocess terminate grace for the health-check CLI probe
defaultContextWindow8192Context capacity used when a model has no exact value
maxTokens4096Per-request output cap used when a model has no exact value
temperature(none)Default sampling temperature (0..2); omitted leaves the provider default
models[]Harness-visible → Ollama model mappings
models[].name(required)Harness-visible model name (GenerateOptions.model)
models[].model= nameOllama model id
models[].contextWindow(none)Per-model context capacity
models[].maxTokens(none)Per-model output cap
models[].temperature(none)Per-model sampling temperature
route[]Local-model routing rules (first match wins)
route[].model(required)Target local model name
route[].purpose(none)Task type match: compaction / session-title
route[].keywords[]Case-insensitive request keywords
route[].alwaysfalseRoute every eligible request to this model

Tools & surfaces

SurfaceKindWhat it does
ollama_listtoolList installed models, running models, and disk usage
ollama_showtoolShow parameter size, quantization, context length, family, format
ollama_pulltoolPull (download) a model
ollama_removetoolRemove a model
ollama_healthtoolProcess liveness + API responsiveness
/ollamacommandOne-shot status overview (models + health + suggestions)

Consumes the public host services ctx.llm (registerAdapter), ctx.tools, ctx.subprocess (CLI probe), and ctx.commands. It registers no llm/stream short-circuit by default — the routing listener passes through (next()) unless a rule matches.

Permissions & data

  • Permissions: network:outbound to the Ollama endpoint you configure; no native code, no filesystem access, no storage.
  • Data: every model list/detail, health fact, and error message shown to the model or the user is sanitized (endpoint userinfo and secret query params dropped, control characters stripped, lengths bounded) before display. Tool and command results are logged by the harness's own tool/command seams.
  • Credentials: the plugin stores and reads no credentials. It only issues HTTP requests to the endpoint you configure, plus the local ollama list process probe.

Security boundaries

  • No re-routing by default — the route list is empty unless you opt in; a request reaches a local model only through an explicit rule or an explicit ollama provider selection.
  • Sanitize before display — endpoint addresses and local paths are sanitized before they reach tool output, the /ollama command, or error messages.
  • Zero bundled models — downloads and storage are Ollama's own responsibility; nothing is shipped in the package.
  • Failure loud, failure contained — invalid config fails the mount; a local route that fails before producing content falls back to the cloud (next()), so a down Ollama never bricks a conversation.
  • Model-visible ⟺ logged — routing only changes which provider serves a request (the assistant message is logged with its ollama provenance); no new model-visible input is invented.

Known limitations

  • rc.6 only — developed and tested against @deepseek-ai/dsh@0.1.0-rc.6; newer harness baselines are expected to work but are verified by the monthly compat workflow.
  • Text-only route — image content is rejected (UNSUPPORTED_CONTENT); multimodal local models are not wired up yet.
  • Mid-stream fallback — once a local route has started producing content, a later failure is forwarded (not retracted); only a failure before the first token falls back to the cloud.

Development

pnpm install        # node ^22.19 || >=24
pnpm run typecheck  # tsc: src + tests against the published 0.1.0-rc.6 types
pnpm run typecheck:ci  # strict tsc against published rc.6 types (skipLibCheck off)
pnpm test           # vitest: real Context/LlmRuntime/ToolRuntime/CommandRuntime/subprocess seams
pnpm run test:coverage  # coverage gate (90/80/90/90)
pnpm run build      # tsdown bundle + tsc declarations (lib/)
pnpm run verify:self-contained  # dependency specs resolve from the registry
pnpm run verify:artifacts       # built ESM face + bundle patch present
node scripts/check-readme-sync.mjs  # five-language README sync gate
pnpm pack           # the published tarball

Topics

dsh, dsh-plugin, deepseek-harness, deepseek, cordis, ollama, local-llm, local-models, offline, privacy, model-routing

Contributors

  • @PerryLink — creator and maintainer: adapter, routing, tools, health check, sanitization, and the five-language docs.

PerryLink DSH Plugin Family

This project is one of the 29 DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:

PluginOne-liner
dsh-auto-reviewSecond-model auto-review on the approval chain, fail-closed by default
dsh-background-agentsDurable background child agents with a Web UI sidebar, messaging and interrupt
dsh-budgetCost governance for DeepSeek Harness: budgets, carbon, and latency in one panel.
dsh-checkpoint-rewindClaude Code /rewind-equivalent: snapshots, session forks, one-shot restore
dsh-claude-moveMigrate Claude Code sessions, memory, skills and CLAUDE.md into DSH
dsh-clickCross-platform native desktop control for DeepSeek Harness — Windows first.
dsh-composer-historyTerminal-style input history for the web composer: arrows, Ctrl+R search
dsh-defendPrompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness.
dsh-doublecheckEngineering-discipline guard: requirements grill, test gates, adversary review
dsh-drawUnified static-image generation routing for DeepSeek Harness.
dsh-fastRead-only performance diagnostics for DeepSeek Harness.
dsh-githubGitHub PR/issues integration for DSH, every write gated by approval
dsh-libraryLocal document knowledge base for DeepSeek Harness.
dsh-local-aiLocal-model (Ollama) integration for DeepSeek Harness.
dsh-lsp-actionsLSP diagnostics, formatting, completion, code actions and rename over language servers
dsh-maskPII masking middleware for DeepSeek Harness — anonymize personal data before it reaches the model, restore it at the display layer.
dsh-mcp-panelRead-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors
dsh-mementoApproval-gated cross-session memory: ctx.memory seam + SQLite + memory tool
dsh-observeOpenTelemetry and Langfuse observability exporter for DeepSeek Harness.
dsh-output-stylesClaude Code outputStyles-equivalent runtime style switching
dsh-permission-rulesClaude Code-style declarative allow/deny/ask permission rules with audit
dsh-plugin-guidePlugin-development knowledge base as an on-demand agent skill
dsh-scoreMulti-dimensional quality scoring for DeepSeek Harness plugins.
dsh-session-pinPin sessions in the Web sidebar with durable ordering
dsh-session-syncCross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store.
dsh-skill-pack-securitySecurity-audit skill pack: secret scan, dependency and supply-chain review
dsh-talkVoice-first session loop for DeepSeek Harness: talk to it, hear it answer.
dsh-test-driveIsolated install-and-smoke test drives for DeepSeek Harness plugins.
dsh-translateVendor parameter translation and deterministic JSON repair for DeepSeek Harness.

License

Apache License 2.0 © 2026 dsh-local-ai contributors