Skip to content

dsh-math-calculator

Verified

dsh-math-calculator · v2.1.1 · MIT

DSH 原生的高精度数学计算器插件:BigNumber 64 位求值、符号微积分、线性代数(秩/零空间/奇异值/特征值)、统计概率与回归、微分方程、单位换算、395 条公式库(三轴标签)、物理常数推演。全部本地执行,不联网。附带一组可选的世界观推演工具。

Install

dsh plugin add dsh-math-calculator

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

dsh-math-calculator

DSH(DeepSeek Harness)原生的高精度数学计算器插件,附带可选的架空世界推演能力。

运行期依赖三样:mathjs、algebrite,以及官方 @deepseek-ai/dsh-tools 里的 defineTool 一个导出。 宿主服务一律用 ctx.get 可选读取,不碰 CallId 这类宿主内部导出 —— 旧版正是死在那个导出被删除上。


它解决什么

场景 传统方式 这个插件
高精度计算 心算 / bash 拼 BigNumber 64 位,整数输出完整定点
符号运算 查表或近似 求导/积分/化简/展开,符号精确
单位换算 自己查系数 73 个单位,温度按仿射换算
写公式 每次都重推 404 条公式库,参数全可覆盖
改物理常数 无法验证 自动推导派生量 + 全公式偏差
多项目数据 互相污染 工作区隔离,各持一套常数表与公式表
(可选) 架空世界设定 凭感觉 输入星球参数 → 出重力/气候/地形上限

安装

本插件是标准 DSH bundle(dsh.bundle.patch → cordis.patch.yml)。

本机 dsh 未加入 PATH,实际入口是随桌面版分发的: C:\Users\<you>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd

cd D:\0cengxu\5\dsh-math-calculator
npm install
npm run build

