Skip to content

Releases

v1.1.4 — 第三档更名为「免费档」

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 11 Nov 02:01
775ecb1

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 资产)

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 09 Nov 14:18

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 · 多模态:标签真正影响路由

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 09 Nov 01:48

标了「多模态」,带图的请求才真的派得过去

自建端点的型号(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 兼容

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 07 Nov 02:46

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 fail
  • tsc --noEmit → 干净

v1.1.0 · 子代理档位与会话上下文继续

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 06 Nov 16:52

这一版解决两个真问题

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

Choose a tag to compare

@JiamingShi-JsPhys JiamingShi-JsPhys released this 06 Nov 15:04

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。
  • 白嫖页与厂家卡片对齐:快照只在悬浮面板展开时轮询,设置页里一直停在启动那一刻;保存厂家配置、打开设置页、切到白嫖页现在都会重取快照。
  • 热重载竞态修复:基线改为同步读取,避免首次保存被误判成「内容没变」而漏掉重载。
  • 快照序号跨重建连续:保存厂家配置、删厂家、重读配置都会重建路由引擎,序号一归零,面板就会把之后所有快照当成迟到响应丢掉;宿主改为维护只增不减的游标。