dsh-auto-model-routing 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +82 -24
- package/README.zh.md +82 -24
- package/docs/architecture-v2.en.json +26 -0
- package/docs/architecture-v2.en.svg +637 -0
- package/docs/architecture-v2.zh.json +281 -0
- package/docs/architecture-v2.zh.svg +637 -0
- package/docs/feedback-evaluation.md +18 -0
- package/docs/host-capability-report.md +91 -0
- package/docs/jev-policy-v2-validation.md +37 -0
- package/docs/magpie-live-acceptance.md +27 -0
- package/docs/policy-v2-development.md +68 -0
- package/docs/policy-v2-real-evaluation-plan.md +32 -0
- package/docs/routing-community-research-2026-10-24.md +98 -0
- package/docs/routing-intent-and-gaps.md +56 -0
- package/docs/routing-strategy-plan.md +101 -0
- package/lib/client/control.d.ts +9 -1
- package/lib/client/control.js +16 -1
- package/lib/client/index.d.ts +2 -0
- package/lib/client/index.js +2 -2
- package/lib/client/label.d.ts +4 -0
- package/lib/client/label.js +24 -8
- package/lib/client/settings-section.js +53 -3
- package/lib/client/settings-ui.d.ts +1 -1
- package/lib/client/strategy-details.d.ts +4 -0
- package/lib/client/strategy-details.js +8 -0
- package/lib/client.js +332 -47
- package/lib/decision-service.d.ts +39 -0
- package/lib/decision-service.js +28 -0
- package/lib/endpoints.d.ts +2 -1
- package/lib/endpoints.js +22 -1
- package/lib/feedback.d.ts +95 -0
- package/lib/feedback.js +67 -0
- package/lib/hints.js +1 -1
- package/lib/index.js +29 -7
- package/lib/jev.d.ts +27 -1
- package/lib/jev.js +51 -23
- package/lib/policy-host.d.ts +68 -0
- package/lib/policy-host.js +274 -0
- package/lib/policy-store.d.ts +96 -0
- package/lib/policy-store.js +60 -0
- package/lib/policy-v2-rubric.json +21 -0
- package/lib/policy-v2.d.ts +20 -0
- package/lib/policy-v2.js +53 -0
- package/lib/settings-contract.d.ts +4 -1
- package/lib/settings-contract.js +1 -1
- package/lib/settings-host.d.ts +2 -2
- package/lib/settings-host.js +26 -14
- package/lib/settings.js +14 -1
- package/lib/subagent-tool.js +32 -5
- package/lib/usage-report.d.ts +59 -0
- package/lib/usage-report.js +332 -0
- package/package.json +3 -3
- package/skills/auto-model-routing-report/SKILL.md +50 -0
- package/skills/subagent-model-routing/SKILL.md +15 -0
- package/lib/selection-projection.d.ts +0 -8
- package/lib/selection-projection.js +0 -7
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# AUTO 人工反馈数据与评估口径
|
|
2
|
+
|
|
3
|
+
## 记录
|
|
4
|
+
`$DSH_HOME/state/auto-model-routing/allocation-feedback.jsonl` 是本地append-only记录,无会话正文和key。
|
|
5
|
+
|
|
6
|
+
绑定行使用sessionId/messageId/decisionId、depth、实际model/effort,新增boundAt与不可变snapshot:decidedAt/appliedAt、policyVersion/mappingVersion、decisionProvider/decisionModel、判断ms、返回的confidence/probabilities、实际provider、requestSeq及可得时requestTurn。requestSeq是同session请求头事件,可与该会话历史关联actual request及usage;绑定并非完成任务或用量已知的证明。
|
|
7
|
+
|
|
8
|
+
反馈事件为`type:feedback, version:2`,带sessionId/messageId/decisionId、at、feedback。每次修改或撤销独立追加;null表示撤销。读取时按追加顺序应用到既有精确绑定。历史完整记录仍兼容,原快照不可被后续同身份行替换;旧记录没有时间或快照则未知,禁止用迁移时刻或最新配置补造。
|
|
9
|
+
|
|
10
|
+
## 评估
|
|
11
|
+
- 评估单位为(sessionId, decisionId),不是每个assistant/message,避免同轮多条工具消息导致重复计数。先按消息取最后事件,再按决策取最后反馈;历史无时间以追加顺序作本文件内顺序,跨文件不可猜。
|
|
12
|
+
- appropriate/too-high/too-low分别统计;unknown不是满意,null撤销不计有效评价;未评价不能计为合适。多条消息评价冲突也应单独报告。
|
|
13
|
+
- 按策略版本/映射版本/服务模型及depth/实际路由分组;旧缺字段独立unknown组,不混进新策略精确对照。
|
|
14
|
+
- 以requestSeq和消息ID关联实际usage/延迟/返工证据;拿不到价格或token就未知。用户主观反馈不等于正确性oracle,适合率也不能单独证明质量或节省。
|
|
15
|
+
- 按需观察报表见包内 skill `auto-model-routing-report`(`lib/usage-report.js`,只读);仍不做自动阈值调整、自动训练或换模重试。
|
|
16
|
+
|
|
17
|
+
## 确定度
|
|
18
|
+
UI称“判定确定度”,Choice公式为`(pmax - 1/n)/(1 - 1/n)`;n为该维候选数。三选一最高概率70%得到55%,不等于选中概率或任务成功率。插件直接展示服务返回值,分布独立保留,不从四舍五入后的百分比反推。官方定义:https://docs.typesafe.ai/confidence.md 。
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# AUTO 宿主能力核验(官方 0.2.0-rc.2)
|
|
2
|
+
|
|
3
|
+
## 结论
|
|
4
|
+
|
|
5
|
+
**官方入口足以让插件在普通子会话、fork、teammate 的首次模型请求前读取精确子身份和本轮任务,并改写实际 provider/model/effort;不需要改宿主或 compat。** 这证明的是宿主接入能力,不是现有 AUTO 已支持这些路径。
|
|
6
|
+
|
|
7
|
+
本次只完成宿主探针。策略、Jev、生产持久化、部署与真实模型兼容性均未实现/验证。尤其 fork 跨真实 provider 的历史兼容仍未通过支持门槛,不可据此启用生产自动路由。
|
|
8
|
+
|
|
9
|
+
## 方法与范围
|
|
10
|
+
|
|
11
|
+
- 可重跑的 [探针](../scripts/host-capability-probe.mjs):独立临时 npm prefix,官方包精确 pin 为 `0.2.0-rc.2`、Cordis 为 `4.0.4`;运行前检查所有直接加载包版本。未加载 launcher 或 compat。
|
|
12
|
+
- 官方 Agents、Loop、Sessions、Subagents、spawn/fork providers、Teams、JSONL persistence、session-query 组成真实宿主服务链。适配器是本地 fake,唯一允许的 provider 为 `probe` / `probe-other`,运行期 `fetch` 明确抛错。依赖安装访问 npm,不产生模型/Jev 请求。
|
|
13
|
+
- 使用全局 `agent/pre-step` 的 `decision.messages` 读取进入本轮的任务;按 `agent.id` 记录确定性测试决策;`agent/request` waterfall 应用配置。测试标签仅为 oracle,**不是可直接复用的生产 prompt 匹配绑定方案**。
|
|
14
|
+
- 证据同时校验子会话 `requestHeader().config` 和 fake adapter 收到的最后一次请求,使用请求 `sessionId` 关联,分别确认 provider、model、effort。provider 由各自独立适配器实例记录,不以相同模型名代替路由证明。
|
|
15
|
+
- 数据均为合成任务,JSONL 和简易决策文件只写临时目录,不提交原始会话。
|
|
16
|
+
|
|
17
|
+
## 支持矩阵
|
|
18
|
+
|
|
19
|
+
| 路径 | 精确父子身份与任务 | 请求入口与实际执行 | 并发/后续/恢复 | 结论 |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| one-shot ordinary `start('spawn')` | 通过:run ID、live child、parentSession 与进入任务对应 | 通过:跨 fake provider + model/effort | 单次请求;未单测此入口并发 | 官方服务入口可用;非生产 applied |
|
|
22
|
+
| continuable ordinary `startContinuable('spawn')` | 通过 | 通过 | 两个并发提交的不同任务各获不同配置,父请求不变;重建宿主后恢复通过 | 可作为正式实现基础;需插件自己的决策恢复机制 |
|
|
23
|
+
| one-shot / continuable fork | 通过;进入任务不含父历史标记,完整会话仍保留父文本历史 | 通过:fake provider 切换 | 未覆盖 fork 冷恢复或并发专项 | 宿主入口可用;真实历史兼容未验证,生产异构 fork 不宣称支持 |
|
|
24
|
+
| teammate fresh | 通过:官方 TeamService → continuable child | 通过;无需 Team 创建 API 暴露 model 参数 | 后续消息含不同测试标签也不重选;重建宿主后发消息恢复同一路由 | 官方服务入口可用;工具层与生产持久化未验证 |
|
|
25
|
+
| teammate fork | 未单独运行组合测试 | 不借普通 fork 的结果算通过 | 未覆盖 | 本轮未验证,不启用自动应用 |
|
|
26
|
+
| ACP / 远端进程子会话 | 未覆盖 | 当前全局 hook 仅本进程 | 未覆盖 | 本轮不支持声明 |
|
|
27
|
+
|
|
28
|
+
并发证据是 `Promise.all` 并发提交的身份隔离,不是高负载、长流式交错或取消压力测试。后续消息证据是新消息新请求,不包括重复投递同一 message ID 的去重验证。
|
|
29
|
+
|
|
30
|
+
## 关键发现:请求覆盖不等于持久化选模
|
|
31
|
+
|
|
32
|
+
官方 continuable descriptor 在创建时保存 model/effort;`agent/request` 覆盖不会修改它。
|
|
33
|
+
|
|
34
|
+
探针包含负对照:先路由 child → 关闭整个宿主 → 以同一持久化目录重建宿主,禁用决策应用 → 发新消息。实际请求恢复为父模型 `parent/medium`,而非首次应用的 `small/high`。
|
|
35
|
+
|
|
36
|
+
再次重建宿主,并从探针自有文件恢复 `childId → provider/model/effort` 决策后,同一 child 和 teammate 的请求才保持首次选择。因此正式实现至少需要:
|
|
37
|
+
|
|
38
|
+
1. 使用稳定的会话身份绑定初始决策,后续消息不重新分类;不能依赖临时 Agent 对象或 prompt 相似度。
|
|
39
|
+
2. 通过插件自己的持久化或可验证重建机制恢复决策,处理恢复失败,不能默默继承却报告 applied。
|
|
40
|
+
3. 为显式 model/effort 约束保留来源;本探针的标签路由没有实现该语义,不可直接上线。
|
|
41
|
+
4. 避免调用主 UI 的 `sessionController.selectModel`:它还会保存全局默认选择;本探针完全不调用该入口。
|
|
42
|
+
|
|
43
|
+
这里只验证了简易测试文件的正常读写恢复,不是生产持久化设计;未覆盖原子写、并发进程、崩溃、损坏、版本迁移和 MANUAL 切换。
|
|
44
|
+
|
|
45
|
+
## 官方源码依据
|
|
46
|
+
|
|
47
|
+
以下为核验时已安装的官方发布包位置,不是上游改动要求。临时 prefix 可按下方命令重建;其中源码行号仅适用于此 pin。
|
|
48
|
+
|
|
49
|
+
- pre-step / request 类型(`node_modules/@deepseek-ai/dsh-agent/lib/types/runtime-types.d.ts#L293-L332`):公开事件输入和 waterfall 返回契约。
|
|
50
|
+
- Loop 请求链(`node_modules/@deepseek-ai/dsh-agent-loop/lib/index.js#L1164-L1220`):实际调用 waterfall 后才 `llm.prepareCall`,记录 resolved request header。
|
|
51
|
+
- scopeTarget(`node_modules/@deepseek-ai/dsh-scope/lib/index.js#L315-L337`):无 Agent 作用域标记的全局 listener 可观察不同子身份。
|
|
52
|
+
- SubagentStartRequest(`node_modules/@deepseek-ai/dsh-subagent/lib/types/types.d.ts#L136-L162`):公开 `agentOptions`,不必通过工具 schema 推断宿主能力。
|
|
53
|
+
- continuation 创建(`node_modules/@deepseek-ai/dsh-subagent/lib/types/continuation.js#L101-L176`)、冷恢复(`node_modules/@deepseek-ai/dsh-subagent/lib/types/continuation.js#L354-L374`):descriptor 与恢复选项。
|
|
54
|
+
- 官方 Team 创建转发(`/tmp/dsh-official-routing-probe.HImElm/node_modules/@deepseek-ai/dsh-experimental-agent-team/lib/index.js#L573-L582`):只转发 prompt/parent,未传 agentOptions;并不妨碍插件在 child request 入口配置。
|
|
55
|
+
- 默认选择副作用(`node_modules/@deepseek-ai/dsh-api-session-controller/lib/index.js#L720-L739`):`selectModel` 还会 `saveSelection`。
|
|
56
|
+
|
|
57
|
+
`resolveChildAgentOptions` 是 官方公开导出(`node_modules/@deepseek-ai/dsh-subagent/lib/types/index.d.ts#L55`),前期函数级实验使用内部文件路径不意味着函数本身是私有 API。本次整链探针没有导入任何内部 helper。
|
|
58
|
+
|
|
59
|
+
## 重跑
|
|
60
|
+
|
|
61
|
+
从仓库根运行,Node 24;不更改仓库依赖、manifest 或当前 GUI:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
PROBE_HOME=$(mktemp -d /tmp/dsh-official-routing-probe.XXXXXX)
|
|
65
|
+
npm install --prefix "$PROBE_HOME" --save-exact --ignore-scripts --no-audit --no-fund \
|
|
66
|
+
@deepseek-ai/cordis@4.0.4 \
|
|
67
|
+
@deepseek-ai/dsh-agent-loop@0.2.0-rc.2 \
|
|
68
|
+
@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2 \
|
|
69
|
+
@deepseek-ai/dsh-session-persistence-jsonl@0.2.0-rc.2 \
|
|
70
|
+
@deepseek-ai/dsh-session-query-sqlite@0.2.0-rc.2 \
|
|
71
|
+
@deepseek-ai/dsh-subagent-fork-in-process@0.2.0-rc.2 \
|
|
72
|
+
@deepseek-ai/dsh-subagent-spawn-in-process@0.2.0-rc.2
|
|
73
|
+
node packages/auto-model-routing/scripts/host-capability-probe.mjs "$PROBE_HOME"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
探针输出 7 项 PASS 后才表示整链成功。它有独立依赖装配要求,未加入默认单元测试命令。
|
|
77
|
+
|
|
78
|
+
装配期间遇到并修正的探针问题:父创建必须提供 sessionId;官方 continuable 任务会附加返回指导,不能断言整个文本与原 prompt 完全相等;子实例自然完成后可能已经卸载,证据应保存事件中的精确 Agent 身份;冷恢复必须装配 session-query(`openAt: 'never'` 保留 exact reads 且不加载 SQLite);npm 分次安装缺少 `--save-exact` 会漂移版本,版本断言已捕获,最终重装为精确 pin。以上均未修改官方宿主。
|
|
79
|
+
|
|
80
|
+
## 检查结果与本地复核
|
|
81
|
+
|
|
82
|
+
- 探针:7 项 PASS(包含恢复负对照);复核后补充父会话在子任务之后再次发请求仍保持原配置的断言。
|
|
83
|
+
- package 工作目录执行 Vitest:25 个测试文件、162 个测试通过。
|
|
84
|
+
- OpenSpec 严格校验与 `git diff --check`:通过。
|
|
85
|
+
- 首次从仓库根运行 Vitest 的路径过滤意外匹配 worktree,且未使用 package 配置,UI 测试报告缺少 `clsx`。改为 package 工作目录后全部通过;未为此安装仓库依赖或修改 UI。
|
|
86
|
+
- 本地全范围复核:新增脚本/报告及本轮 design/tasks 修改均检查;没有修改运行时代码。保留的局限是明确列出的组合覆盖和生产机制缺口,不将其记为 applied。
|
|
87
|
+
- 未运行全仓测试、构建、sync、真实模型调用或浏览器验证;本次没有部署变更。
|
|
88
|
+
|
|
89
|
+
## 明确不包含
|
|
90
|
+
|
|
91
|
+
真实模型和 Jev 调用、策略效果/成本比较、真实 provider 历史与工具消息兼容、部署中工具调用、GUI、subscriptions/MANUAL 改造、上游补丁、生产 AUTO 自动路由。现有 AUTO 请求中间件仍跳过 subagent,此报告不改变当前功能承诺。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Jev policy-v2 验证(2026-10-24)
|
|
2
|
+
|
|
3
|
+
## 结论
|
|
4
|
+
|
|
5
|
+
官方接口和真实 `typesafe/jev-1.13` 均支持一次请求中独立返回 capability 与 depth。10 次合成任务请求全部返回合法的双 Choice;预先定义的 development / holdout 各 5 例均符合预期,不调整 rubric、不重试。**这只证明接口与小样本分类,不证明实际子模型质量、成本收益或默认推广条件。**
|
|
6
|
+
|
|
7
|
+
- [官方教程](https://openrouter.ai/docs/guides/community/jev-tutorial.md):多个问题并行作答,不能读取彼此答案。
|
|
8
|
+
- [官方 API schema](https://openrouter.ai/docs/api/api-reference/alphadecisions/submit-a-decisions-request.md):questions 为命名问题映射,answers 同键返回。
|
|
9
|
+
- [价格入口](https://openrouter.ai/api/v1/models/typesafe/jev-1.13/endpoints):验证时 input US$0.042 / million tokens,output 0;请求显式 max_price + 禁止 fallback。
|
|
10
|
+
- 模型仍固定 `typesafe/jev-1.13`;文档虽然已有 1.14,本次不擅自升级。
|
|
11
|
+
|
|
12
|
+
## 实测
|
|
13
|
+
|
|
14
|
+
用户授权上限:20 次、输入每次 ≤8192 bytes、US$0.10。实际 10 次,总 input 8194 tokens,**US$0.000344148**;单次 493–1036 ms。真实 snapshot 为 `typesafe/jev-1.13-20260917`。
|
|
15
|
+
|
|
16
|
+
| 样例 | split | capability | depth |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| dev-bulk | development | bounded | baseline |
|
|
19
|
+
| dev-risk | development | bounded | baseline |
|
|
20
|
+
| dev-debug | development | analytical | baseline |
|
|
21
|
+
| dev-proof | development | frontier | higher |
|
|
22
|
+
| dev-missing | development | insufficient_context | baseline |
|
|
23
|
+
| hold-extract | holdout | bounded | lower |
|
|
24
|
+
| hold-batch | holdout | bounded | baseline |
|
|
25
|
+
| hold-tradeoff | holdout | analytical | baseline |
|
|
26
|
+
| hold-constraints | holdout | frontier | higher |
|
|
27
|
+
| hold-unknown | holdout | insufficient_context | baseline |
|
|
28
|
+
|
|
29
|
+
[测试输入及独立预期](../eval/policy-v2-cases.json)、[问题定义](../src/policy-v2-rubric.json)、[有预算保护的实测脚本](../eval/policy-v2-live.mjs)。depth 从同一任务证据独立判断相对适配模型的推荐投入,不引用另一个尚未返回的 capability 答案。两者都指定时不判;只指定一个维度时仅询问另一个。
|
|
30
|
+
|
|
31
|
+
实测脚本先保留每次费用预算再请求,失败也计一次;预留每次 65536 input tokens 远高于合成输入。未知 usage.cost 停止,不记零。尚有 10 次授权余量,不默认消耗,也不因生成一个新结果文件就获得新预算。跨多次运行的全局预算需由执行者核对,脚本不是账户级额度控制。
|
|
32
|
+
|
|
33
|
+
## 实施映射起点
|
|
34
|
+
|
|
35
|
+
版本 `capability-slots-1`:Claude bounded/analytical/frontier = Haiku/Sonnet/Opus 5.5;Codex = Luna/Sol/Sol(目前目录只有两种已选能力模型,不伪造第三种)。推荐 effort 复用当前 [官方起点表](../src/effort.ts#L7-L16),Claude 三模型 medium、Luna high、Sol medium。depth 只按支持序列移动一档,automatic 不使用 max;显式值仍校验目录、允许列表与上限,失效报错不替换。
|
|
36
|
+
|
|
37
|
+
这份映射是初始试验基线,不声称已经独立证明各子模型是最优能力槽。未进行实际子模型调用或端到端任务保留集对照;其成本、质量与返工收益均未知。
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Magpie 真实最小验收与本地部署
|
|
2
|
+
|
|
3
|
+
2026-10-25。用户授权按订阅最小必要调用完成验收与本地部署重启,不授权全局默认切换或发布。
|
|
4
|
+
|
|
5
|
+
## 实际结果
|
|
6
|
+
|
|
7
|
+
- 在线 Magpie `/models` 返回 200,确认完整 provider/model 与 effort 元数据;不依赖磁盘缓存作可用证明。
|
|
8
|
+
- GPT:真实 Jev + 生产插件 + 官方 ordinary 子工具 + Magpie adapter,最终 `dsh-magpie-connect` / `codex/gpt-6-luna` / medium / maxTokens=1024,4322 ms,排序去重 JSON 确定性 oracle 通过。
|
|
9
|
+
- Claude:先遇网关账户认证 502,用户重新登录后成功;同一路径选 `claude/claude-haiku-5-5` / low / maxTokens=1024,4027 ms,同一 oracle 通过。未绕到本地 Claude。
|
|
10
|
+
- 实际结果仅证明生成可用与请求配置;不证明底层服务内部推理投入与 effort 参数完全相等,不宣称统计性能收益。订阅实际美元成本 unknown。
|
|
11
|
+
- 尝试旧策略表参考时被官方固定工具实例拒绝显式 model 参数,未产生该参考模型执行;已删除不可用试验分支,不冒充完成策略对照。6任务保留集仍未运行。
|
|
12
|
+
|
|
13
|
+
## 部署与现场
|
|
14
|
+
|
|
15
|
+
- 首次 `dsh build` 因仓库工作依赖缺少 lottie-web 失败,恢复已声明依赖后第二次构建成功;再跑一次构建成功且没有 changed/reinstall/generate 操作。
|
|
16
|
+
- 通过 manifest/sync 物化源码,没有手改部署插件。没有升级 DSH。最终再次逐字节确认部署的 index、policy-host、policy-v2、client 构建与源码构建一致;读取持久配置确认为 legacy/AUTO,没有改变全局策略。
|
|
17
|
+
- 自动 restart 尝试中断,用户手动恢复服务成功;现有 3080 GUI 已实测可访问,未将自动重启记为成功。近期日志没有足够证据定位自动重启挂起根因,不猜测。
|
|
18
|
+
- 使用官方启动 URL 认证隔离浏览器,不输出 token;现有 GUI 的设置页显示原策略被选中、v2 试验入口存在。切换 v2 草稿后保存按钮启用;切回原策略并关闭,未保存或改变全局策略。
|
|
19
|
+
- 190 项 package 测试、typecheck 在依赖恢复后再次通过;mock 官方完整冷恢复证据见开发报告。GUI 只验界面入口与草稿状态,不冒充在真实 GUI 已执行完整子路由。
|
|
20
|
+
|
|
21
|
+
## 全仓检查
|
|
22
|
+
|
|
23
|
+
全仓 `npm test`:447 项,444 通过、2 跳过、1 失败。唯一失败为文档治理要求链接目标已进入 Git tracked 集合,而本次新增报告尚未暂存;文件真实存在,不为制造绿灯自动 staging 或改写治理测试。package 190 项测试全部通过;artifact check、严格 OpenSpec、diff check 通过。
|
|
24
|
+
|
|
25
|
+
## 边界
|
|
26
|
+
|
|
27
|
+
当前 policy 是插件全局设置,不是单会话策略选择;没有承诺仅启用某一会话就实际保存全局开关。默认仍为旧策略。若要全局启用 v2 需用户明确选择。真实 fresh teammate、fork、任务质量收益和保留集对照均不在此最小验收通过范围。
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# policy-v2 开发与验收记录
|
|
2
|
+
|
|
3
|
+
## 状态
|
|
4
|
+
|
|
5
|
+
2026-10-25 用户在最小真实 Magpie 验收后追加授权:AUTO 默认升级,不再要求版本开关。默认配置为内部 policy-v2;显式 legacy 仅供回滚。旧四档配置保留但不参与新策略,MANUAL 不变。已构建部署、通过分离控制进程重启现有3080服务,并在实际GUI验证无版本选择、显示 AUTO 已使用新策略。真实质量/返工/成本对照仍未完成,不宣称性能收益。
|
|
6
|
+
|
|
7
|
+
## 实现入口
|
|
8
|
+
|
|
9
|
+
- [Jev 契约](../src/jev.ts):复用认证、deadline、body 上限、错误分类;原 tier 问题不变。新主请求只问 depth;子请求一次问 capability/depth,显式约束只问未指定维度。
|
|
10
|
+
- [独立映射](../src/policy-v2.ts):版本化能力槽,effort 推荐起点按受支持序列最多移动一档,受 cap 限制,不自动使用 max。映射是初始基线,Codex analytical/frontier 都是 Sol,未虚构第三模型。
|
|
11
|
+
- [宿主接入](../src/policy-host.ts):官方 `tools/execute` → AsyncLocalStorage → `agent/created` 绑定精确 child ID 和 parent/root;不依赖 prompt 相似度。`agent/pre-step` 获取首次任务并决策,`agent/request` 应用;`request/header` 记录匹配证据。
|
|
12
|
+
- [持久化](../src/policy-store.ts):每 child 哈希路径、严格 schema、owner-only 原子替换,只有身份/版本/约束/路由/状态,不含任务原文。缺失、损坏、未完成恢复不默默继承;未完成决策不能用后续消息重新分类。
|
|
13
|
+
- [工具](../src/subagent-tool.ts):policy-v2 下 optional preview,仅 recommended;普通创建工具负责精确应用,不把预览冒充 applied。
|
|
14
|
+
- [设置](../src/client/settings-section.ts):无用户版本开关;省略即新策略,旧四档表仅在显式 legacy 回滚时显示。当前能力槽是版本化代码,不新增另一套可编辑映射表。
|
|
15
|
+
- [状态 API](../src/index.ts):`auto-model-routing.childRouting` 接收 `{sessionId}`;主 state 返回 policy/depth/effort。v2 不使用 `selectModel`,避免全局默认副作用。
|
|
16
|
+
|
|
17
|
+
## 覆盖矩阵
|
|
18
|
+
|
|
19
|
+
| 路径/行为 | 证据 | 结果/边界 |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 官方 ordinary fresh continuable 工具与 provider | [整链脚本](../scripts/policy-v2-host-probe.mjs)加载官方 0.2.0-rc.2、真实生产插件,fake Jev/adapter | 实际请求 model/effort 匹配;全宿主关闭重建后恢复,不重判 |
|
|
22
|
+
| 官方 fresh teammate 工具与服务 | 同上 | 创建、后续消息和全宿主恢复通过,不重选 |
|
|
23
|
+
| 并发创建与显式模型/effort | [宿主测试](../test/policy-host.integration.test.ts)官方 Tools/Agents,测试创建工具 | 并发精确身份隔离;两者指定零判断;普通/teammate 官方 provider 的并发压力未测 |
|
|
24
|
+
| fork / teammate fork | tools wrapper 可提前拒绝 | unsupported,真实历史兼容未验证,不擅自转 fresh |
|
|
25
|
+
| 未绑定 service API、别名工具、远端 ACP | 进入子 pre-step 时若发现启用 v2 而无绑定则停止 | 不宣称支持;根链不可达时不作自动决策。未宣称能阻止进程外原生创建 |
|
|
26
|
+
| MANUAL / 切回原策略 | unit + host tests | 不做新判断;已绑定实例保留创建初始路线,不因后续消息换模 |
|
|
27
|
+
| needs-context / Jev 402 / 配置失效 | host tests | 子请求停止,根仍 AUTO,不静默替代或自治重试 |
|
|
28
|
+
| 恢复损坏 / 身份不匹配 | store tests | fail closed;单进程按 child 写,无跨进程争用/崩溃注入证明 |
|
|
29
|
+
| 实际请求被其它 middleware 改写 | host mismatch test | 记录 failed,不标 applied;header observer 抛错为尽力阻断,不将配置匹配等同调用成功 |
|
|
30
|
+
| 当前允许列表与父快照 | 新鲜 catalog 校验 + 父 `subagent/model-selection-policy`(存在时) | 不用较新全局列表扩大父快照;整链脚本的 allowlist 是合成 service seam,未验证真实 GUI 设置装配 |
|
|
31
|
+
|
|
32
|
+
适配器/Jev 都为 fake 的宿主测试不证明真实 provider 兼容、真实工具 schema 部署或网络效果。实际 `applied` 只代表 request/header 配置匹配,不代表任务验收、模型成功或底层 provider 尊重 effort。
|
|
33
|
+
|
|
34
|
+
## 验证
|
|
35
|
+
|
|
36
|
+
- 真实 Jev:10 请求 / development 5 + holdout 5,均符合预期,US$0.000344148;见 [Jev 记录](jev-policy-v2-validation.md)。没有实际子模型调用。
|
|
37
|
+
- package `npm run typecheck`、`npm test`(29 文件 / 184 测试)、`npm run build` 通过;构建保留现有 tsdown deprecation/format warning,不顺手升级工具链。
|
|
38
|
+
- 官方整链脚本:ordinary + fresh teammate 创建/请求/全宿主冷恢复通过。
|
|
39
|
+
- 早期 [宿主能力探针](host-capability-report.md)证明 service/request 基础能力;新整链脚本补充生产插件与正式工具绑定,而非把之前的测试标签 oracle 当生产实现。
|
|
40
|
+
|
|
41
|
+
重跑整链:先 package build;在原临时官方 prefix 的基础上,精确安装 `@deepseek-ai/dsh-tool-subagent@0.2.0-rc.2`、`@deepseek-ai/dsh-experimental-tool-agent-team@0.2.0-rc.2`、`@deepseek-ai/dsh-launch-environment@0.2.0-rc.2`(`--save-exact --ignore-scripts`),然后:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
node packages/auto-model-routing/scripts/policy-v2-host-probe.mjs "$PROBE_HOME"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
官方 standing tool 的 `modelSelectionSettings:true` 要求 preset-scoped context;隔离脚本没有伪造该 composition,使用 standing fixed-schema 工具 + 合成 allowlist。因此显式选择与父快照另用 host tests 验证,真实 preset/GUI 组合不记为通过。
|
|
48
|
+
|
|
49
|
+
## 独立审查后的修复
|
|
50
|
+
|
|
51
|
+
用户授权只读独立审查后,修复子输入来源过滤、模式往返 epoch 撤销、await 后 MANUAL 复核,以及路由记录丢失时的 sidecar 绑定检测。原尝试自定义 session 事件被官方持久化拒绝,已完全移除;不依赖上游改动。完整官方 cold resume 探针重新通过。独立最终聚焦复核结论 PASS;其测试命令未能找到 vitest,测试通过证据来自主会话的完整运行,不将其静态审查冒充独立测试通过。
|
|
52
|
+
|
|
53
|
+
`.bound` 标记只保存 child ID,不包含任务;路由 JSON 缺失而标记保留时 fail closed。整个插件状态目录(两份记录)同时丢失、或旧版无标记记录丢失,无法检测,不能泛称所有存储丢失都已覆盖。
|
|
54
|
+
|
|
55
|
+
## Magpie 接入(2026-10-25)
|
|
56
|
+
|
|
57
|
+
用户指定实际模型先只经 Magpie,OpenRouter 仅 Jev,不用本地 Claude/codex。v2 支持精确 `dsh-magpie-connect` transport,持久记录保留完整 model ID;自动映射使用 `claude/...` / `codex/...` 家族,不把网关 route 伪装为本地 provider。映射版本为 `capability-slots-2-magpie`,已有完成路由保持原配置;其他网关模型可显式使用,未定义能力槽时不自动猜;未知模型 effort 使用 LLM 目录 defaultEffort,缺失则停止。固定已知家族沿用版本化官方起点。
|
|
58
|
+
|
|
59
|
+
当前 legacy catalog 仍不包含 Magpie;持久子路由重放使用独立全量策略目录,避免关闭试验导致既有实例失效。目录/allowlist 校验对精确 provider+model 执行,模型名含斜线只在 v2 网关路径允许,旧配置校验不放宽。
|
|
60
|
+
|
|
61
|
+
验证:190 测试、类型检查、构建通过;官方工具整链脚本加 `--magpie` 后通过 ordinary/fresh teammate 和全宿主冷恢复(fake adapter/Jev,无外网)。实际 dsh-magpie-connect 0.4.1 源码显示 resolveModel.reasoning 从缓存努力等级构建 defaultEffort;尚未验证在线生成或真实 effort 消费,不把缓存/模拟当实测。
|
|
62
|
+
|
|
63
|
+
## 回滚与后续
|
|
64
|
+
|
|
65
|
+
- 切回 legacy 或 MANUAL:停止新判断;已有 child 继续恢复初始路线,避免意外退回父模型。
|
|
66
|
+
- 完全移除/停用插件:请求覆盖停止,官方 cold resume 回到创建 descriptor 配置;操作前应确认已创建子任务可以接受该变化。
|
|
67
|
+
- 不修改 main current spec,不归档 change;其约束继续描述默认旧策略。试验有独立 delta spec。
|
|
68
|
+
- 未运行真实子模型保留集对照、返工总成本评估、浏览器部署验收、全仓测试、sync、发布。4.3 和默认推广不完成;真实质量与收益未知,不记为零。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# policy-v2 真实任务对照(计划;完整对照未执行)
|
|
2
|
+
|
|
3
|
+
## 目的与门槛
|
|
4
|
+
|
|
5
|
+
下一步不是直接部署,而是在独立评审修复后验证真实子模型质量、耗时与总开销。现有 10 个 Jev 分类样例不是执行任务基准,不能把其标签命中率当任务成功率。不得消耗剩余 Jev 授权来调用其它模型;2026-10-25 用户已授权以最小必要订阅调用验收并本地部署,不再按美元预算审批;仅经 Magpie。当前真实最小验收已完成,完整对照仍未完成,见 [实测记录](magpie-live-acceptance.md)。
|
|
6
|
+
|
|
7
|
+
## 已确认的执行入口(2026-10-25)
|
|
8
|
+
|
|
9
|
+
用户明确本机网络约束:OpenRouter 仅用于 Jev;实际子模型先只经 Magpie(含其中的 GPT/Claude 等模型)。不调用本地 Claude,不调用本机 codex/subscriptions,也不使用 OpenRouter 执行模型。
|
|
10
|
+
|
|
11
|
+
本机缓存显示 Magpie DSH provider ID 为 `dsh-magpie-connect`,model ID 例如 `claude/claude-haiku-5-5`、`codex/gpt-6-luna`。缓存只证明曾发现的目录,不证明当前在线可用或实际 effort 生效。
|
|
12
|
+
|
|
13
|
+
**接入进度**:policy-v2 已接入 `dsh-magpie-connect` 精确 provider/model;Claude/GPT 前缀识别能力家族,其他模型只允许显式选用并从当前目录读取 defaultEffort(两维显式时只验证)。没有自动能力槽时停止,不猜、不回退本地入口。旧策略目录不变;已绑定 Magpie 子会话切回 legacy 后仍使用独立目录恢复。190 项测试与 fake-adapter 官方工具全宿主恢复通过,尚未执行真实 Magpie 模型调用。网关插件是已配置模型入口,不修改其源码或上游。
|
|
14
|
+
|
|
15
|
+
## 最小可执行方案
|
|
16
|
+
|
|
17
|
+
- 固定一个 provider,避免首轮同时混入跨 provider 与 fork 变量;只测官方 ordinary fresh,主组织/验收角色固定。
|
|
18
|
+
- 两个策略:默认 legacy 与显式 policy-v2;每个策略对同样的 6 个合成、独立验收任务执行一次,总计初始 12 个子运行。
|
|
19
|
+
- 任务三类各 2 个:有确定 validator 的机械修改、需要定位根因的调查修复、需约束推理的分析。先写 fixture、测试/验收 oracle,再执行;一半用于开发、一半冻结为 holdout,不因结果修改预期。
|
|
20
|
+
- 每个运行最多一次由主 Agent 明确决定的返工,额外运行也计预算,故最多 24 个子运行。禁止路由器自动升级、自动重试和失败后偷偷换模型。
|
|
21
|
+
- provider 模型与 effort 必须先从当前官方目录/允许列表解析并确认,报告完全展开后的模型 ID,不能只写 Haiku/Sol 等别名。现在不假定任何真实 adapter 可用,也不触碰 subscriptions/MANUAL adapter。
|
|
22
|
+
- 准确模型列表、每模型调用次数、输入/输出上限、美元费用或订阅额度上限必须在执行前提交用户确认。无法获得可约束费用的官方模型入口则停止,不自建兼容 adapter。
|
|
23
|
+
|
|
24
|
+
## 指标
|
|
25
|
+
|
|
26
|
+
每个任务记录:独立验收是否通过、初次/最终通过、返工原因/次数、分类调用耗时与usage、子执行与验收总耗时、可用的实际usage/成本、基础设施错误。缺失字段记 unknown,不记 0;订阅usage不等同美元API价格。
|
|
27
|
+
|
|
28
|
+
以包含返工与验收的总成本/总耗时比较,不能只比较首次选中轻模型。小样本只用于发现明显回归,不据此声称统计最优。是否默认推广需要单独批准。
|
|
29
|
+
|
|
30
|
+
## 不包含
|
|
31
|
+
|
|
32
|
+
部署、发布、GUI现场验证、fork兼容、真实业务数据/会话外发、扩大provider适配层、自动重试系统。通过后再申请单会话 opt-in 现场试运行,不默认全局启用。
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# AUTO routing 外部方案调研(2026-10-24)
|
|
2
|
+
|
|
3
|
+
状态:只读调研,未采纳实现;主会话复核 + gpt-6.1-sol/high 子智能体调研。核心诉求见 routing-intent-and-gaps.md。
|
|
4
|
+
|
|
5
|
+
## 先分清三类自动路由
|
|
6
|
+
|
|
7
|
+
1. 服务网关选模型/供应商:对请求做能力与价格路由,可能改变主模型,不天然符合本项目主模型固定的不变量。
|
|
8
|
+
2. 固定模型调推理预算:最接近本项目主会话,但需处理缓存前缀、模型支持与同回合稳定性。
|
|
9
|
+
3. 编排层委派:决定是否派发、任务边界、worker能力与预算、验收升级;网关分类器无法代替主Agent完成这些决策。
|
|
10
|
+
|
|
11
|
+
## 已复核的一手证据
|
|
12
|
+
|
|
13
|
+
### Anthropic:强主轻子的生产案例,但不保证省token
|
|
14
|
+
|
|
15
|
+
来源:https://www.anthropic.com/research/multi-agent-research-system
|
|
16
|
+
|
|
17
|
+
官方研究系统使用 Opus 4 lead + Sonnet 4 workers;适合多条独立方向的并行研究与上下文压缩,强调任务目标/输出格式/边界/工具指导,以及按最终成果评估。不能将该内部研究评估的收益直接推广到所有编码任务;多agent会增加token消耗,只有收益足够时才值得。
|
|
18
|
+
|
|
19
|
+
Anthropic platform effort/caching文档本次直接抓取存在地区跳转限制。仓库 eval/README.md 的2026-10-21/22来源摘要是历史依据,不能冒充本次全文复核。
|
|
20
|
+
|
|
21
|
+
### OpenAI:effort不是无缓存代价的开关
|
|
22
|
+
|
|
23
|
+
来源:https://developers.openai.com/api/docs/guides/prompt-caching.md
|
|
24
|
+
|
|
25
|
+
官方说明 reasoning.effort 可改变隐藏模型指令;支持GPT-6+模型可以追加 configuration_update、保持顶层原值,以保存既有前缀。是否适用于DSH订阅适配器需单独检查实际协议,不能从API文档直接推断。
|
|
26
|
+
|
|
27
|
+
### LiteLLM:分类 + 运行约束 + 影子评估
|
|
28
|
+
|
|
29
|
+
来源:https://docs.litellm.ai/docs/auto_router
|
|
30
|
+
来源:https://docs.litellm.ai/docs/auto_router/evaluate
|
|
31
|
+
|
|
32
|
+
当前已经有 Auto Router add-on,不能再将LiteLLM仅归为负载均衡。最值得借鉴的是 shadow evaluation:同输入复制请求、盲评实际输出、对比多个策略;官方明确指出 tier标签匹配不等于选中模型答得好。
|
|
33
|
+
|
|
34
|
+
费用核算包括classifier与下游费用,记录fallback和p95;继续回合的对照费用应采用暖缓存,切换后新增cache write应扣除。其按最昂贵配置估算的savings仍是反事实估计,不能等同本项目实测节约。
|
|
35
|
+
|
|
36
|
+
### Magpie:回合稳定、缓存迟滞、可选effort更新
|
|
37
|
+
|
|
38
|
+
项目确认为 https://github.com/yetone/magpie ,不是同名数据集或仅DSH连接器。
|
|
39
|
+
|
|
40
|
+
固定代码:https://github.com/yetone/magpie/tree/f3eb92924e56605860f6a85a3449247c26c0bd90
|
|
41
|
+
|
|
42
|
+
- internal/gateway/rules.go:用户回合开始决策,工具结果继续沿用;上下文超过模型能力等例外另处理。缓存仍暖时保留更高effort,不因新一轮简单就立刻降档;冷却或上下文显著缩短时才允许降低。
|
|
43
|
+
- Pick/Wanted区分实际保留档位与新判断期望,方便展示“推荐值≠生效值”。
|
|
44
|
+
- internal/gateway/effort_update.go:MAGPIE_EFFORT_UPDATES=on的preview才启用,默认关闭;限GPT-6、Responses、OpenAI/ChatGPT账户,并排除某些服务端历史管理/自动截断路径。
|
|
45
|
+
- 超过初始base的升档重设顶层effort;注释声称configuration_update升到高档时实际推理不足。这是上游实测自述,非官方保证,也未由本项目复现。
|
|
46
|
+
- 保存每个thread/account/model的更新位置并重放;历史不匹配、compact或重启可能导致重新缓存。不是只改一个effort字段就能实现。
|
|
47
|
+
|
|
48
|
+
可借鉴:主会话调effort要有缓存意识;判档值与生效值可分离;缓存更新路径需显式支持与能力验证。不可照搬:默认启用preview、假定跨provider都支持、将所有回合只升不降当作永久最优。
|
|
49
|
+
|
|
50
|
+
## Sol 补充核验:官方建议
|
|
51
|
+
|
|
52
|
+
- https://claude.com/resources/articles/claude-model-and-effort-level-in-claude-code :model是能力边界,effort也影响读文件/工具/核验/坚持程度;从模型默认起,把effort当总体偏好。认真尝试仍错可能需强model,漏读/不测/早退可能需更多effort。
|
|
53
|
+
- https://code.claude.com/docs/en/model-config.md :当前Opus/Sonnet/Haiku5.5默认medium;各模型同名effort不等价。
|
|
54
|
+
- https://code.claude.com/docs/en/prompt-caching.md :多数模型不同effort有独立cache;当前Claude Code在部分模型与直API/订阅组合可保cache,但其他后端、禁beta等不适用。这是client×backend×model组合能力,不自动适用于DSH。
|
|
55
|
+
- https://developers.openai.com/api/docs/guides/model-selection.md :用同输入比较模型和effort,选择达到质量要求的最轻配置。
|
|
56
|
+
- https://developers.openai.com/api/docs/guides/reasoning.md :Sol默认medium,high适合复杂调试,xhigh需eval收益;模型在各effort档内已会根据任务自适应。
|
|
57
|
+
- https://learn.chatgpt.com/docs/agent-configuration/subagents.md :主线程管需求/决策/最终交付,子线程做噪音探索并摘要;Sol适合歧义多步,Luna适合窄且可重复任务,显式Luna起high/Astra起low;子agent不是必定更弱。
|
|
58
|
+
|
|
59
|
+
## 社区策略与维护快照
|
|
60
|
+
|
|
61
|
+
2026-10-24约02:09–02:15 Asia/Shanghai,Sol读取GitHub REST repo与commits端点。stars仅关注度;last push/commit不等于质量。下表均为当时值。
|
|
62
|
+
|
|
63
|
+
| 项目 | 关注/维护 | 路由与适用边界 |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| [Magpie](https://github.com/yetone/magpie) | 20,159 stars / 1,547 forks,HEAD f3eb929,10/23 18:05Z提交;9/23建仓,活跃但年轻,maintainers-only PR | 最接近本项目的回合判档与effort缓存问题,但网关不负责拆解/验收 |
|
|
66
|
+
| [LiteLLM](https://github.com/BerriAI/litellm) | 61,909 / 12,608,HEAD 1e6dc81,10/23 18:11Z提交 | 大平台;Auto Router仍Beta/add-on。四档→模型/pool,可用heuristic/LLM/Jev/local Laya;上下文/模态约束、stall escalation、session pin。平台成熟不证明每个路由策略成熟 |
|
|
67
|
+
| [RouteLLM](https://github.com/lm-sys/RouteLLM) | 5,633 / 446,HEAD 0b64fda,最后push 2024-08-10 | 强弱两模型win-rate/阈值路由;MF/Elo/BERT等,强调本域校准。影响力研究基线而非持续维护的新模型产品;旧静态benchmark非长程coding证据 |
|
|
68
|
+
| [DSH Laya](https://github.com/HapyRain/dsh-router-laya) | 25 / 6,HEAD 29624e7,10/17提交 | 本地约846MB分类器+规则,默认同Flash调low/high/max,同回合锁定;故障回low。标签99%与未公开实验不能当端到端收益 |
|
|
69
|
+
| [Neptune810 router](https://github.com/Neptune810/dsh-model-router) | 2 / 3,HEAD 1d1968a,10/04提交 | full/effort/model作用范围,错误/重复升级与降档迟滞;child preferCheap未经质量证明 |
|
|
70
|
+
| [thedeveloper256 router](https://github.com/thedeveloper256/dsh-model-router) | 1 / 0,9/20最后push | root planner/child executor角色配置;当前两者默认均Flash,README与旧description不一致;角色分离不等于实际强主轻子 |
|
|
71
|
+
| [incrhst router](https://github.com/incrhst/dsh-model-router) | 0 / 0,8/31提交 | size/tool/code/关键词分数阈值切Pro/Flash,图片vision;未见验收闭环 |
|
|
72
|
+
| [superboy911 router](https://github.com/superboy911/dsh-model-router) | 4 / 1,9/11最后push | 有序关键词→model+可选effort,无匹配不改;确定规则而非学习型AUTO |
|
|
73
|
+
|
|
74
|
+
社区DSH路由尚无充分证据表明已形成大规模验证的收敛方案;不能把同名repo混为一个热门项目。
|
|
75
|
+
|
|
76
|
+
## OpenRouter Auto 现行策略
|
|
77
|
+
|
|
78
|
+
来源:https://openrouter.ai/docs/guides/routing/routers/auto-router.md (Sol本次读取)
|
|
79
|
+
|
|
80
|
+
当前是轻classifier分约30任务类→最近7日该类真实aggregate spend share排序→cost_tier区间→allow/exclude/tool/modality/ZDR约束下选模型与fallback。不是旧NotDiamond描述;市场支出份额不等于能力评分,cost_tier不等于reasoning effort,也不是纯价格上限。session stickiness有条件:原模型仍须在新任务top候选中。可借鉴约束和实际模型透明度,不能原样替换固定主模型策略。
|
|
81
|
+
|
|
82
|
+
## Magpie进一步代码观察
|
|
83
|
+
|
|
84
|
+
- classify.go/decide.go:普通小模型可intent+effort两个调用并行;Jev可单调用多questions;effort score 0..3映射low/medium/high/xhigh,不同于本项目choice tier再加模型offset。
|
|
85
|
+
- 意图normalized confidence门槛0.4;level低confidence保前级;结果10分钟缓存与inflight合并,失败rest30秒,可保持前intent。
|
|
86
|
+
- 当前上下文含最新请求前3000+后1000runes、前轮user/reply各1000,不含工具结果/推理。
|
|
87
|
+
- https://usemagpie.ai/docs/intent 标记v0.1.99,仍写只看最新消息/不支持group classifier,与固定提交当前代码不同;不能只读旧文档。
|
|
88
|
+
- smart/order/rotate/usage/pace大量处理账户可用性与额度,不应统称质量最优路由。
|
|
89
|
+
|
|
90
|
+
## 对本项目的建议顺序
|
|
91
|
+
|
|
92
|
+
1. **P0 缓存与结果基线**:固定主模型+官方默认effort,与主effort-only、child-model-only、child-effort-only、联合AUTO对照。按窄实现/探索/debug/跨系统设计分层,以独立测试与最终结果为准,计父子/分类/验收/重试/cache总费用、端到端与p95。不要只评tier。
|
|
93
|
+
2. **P1 分离能力与预算**:保留强主轻子;主模型负责规划验收,子模型按任务能力和可验证性选,不因是child就便宜。小模型先用推荐effort起点测,不能未经验证再次降档。
|
|
94
|
+
3. **P1 缓存感知调节**:核验当前DSH实际wire能力,再选择逐轮更新/较稳定默认/自然任务边界/冷却或compact后的降档迟滞;不照搬Magpie五分钟。
|
|
95
|
+
4. **P2 验收与升级**:能力失败与429/timeout分开;根据失败原因补上下文/加effort/换model,设上限与停止条件。现有Jev失败退出AUTO/暂停委派契约不能静默换成low fallback。
|
|
96
|
+
5. **P2 可观测与影子对照**:展示判档与生效配置、缓存/费用/升级原因;真实shadow output有对照价值但额外花钱,推荐值或理论估费不等实际效果。
|
|
97
|
+
|
|
98
|
+
未安装外部项目、未执行付费基准、未更改运行配置。以上外部收益数字均未独立复现;实施仍需单独确认规范与验收条件。
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# AUTO routing:核心诉求与待补差距
|
|
2
|
+
|
|
3
|
+
记录时间:2026-10-24(Asia/Shanghai)。状态:需求回顾与调研,不是已批准实施方案;不修改现行运行规范、0.3.0 默认行为或生产配置。
|
|
4
|
+
|
|
5
|
+
## 用户核心诉求(后续方案的验收方向)
|
|
6
|
+
|
|
7
|
+
1. 决策配置遵循 Anthropic 与 OpenAI 对具体模型用途、effort、委派和成本优化的官方建议;区分官方支持能力、官方推荐和本项目经验策略,不将自定义四档表称为官方标准。
|
|
8
|
+
2. 主会话保留用户选择的 provider/model,只调整 effort。保留主模型的理由包括行为/上下文连续性与减少缓存扰动;不承诺改变 effort 一定保留缓存,须按实际适配器核验。
|
|
9
|
+
3. 强主模型承担理解、拆解、协调与验收;适宜的执行任务交给较轻量子模型。不因缺乏跨模型评估而简单退回“所有子会话默认使用强主模型”,也不把所有小事都委派。
|
|
10
|
+
4. AUTO 的目标是质量、速度、总开销的平衡,避免一律最高或最低配置。总开销包括判档、上下文移交、worker 执行、主模型复核与失败重试。
|
|
11
|
+
5. 用户记得曾要求“主模型让简单子模型干活”:当前环境级指令确有委派场景指导,但不是所有简单任务强制委派;后续应补齐与独立插件一致的执行边界。
|
|
12
|
+
|
|
13
|
+
## 当前证据
|
|
14
|
+
|
|
15
|
+
- 当前规范:[主仓规范](https://github.com/prgrmrwy/ohmydsh/blob/main/openspec/specs/auto-model-routing/spec.md)(本节是历史调研快照,不代表当前默认策略),固定主模型、共享四档 rubric、childRoutes 与派发规则。
|
|
16
|
+
- 默认主模型起点与偏移:../src/effort.ts;Claude 子表 Haiku/Sonnet/Opus/Opus;GPT 子表 Luna/Sol/Sol/Sol。
|
|
17
|
+
- 子工具:../src/subagent-tool.ts,单独判断子任务;指定模型时只调 effort;校验目录与允许列表。
|
|
18
|
+
- 包内指导:../skills/subagent-model-routing/SKILL.md,主要约束选模、调用与复用;是否派发的场景主要位于 [主仓环境指令](https://github.com/prgrmrwy/ohmydsh/blob/main/instructions/dsh-home.md)(可选背景,不是插件加载依赖)。历史提交 14d68627(2026-10-22)已明确加入较大编码、独立复核、大量探索、可并行工作的派发规则,以及小修复/讨论不派发;这确认用户记忆中的委派要求确实曾落地,但不是所有简单任务强制派发。
|
|
19
|
+
- 来源与评估范围:../eval/README.md,现有回归是判档一致性,不是最终任务质量/速度/费用基准。
|
|
20
|
+
|
|
21
|
+
## Gap 与建议(待调研校准,不是实施授权)
|
|
22
|
+
|
|
23
|
+
| Gap | 影响 | 建议与验证 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| 同一难度标签同时决定模型能力档与effort | simple 可能同时降到小模型与低effort,不能由“强模型轻松做”推导“小模型低预算可靠做” | 保留轻量worker;分开能力适配与推理预算,以所选模型官方起点为基线,再验证偏移;不急于增加第二次网络判档 |
|
|
26
|
+
| 固定model被误当作缓存保持保证 | Claude顶层effort可能影响前缀,省下输出费用但新增缓存写入 | 检查当前Claude/GPT适配器与官方文档;记录cache read/write和总延迟;比较稳定effort与逐轮effort策略 |
|
|
27
|
+
| 缺少是否值得委派的成本边界 | 一行任务派发可能比主模型直接做更慢更贵 | 主Agent依据任务独立性、工作量、移交成本与可验证性决定派发;不要“simple必委派” |
|
|
28
|
+
| 独立插件与个人环境指导不完全相同 | 安装工具/skill不保证强主轻子的工作方式真正执行 | 明确包内最小派发/复核指导及尽力而为边界,真实Host验证,不宣称强制拦截 |
|
|
29
|
+
| 缺少结果验收与质量失败升级闭环 | 弱配置可能持续重试,最终成本反增 | 区分工具/网络故障与推理失败;定义验收、有限重试与能力升级策略,尊重用户固定模型约束 |
|
|
30
|
+
| 官方推荐与经验配置边界不清 | 默认表随模型更新失效,用户误以为有官方保障 | 维护版本化来源、适用任务、支持effort、推荐起点;将自行推导明确标注为待评估预设 |
|
|
31
|
+
| 没有端到端收益证据 | 分类准确不等于任务成功或省钱 | 同任务比较固定高配置、固定推荐配置、当前AUTO及候选AUTO;记录独立通过率、全链路耗时/费用与重试次数 |
|
|
32
|
+
|
|
33
|
+
## 修订后的优先级与职责边界
|
|
34
|
+
|
|
35
|
+
以用户后续确认的 [策略与推进计划](routing-strategy-plan.md) 为准:
|
|
36
|
+
|
|
37
|
+
1. 先明确该怎么 route,再把决策说清楚交给 Jev;不能让现有四档输出反向定义策略。
|
|
38
|
+
2. Agent 保留拆解、派发、协作、验收权;AUTO 补齐资源选择与实际生效;Jev 负责有限范围的能力/深度判断。
|
|
39
|
+
3. 分开子模型能力与 effort,保留强主轻子;不因轻量模型而自动再次降低其 effort。
|
|
40
|
+
4. 补齐创建路径 gap:当前 subagent 暴露模型与 effort 参数,fork/teammate 未暴露。返回推荐不等于成功路由,须检查正式接入点并验证实际请求;不能把主 Agent 自选当作所有路径都可用的替代方案。
|
|
41
|
+
5. 分别验证策略质量、Jev 判断忠实度、宿主接入正确性。
|
|
42
|
+
|
|
43
|
+
本轮按用户范围约定排除 dsh-plugin-subscriptions 与 MANUAL 改造,缓存/适配器实验不再是前置事项。上表与下节缓存内容保留为历史证据和评估限制,不构成本轮实施要求,也不宣称固定模型必保缓存。此范围约定不表示订阅适配器在技术上只运行于 MANUAL。
|
|
44
|
+
|
|
45
|
+
## 已独立核验的缓存证据
|
|
46
|
+
|
|
47
|
+
- [OpenAI Prompt caching](https://developers.openai.com/api/docs/guides/prompt-caching.md)(2026-10-24读取):request-level reasoning.effort 可以改变模型侧指令;支持的 GPT-6+ 模型通过追加 configuration_update 并保持顶层原值来保留早先前缀。这是 API 能力,不证明当前 DSH/订阅适配器已支持。
|
|
48
|
+
- [Magpie rules.go](https://github.com/yetone/magpie/blob/main/internal/gateway/rules.go)(2026-10-24读取 main,可变引用):同回合保持决策;keepsEffort 在缓存仍暖时阻止降 effort,但允许升档,缓存过冷或上下文缩小至一半以下时允许降档;区分 Pick 与 Wanted,注释说明支持 effort updates 的路径可使用 Wanted。项目注释中的缓存命中观测是上游自述,不是本项目复现结果。它是可借鉴的缓存策略,不能直接抄作所有 provider 的普遍规律。Sol 后续对固定提交 f3eb92924e56605860f6a85a3449247c26c0bd90 的检查指出,effort_update.go 的更新通路为 MAGPIE_EFFORT_UPDATES=on 显式启用的 preview,默认关闭,限 GPT-6/OpenAI或ChatGPT账户/Responses;不能将源码出现 takesEffortUpdates 解读为所有部署默认具备缓存保持能力。
|
|
49
|
+
|
|
50
|
+
## 官方强主轻子的适用边界
|
|
51
|
+
|
|
52
|
+
[Anthropic 多智能体研究系统](https://www.anthropic.com/research/multi-agent-research-system)(2026-10-24全文读取)描述 Opus 4 lead + Sonnet 4 workers,在其内部研究评估优于单 Opus 4;这是特定研究系统结果,不是本项目收益证明,也不是所有 coding 都适合多agent的结论。文章强调并行独立方向、上下文压缩、清晰任务边界与最终结果评估;同时指出多agent显著增加token,编码任务往往比研究更难并行。应采用其编排与验收原则,不直接复制旧代模型组合或收益百分比。
|
|
53
|
+
|
|
54
|
+
## 外部调研
|
|
55
|
+
|
|
56
|
+
已由 gpt-6.1-sol/high 完成官方指引、维护/热度较高社区路由与 yetone/magpie 策略调研,主会话复核了OpenAI缓存、Anthropic研究编排、LiteLLM评估与Magpie更新路径。详见 [调研记录](routing-community-research-2026-10-24.md)。结果区分官方文档、代码事实、项目自述与未经复现的效果声明;热度不等于效果,不把调研建议直接写为现行spec。
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# AUTO 路由策略与推进计划(修订版)
|
|
2
|
+
|
|
3
|
+
日期:2026-10-24。状态:已确认职责方向的设计草案,具体规则和宿主接入待验证;不是实施或部署记录,不改变现行规范与运行行为。
|
|
4
|
+
|
|
5
|
+
## 1. 核心定位
|
|
6
|
+
|
|
7
|
+
尊重 Agent 的任务组织权;AUTO 补齐资源选择与实际生效能力;Jev 按明确的策略快速判断。先讨论什么决定是正确的,再设计决策问题,最后优化判断性能。不能因 Jev 支持四档就反推策略必须是四档。
|
|
8
|
+
|
|
9
|
+
| 责任方 | 负责 | 不负责 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| 主 Agent / Team Lead | 理解目标、决定是否派发、拆解任务、选择协作形式、定义验收、整合与失败处置 | 不要求它通过没有模型参数的接口完成资源选配 |
|
|
12
|
+
| AUTO | 主会话 effort、子任务 model 与 effort 的独立选择,确定性约束,以及在支持的宿主路径实际生效 | 不重新实现团队任务调度、消息与任务板,不替代主模型验收 |
|
|
13
|
+
| Jev | 按已明确的策略判断当前工作的能力需求和推理投入 | 不制定目标权衡、不拆整个项目、不判断未经执行的任务已成功 |
|
|
14
|
+
| 宿主接入与确定性代码 | 模型目录/允许列表、显式选择优先级、映射、决策绑定、实际请求核验 | 不把推荐结果当作已生效结果 |
|
|
15
|
+
|
|
16
|
+
## 2. 范围与不变量
|
|
17
|
+
|
|
18
|
+
- 主会话保留用户选择的 provider/model,只调整 effort。
|
|
19
|
+
- 适宜任务交给较轻量 worker,但不要求所有子任务都降模;复杂调查和独立审查可使用强模型。
|
|
20
|
+
- 不改变 MANUAL 的继承/选择行为。本轮按用户范围约定排除 dsh-plugin-subscriptions,不调查或修改它,不以其缓存实验作为前置条件。此处是范围约定,不是宣称该适配器在技术上仅运行于 MANUAL。
|
|
21
|
+
- 不替换 Jev,不引入多分类器,不改底层缓存协议,不自动发布或部署。
|
|
22
|
+
- 保留同回合稳定与显式用户约束;Jev 失败沿用现有可见退出/暂停契约,不静默降档。
|
|
23
|
+
- 缓存影响保留为评估限制,不承诺固定模型或调 effort 必然保缓存。
|
|
24
|
+
- 本轮讨论 Teams 支持不等于授权启动团队。
|
|
25
|
+
|
|
26
|
+
## 3. 策略草案
|
|
27
|
+
|
|
28
|
+
### 3.1 工作组织交给 Agent
|
|
29
|
+
|
|
30
|
+
任务能独立描述、执行和验收,且并行/上下文隔离收益超过移交与复核成本时考虑派发。小修复、紧密依赖当前上下文的讨论留在主线程。不另设一个 Jev“是否组队”分类器。
|
|
31
|
+
|
|
32
|
+
### 3.2 主会话 effort
|
|
33
|
+
|
|
34
|
+
以官方推荐起点为默认参照,按当前承担的认知工作调整,而非整个项目大小。明确低推理需求可降低;复杂取舍、原因分析和结果冲突可提高;信息不足时不强行偏移。同回合稳定。具体档位、映射和未知输入处理在后续决策契约中定义;暂不增加只升不降、固定冷却等状态机。
|
|
35
|
+
|
|
36
|
+
### 3.3 子模型能力与 effort 分离
|
|
37
|
+
|
|
38
|
+
先选择有合理把握胜任任务的模型能力,再确定推理投入。轻量模型先以其官方推荐 effort 起点验证,不自动再次降低 effort。可验证性越强,越可积极试用轻量模型;风险通过权限、验收和确认控制,不直接当作推理难度。
|
|
39
|
+
|
|
40
|
+
- 明确、成熟、可直接验证的执行任务:优先轻量模型。
|
|
41
|
+
- 范围可控但需要探索推断的任务:选择足够能力的模型。
|
|
42
|
+
- 歧义大、多步推断、困难调试、独立审查:允许强模型。
|
|
43
|
+
|
|
44
|
+
这不是新的三档 rubric,也不意味着必须两次调用 Jev;输出维度与请求次数分别设计。
|
|
45
|
+
|
|
46
|
+
### 3.4 验收与升级
|
|
47
|
+
|
|
48
|
+
主模型依据执行证据验收。描述不清先补描述,缺信息先补上下文,漏核验/浅尝辄止考虑加 effort,充分尝试仍失败考虑更强子模型。网络与限流不视为能力不足。升级有预算和停止条件,具体上限在规则确认阶段确定,不通过初始分类自动断言成功。
|
|
49
|
+
|
|
50
|
+
## 4. 创建路径的真实能力差异
|
|
51
|
+
|
|
52
|
+
以下仅依据当前会话暴露的工具 schema,不代表所有宿主版本,也不证明已经找到扩展点:
|
|
53
|
+
|
|
54
|
+
| 路径 | 当前创建接口 | 现有“推荐后传参”是否够用 | 后续必须验证 |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| subagent | 暴露 provider/model/reasoning_effort | 接口上可表达,仍需核验实际生效 | 传参、显式指定优先级、实际请求配置 |
|
|
57
|
+
| subagent_fork | 未暴露上述参数 | 不够 | 官方创建/首次请求扩展点,继承与前缀限制 |
|
|
58
|
+
| spawn_teammate | 未暴露上述参数 | 不够 | 官方扩展点、任务到成员的绑定、首个请求配置 |
|
|
59
|
+
|
|
60
|
+
AUTO 的关键增量是补出默认继承路径上的异构执行能力,而非仅让主 Agent 重复一次它已能表达的选择。主 Agent 能决定派发,不等于创建接口允许它选择资源。
|
|
61
|
+
|
|
62
|
+
不得以 route_subagent 返回了推荐就声称 Teams/fork 已覆盖。没有可靠接入点的路径明确标为不支持;不静默绕过用户限制。长驻 teammate 的创建时选配与后续换任务重选分开设计,首版不默认每条消息重路由。
|
|
63
|
+
|
|
64
|
+
## 5. 策略演练案例
|
|
65
|
+
|
|
66
|
+
| 场景 | 组织方式 | 资源策略与理由 |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| 上下文齐全的一行修改 | 主模型直接做 | 派发成本高于收益;低推理需求可降低 effort |
|
|
69
|
+
| 规则明确且有测试的批量迁移 | Agent 划分独立任务 | 轻量 worker + 推荐 effort 起点;量大不等于能力要求高 |
|
|
70
|
+
| 明确字段提取并附来源 | 独立子任务 | 轻量优先,主模型核验来源与格式 |
|
|
71
|
+
| 冲突资料的因果判断 | 独立调查或主模型 | 足够强的模型,按深度加 effort |
|
|
72
|
+
| 未知原因的跨模块 bug | 主模型组织调查 | 不默认降模;并行假设由 Agent 决定 |
|
|
73
|
+
| 复杂实现后的独立 review | 独立 reviewer | 以审查能力为先,不因子任务身份降模 |
|
|
74
|
+
| 多个结果的整合 | 主模型 | 按冲突和整合难度,不继承项目总难度 |
|
|
75
|
+
| 高后果的简单操作 | 主模型控制权限和验收 | 风险不直接映射高 effort |
|
|
76
|
+
|
|
77
|
+
## 6. 修订后的推进顺序
|
|
78
|
+
|
|
79
|
+
1. **策略定稿**:用以上案例与反例确认派发边界、模型能力、effort、未知情况与升级规则。此阶段不先改 rubric。
|
|
80
|
+
2. **Jev 决策契约**:分别定义主会话与子任务的输入、问题、输出、信息不足处理及确定性映射。主回合只能依赖本轮推理前已有信号;子任务可使用主模型已经写清的目标、范围、输出和验收。
|
|
81
|
+
3. **宿主能力核验**:只读检查三条创建路径的正式扩展点,明确能覆盖的路径及实现边界。此项与策略细化可并行,但不以宿主接口反推策略。
|
|
82
|
+
4. **创建独立 OpenSpec change**:将确认策略、接入范围和验收条件写为提案,与既有发布 change 分开;再进入实现。
|
|
83
|
+
5. **实现与分层验证**:先离线契约与路由集成测试,再经明确预算的小规模真实任务对照;验证实际模型与 effort,而非只验证推荐。
|
|
84
|
+
6. **根据证据决定上线**:保留回滚与原继承行为,未通过验收不替换默认策略。
|
|
85
|
+
|
|
86
|
+
## 7. 分开验证三件事
|
|
87
|
+
|
|
88
|
+
- **策略质量**:假设每次都正确执行策略,任务最终质量、总消耗和耗时是否改善?保留独立任务集,包含验收与重试成本。
|
|
89
|
+
- **Jev 忠实度**:是否按已确认策略作出期望判断?单独测错误类型、稳定性、分类成本与延迟。快速判断不等于正确策略。
|
|
90
|
+
- **接入正确性**:每种支持的创建路径是否真正使用选定 model/effort?MANUAL、显式指定、同回合稳定、失败与不支持路径是否符合契约?
|
|
91
|
+
|
|
92
|
+
Jev 的价值不仅是体验和性能;误判会损害质量。但策略质量不能用 Jev 标签一致率代替,接入正确性也不能用推荐输出代替。
|
|
93
|
+
|
|
94
|
+
## 8. 参考与当前规范
|
|
95
|
+
|
|
96
|
+
- [核心诉求与差距](routing-intent-and-gaps.md)
|
|
97
|
+
- [外部调研](routing-community-research-2026-10-24.md):历史调研建议,实施优先级以本修订为准。
|
|
98
|
+
- [现行规范](https://github.com/prgrmrwy/ohmydsh/blob/main/openspec/specs/auto-model-routing/spec.md):仍描述当前行为,本稿不静默替换它。
|
|
99
|
+
- [Claude Code model configuration](https://code.claude.com/docs/en/model-config.md):opusplan 是规划阶段 Opus、执行阶段 Sonnet,不等于固定强主监督轻子。
|
|
100
|
+
- [Claude Code subagents](https://code.claude.com/docs/en/sub-agents.md):主模型根据职责描述委派。
|
|
101
|
+
- [Claude Code Agent Teams](https://code.claude.com/docs/en/agent-teams.md):Lead 组织共享任务与协作,不天然保证异构模型或低成本。
|
package/lib/client/control.d.ts
CHANGED
|
@@ -22,13 +22,21 @@ export interface Decision {
|
|
|
22
22
|
confidence?: number;
|
|
23
23
|
probabilities?: Record<string, number>;
|
|
24
24
|
ms: number;
|
|
25
|
+
depth?: string;
|
|
26
|
+
capability?: string;
|
|
27
|
+
capabilityConfidence?: number;
|
|
28
|
+
capabilityProbabilities?: Record<string, number>;
|
|
29
|
+
decisionProvider?: string;
|
|
30
|
+
decisionModel?: string;
|
|
31
|
+
provider?: string;
|
|
32
|
+
status?: string;
|
|
25
33
|
}
|
|
26
34
|
export interface Toast {
|
|
27
35
|
id: number;
|
|
28
36
|
lines: string[];
|
|
29
37
|
}
|
|
30
38
|
export declare const TOAST_MS = 3000;
|
|
31
|
-
/**
|
|
39
|
+
/** Shared by the persistent hover panel and transient decision hint. */
|
|
32
40
|
export declare function toastText(d: Decision): string[];
|
|
33
41
|
/** A hint is shown only for a decision id not seen before (it is hidden TOAST_MS later by the chip). */
|
|
34
42
|
export declare function nextToast(seen: number | undefined, d: Decision | undefined): Toast | undefined;
|