前言¶
DeepSeek Harness(命令名 dsh)是 DeepSeek AI 开源的智能体运行时,官方仓库把它的架构概括成一句话:一切皆插件。模型、工具、技能、会话、沙箱和界面都可以在 Cordis 内核上组合或替换。社区里另有一份独立的插件目录站点 deepseek-harness-plugin.com,它和 DeepSeek / 幻方没有官方从属关系,收录的是社区仓库,不要把它当成官方应用商店。
智能体做算术并不稳。让模型心算 15 + 27 * sqrt(9),偶尔会把优先级算错,偶尔会直接猜一个数。DSH 内置的 bash 工具可以走 echo $((15 + 27 * 3)),但仓库 README 指出两条限制:每次计算都要起一个 bash 进程,在 Windows 上尤其贵;bash 算术也不支持 sqrt、sin、log、pow 这类函数,模型只好再去猜,或者临时写一段脚本。
dsh-tool-calculator 做的是另一条路:在进程内注册一个 calculator 工具,用手写递归下降解析器求值表达式,不 eval、不 new Function、不拉起子进程。本文按社区目录页、插件 GitHub 仓库的 README / package.json / src/evaluate.ts / 测试用例,以及 DeepSeek Harness 官方仓库交叉核对后整理。
这是什么¶
dsh-tool-calculator 是一款 工具与能力 类 DSH 插件,由 GitHub 组织 omdsh-dev 维护,仓库地址是 omdsh-dev/dsh-tool-calculator。目录页一句话定位是:安全的数学表达式求值器,零依赖、递归下降解析,绝不执行任意代码。README 补充了三个约束:零依赖、零进程、纯函数。
目录页与 GitHub 仓库目前都显示 6 颗星。许可证为 MIT(LICENSE 文件版权行写作 Copyright (c) 2026 whiteicey),主要语言是 TypeScript。目录页标注收录日期为 2026-08-03,最近一次推送时间为 2026-08-14。package.json 里的包名是 @deepseek-ai/dsh-tool-calculator,版本 0.0.1,private 为 true;peer 依赖指向 @deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-tools 与 @deepseek-ai/dsh-invariants。README 写明已迁移并验证到 DSH 0.1.0-rc.6(npm)的 profile / bundle 插件系统。
它解决的问题很具体:把「算一个确定的数」从模型心算和 bash 算术里拿出来,变成一次工具调用。入口是 evaluate(expression: unknown): number,非字符串直接抛 calculator: expression must be a string,求值结果必须是有限数字,NaN / Infinity(除零、负数开方等)一律拒绝。
核心功能¶
插件在 Cordis 入口 src/index.ts 里调用 ctx.tools.register(),注册名为 calculator 的工具。工具只有一个必填参数 expression(字符串),超时 timeoutMs 为 1000 毫秒,canonical 返回值是数字。README 给出的示例是:
calculator { expression: "15 + 27 * sqrt(9)" } → 96
注册后会进入 Code Mode SDK,可以写成 await tools.calculator(...)。工具名满足 DeepSeek 函数名约束:不超过 64 字符,字符集为 [A-Za-z0-9_-]。
支持的运算以 README 和 src/evaluate.ts 白名单为准:
| 类别 | 项目 |
|---|---|
| 算术 | + - * / % **(幂,右结合:2 ** 3 ** 2 = 512) |
| 单参函数 | abs ceil floor round sqrt log log2 log10 exp sin cos tan |
| 多参函数 | pow(x, y) max(a, b, ...) min(a, b, ...) |
| 常量 | PI E |
| 分组 | ( ),一元正负 +5 -5 |
优先级是:**(右结合)> 一元 ± > * / % > + -。函数与常量合计 15 个函数加 2 个常量,标识符按名查白名单,查不到就抛 Unknown identifier。max / min 是变参;其余函数有参数个数契约,例如 sqrt(9, 1)、pow(2)、abs() 都会因参数个数被拒绝。
安全模型是这款插件真正想强调的部分。解析器分词法层和语法层,不用 eval,也不用 new Function。词法层只识别数字字面量、标识符和运算符;引号、分号、反引号、{} [] 会直接报错。求值只走白名单节点,白名单用 Object.hasOwn 判断,避免落到 Object.prototype 上的 constructor / toString / __proto__ 一类继承属性。表达式长度上限是 500 个字符。仓库的 tests/evaluate.spec.ts 里既有功能用例,也有针对构造器逃逸、process 全局、globalThis、引号注入、分号语句等输入的拒绝用例。
实现上没有第三方运行时依赖:package.json 的 devDependencies 只有 TypeScript、Vitest 和 @types/node,求值函数本身不拉网络、不起子进程。
安装与启用¶
社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:
dsh plugin add github:omdsh-dev/dsh-tool-calculator
dsh CLI 会从 GitHub 解析插件并装进当前配置。如需可复现安装,目录页建议固定 commit 哈希:
dsh plugin add github:omdsh-dev/dsh-tool-calculator#commit
把 #commit 换成实际提交哈希。仓库 README 针对 DSH 0.1.0-rc.6 的 profile bundle 还补充了按 profile 安装的写法。web 和 headless 是两套不同的 profile:装到 web 不会自动覆盖 headless,dsh run 默认走 headless。
# 交互式(web)profile
dsh plugin --profile web add github:omdsh-dev/dsh-tool-calculator
# 一次性任务(headless)profile
dsh plugin --profile headless add github:omdsh-dev/dsh-tool-calculator
也可以先 npm pack 再按本地 tarball 安装:
git clone https://github.com/omdsh-dev/dsh-tool-calculator
cd dsh-tool-calculator
npm install && npm pack
dsh plugin --profile web add ./deepseek-ai-dsh-tool-calculator-*.tgz
dsh plugin --profile headless add ./deepseek-ai-dsh-tool-calculator-*.tgz
包内 dsh.bundle 指向 cordis.patch.yml,安装后会把 tool-calculator 条目以 - insert: 的形式插入 profile 的 layer stack。README 特别提醒:DSH 0.1.0-rc.6 的 patch 是按 id 定位的,裸写 - id: 会报 entry not found,必须用 - insert: 列表包起来。Windows 路径请用正斜杠,例如 C:/...。
验证安装:
dsh --profile web --dump-config | grep tool-calculator
package.json 声明的 Node 引擎是 ^22.19.0 || >=24.0.0。README 推荐用 npx -p @deepseek-ai/dsh@0.1.0-rc.6 dsh web 启动(lib 生产模式),不要 npm install -g 做全局安装。
目录页和 README 都写了同一条安全提示:插件以当前 dsh 进程的权限运行,安装时可能执行代码。 安装前应检查源代码仓库和许可证。
典型用法¶
安装完成后,agent 会自动拿到 calculator 工具,一般不需要再配一层开关。仓库给出的运行验证命令是:
dsh run "使用 calculator 工具计算 1+2*3"
按运算符优先级,这个表达式的结果应是 7。再看 README 里的完整示例:
15 + 27 * sqrt(9)
先算 sqrt(9) = 3,再算 27 * 3 = 81,最后 15 + 81 = 96。括号会改变顺序,测试里 (2 + 3) * 4 得到 20,而 2 + 3 * 4 得到 14。幂是右结合,2 ** 3 ** 2 等于 512,不是 64。
需要角度制的三角函数时,仓库写明接口与 Math.sin / Math.cos 一致,用的是弧度。例如 30 度应写成:
sin(30 * PI / 180)
本地跑测试:
pnpm test
package.json 里对应脚本是 vitest run tests,也可以走 npm test。测试文件目前有 tests/evaluate.spec.ts(求值与拒绝用例)和 tests/register.spec.ts(工具注册)。
适用场景与注意事项¶
比较适合这几类用法:编码智能体需要一个确定的算术结果,而不是让模型心算;表达式里带 sqrt、log、pow 或三角函数,bash 算术覆盖不到;希望计算发生在当前进程内,不要为一次加减去拉起 shell。omdsh-dev 另外维护了合集仓库 dsh-toolkit,其中也包含同名的 calculator 工具;若只需要计算器,装这一份独立插件即可。
使用时有几条已经写进 README 和源码的边界,不要当成缺陷以外的「隐藏能力」:
- 不支持科学计数法。
1e5、1e-5、6.02e23会被词法层拒绝,错误信息是Scientific notation is not supported。 - 不支持大整数。 求值走 JavaScript 的 IEEE 754 双精度,安全整数范围大约 ±9e15,超出后会有精度损失。
- 三角函数用弧度。 需要角度时自己乘
PI / 180。 - 结果必须是有限数字。 除零、负数开方等得到
NaN或Infinity时,接口会抛错而不是把特殊值传回给模型。 - 表达式最长 500 字符。 超长输入直接拒绝。
DeepSeek Harness 目前仍是 developer preview,官方 README 写明会有破坏性变更。本插件按 README 适配的是 0.1.0-rc.6 的 bundle / patch 语义,换版本前应对照仓库的版本适配说明。社区目录不是官方应用商店,安装命令以目录页原文 dsh plugin add github:omdsh-dev/dsh-tool-calculator 为准。
再次强调:插件跑在当前 dsh 进程里,权限与宿主相同。即使这款插件的求值路径刻意避开了 eval / new Function,安装动作本身仍可能执行仓库里的代码。装之前读一下源码和 MIT 许可证,需要可复现环境时把 commit 哈希钉死。
结语¶
dsh-tool-calculator 把一件很小、但模型经常算错的事收成工具:在 DSH 进程内安全地求值数学表达式。它不替代 bash,也不扩展成通用脚本引擎;白名单、有限数字、500 字符上限,都是为了让「算一个数」这件事可预期。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-tool-calculator/
GitHub:https://github.com/omdsh-dev/dsh-tool-calculator