Repository navigation
Releases
v1.1.4 — 第三档更名为「免费档」
Note
安装:本包尚未发布到 npm。有 git 的机器 pnpm add https://github.com/JiamingShi-JsPhys/dsh-token-steward.git#v1.1.4;没有 git 的机器下载下方 dsh-token-steward-1.1.4.zip(内含预构建 lib/,无需编译),解压后 pnpm add file:<解压路径>。完整步骤见 README「安装」一节。
1.1.4 — 第三档更名为「免费档」
- 输入框模型菜单里的第三档改名为
管家·免费档,id 仍是steward:free。面板、设置页、徽标、报错提示、README 与使用指南统一使用这一名称。 - 功能没有任何变化:只允许价目为 0 的型号进候选,一个都选不到就报错并说明原因,绝不退化到付费模型。子代理同样受这条约束。
- 若
cordis.patch.yml里存的是旧模型名,重启 DSH 后autoWire会重写模型菜单;关掉autoWire的话,手动把该行的name改成管家·免费档即可(id不用动)。 - 验证:
npm run typecheck干净,558 条断言全过,lib/已重建。
其余改动见 CHANGELOG。
v1.1.3 — 安装路径修正(npm 未发布,附 zip 资产)
Note
安装:本包尚未发布到 npm。有 git 的机器 pnpm add https://github.com/JiamingShi-JsPhys/dsh-token-steward.git#v1.1.3;没有 git 的机器下载下方 dsh-token-steward-1.1.3.zip(内含预构建 lib/,无需编译),解压后 pnpm add file:<解压路径>。完整步骤见 README「安装」一节。
1.1.3 — 安装文档对齐现实
- README 安装节不再首推
pnpm add dsh-token-steward(npm 上没有这个包,404)。 - 改为两条实测可行路径:git 地址直装 / Release zip +
file:依赖。 - Releases 从本版起附带 zip 资产(含预构建
lib/index.js、lib/client.js),没有 git、不想编译的机器下载即用。
上一版 1.1.2 的多模态路由修复见 CHANGELOG。
v1.1.2 · 多模态:标签真正影响路由
标了「多模态」,带图的请求才真的派得过去
自建端点的型号(deepseek-flash / glm-flash / Qwen)上游明明能看图,用户在面板里也标了「多模态」,带图的请求却一直被 missing-capability:vision 拒掉——标签只写进了展示用的 strengthTags,没进引擎的 capabilities。看起来是「管家不会看图」,其实是「管家没把你打的标签当真」。
改了什么
- 能力型标签(
vision/tool-use/reasoning/fast/long-context/json-mode/multilingual)现在合并进引擎的capabilities;vision还会补上imageInput与image输入模态,硬过滤与模态判定一起通过。 - 中文写法与英文等价:
多模态/看图/视觉/图像理解→vision;编程/推理/快速/工具调用/长上下文/多语言各自落到对应能力。以前占位符写的是「多模态」,认不出来就等于没打。 - 设置页每张模型卡多了个 「能看图」 勾选框:目录认不出的型号(中转站、自建端点)一眼就能声明,勾上即写
vision标签,卡片同时挂「多模态」徽标。 - 目录自带的能力只合并不覆盖;没标注的型号仍然接不了图——不会为了「能跑」把所有人都当成多模态。
升级
cd ~/.dsh/profiles/desktop && pnpm add github:JiamingShi-JsPhys/dsh-token-steward重启 DSH,进「管家设置 → 厂家设置」,看那张模型卡上的「能看图」是否勾着;勾上后带一张图问一句,路由日志里应该能看到它被选中,而不是 missing-capability:vision。
验证
npm test→ 558 pass / 0 fail(新增 6 条能力标签与路由用例)tsc --noEmit→ 干净
v1.1.1 · 自动接线 / 首装修复 / 型号识别与 Anthropic 兼容
1.1.1 包含三件事
1. 装好就能用:自动接进模型菜单
之前装完插件,DSH 的模型菜单里什么也不会多出来——菜单读的是 profile 里 llm-pi-ai 的 providers,而 steward 这一家要自己手抄一段 YAML。抄错一个字段就一个档位都看不到,报错还指不到配置上。
现在插件启动、网关就绪后会自己检查并补上四个档位:
steward:
displayName: 管家
api: openai-completions
baseURL: http://127.0.0.1:51741/v1
apiKeyEnv: STEWARD_LOCAL_TOKEN
defaultMaxTokens: 65536
models:
- { id: 'steward:frugal', name: '管家·极致便宜' }
- { id: 'steward:balanced', name: '管家·效率优先' }
- { id: 'steward:max_power', name: '管家·最强火力' }
- { id: 'steward:free', name: '管家·白嫖' }装完重启一次 DSH,输入框里直接能选。令牌也一并写进宿主的凭据库——DSH 的凭据层读的是启动时的环境快照,插件在进程里改 process.env 它看不见,不写这一步设置页会一直红着「未检测到环境变量」。写回走文本拼接:只插/换 steward 那一段,注释、空行、缩进风格、别的厂家原样保留;认不出结构就什么都不做。已接好则一个字节都不写。不想让它动 profile 就配 autoWire: false。
网关默认端口改为 51741(地址要写进 profile,端口每次变等于每重启一次接线就断一次),被占用时自动退到系统分配。
2. 首次安装不再卡死
新装机器上还没有 model_pool.yaml,旧代码把它判成「配置被拒」:面板甩红字 not found: …model_pool.yaml,网关干脆不启动,「拉取模型」又被网关判空拦住——没配置 → 没网关 → 没法配置,死循环。
现在缺文件是「还没接入任何厂家」的中性提示;空矩阵也照常起网关、照常发布四个虚拟档位;拉取模型不再过网关前置检查。
3. 型号识别 + Anthropic 格式兼容
- 中转站 / 第三方平台写出来的
Qwen、deepseek-chat、glm-flash、gpt-6.1-terra都能认出来,不再要求自打标签。精确 id → 别名 → 发版快照(只认日期样式的尾巴,claude-fable-5不会被当成5.1)→ 同族(只借能力与擅长标签,不借评级与价目)。 - 官方 Anthropic 端点自动按
POST /v1/messages走,请求/响应/流式在宿主最边上翻译,网关、路由、计量、缓存一行没改。
升级
覆盖 lib/ src/ assets/ docs/ market/ cordis.patch.yml model_pool.example.yaml package.json 到 ~/.dsh/profiles/desktop/node_modules/dsh-token-steward,重启 DSH。老的 vendors.json / model_pool.yaml 不用动。
验证
npm test→ 552 pass / 0 failtsc --noEmit→ 干净
v1.1.0 · 子代理档位与会话上下文继续
这一版解决两个真问题
1. 子代理该派谁:steward:subagent
DSH 的子代理默认继承父会话的路由——主代理用最强火力时子代理跟着烧钱,主代理用便宜档时子代理又扛不住真活。1.1.0 给子代理单开了一个档位(不是模式,不改全局档位):
- agentic 质量 0.6 + 成本 0.4:够聪明,但不必每件事都用顶配;
- 窗口每 100k +4 分(封顶 40):子代理带着父会话的已完成轮次,长前缀是常态;
- 延迟最多 +20 分、burst 打散决定性(−20000):一批子代理同时开工时落到不同上游,不一起撞 429;
- agentic 维度 B+ 硬门槛:弱模型会把工具调用写坏、把半截结果当完成;
- 会话粘性 +300:同一子代理会话的后续轮次沿用同一模型。
接线(写进 profile,重启生效):
- id: tool-subagent
name: "@deepseek-ai/dsh-tool-subagent"
config:
provider: spawn
toolName: subagent
agentOptions:
provider: steward
model: 管家·子代理不想固定,也可以让 Agent 先问一句再派:token_steward_manage 新增 recommend_model(profile=subagent + task="一句话任务"),返回按真实意图推断排好序的 provider/model 与逐项理由。/v1/models 现在给 6 个虚拟 id 都带上 name / strengths / strength_tags,选择界面不再是看不懂的 id。
2. 换模型时的上下文
消息日志本身不会丢——DSH 会话层把完整历史原样发给新模型。会损失的是:
- 上游前缀缓存:每换一次模型,新厂商从零读完整段前缀。对策是会话粘性(同一会话成功服务过的模型,下一轮小额加分:frugal +60 / balanced +300 / max_power +120;主会话与子代理按档位分开记,LRU 512 个会话)。
- 上一家的私有字段:
reasoning_content/reasoning_details/thinking块 /cache_control。对策是跨厂商请求归一化:只在目标厂商 ≠ 上一轮服务的厂商时剥掉,系统提示与用户内容一字不动;同一厂商内换模型保持原样。 - 窗口收缩:仍然硬拒绝(
window-too-small),绝不悄悄截断历史。
关于「把 KV 状态直接搬给下一家」:公开 chat/completions 协议拿不到模型内部状态,这一层做不到,也不假装做到。README 里写清了边界。
升级
cd ~/.dsh/profiles/desktop && pnpm update dsh-token-steward然后重启 DSH。已有配置无需改动;steward:subagent 与 recommend_model 是新增能力。
质量
- 485 条断言全绿(新增子代理打分 / 粘性 / 只读预览 / 跨厂商归一化 / 虚拟 id 自述 /
recommend_model); tsc --noEmit零错误;npm run build正常产出;- README / CHANGELOG / docs/architecture.md 同步更新。
如果它帮到了你,去仓库点一颗 Star 吧 —— @JiamingShi-JsPhys
发布后并入 1.1.0 的两处修复
换过令牌后「API 密钥无效 AUTH」
系统用户环境变量 STEWARD_LOCAL_TOKEN 里留着旧令牌、网关持久化的是新令牌时,DSH 的 llm-pi-ai 可能在插件挂载前就把 apiKeyEnv 读进凭据缓存,之后每个请求都被网关 401。三道保障:网关优先采用继承来的合法令牌;启动时两把不一致则漂移窗口内两把都接住;每次启动把当前令牌写回 HKCU\Environment。仍是常量时间比较,认的钥匙最多两把、都在本机用户目录,范围仍只限回环。
DSH 打不开:desktop welcome: Web authentication failed
桌面版宿主每次启动下发一枚新名字的 dsh-auth-<随机> Cookie 且从不回收旧的,本机实测积了 71 枚;Cookie 头越过 Node 16 KB 上限后宿主回 431,桌面端拿不到 2xx 就判定认证失败——与插件、密钥、账号都无关。面板现在会数这个数(≥40 黄条 / ≥55 红条);完全退出 DSH 后跑 npm run repair:cookies 即可清理(先备份,只删本机 127.0.0.1 的 dsh-auth-*)。
测试: 505 条断言全绿,tsc --noEmit 零错误。
DSH Token Steward v1.0.0
v1.0.0 是 Token 管家的首个正式版本:在 DSH 的 llm-pi-ai 适配器与上游之间加一层本地 OpenAI 兼容网关,把模型池、路由、容灾、缓存、计量与面板全部收进一个插件。DSH 的会话层一行不改。
主要能力
- 模型矩阵调度:任意 OpenAI 兼容上游——官方 API、免费镜像、自建中转、opencode——挂进同一张池子。网关做「硬过滤 → 打分 → 降级链」,写代码、长文推理、看图、并发轰炸的请求落到不同型号。
- 四种调度模式:极致便宜
frugal(C/D 级里最便宜)、效率优先balanced(任务维度 A 级以上,质量 0.6 + 成本 0.4,同批并发打散)、最强火力max_power(六维总和最高)、白嫖free(零成本硬过滤,绝不偷偷切付费模型)。 - 容灾:429 指数退避冷却、5xx 熔断后半开试探、401/403 一次下线、上下文超限换大窗口、
max_tokens出站按窗口回压;首字节发出后的失败不重试(避免第二份副作用)。 - 价格层:每 1M token 的榜单估算价,查价对 id 归一化(
agnes-3.0-flash↔agnes-3-0-flash),面板可逐型号覆盖。未定价显示—,CNY 与 USD 不相加。 - 本地精确缓存:SQLite 中按 SHA-256 回放,命中即 0 token、不出站、不计费;没有
node:sqlite的宿主自动降级为内存 LRU。带 tools、超长 prompt、已下线模型的请求不缓存。 - 面板:悬浮球(环色 = 当前模式,角标 = 今日已省)、四页签(成本看板 / 模型矩阵 / 路由日志 / 代理协作)、管家设置(拉取模型、只导入地址对得上的那一家、反向同步系统模型、显式删除、价目与擅长标签、白嫖徽标)。
- Agent 工具:注册
token_steward_manage与同名运行时技能,用对话完成「接厂商、勾模型、打标签、切模式」,改动走与面板相同的原子保存路径。 - 安装踩坑已固化:profile 里
defaultMaxTokens: 65536(llm-pi-ai默认 128000,会被 Agnes 这类上游拒绝),凭据只走apiKeyEnv: STEWARD_LOCAL_TOKEN(llm-pi-ai没有apiKey字段)。
验证
- 测试套件:
463 tests, 463 passed(node --test,纯函数与本地回环,零外部服务、零费用)。 - 类型检查:
tsc --noEmit(strict + exactOptionalPropertyTypes + noUncheckedIndexedAccess)无错误。 - 真机验证:
agnes-3.0-flash在白嫖模式下返回 200;65k token 的长请求正常通过窗口过滤。
已知局限
- 只支持 OpenAI 兼容的
chat/completions;Anthropic / Gemini 原生协议需经中转。 - 首字节之后的失败不重试;上游不返 usage 的调用只能记估算成本。
vendors.json中的密钥为明文(0600,仅本机),不是加密存储。
许可
MIT。详见 LICENSE。
本版增补(同一标签内)
- 设置页接线信息可刷新:新增「刷新」按钮,一次重读配置、网关参数与厂家列表;网关端口与本地令牌随重启变化,之前只在第一次取到时缓存,重启后照着旧值配 profile 会 401。
- 本地令牌默认打码:点「显示」才展开,「复制」仍复制真实值;配置文件、网关地址、令牌、台账保留天数各补了一行用途说明,保留天数不再写死 180。
- 白嫖页与厂家卡片对齐:快照只在悬浮面板展开时轮询,设置页里一直停在启动那一刻;保存厂家配置、打开设置页、切到白嫖页现在都会重取快照。
- 热重载竞态修复:基线改为同步读取,避免首次保存被误判成「内容没变」而漏掉重载。
- 快照序号跨重建连续:保存厂家配置、删厂家、重读配置都会重建路由引擎,序号一归零,面板就会把之后所有快照当成迟到响应丢掉;宿主改为维护只增不减的游标。