& "C:\Users\<you>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" `
  plugin --profile desktop add D:/0cengxu/5/dsh-math-calculator

dsh plugin 会把参数转发给 profile 目录里的 pnpm。装完重启桌面版。

注意:desktop profile 由 Electron 应用独占管理,CLI 无法用 --dump-config 检查它 (会报 profile "desktop" is managed exclusively by the Electron application)。 验证方式是重启后看「设置 → 插件列表」。

打包成 tgz 再装也可:

npm pack
& "...\dsh.cmd" plugin --profile desktop add ./dsh-math-calculator-2.1.1.tgz

30 个 operation

基础运算

operation 说明 示例
evaluate 求值(BigNumber 64 位) {"expression":"10^20+5"}
solve 解方程;多方程逗号分隔 = 方程组 {"expression":"3x + 2y = 10, x - y = 1"}
system 显式线性系统 {"matrix":[[3,2],[1,-1]],"vector":[10,1],"operation":"system"}
derivative 符号求导(order 指定阶数) {"expression":"x^3 * sin(x)","operation":"derivative"}
integral 符号不定积分 {"expression":"x^2","operation":"integral"}
simplify / expand 化简 / 展开 {"expression":"2*x + 3*x","operation":"simplify"}
roots 多项式求根(含复数) {"expression":"x^4 + 1","operation":"roots"}

线性代数与统计

operation 说明 示例
matrix 矩阵运算 {"expression":"inv([[1,2],[3,4]])"}
eigen 特征值与特征向量 {"matrix":[[2,1],[1,2]],"operation":"eigen"}
stats 描述统计 {"data":[1,2,3,4],"operation":"stats"}
dist 概率分布 {"distribution":"normal","params":[0,1],"x":1.96,"operation":"dist"}
regression 线性/多项式回归 {"data":[1,2,3],"dataY":[2,4,6],"operation":"regression"}
ode 微分方程数值解(RK4) {"expression":"dy/dt = -0.5*y","initial":{"y":100},"from":0,"to":10,"operation":"ode"}

公式库与世界观推演

operation 说明 示例
formula 调用 404 条公式之一 {"formula":"escape_velocity","overrides":{"M":5.97e24,"r":6371000},"operation":"formula"}
formulas 检索公式库 {"query":"重力","operation":"formulas"}
world 星球参数 → 体感画像 {"world":{"planetRadius":1.4,"rotationHours":40},"operation":"world"}
terrain 局地气候(配合 world) {"world":{"planetMass":2},"terrain":{"kind":"coastal","latitudeDeg":58},"operation":"world"}
constants 改常数 → 推导派生量 {"constants":{"c":1.5e8},"operation":"constants"}
quantities 哪些物理量该跟着变 {"constants":{"G":1.3e-10},"constantName":"G","operation":"quantities"}
impact 改常数 → 全公式偏差 {"constants":{"c":1.5e8},"operation":"impact"}
feasibility 设定一致性校验 {"world":{"planetMass":2},"claims":{"creatureHeight":50},"operation":"feasibility"}
bodies 天体目录与类型学(26 具名天体 + 32 类型) {"bodyName":"mars"} / {"bodyType":"中子星"} / {"bodyConstant":"alpha_fs","bodyFactor":2}
balance 收支盘点(多项一起看,给最短板) {"balance":{"grain":{"demand":2.7e6,"supply":3.1e6}}}
units 单位换算(73 个单位,含中文古制) {"unitValue":30,"unitFrom":"里","unitTo":"km"}
custom 自创常数/新物理量 {"operation":"custom","action2":"add"}

恒星结构(S3)

world 会由恒星质量推出一整套结构量,并明确标注每一层的可信度:

结论 依据 置信度
光度 L(M)、半径 R(M) 质光关系 L∝M^3.5、质径关系 R∝M^0.57 经验
有效温度 斯特藩-玻尔兹曼反解 精确
主序寿命 τ=10 Gyr·M^-2.5 质光关系直接推出 经验
宜居带 0.95–1.67√L 辐射平衡 精确
辐射峰值、紫外占比 维恩位移 + 普朗克积分 精确
α 对点火温度、不透明度 库仑势垒 ∝ α、σ_T ∝ α² 量级 / 精确
α 对寿命的净效应 需要完整恒星演化 只给方向

例:0.3 M☉ → 3241 K、寿命 203 Gyr、宜居带 0.11–0.20 AU、紫外 0.4%; 10 M☉ → 26504 K、寿命 32 Myr、宜居带 63–111 AU、紫外 92%。

作者显式给的恒星半径/温度优先于质径关系,避免同一份输出里出现两套数字。

面向用户的接口:AI 调用,没有面板

本插件不提供界面。 2026-10-25 决定砍掉全部前端(做过目录树、精简版、单页工作台三版, 效果始终不好,见 docs/ui-removed.md)。作者不再点面板填表, 而是直接说需求,由 AI 调用工具与路由:

作者说 AI 调用
「我想要个重力 1.5 倍的世界」 POST /solve-anchor → 得 planetMass=1.5 → save-world
「这个星球能住人吗」 POST /derive {sub:"dead"}
「50 米巨兽需要什么条件」 derivation backSolve
「文明能飞出这个星球吗」 derivation civilization
「把设定整理成文档」 derivation whitepaper

后端接口一条没删,恢复界面只需重建前端(见 docs/ui-removed.md 第七节)。 所有修改都落到当前工作区,不同世界观互不影响。

成本控制:schema 瘦身 / 缓存 / 批量

工具定义是每轮请求都重复计费的固定成本,所以做了三件事:

措施 效果
schema 瘦身(详细字段挪进 help) 7789 → 6140 字符,约省 21%(≈1100 token/轮)
结果缓存(键含常数与工作区指纹) 同一式子重复调用不再重算;改常数后必然失效
批量求值 expressions 一次算最多 100 条,逐条独立报错

三条都是纯收益、不改语义:参数一个没删、缓存键漏一项就会算错(有测试守)。

显示精度:默认 8 位小数,可调、可固化

计算精度与显示精度分开:

参数 语义 默认
precision 计算精度(BigNumber 有效位) 64,不要为好看调低((10^20+1)-(10^20) 在 20 位时算出 0)
displayPrecision 显示精度:小数点后几位 8
  • 整数永远完整:10^20+5 仍是 21 位,不受显示精度影响
  • 截断会丢精度时主动提醒:0.00000123456789 在 8 位下相对误差 0.37%,会附上「请传 displayPrecision:16」
  • 固化一次即全局生效:{"operation":"workspace","action2":"set","displayPrecision":8}

计算需求分流:心算 / 强制用工具

预警器在外部分三档(不调用 LLM,成本近零):

档 判据 处置
simple 短、数字少、纯四则 不提醒(想用工具仍可用)
forced 数据/汇总/金融/物理推演信号 提醒(这类心算易错且错得看不出来)
fuzzy 其它数学需求 按阈值提醒

物理推演类一律不算 simple——1.5 倍重力下山能长多高 心算给「大概 3000 米」, 工具给 3262 米并提示「已接近花岗岩极限」。差别不在精度,在于知不知道这个数意味着什么。

面向 AI 的设计

插件对 AI 有三层提示(详见 ADR-0002):

层 位置 预算
工具描述 TOOL_DESCRIPTION ≤ 800 字符,枚举 30 个 operation 与读输出规则
系统提示 systemPrompt.section(brief) ≤ 320 字符,每轮注入
主动提醒 agent/pre-step 钩子 每会话 ≤ 3 次,检测到计算需求才触发

输出里的 [精确]/[标度]/[量级]/[仅方向]、【跨模块一致性】✓/⚠/✗、【模型可信度】 既是给人看的,也是给 AI 判断"这条能信几分"的。

公式库扩展(全局包 + 工作区临时)

404 条内置公式不够时,不必改代码:

级别 存放 范围 用法
全局公式包 $DSH_HOME/math-calc/formula-packs/global.json 所有工作区 tableAction:"global-add"
工作区临时公式 工作区 JSON 单个世界观 tableAction:"add"

新增时校验器会挡住:非法 id、坏表达式、表达式里未在 params/CONSTANTS 定义的符号、参数缺描述。 字段说明与检查清单见 docs/formula-authoring.md。

符号消歧:同一个字母在不同公式里含义不同(m = 质量/米)。 符号索引从公式参数自动生成,查询方式:

{"operation":"formulas","query":"symbol:m"}       // m 的全部含义
{"operation":"formulas","query":"symbol:m@质量"}   // 只看质量
{"operation":"formulas","query":"symbol:*"}        // 所有多义符号

三轴标签(分类不是学科,是「离底层规则的远近」):

轴 取值 例子
layer 规则层级 fundamental / mathematical(与基本同级)/ derived / phenomenological / engineering / conventional 洛伦兹因子→基本;圆面积→数学;环向应力→导出;风寒→经验;用砖量→工程
domains 学科领域(多标签) physics / materials / medicine / agriculture / military… 人体表面积 = 生物 + 医学
frequency 主角感知频率 high / medium / low 用砖量→高;洛伦兹因子→低
{"operation":"formulas","query":"layer:derived"}
{"operation":"formulas","query":"domain:物理"}
{"operation":"formulas","query":"freq:high"}

按主角感知频率筛选(不是世界观推导常用度,而是读者在故事里会不会感知到):

{"operation":"formulas","query":"freq:high"}   // 高频:材料/天气/感知/交通/人体/战斗
{"operation":"formulas","query":"freq:low"}    // 低频:量子/核物理/相对论/金融

当前分布:高频 144 / 中频 228 / 低频 32(共 404 条)。

基础运算扩展

除了 mathjs 自带的能力,引擎里额外注册了这些(表达式里可直接用):

函数 说明 例子
rank(A) 矩阵的秩(RREF 主元计数) rank([[1,2],[2,4]]) → 1
nullspace(A) 零空间的一组基 nullspace([[1,2],[2,4]]) → [[-2,1]]
svd(A) 奇异值(AᵀA 的 Jacobi 特征值开方) svd([[1,2],[3,4]]) → [5.465, 0.366]
factorize(n) 整数质因数分解 factorize(360) → [2,2,2,3,3,5]
nsolve(expr, guess) 数值求根(牛顿法 + 二分兜底) nsolve("x^2-2", 1) → 1.41421356

另外修复了一个真实缺陷:operation:"matrix" 只给矩阵时会报「缺少 vector」, 连行列式和逆矩阵都算不了。现在只给矩阵会输出完整画像(秩 / 行列式 / 迹 / 奇异值 / 零空间 / 逆)。

化学窗口与生命闸门

按「只判绝对不行,其余交给叙事」的原则,world 会给出一个生命闸门:

档位 判定 例子
硬否决 物理上不可能 气压低于水的三相点、全星球低于冰点/高于沸点、化学窗口失效
强约束 可以写,但需要解释 恒星寿命 < 0.5 Gyr、潮汐锁定 + 稀薄大气、强紫外无屏蔽
开放 本模型不下结论 板块运动、细胞/多细胞、非水溶剂、智慧与文明

化学窗口由 α 决定:共价键能 ∝ α²。α 降到现实的 30% 时,键能只剩约 0.36 eV(14 kT), 分子会被热运动直接扯散——这是硬否决;α 升到 3 倍时键太强、重排困难,只算强约束。

注意区分两件事:化学(分子能否稳定,由 α 决定,本模块算)与 核合成(碳元素能否生成,由 α_s 与 Hoyle 共振决定,本模型不覆盖)。

常数与宇宙(ADR-0001 新增)

改常数时最容易犯的错是「我把光速改成 1.5e8,宇宙就不一样了」。物理上不成立:c、G、h、kB 都是有量纲的, 单独改它们只是换了一套单位。真正决定世界长什么样的是无量纲常数:

常数 现实值 决定什么
α 1/137.036 原子大小、化学键能、光与物质作用
μ = mₚ/mₑ 1836.15 化学多样性、物质稳定性
α_s ≈0.118 核力、元素是否存在
α_G 5.9×10⁻³⁹ 引力强度、恒星与行星形成

operation:"constants" 现在会多输出一段【无量纲视角】:判定这次改动是「换单位」还是「换物理」, 并由 α、μ 推出尺度阶梯(原子半径、里德伯能量、键能、材料强度、山峰尺度),每条都带置信度标签:

  • 精确:严格代数关系(a₀ = ħ/(mₑcα)、Ry = ½mₑc²α²)
  • 标度:形式正确但有一个地球标定系数(材料强度 S ∝ α⁵,基准 1.3×10⁸ Pa)
  • 量级:只保证数量级(化学多样性窗口、山峰尺度)

超出标定范围时不拒绝回答,而是降级并列出「与已知物理的张力」(例如 α 偏离 4% 以上,碳的恒星核合成就不再成立)。

常数会真的传导进星球模型(S2):world 不再使用地球常数快照,而是读当前生效的常数表。 改 α 会改变材料强度(S ∝ α⁵)→ 山峰上限随之移动;改 G 会改变重力与逃逸速度; 气温直减率由 Γ = g·M/(3.5R) 推出,所以重行星/厚大气会自己得到不同的雪线。 现实常数下这些值与原实现完全一致(回归锚)。

抬头看宇宙(v4 新增)

world 的输出里现在多了两块从地表观测者视角推演的内容:

【抬头看见什么】

  • 恒星的光谱与颜色:表面温度 → 峰值波长(维恩位移)→ sRGB 色号 → 中文观感名;同时给光谱型(O/B/A/F/G/K/M)与典型吸收线(例如 M 型的 TiO 分子带吃掉蓝光,所以看上去橙红)
  • 视星等与角直径:以太阳 0.53° / −26.74 等为标尺
  • 白天天空:瑞利散射 1/λ⁴ 单次散射 → 天顶色与日落色(红矮星的白昼是橙金色,不是蓝的)
  • 夜晚天空:分开报「无月夜」与「满月夜」两种——极限星等、可见星数、银河是否可见、夜空基色

【卫星系统】

  • 希尔球、洛希极限、稳定轨道区间
  • 每颗卫星的角直径、满相视星等、潮汐强度、是否已被潮汐锁定
  • 多卫星在物理上是否成立:相邻卫星间距必须 ≥ 3.5 倍互相希尔半径,否则几十万年内失稳;同时检测轨道共振(1:2、1:3……)
{"operation":"world","world":{
  "starClass":"M5V","orbitAU":0.2,
  "moons":[
    {"name":"银月","massMoon":1.2,"distanceMoon":0.8},
    {"name":"赤月","massMoon":0.4,"distanceMoon":2.2}
  ]}}

一条容易踩的物理红线:卫星能放多远由希尔球决定。M5V 红矮星在 0.2 AU 时希尔球只有约 52 万 km,和地月的 38 万 km 同量级——所以「红矮星 + 多颗卫星 + 大轨道」这类设定经常直接不成立,插件会明确警告而不是照单全收。

数据管理

operation 说明 示例
workspace 工作区管理(隔离世界观) {"action2":"list","operation":"workspace"}
formula-table 工作区公式表 {"tableAction":"show","operation":"formula-table"}

其他

operation 说明
auto 默认。含 = 判为方程,其余求值
help 完整能力清单

一个架空世界观的完整推演流程

// 1. 建立世界观(独立数据空间)
{"operation":"workspace","action2":"create","workspace":"aether","description":"低光速高重力世界"}

// 2. 改这个世界的物理常数
{"operation":"constants","constants":{"c":1.5e8,"G":1.3e-10}}
//    → 派生量自动跟随:mu0 +299%、sigma +299%、alpha_fs +100%、ly -50%、Lsun +299%

// 3. 看哪些物理量该跟着变、哪些不该(量纲分析)
{"operation":"quantities","constants":{"G":1.3e-10},"constantName":"G"}
//    → 普朗克长度 ∝√G、玻尔半径与 G 无关、表面重力 ∝G

// 4. 看全部 404 条公式相对现实的偏差
{"operation":"impact","constants":{"c":1.5e8}}
//    → 11 条受影响:质能 -75%、黑体辐射 +300%、维恩位移 -50%

// 5. 设定星球参数,看体感画像
{"operation":"world","world":{"planetRadius":1.4,"rotationHours":40,"obliquityDeg":45}}

// 6. 细化某个地点的气候
{"operation":"world","world":{"planetMass":2},"terrain":{"kind":"coastal","latitudeDeg":58,"oceanCurrent":"warm"}}

// 7. 校验设定有没有超出物理上限
{"operation":"feasibility","world":{"planetMass":2},"claims":{"creatureHeight":50,"buildingHeight":3000}}
//    → 50m 巨兽超限 4 倍(上限 12.5m),建议降低重力

// 8. 定制这个世界的公式(改结构或加新公式)
{"operation":"formula-table","tableAction":"override","formulaId":"kinetic_energy","newExpression":"m * v^2"}

关键点:第 2 步改的常数会自动流入后续所有公式计算。因为公式里的常量(如 gravitation 的 G)会自动绑定到工作区的常数表,而不是写死现实值。


常用参数

参数 说明
expression 表达式/方程;多方程用逗号
variables 变量字典,如 {"m":500,"v":30}
operation 上述 27 个之一;不填 = auto
precision 有效数字,默认 64,范围 1-256
variable 求导/求根的自变量,默认 x
overrides 公式参数覆盖(架空改造的核心)
constants 要改的物理常数(只能改基础旋钮)
world 星球参数(23 个基础量 + moons 逐颗卫星,见下)
terrain 局地地形参数
claims 待校验的设定

34 个物理常数:20 个基础旋钮(c G h kB e_charge me mp NA epsilon0 day AU Rearth Mearth Rsun Msun atm + 4 个数学常数)+ 14 个派生量(自动推导,不能直接设)。

世界参数的校验(三档,不反驳设定)

world-params.ts 的 range 现在真的生效(2026-10-25 之前是纯装饰, planetRadius=0 能存进去并算出 Infinity):

档 行为 例
硬拒绝(400) 会算出无穷/非数/负物理量,下游没法用 planetRadius=0、planetMass=-5、orbitAU=0
软警告(200 + warnings[]) 物理极端但可以是设定,照你的设定算 planetMass=500(超常规上限 100)、albedo=1.5
静默接受 在范围内 planetMass=1.5

只是「质量大得离谱」不会拦——那是设定自由;但「半径为零」会拦,因为除零算不出数。 判定不是拍的,是逐个参数取极端值跑推演、统计产物里 Infinity/NaN 个数得出的。

类型也收严了:Number(true)===1、Number([])===0 这类静默强转不再发生, {planetMass:true} 会 400 而不是悄悄存成 1。数字字符串仍接受(AI 常传 "1.5")。

逐颗卫星(moons)

world.moons 是数组,每颗给 name / massMoon / distanceMoon / radiusKm / albedo:

{"world": {"moons": [{"name":"小月","massMoon":0.1,"distanceMoon":3},
                     {"name":"大月","massMoon":2,"distanceMoon":8}]}}

给了它,moonCount/moonMass/moonDistance 的数量语义就让位(以数组长度为准)。 推演会逐颗算洛希极限、希尔球、相邻间距、角直径、视星等与潮汐力。


让模型记得用它

插件做了三层感知机制,避免模型「自己心算一遍」:

  1. 工具描述枚举全部 30 个 operation,并写明「凡是需要数值计算都必须调用」
  2. 系统提示注入(ctx.systemPrompt.section)每轮对话提醒,默认 brief 档,可用 {"promptMode":"full"} 切换
  3. agent/pre-step 钩子实时检测用户消息里的计算需求,命中则插入提醒(每会话最多 3 次,用过插件后静默)

检测器经 22 个样本验证:12 个计算需求全中,10 个非计算文本(编年史、编号列表、版本号等)零误报。


已知边界

完整实测档案见 LIMITS.md(78 条,46 项支持 / 19 项不支持)。

  1. 符号积分受 Algebrite 限制。∫x²、∫sin(x)、∫1/x 能算;∫x³sin(x)、∫ln(x)/x 其实有初等原函数但引擎算不出;∫sin(x²)、∫x^x 数学上确实无初等原函数。
  2. 特征值/概率/回归是 double 精度,不受 precision 影响(mathjs 限制)。
  3. ODE 只做初值问题,刚性方程用显式 RK4 可能不准(会警告)。
  4. 方程组只支持线性,非线性明确报 unsupported。
  5. mathjs 没有 SVD / 秩 / 零空间。
  6. pi 常量硬编码 64 位,precision 超过 64 对 pi 无效(对 1/7 等有效)。
  7. 局地气候与可行性校验是经验模型,有 2~3 倍不确定性,输出已标注置信度。
  8. 没有界面。所有能力经 math_execute 与 HTTP 路由给 AI;想手动调参数只能让 AI 代劳。

安全模型

  • 禁用 math.import 与 createUnit(前者可注入任意 JS 函数)
  • AST 遍历拦截 process / require / constructor / globalThis 等标识符与危险属性访问
  • 复杂度阈值:factorial(1e9) 一类在 AST 层拒绝
  • 无 eval、无 new Function
  • 工作区名白名单(防路径穿越),写盘用临时文件 + rename 原子替换

开发与测试

装机前先跑自检(会检查构建产物、入口契约、运行期依赖、package.json 与注释覆盖):

npm run build
npm run test:all      # 58 套 / 2321 项
npm run preflight     # 一条命令判断「能不能装」

preflight 通过后再装;装的时候优先在隔离 profile 里试。

npm run build          # tsc 单份配置(无客户端 bundle)
npm run typecheck
node run-all-tests.mjs # 58 套 / 2321 项

单套测试:node test/<name>.mjs。

测试清单与每套期望项数见 run-all-tests.mjs 的 SUITES 表—— 新增测试必须进那张表,否则「全绿」不代表覆盖。

目录结构

src/
├── index.ts            插件入口 + 工具定义 + operation 分发(2032 行)
├── ops/                8 个较大的 operation 实现
├── formula-library*.ts 404 条公式(8 个批次,含势力运行与通用计算批次)
├── constants-graph.ts  43 个常数的依赖图(23 基础旋钮 / 20 派生)
├── quantities.ts       量纲分析与缩放指数
├── feasibility.ts      11 条设定约束
├── consequences.ts     跨尺度长链后果
├── world.ts / terrain.ts  星球与局地推演
├── sky.ts / moons.ts      地表观测(星空色谱/夜空亮度)与多卫星系统
├── workspace.ts        工作区隔离与持久化
├── formula-table.ts    工作区公式表
├── awareness.ts / detector.ts  模型感知
├── api.ts              HTTP 路由(AI 的第二个入口,无前端)
└── ...

许可

MIT