dsh-auto-model-routing 0.3.0 → 0.4.0
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 +11 -0
- package/README.md +56 -25
- package/README.zh.md +56 -25
- 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 +69 -0
- package/lib/feedback.js +65 -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/package.json +3 -3
- package/skills/subagent-model-routing/SKILL.md +15 -0
- package/lib/selection-projection.d.ts +0 -8
- package/lib/selection-projection.js +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
- Upgrade AUTO by default: keep the main model fixed, independently judge child capability and reasoning investment, and enforce exact fresh-child bindings with persisted replay. Preserve explicit legacy rollback and MANUAL behavior.
|
|
6
|
+
- Add TypeSafe, Concentrate and custom System One decision services with separate credentials, preset model menus and explicit public-sample connection testing.
|
|
7
|
+
- Expose executable strategy details, candidate distributions, normalized Choice certainty and actual application status; no task-quality or savings claims.
|
|
8
|
+
- Restore per-reply allocation feedback with immutable evaluation snapshots, request-event correlation, timestamped change/cancel events and legacy-record compatibility.
|
|
9
|
+
- Refresh bilingual user documentation; label earlier GIFs as legacy mock-host demonstrations. Fork and real-provider teammate acceptance remain unsupported/unverified as documented.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
- Accept the DSH 0.2 host's React 18.3.1 as well as React 19 in the runtime peer declaration; client builds continue to use the host's shared React instance.
|
|
13
|
+
|
|
3
14
|
## 0.3.0
|
|
4
15
|
|
|
5
16
|
- Publish as a standalone DSH bundle with the companion `subagent-model-routing` skill included.
|
package/README.md
CHANGED
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
English · [简体中文](README.zh.md)
|
|
4
4
|
|
|
5
|
-

