Back to home@jwilson411

dsh-compat-probe

DeepSeek Harness plugin: OpenAI-compat server protocol card (loopback probe, no GGUF)

Stars
0
Language
JavaScript
Created
Sep 1, 2026
Updated
Sep 1, 2026

Introduction

dsh-compat-probe

A DeepSeek Harness plugin with one tool. compat_probe sends five tiny fixture requests to one OpenAI-compatible server and returns a protocol card: a fixed set of booleans saying what that server actually implements, rather than what its docs claim.

The card answers the questions that break a harness at runtime. Is the server up? Does GET /models answer? Does stream: true come back as Server-Sent Events, or as one non-streaming JSON completion because the build ignored the flag? Does it accept max_tokens, max_completion_tokens, both, or neither?

It pairs with dsh-llamacpp, which does the actual serving. This package only asks questions.

What this is not

  • It does not ship GGUF weights, and it does not download any.
  • It does not start llama-server or any other process. Point it at a server you already run.
  • It is not Ollama, and it does not speak the Ollama API.
  • It is not a load tester. Five requests, once, when the model calls the tool.
  • It is not a GPU benchmark. It measures nothing about throughput, latency, or hardware.
  • It is not a client for hosted OpenAI or hosted Anthropic. The default target is loopback, and a non-loopback target is refused unless the deployment opts in.

Install

dsh plugin --profile web add github:jwilson411/dsh-compat-probe

The installer reads dsh.bundle.patch from package.json and appends cordis.patch.yml to the profile's ordered bundle list. The bundle inserts one row, compat-probe, pointing at loopback.

Pin the harness packages

Install @deepseek-ai/dsh-* at 0.1.1-rc.2 explicitly. The latest dist-tag on those packages is older than the release this plugin builds against, so an unpinned install resolves backwards and defineTool will not have the output schema shape used here.

npm install @deepseek-ai/dsh-tools@0.1.1-rc.2

Configuration

Set these in the profile's cordis.patch.yml, or in a --patch overlay, on the row with id: compat-probe. An id-targeted patch replaces the row's whole config, so restate every field you mean to keep.

KeyDefaultEnv fallbackNotes
baseURLhttp://127.0.0.1:8080/v1DSH_COMPAT_PROBE_BASE_URLIncludes the API prefix, so /v1 is never appended twice. This is where llama-server --port 8080 listens.
apiKeyunsetDSH_COMPAT_PROBE_API_KEYSent as Authorization: Bearer when set, and never logged. Prefer the environment variable over writing a credential into the profile. Never a tool argument.
allowRemotefalsenone, on purposePermit a non-loopback baseURL. No env fallback: widening where the harness sends requests should take an edit to the profile, not an exported shell variable.
modelprobeDSH_COMPAT_PROBE_MODELThe model id named on the fixture requests. A single-model server ignores it.
timeoutMs3000DSH_COMPAT_PROBE_TIMEOUT_MSPer-request budget in milliseconds.

The tool itself declares no parameters. Where to probe and which credential to send are deployment decisions, so a model cannot aim the harness at a host the operator did not name, and has no argument slot to smuggle a key into.

The card

FieldTypeMeaning
reachablebooleanAny fixture request received an HTTP response at all.
models_okbooleanGET {baseURL}/models answered 2xx.
stream_ssebooleanA stream: true chat completion came back as Server-Sent Events (text/event-stream, or data: frames).
stream_ignored_jsonbooleanA stream: true chat completion came back as one non-streaming JSON chat.completion, meaning the server ignored stream.
honors_max_tokensbooleanA POST carrying max_tokens: 1 avoided a 4xx or 5xx.
honors_max_completion_tokensbooleanA POST carrying max_completion_tokens: 1 avoided a 4xx or 5xx.
http_statusinteger or nullThe first non-2xx status seen in probe order, otherwise the last successful status, otherwise null when nothing connected.
error_codestring or nullNull when every fixture answered 2xx. UNREACHABLE when a request got no answer, HTTP_ERROR when one came back non-2xx.

Failures are fields, not exceptions. A refused connection, a DNS failure, a timeout, and a 500 each land in the card, so the model reads one shape whether the server is healthy or dead.

Default-deny for non-loopback targets

Only http: and https: on a loopback host (localhost, ::1, anything in 127.0.0.0/8) are probed. Anything else is refused before a socket is opened, and the refusal is thrown rather than returned so it cannot be ignored by forgetting to read a boolean. To probe a server on another host, set allowRemote: true on the plugin row.

Loopback is judged as written, not as resolved. A hostname that happens to resolve to 127.0.0.1 is still remote to this check.

Denials carry a stable reason: INVALID_URL, SCHEME_DENIED, or NOT_LOOPBACK.

Tests

npm test

The suite is offline. Every server it probes is a node:http mock bound to 127.0.0.1:0, so the kernel picks a free port and nothing outside the machine is contacted. No GGUF weights, no llama.cpp process, no GPU, no credential. Unreachability is produced by binding a port and releasing it, not by waiting on a timeout.

Topics

dsh-plugin, deepseek-harness, llama-cpp

License

MIT. See LICENSE.