DeepSeek Harness Plugin

oldzhang82/dsh-tps-ttft

Stars ★ 3 Category Usage & Billing Added 2026-10-22

Per-turn TPS and TTFT statistics for DeepSeek Harness: model time, tool time, time-to-first-token, and output speed per turn.

Install

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:oldzhang82/dsh-tps-ttft

Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).

README

Per-turn TPS and TTFT statistics for DeepSeek Harness: model time, tool time, time-to-first-token (TTFT), and output speed (TPS) per turn.

What it does

After each turn completes, a gauge-icon timing pill appears in the turn tail (showing model time). Click it to open a popover with the full timing statistics:

timing pill

  • Model time: Wall-clock time for model inference (step/start → assistant/message)
  • Tool time: Total time for tool calls (tool/call → tool/result; hidden when no tools ran)
  • TTFT: Time to first token (step/start → first token)
  • Output speed: Output speed in tokens/sec (decodeTokens / decodeMs; hidden when no data)

Fully self-contained: the plugin ships its own client component (registered to the conversation.chat.turnTail slot). No DSH core changes required — install and go.

The original "Turn Usage" (token usage) panel is unaffected; the two are independent.

Installation

Install directly from GitHub (one command, no extra config):

dsh plugin --profile <your-profile> add "github:oldzhang82/dsh-tps-ttft#<commit-sha>"

Quote the argument: in PowerShell, # starts a comment, so without quotes the SHA after # is dropped.

Use the latest full SHA from the commits page. Pinning the commit prevents later pushes from silently changing what gets installed.

This plugin is pure JS with no build scripts, so the install does not trigger pnpm's allowBuilds prompt — one command and it's done.

After installing, restart DSH, run a turn, and the gauge-icon timing pill in the turn tail confirms success.

How it works

The plugin has two parts, neither modifies the DSH core:

  1. Server side (index.js): registers a session projection (perTurnStats) that performs a pure fold over the session event stream:

    • Listens to step/start, assistant/attempt, assistant/message, tool/call, tool/result, and turn/end events
    • Accumulates model time, tool time, TTFT, and output speed per turn
    • Cleans up per-turn transient state at turn/end to keep the view bounded
  2. Client side (lib/client.js): registers a React component to the conversation.chat.turnTail slot, reads the perTurnStats projection, and renders the timing pill.

Compatibility

  • DSH >=0.2.0-rc.1 <0.3.0-0 (see engines.dsh)

Dependencies

  • zod ^4.6.5 (schema validation)

License

MIT

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.