Descriptive statistics, percentiles, frequency distributions, and correlation.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:omdsh-dev/dsh-tool-stat
GitHub-sourced plugins run build scripts on your machine at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
DSH statistics tool plugin — descriptive statistics, percentiles, frequency distributions, correlation computation. Zero dependencies, pure functions, deterministic.
Motivation
When Agents process numeric data, after extracting numeric arrays from CSV / JSON they often need aggregate analysis (mean, quantiles, distributions, correlation). The existing toolchain has no such capability:
calculatoronly does single-expression evaluation — one expression cannot compute quantile distributions, let alone a correlation coefficientdsh-tool-csv'sstatsonly reports row/column structure — it does not provide statistical aggregation over a set of observations- Model "mental" statistics are not verifiable — mean, variance, percentiles, and correlation involve a large amount of floating-point computation; manual calculation has an extremely high error rate and cannot show the user a reproducible process
This plugin accepts an explicitly passed finite numeric array or paired observations and provides deterministic statistical computation: a single function call returns a structured JSON report in milliseconds. It reads no files, accesses no network, spawns no processes, and stores no state — the same input always yields the same output.
Security Model
- Zero dependencies: Neumaier compensated summation, Welford online variance, linear-interpolation percentiles, and Spearman midrank are all hand-written; no third-party numeric library
- Strict finite-number constraint: rejects
NaN/Infinity(error messages locate the index, e.g.values[3] must be a finite number (got Infinity));-0is normalized to0in both input and output - Overflow re-check: all results are re-checked for finiteness before being returned; intermediate or final overflows return a
numeric-overflowerror — the canonical output never contains non-finite values - Pure functions: input arrays are never mutated (read-only traversal; a copy is made first when sorting is needed)
- Zero-variance semantics:
correlationon a zero-variance pair returnsdefined: false+reason: "zero-variance"instead of NaN or ±Infinity - Budgets:
- 1..100,000 observations (over-limit is rejected with an error immediately)
- ≤ 100 percentile requests
- ≤ 10,000 distinct outputs (beyond that, truncated by deterministic rules and flagged)
timeoutMs: 2000
- Tool parameters are recorded in the session log; do not pass sensitive data
Tool Declaration
Registers the stat tool (@deepseek-ai/dsh-tool-stat, row id tool-stat), uniformly outputting a JSON text string.
| action | Purpose | Output |
|---|---|---|
describe |
Descriptive statistics | count / sum / min / max / mean / median / variance / standardDeviation / q1 / q3 / iqr (Neumaier compensated summation + Welford variance, population or sample) |
percentile |
Percentiles | One or more percentiles (linear interpolation h=(n-1)*p, 0..100), output in request order, duplicates preserved |
frequency |
Frequency distribution | value / count / ratio groups (exact-equality grouping, ascending output, ratio denominator is the original count) |
correlation |
Correlation coefficient | Pearson or Spearman (midrank average rank) correlation coefficient; zero variance returns defined:false + reason |
| Parameter | Type | Required | Description |
|---|---|---|---|
action |
string | ✅ | describe / percentile / frequency / correlation |
values |
array | ✅ | Finite numeric observations (1..100,000); -0 normalized to 0 |
other |
array | Paired observations for correlation; length must equal values (≥2) |
|
percentiles |
array | Percentiles for percentile (0..100, 1..100 items) |
|
method |
string | Correlation method: pearson (default) / spearman |
|
sample |
boolean | Variance denominator: true uses sample (n-1), default false (population n) |
Output Examples
{"action":"describe","count":5,"sum":15,"min":1,"max":5,"mean":3,"median":3,"variance":2,
"standardDeviation":1.4142135623730951,"q1":2,"q3":4,"iqr":2,"sample":false}
{"action":"correlation","method":"pearson","count":4,"defined":true,"value":1,"reason":null}
Design Points
- Neumaier compensated summation:
sumuses a compensation term to correct rounding loss when adding large + small numbers;varianceuses the Welford online algorithm (single-pass, numerically stable); describe and correlation share the same statistics core - Linear-interpolation percentiles:
h=(n-1)*p,value = v[floor(h)] + (h - floor(h)) * (v[ceil(h)] - v[floor(h)]); output keeps the request order, duplicate percentiles preserved - Spearman midrank: ties take the average rank (midrank), then Pearson is computed on the ranks; pairs that are entirely identical do not affect boundedness
- Zero-variance semantics: when either series has zero variance, the correlation coefficient is undefined — returns
defined:false+reason:"zero-variance", never NaN/±Infinity - Frequency truncation rule: when distinct outputs exceed 10,000, select the top 10,000 items by count descending → value ascending, then present them by value ascending (deterministic and reproducible)
- Determinism: no randomness, no state, no time dependence; floating-point operation order is fixed, the same input always yields the same output
Build & Tests
# Build (zero dependencies, only needs the monorepo's tsc)
node <monorepo>/node_modules/typescript/bin/tsc -p tsconfig.json
# Tests (vitest, 82 cases: describe 20 / percentile 7 / frequency 7 / correlation 15 / limits 24 / register 9)
node <monorepo>/node_modules/vitest/vitest.mjs run tests
npm 0.1.0-rc.6 Compatibility (Verified)
This plugin has been migrated to the npm 0.1.0-rc.6 dependency line and fully verified end-to-end in an isolated consumer of @deepseek-ai/dsh@0.1.0-rc.6 (npm private package):
- Types/runtime: peers are
@deepseek-ai/cordis: ^4.0.1+@deepseek-ai/dsh-tools: >=0.0.1-rc.1 <0.2.0+@deepseek-ai/dsh-invariants: >=0.0.1-rc.1 <0.2.0; no longer depends on the unscopedcordis - Standalone build:
npm install(devDependencies are self-contained: typescript/vitest/@types/node) →npm run typecheck→npm test→npm run build→npm pack - Consumption verification: tarball installed into a DSH 0.1.0-rc.6 (npm) consumer →
dsh --profile compat --dump-configshows this plugin's row → tool registration and execution actually pass - Launch method:
npx -p @deepseek-ai/dsh@0.1.0-rc.6 dsh web(lib production mode; do notinstall -gglobally)
Installation
Profile Bundle (Recommended)
Install this plugin into a profile as a standalone bundle (DSH 0.1.0-rc.6 (npm)). This repository lives under the omdsh-dev organization and is publicly accessible:
# Interactive (web) profile —— install from the GitHub repository
dsh plugin --profile web add github:omdsh-dev/dsh-tool-stat
# One-off task (headless) profile —— dsh run uses headless by default
dsh plugin --profile headless add github:omdsh-dev/dsh-tool-stat
Or install from the tarball produced by npm pack:
npm pack # produces dsh-tool-stat-<version>.tgz
# Interactive (web) profile
dsh plugin --profile web add ./dsh-tool-stat-<version>.tgz
# One-off task (headless) profile
dsh plugin --profile headless add ./dsh-tool-stat-<version>.tgz
The bundled dsh.bundle.patch automatically adds the plugin to the profile's layer stack after installation (row id: tool-stat). The plugin's missing peer dependencies (@deepseek-ai/cordis, @deepseek-ai/dsh-tools, @deepseek-ai/dsh-invariants) are provided by the profile's healed profiles/node_modules fallback installation.
⚠️ web and headless are different profiles: installing into web does not automatically cover headless;
dsh runuses the headless profile by default. Use forward slashes for Windows paths (C:/...).
Verify Installation
dsh --profile web --dump-config | grep tool-stat
Runtime Verification
dsh run "使用 stat 工具计算 [1,2,3,4,5] 的描述统计"
Manual Installation and Legacy Compatibility (legacy monorepo scenario)
The monorepo way is only for legacy scenarios: old snapshots that do not support Profile Bundle, or plugin development/debugging environments (local junction/symlink, manually editing profile layers).
License
MIT
Links
More in this category
liustack/modlens★ 1199
Vision bridge for text-only models: paste an image, get structured JSON evidence (OCR, layout, semantics).
Anionex/dsh-vision-toolkit★ 308
Vision tasks for text-only models: intent-aware image Q&A, long-screenshot OCR, UI reproduction, grounding, and pixel diff.
zhaoolee/notes★ 138
Export DSH conversations as Smartisan Notes-style PNGs, or create and update Markdown notes in a configured account-scoped workspace.
liustack/modsearch★ 85
Web search bridge for text-only agents: ask the web or X, get structured JSON evidence (search, fetch, citations).
Lum1104/dsh-browser★ 80
Chrome sidebar extension that lets DSH operate your browser directly, no vision capabilities required.
taxueseek/argo★ 69
Search built for agents: multilingual coverage across web, academic, code, shopping, finance, news, and encyclopedias.