DeepSeek Harness "unknown tool": null wipes tool call id

TroubleshootingPublished 2026-09-12Author: DeepSeek Plugin Market
DeepSeek HarnessDSH pluginunknown tooltool call failedSSE delta
DeepSeek Harness failing tool calls with unknown tool ""? A null SSE delta wipes the id and name captured in the first frame. How to work around it.

When DeepSeek Harness reports unknown tool "" and every tool call fails while the model spins for a few steps, the stream translator has overwritten the tool call identity with an empty value: after the first frame supplies id and name, the provider sends a delta carrying an explicit null, and the !== undefined check writes that null over the captured identity. Nothing is corrupted and no config is lost — switching to a provider that does not send explicit null deltas restores tool calls immediately.

What the DeepSeek Harness unknown tool error looks like

The shape is fixed: the log shows [tool/call] {"callId":"","name":""} followed by unknown tool "". A user hit this in the wild (see the discussion), and the symptoms were:

  1. The model issues a tool call normally, but the printed request has empty callId and name strings;
  2. The runtime finds no tool named "" and rejects execution with unknown tool "";
  3. The model never receives a usable result, retries for a few steps and exits with zero output for the turn;
  4. Every tool call under that provider fails together — it is not one broken plugin.

This is why the error is easy to misread: the text points at "tool does not exist", which looks like a missing plugin or a typo, while the plugin is perfectly fine. What was dropped is the identity carried by the call, not the tool (see Discussion #4671).

Why a DSH plugin's tool call identity gets overwritten by null

The root cause sits in the SSE translation layer, which treats "field present" and "field has a value" as the same thing. Streaming responses arrive frame by frame: the first frame carries the full id and name, and later deltas carry only what changed. After checking the source, the community located it in packages/llm/llm-deepseek/src/translate.ts. The chain is:

  1. The translator accumulates tool call identity and uses !== undefined to decide whether a frame should update the fields;
  2. The provider sends null rather than omitting the field, and null !== undefined is true, so the update runs;
  3. The id and name captured in the first frame are overwritten with empty values, which is exactly the {"callId":"","name":""} in the log;
  4. The empty name is the fatal part: an empty name makes the tool unresolvable, while an empty id only makes the call hard to correlate (source: Discussion #4671).

The correct check updates a field only when it has a real value, treating both undefined and null as absent. The community branch fix/tool-call-null-delta-identity changes exactly that, and a reference implementation exists in Jstn-1g/reference/discussion-4671-sse-null-identity (commit 138691e0). Neither is merged yet.

How to work around a DSH plugin unknown tool loop, and where the fix stands

Until the fix lands upstream, work around it by avoiding the trigger: change provider or model, or roll back the build. In order of how quickly you can do it:

  1. Switch to a provider or model that does not send explicit null deltas — the fastest route, effective in the same session;
  2. Roll back to the DeepSeek Harness build you used before the regression;
  3. Keep the full log while diagnosing: whether callId / name on the [tool/call] line are empty is the only reliable way to tell "the tool really is missing" from "the identity was overwritten";
  4. If you need to add or roll back a plugin to compare, manage installed plugins from Settings → Plugin Marketplace; the community marketplace for this project is DSH Plugin Hub;
  5. On the fix: the branch names the exact change (the check condition), but it is still waiting to be merged, so do not expect the loop to disappear before you upgrade to a build that includes it.

DSH plugin troubleshooting notes

Separate "the tool is missing" from "the call identity was overwritten" before touching anything: the first means changing a DeepSeek Harness plugin setup, the second only means switching provider or rolling back. Three traps to avoid:

  1. Do not treat unknown tool "" as an installation problem: reinstalling the plugin changes nothing, because the overwritten value is runtime state, not the plugin package.
  2. This is not a model-capability issue, so prompt tweaks will not help: the null delta overwrites the identity no matter how the prompt is written.
  3. More model-related failures are collected in DeepSeek Harness model errors: connection failures, missing model lists and configuration.
DSH Plugin Hub installed plugins: manage all installed plugins, view versions and updates

Sources: Discussion #161, Discussion #4671

FAQ

Why does every tool call fail with unknown tool "" in DeepSeek Harness?

In a DSH plugin the stream translator overwrites the tool call identity with an empty value, which is why every call fails. After the first frame supplies id and name, the provider sends a delta that carries an explicit null, and the translator uses a !== undefined check, so it writes null over the captured id and name. Every call then has an empty name and the model spins until it gives up.

Why do only some providers and models hit the unknown tool loop in DeepSeek Harness?

In DeepSeek Harness only providers that send explicit null deltas trigger this overwrite. Most OpenAI-compatible implementations simply omit empty fields, and an absent field cannot overwrite anything. Once an implementation sends "id": null as an explicit value, the faulty check is hit.

In a DSH plugin, which is worse: an empty tool call name or an empty id?

In a DSH plugin tool call the empty name is the fatal one. An empty id only makes the call hard to correlate, while an empty name turns the invocation into unknown tool "" with no tool to execute. When you read the log, check the name field first.

How do I work around the unknown tool loop in DeepSeek Harness, and when will it be fixed?

In DeepSeek Harness you can work around the unknown tool loop by switching to a provider or model that does not send explicit null deltas, or by rolling back to a build from before the regression, and tool calls recover immediately. A community branch that changes the translate.ts check exists and is waiting to be merged upstream.

Related Terms

DeepSeek Harness
DeepSeek Harness (DSH) is DeepSeek's open-source agent runtime that turns models, tools and plugins into an executable session flow.DeepSeek Harness official documentation
tool call
A tool call is a model request asking the runtime to execute a tool, made of an id, a name and an arguments payload.DeepSeek Harness official architecture docs
SSE delta
An SSE delta is a follow-up chunk in a streaming response that carries only the fields that changed; unchanged fields are meant to be omitted, not filled with null.DeepSeek Harness official architecture docs

Sources