|
|
6
|
-
|
|
7
5
|
<!-- problem -->
|
|
8
|
-
|
|
6
|
+
Keep the main model you chose; let AUTO select reasoning investment for each turn and suitable resources for fresh sub-agents. Jev judges **capability and effort independently**. DSH applies the route, and the UI distinguishes a decision from a configuration that actually reached a request.
|
|
9
7
|
|
|
10
|
-
**Install.** DSH `0.2.0-rc.2`, Node.js `>=22.19`.
|
|
8
|
+
**Install.** Tested with DSH `0.2.0-rc.2`, Web UI, Node.js `>=22.19`.
|
|
11
9
|
|
|
12
10
|
```sh
|
|
13
11
|
dsh plugin --profile web add dsh-auto-model-routing
|
|
@@ -15,40 +13,69 @@ dsh plugin --profile web add dsh-auto-model-routing
|
|
|
15
13
|
dsh plugin --profile web add prgrmrwy/dsh-auto-model-routing
|
|
16
14
|
```
|
|
17
15
|
|
|
18
|
-
Restart DSH
|
|
19
|
-
|
|
20
|
-
In [ohmydsh](https://github.com/prgrmrwy/ohmydsh), enable only the local `auto-model-routing` entry and run `dsh build`; no separate skill customization is needed.
|
|
16
|
+
Restart DSH and refresh the Web page. In **Settings → 自动模型路由**, choose a decision service, save its API key, and use **测试连接** with a fixed public sample. New chats default to **MANUAL**; click the chip to use AUTO. The companion delegation skill is included—no separate skill installation is needed.
|
|
21
17
|
|
|
22
18
|
## Use
|
|
23
19
|
|
|
24
20
|
| Where | What you do |
|
|
25
21
|
|---|---|
|
|
26
|
-
| **AUTO / MANUAL chip
|
|
27
|
-
| **Decision hint** |
|
|
28
|
-
| **Gauge button**
|
|
29
|
-
| **Settings → 自动模型路由** |
|
|
22
|
+
| **AUTO / MANUAL chip**, left of the model picker | Click to switch. Hover for the decision, candidate distribution, certainty, model/effort and application status. |
|
|
23
|
+
| **Decision hint** | Shows new decisions briefly; its Settings switch does not hide the hover panel. |
|
|
24
|
+
| **Gauge button** below an eligible reply | Mark the allocation appropriate, too high, too low or unknown; change or clear your feedback later. Only replies bound to an applied main decision qualify. |
|
|
25
|
+
| **Settings → 自动模型路由** | Choose service/model, manage its separate key, test the connection, set defaults/cap/deadline, or expand **查看决策策略** to inspect the actual rubric and model slots. |
|
|
26
|
+
|
|
27
|
+
### Main model stays fixed; children are selected separately
|
|
28
|
+
|
|
29
|
+
- **Main chat:** `lower / baseline / higher` moves at most one supported effort step below/at/above the model's verified recommended starting point. The cap defaults to `xhigh`; AUTO never selects `max`. It does not change the main provider/model or write global model defaults.
|
|
30
|
+
- **Fresh children:** capability is `bounded / analytical / frontier`; effort is judged separately. Claude slots are Haiku / Sonnet / Opus 5.5; GPT slots are Luna / Sol / Sol. The current catalog, supported efforts and official child allowlist must all permit the route. Magpie uses its exact provider and full family-prefixed model IDs, not a fallback to local transports.
|
|
31
|
+
- **Explicit choices win:** specifying a model or effort leaves only the other dimension to judge. Specifying both skips Jev and validates the route. Missing task scope stops delegation rather than guessing.
|
|
32
|
+
- **Official creation binds the route:** fresh `subagent` and fresh `spawn_teammate` paths bind an exact child identity before its first request. `route_subagent` is an optional preview—not proof of application and not a user constraint to copy into a subsequent call. Fork and unbound creation paths are unsupported; there is no silent substitution.
|
|
33
|
+
- **Resume keeps the initial route.** Switching the root to MANUAL stops new judgments; already bound children retain their initial route. `applied` means the actual request configuration matched, **not** that the task succeeded. Real Magpie Claude/GPT ordinary calls were tested; fresh teammate routing and cold resume have mock-host coverage, not real-provider teammate acceptance.
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
### Choose the decision service
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
| Service | Endpoint | Default model | Credential reference |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| OpenRouter (default, preserves existing installations) | `https://openrouter.ai/api/alpha/decisions` | `typesafe/jev-1.13` | `OPENROUTER_API_KEY` |
|
|
40
|
+
| TypeSafe | `https://api.typesafe.ai/v1/systemone` | `jev-1.13.0` | `TYPESAFE_API_KEY` |
|
|
41
|
+
| Concentrate | `https://api.concentrate.ai/v1/systemone` | `jev-1.13.0` | `CONCENTRATE_API_KEY` |
|
|
42
|
+
| Custom System One | Your full endpoint | Editable | `AUTO_DECISION_CUSTOM_API_KEY` |
|
|
34
43
|
|
|
35
|
-
|
|
44
|
+
Preset model menus expose documented versions, not live availability guarantees. Custom services keep an editable model ID and must support `state + questions → answers`; an OpenAI chat-completions endpoint alone is not compatible. Custom endpoints require HTTPS (loopback HTTP is allowed), reject URL credentials/query/fragment and redirects. Only configure endpoints you trust with the dedicated key. TypeSafe and Concentrate have contract/mock coverage; their live authentication and regional availability were not verified here. No service failover occurs automatically.
|
|
45
|
+
|
|
46
|
+
**Certainty is not the selected probability.** Choice certainty is `(pmax − 1/n) / (1 − 1/n)`: with three candidates, a 70% top probability gives 55% certainty. The panel shows the service's returned certainty and full candidate distribution separately, including returned zeroes; missing values are marked unavailable. Neither number is task success rate.
|
|
36
47
|
|
|
37
48
|
## Good to know
|
|
38
49
|
|
|
39
|
-
- **
|
|
40
|
-
- **
|
|
41
|
-
- **
|
|
42
|
-
- **
|
|
43
|
-
- **
|
|
44
|
-
- **
|
|
50
|
+
- **Failures are visible.** Main judgment failure disables AUTO with a reason; child judgment/route failure stops dispatch. No local classifier, automatic retry, upgrade or cross-service fallback.
|
|
51
|
+
- **MANUAL stops adjustments, not history.** It does not restore an earlier effort. The official current selection remains in control; existing bound children keep their route while the plugin is enabled.
|
|
52
|
+
- **Data leaves the machine.** AUTO sends shape-redacted task text (up to 8000 characters) and short previous-turn excerpts to your chosen service. Redaction is best effort, not a guarantee that all secrets are removed. Test Connection sends only a fixed public sample and can incur a small charge.
|
|
53
|
+
- **Keys use official DSH credentials**, never plugin configuration. Launch-environment keys take precedence and are read-only. Service changes clear key drafts; save the service before managing its separate key. Changing a custom endpoint does not create a new credential namespace—review the key before trusting a new host.
|
|
54
|
+
- **Local state:** configuration is under `$DSH_HOME/plugins/dsh-auto-model-routing/`; mode, child routes and feedback are under `$DSH_HOME/state/auto-model-routing/`. Feedback stores resource metadata, IDs, versions, returned distributions and timestamps—not task/reply text. Request event IDs allow later usage correlation; costs are not fabricated when unavailable. See [feedback and evaluation](docs/feedback-evaluation.md).
|
|
55
|
+
- **No automatic learning.** Human allocation feedback is observational. It does not change routing or prove quality/cost benefits. Old messages without decision bindings are not backfilled; old records with missing evaluation fields remain unknown.
|
|
56
|
+
- **Upgrade:** existing AUTO sessions use the new policy without a version switch or rewriting their stored mode. New chats still default to MANUAL unless configured otherwise. Historical four-tier mappings remain only for explicit `policy: "legacy"` rollback in plugin configuration; they are not the current policy or feedback menu.
|
|
45
57
|
|
|
46
58
|
## Architecture
|
|
47
59
|
<!-- section: architecture -->
|
|
48
60
|
|
|
49
|
-
|
|
61
|
+
```text
|
|
62
|
+
user turn → pre-step → selected Jev service → depth → main request effort
|
|
63
|
+
fresh child creation → exact child binding → capability + depth → validated route
|
|
64
|
+
request/header → configuration match → applied evidence
|
|
65
|
+
assistant message → immutable decision snapshot → human feedback events
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Entry: [index.ts](src/index.ts). Enforcement: [policy-host.ts](src/policy-host.ts). Actual rubric: [policy-v2-rubric.json](src/policy-v2-rubric.json). Model slots: [policy-v2.ts](src/policy-v2.ts). UI: [client](src/client/index.ts). Coverage and limitations: [development verification](docs/policy-v2-development.md), [real Magpie acceptance](docs/magpie-live-acceptance.md).
|
|
50
69
|
|
|
51
|
-
|
|
70
|
+
<details>
|
|
71
|
+
<summary>Earlier four-tier UI demos (legacy rollback only)</summary>
|
|
72
|
+
|
|
73
|
+
These isolated-host recordings use mock Jev/model responses and show the previous UI, not the current default policy.
|
|
74
|
+
|
|
75
|
+

|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
</details>
|
|
52
79
|
|
|
53
80
|
## Development
|
|
54
81
|
|
|
@@ -58,11 +85,15 @@ npm run typecheck
|
|
|
58
85
|
npm run build
|
|
59
86
|
```
|
|
60
87
|
|
|
61
|
-
Tests use the
|
|
88
|
+
Tests use the official AgentLoop with fake LLM streams and mock/loopback Jev responses, not paid model calls. `scripts/label-report.mjs` reports **legacy tier labels only**; it is not a report for new allocation feedback. Evaluation schema and deduplication rules are in [feedback-evaluation.md](docs/feedback-evaluation.md).
|
|
62
89
|
|
|
63
|
-
|
|
90
|
+
The [current specification](https://github.com/prgrmrwy/ohmydsh/blob/main/openspec/specs/auto-model-routing/spec.md) lives in the source monorepo. The bundled [delegation skill](skills/subagent-model-routing/SKILL.md) supplies guidance; enforcement belongs to the official host hooks, not the prompt. No measured task-quality or token-savings claim is made.
|
|
64
91
|
|
|
65
92
|
## Removal
|
|
66
93
|
<!-- section: removal -->
|
|
67
94
|
|
|
68
|
-
|
|
95
|
+
```sh
|
|
96
|
+
dsh plugin --profile web remove dsh-auto-model-routing
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Restart DSH and refresh the page. The plugin's skill/tools and request hooks disappear; settings and logs remain. Without the plugin, child replay is no longer enforced and host restoration uses the original creation configuration. In [ohmydsh](https://github.com/prgrmrwy/ohmydsh), disable the local entry and rebuild instead.
|
package/README.zh.md
CHANGED
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) · 简体中文
|
|
4
4
|
|
|
5
|
-

|
|
6
|
-
|
|
7
5
|
<!-- problem -->
|
|
8
|
-
|
|
6
|
+
主模型由你选,AUTO 为每轮选择推理投入,并为 fresh 子任务选配资源。Jev **独立判断能力需求和投入**,DSH 验证并应用配置;界面区分“做出了判断”和“实际请求已生效”。
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
**安装**:已验证 DSH `0.2.0-rc.2`、Web UI,Node.js `>=22.19`。
|
|
11
9
|
|
|
12
10
|
```sh
|
|
13
11
|
dsh plugin --profile web add dsh-auto-model-routing
|
|
@@ -15,40 +13,69 @@ dsh plugin --profile web add dsh-auto-model-routing
|
|
|
15
13
|
dsh plugin --profile web add prgrmrwy/dsh-auto-model-routing
|
|
16
14
|
```
|
|
17
15
|
|
|
18
|
-
重启 DSH
|
|
19
|
-
|
|
20
|
-
在 [ohmydsh](https://github.com/prgrmrwy/ohmydsh) 中只需启用 local `auto-model-routing` 条目并运行 `dsh build`,不再单独启用 skill 条目。
|
|
16
|
+
重启 DSH 并刷新页面,到**设置 → 自动模型路由**选择决策服务、保存对应 API key,点击**测试连接**发送固定公开样例。新会话缺省 **MANUAL**,点击芯片切换 AUTO。配套委派 skill 已包含,无需单独安装。
|
|
21
17
|
|
|
22
18
|
## 使用
|
|
23
19
|
|
|
24
20
|
| 位置 | 操作 |
|
|
25
21
|
|---|---|
|
|
26
|
-
| **AUTO / MANUAL 芯片**(模型选择器左侧) |
|
|
27
|
-
| **判档提示** |
|
|
28
|
-
| 回复下方的**仪表按钮** |
|
|
29
|
-
| **设置 → 自动模型路由** |
|
|
22
|
+
| **AUTO / MANUAL 芯片**(模型选择器左侧) | 点击切换;悬停查看判断、候选分布、确定度、模型与投入、生效状态 |
|
|
23
|
+
| **判档提示** | 短暂显示新决策;关闭设置中的提示开关不会隐藏悬浮面板 |
|
|
24
|
+
| 回复下方的**仪表按钮** | 评价分配合适、投入偏高、投入不足或无法判断,支持修改和撤销;仅对绑定已应用主决策的回复显示 |
|
|
25
|
+
| **设置 → 自动模型路由** | 选择服务与模型、管理独立 key、测试连接、设置模式/强度上限/等待时间;展开**查看决策策略**查看实际判据与模型槽 |
|
|
26
|
+
|
|
27
|
+
### 主模型不换,子任务独立选配
|
|
28
|
+
|
|
29
|
+
- **主会话**:`lower / baseline / higher` 相对于具体模型已验证的推荐起点,在受支持序列降低一档、保持或提高一档。缺省上限 `xhigh`,自动不选 `max`;不修改主 provider/model,也不改写全局模型默认值。
|
|
30
|
+
- **fresh 子任务**:能力需求为 `bounded / analytical / frontier`,推理投入独立判断。Claude 能力槽为 Haiku / Sonnet / Opus 5.5;GPT 为 Luna / Sol / Sol。实际路由必须同时满足当前目录、支持的 effort 和官方子智能体允许列表。Magpie 保留真实 provider 与家族前缀完整模型 ID,不回退到本地入口。
|
|
31
|
+
- **尊重显式选择**:只指定模型或投入时,仅判断另一维;两者都指定则不请求 Jev,只校验路由。缺少任务目标或范围时停止委派,不猜。
|
|
32
|
+
- **官方创建绑定路由**:fresh `subagent` 和 fresh `spawn_teammate` 在子任务首次请求前绑定精确身份。`route_subagent` 只是可选预览,不代表已应用,也不能把推荐复制成用户约束。fork 和未绑定创建路径暂不支持,不静默替换。
|
|
33
|
+
- **恢复保持初始路线**:根会话改为 MANUAL 后停止新判断,已有绑定子实例维持原路线。`applied` 只证明实际请求配置匹配,**不代表任务成功**。真实 Magpie Claude/GPT ordinary 调用已验证;fresh teammate 路由及冷恢复有 mock 宿主覆盖,不等于真实模型 teammate 已验收。
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
### 选择决策服务
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
| 服务 | 接口 | 缺省模型 | 凭据引用 |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| OpenRouter(默认,兼容已有安装) | `https://openrouter.ai/api/alpha/decisions` | `typesafe/jev-1.13` | `OPENROUTER_API_KEY` |
|
|
40
|
+
| TypeSafe 官方 | `https://api.typesafe.ai/v1/systemone` | `jev-1.13.0` | `TYPESAFE_API_KEY` |
|
|
41
|
+
| Concentrate | `https://api.concentrate.ai/v1/systemone` | `jev-1.13.0` | `CONCENTRATE_API_KEY` |
|
|
42
|
+
| 自定义 System One | 完整接口地址 | 可编辑 | `AUTO_DECISION_CUSTOM_API_KEY` |
|
|
34
43
|
|
|
35
|
-
|
|
44
|
+
预置模型菜单列出文档确认的版本,不保证实时可用。自定义服务可填写自己的模型 ID,但必须兼容 `state + questions → answers`;只有 OpenAI chat-completions 接口并不兼容。自定义端点限 HTTPS(回环可 HTTP),禁止 URL 凭据、查询参数、片段及重定向。只配置你信任且适合使用该专用 key 的地址。TypeSafe、Concentrate 目前有协议/mock 覆盖,未在本次验证其真实凭据与地区可用性。失败不自动切换服务。
|
|
45
|
+
|
|
46
|
+
**判定确定度不等于选中概率**:Choice 公式为 `(pmax − 1/n) / (1 − 1/n)`,三个候选中最高概率 70% 对应确定度 55%。面板分别显示服务返回的确定度和完整分布,保留返回的 0%,缺值标未提供。两者都不是任务成功率。
|
|
36
47
|
|
|
37
48
|
## 须知
|
|
38
49
|
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
50
|
+
- **失败可见**:主判断失败会停用 AUTO 并显示原因,子判断或路由失败则停止派发。没有本地分类器、自动重试、自动升级或跨服务降级。
|
|
51
|
+
- **MANUAL 停止调整,不复原历史值**:使用官方当前选择;只要插件启用,已绑定子任务仍保留原路线。
|
|
52
|
+
- **任务会外发**:AUTO 将按形态脱敏的任务文本(最多 8000 字符)及上一轮少量片段发送给所选服务。脱敏尽力而为,不保证去除全部秘密。测试连接只发送固定公开样例,可能产生少量费用。
|
|
53
|
+
- **key 经官方 DSH 凭据服务保存**,不写入插件配置。启动环境 key 优先且只读;切换服务清空 key 草稿,先保存服务再管理新 key。修改自定义端点不会产生新凭据空间,换地址前请确认专用 key 的信任边界。
|
|
54
|
+
- **本地状态**:配置在 `$DSH_HOME/plugins/dsh-auto-model-routing/`,模式、子路由及反馈在 `$DSH_HOME/state/auto-model-routing/`。反馈只保存资源元数据、身份、版本、返回分布及时间,不保存任务或回复正文。请求事件序号供后续关联用量,缺失成本不会编造。见[反馈评估说明](docs/feedback-evaluation.md)。
|
|
55
|
+
- **不自动学习**:人工反馈仅作观察,不改变路由,也不能直接证明质量提升或节省。无决策绑定的旧消息不回填,旧记录缺少的评估字段保持未知。
|
|
56
|
+
- **升级兼容**:已有 AUTO 会话直接使用新策略,无需版本开关,也不重写会话模式。新会话缺省仍为 MANUAL,除非你改过设置。旧四档映射仅供配置中显式 `policy: "legacy"` 回滚,不是当前策略或反馈菜单。
|
|
45
57
|
|
|
46
58
|
## 架构
|
|
47
59
|
<!-- section: architecture -->
|
|
48
60
|
|
|
49
|
-
|
|
61
|
+
```text
|
|
62
|
+
用户回合 → pre-step → 所选 Jev 服务 → depth → 主请求 effort
|
|
63
|
+
fresh 子创建 → 精确身份绑定 → capability + depth → 校验路由
|
|
64
|
+
request/header → 配置匹配 → applied 证据
|
|
65
|
+
assistant 消息 → 不可变决策快照 → 人工反馈事件
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
入口:[index.ts](src/index.ts)。执行接入:[policy-host.ts](src/policy-host.ts)。实际判据:[policy-v2-rubric.json](src/policy-v2-rubric.json)。模型槽:[policy-v2.ts](src/policy-v2.ts)。界面:[client](src/client/index.ts)。覆盖边界:[开发验证](docs/policy-v2-development.md)、[真实 Magpie 验收](docs/magpie-live-acceptance.md)。
|
|
50
69
|
|
|
51
|
-
|
|
70
|
+
<details>
|
|
71
|
+
<summary>旧四档界面演示(仅供 legacy 回滚参考)</summary>
|
|
72
|
+
|
|
73
|
+
下列隔离宿主录屏使用模拟 Jev/模型响应,展示旧界面,不代表当前默认策略。
|
|
74
|
+
|
|
75
|
+

|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
</details>
|
|
52
79
|
|
|
53
80
|
## 开发验证
|
|
54
81
|
|
|
@@ -58,11 +85,15 @@ npm run typecheck
|
|
|
58
85
|
npm run build
|
|
59
86
|
```
|
|
60
87
|
|
|
61
|
-
|
|
88
|
+
测试使用官方 AgentLoop、假 LLM 流和 mock/回环 Jev,不产生真实模型费用。`scripts/label-report.mjs` **仅汇总旧四档标注**,不是新分配反馈报表;新数据结构与去重口径见[feedback-evaluation.md](docs/feedback-evaluation.md)。
|
|
62
89
|
|
|
63
|
-
|
|
90
|
+
[当前规范](https://github.com/prgrmrwy/ohmydsh/blob/main/openspec/specs/auto-model-routing/spec.md)在源码 monorepo 中维护。包内[委派 skill](skills/subagent-model-routing/SKILL.md)提供指引,执行保障来自官方宿主钩子,而不是提示词。暂无完整任务质量或 token 节省的量化结论。
|
|
64
91
|
|
|
65
92
|
## 移除
|
|
66
93
|
<!-- section: removal -->
|
|
67
94
|
|
|
68
|
-
|
|
95
|
+
```sh
|
|
96
|
+
dsh plugin --profile web remove dsh-auto-model-routing
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
重启 DSH 并刷新页面。插件的 skill、工具和请求钩子撤销,配置与日志保留。关闭插件后不再执行子路由恢复,宿主使用原始创建配置。在 [ohmydsh](https://github.com/prgrmrwy/ohmydsh) 中则禁用 local 条目并重新构建。
|
|
@@ -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
|
+
- 本期只提供采集与可追溯性,不做报表、自动阈值调整、自动训练或换模重试。
|
|
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 现场试运行,不默认全局启用。
|