@ai-zen/cli 1.0.0-alpha.14 → 1.0.0-alpha.16

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 CHANGED
@@ -1,3 +1,45 @@
1
+ ## [1.0.0-alpha.16] - 2026-10-22
2
+
3
+ ### 🔧 行为变更(不兼容)
4
+
5
+ - **升级 `@ai-zen/agents-sdk` 至 `1.0.0-alpha.15`:思考档位不再「存档位名」,改存展开后的参数** —— 上一版把档位名写在 Agent 定义的 `reasoningEffort` 上,运行期由 SDK 查表翻译成请求参数。那等于把「什么叫 `max`」这件产品语义塞进了运行时。现在改成**配置即事实**:
6
+ - `/think` 把选中档位的参数补丁直接写进 `AgentDefinition.modelParams`(如 `{"thinking":{"type":"enabled"},"reasoning_effort":"high"}`),SDK 只做一次 `{...defaultParams, ...modelParams}` 浅合并;
7
+ - **旧 `reasoningEffort` 自动迁移**:读 Agent 定义时展开成 `modelParams` 并写回;模型没关联策略的只删旧字段(不会瞎猜参数)。
8
+ - **思考策略表的归属调整为「SDK 提供、CLI 使用」** —— 表的类型、出厂内容与读写放在 SDK(CLI 与桌面端共享同一份「智谱 5.3 只认 low/high/max」的知识),CLI 只负责**利用**它:限制 `/think` 的可选档位、把档位展开成参数写进 Agent。`Scope` 不再需要注入策略表。
9
+
10
+ ### 🚀 新功能
11
+
12
+ - **状态栏档位改为「从生效参数反查」** —— 显示的就是真正会发给 API 的那几个参数匹配到的档位(模型默认参数也算),不再依赖 Agent 上的档位声明。三种状态:命中某档 → 「低/中/高…」;有 Agent 覆盖但匹配不上任何档位(手改过参数)→「自定义」;完全匹配不上 →「默认」。
13
+ - **`/config` →「模型」详情页的「思考策略」字段**继续可用,显示该策略及其档位(如 `zhipu-5.3(low / high / max)`),写错名字当场拦下。
14
+
15
+ ### ✅ 测试
16
+
17
+ - `src/reasoning-effort.test.ts` 重写(19 例):写入的是展开参数而非档位名、`max` → `off` 不残留 `reasoning_effort`、保留 `temperature` 等无关参数、`null` 清空后连 `modelParams` 一起删、往返一致(写进去能反查回原档位)。
18
+ - 新增 `src/agents-store.test.ts`(4 例):旧 `reasoningEffort` 展开并写回磁盘、无策略时只删字段、无旧字段时不写盘、迁移后能反查回原档位。
19
+ - 全量 **24 文件 / 299 例通过**。
20
+
21
+ ## [1.0.0-alpha.15] - 2026-10-22
22
+
23
+ ### 🔧 行为变更(不兼容)
24
+
25
+ - **升级 `@ai-zen/agents-sdk` 至 `1.0.0-alpha.14`:思考能力改为声明式策略表** —— 上一版用 `Model.reasoning: { efforts, disable? }` 表达厂商差异,`disable` 一词双义、`off` 靠拼接、还用全局枚举假装各家档位等价。现在协议差异全部搬进一张表:
26
+ - 新增 `~/.ai-zen/reasoning-presets.json`(首次启动自动释放,出厂三张:`openai` / `zhipu-5.3` / `deepseek`);模型只记 `reasoningPreset` 这个名字;
27
+ - `/think` 的可选档位改为读策略表 —— 表里有 `off` 才能关思考,没有就不给这个选项;
28
+ - 模型没关联策略、或策略名在表里不存在 → 一律视为不可调档(状态栏 `—`),绝不把来路不明的参数发出去;
29
+ - 档位中文标签改为「已知档位查表 + 未知档位名原样显示」,用户自建的档位名(如 `turbo`)不会显示成空白。
30
+ - `src/stdio-runner.ts` / `src/tui/chat-session.ts` 的 `TokenThresholds` 改为直接从 SDK 导入(此前是绕开 alpha.13 缺导出的派生类型)。
31
+
32
+ ### 🚀 新功能
33
+
34
+ - **`/config` →「模型」详情页新增「思考策略」字段** —— 显示该模型当前引用的策略及其档位(如 `zhipu-5.3(low / high / max)`),可直接改成表里另一个策略名;写错名字当场拦下并列出可选策略,留空 = 不调档。自建模型从此能指向内置策略,不必手改 JSON。
35
+ - **策略表可自行编辑** —— 加一张表、调档位补丁都行;给某张表标 `"custom": true` 后 SDK 升级不再覆盖它,其余策略仍随 SDK 同步。
36
+
37
+ ### ✅ 测试
38
+
39
+ - `src/reasoning-effort.test.ts` 重写(14 例):可选档位 = 策略表的键、未知档位名原样显示、未关联策略/策略名不存在时抛错、状态栏在非法声明时回退「默认」。
40
+ - 配置向导新增 2 例:写入合法策略名、非法策略名被拦下且不写盘。
41
+ - 全量 **23 文件 / 290 例通过**。
42
+
1
43
  ## [1.0.0-alpha.14] - 2026-10-22
2
44
 
3
45
  ### 🚀 新功能
package/README.md CHANGED
@@ -180,7 +180,7 @@ While in a conversation, all commands start with `/`. Typing `/` lists the avail
180
180
  | `/clear` | Clear the screen |
181
181
  | `/config` | Open the configuration center (endpoints / models / image models / MCP servers / agent definitions / defaults / tool-output cap) |
182
182
  | `/model` | Switch the model of the current session and persist it: if the Agent has an explicit model binding that binding is updated, otherwise the default model is changed |
183
- | `/think` `/effort` | Switch reasoning effort (available levels come from the model's capability, e.g. `low/high/max`); persisted into the current Agent definition; `/think default` falls back to the model default |
183
+ | `/think` `/effort` | Switch reasoning effort (available levels come from the model's reasoning preset, e.g. `low/high/max`); persisted into the current Agent definition; `/think default` falls back to the model default |
184
184
  | `/key` | Set the API Key of the current endpoint (rebuilds the session on save) |
185
185
  | `/handoff` | Write a handoff document only (session keeps running; no confirmation) |
186
186
  | `/migrate` `/migration` | Handoff + start a new session (discards history; asks for confirmation) |
@@ -195,7 +195,7 @@ Two related commands, one pipeline:
195
195
 
196
196
  Two executors: `self` (default — the original agent writes it in-session, highest fidelity) and `summary` (a single independent model call, cheap but lossy). `self` degrades to `summary` one-way on failure. Pass it explicitly with `/handoff summary` or `/migrate self`.
197
197
 
198
- When `usage.prompt_tokens` exceeds the model's `maxContextTokens`, an interactive terminal shows a three-way picker (self / summary / skip); non-interactive pipes migrate with the default executor without blocking.
198
+ When `usage.prompt_tokens` exceeds the model's `tokenThresholds.handoff`, an interactive terminal shows a three-way picker (self / summary / skip); non-interactive pipes migrate with the default executor without blocking.
199
199
 
200
200
  The document template is not hard-coded: it comes from the `handoff` Skill (`~/.ai-zen/skills/handoff/SKILL.md`, released and synced by the SDK; mark `metadata.custom: "true"` to keep your own version, or override per project). See [Task Handoff & Migration](./docs/en/migration.md) for the full chain, cost notes, and the template sections.
201
201
 
@@ -229,7 +229,7 @@ Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json`
229
229
  | Endpoints / models / image models, MCP servers, agent definitions (incl. sub-agents), defaults, tool-output cap | `/config` (the configuration center — full management) |
230
230
  | Other advanced fields (skills / user tools, …) | Edit the files under `~/.ai-zen/` manually |
231
231
 
232
- The `maxContextTokens` field on each model sets the migration threshold (typically ~25% of the model's actual context window, e.g. 250,000 for a 1M-token model).
232
+ The `tokenThresholds` field on each model sets two usage lines: `handoff` (soft — a handoff is triggered above it) and `guard` (hard — the round is aborted above it, before the request). Both are absolute values; `guard ≈ handoff × 1.5` is recommended (typically ~25% of the model's actual context window for `handoff`, e.g. 250,000 for a 1M-token model).
233
233
 
234
234
  ```jsonc
235
235
  {
@@ -247,7 +247,8 @@ The `maxContextTokens` field on each model sets the migration threshold (typical
247
247
  "name": "GPT-6.1 Sol",
248
248
  "endpointId": "openai",
249
249
  "modelName": "gpt-6.1-sol",
250
- "maxContextTokens": 250000,
250
+ "tokenThresholds": { "handoff": 250000, "guard": 375000 },
251
+ "reasoningPreset": "openai",
251
252
  "custom": true
252
253
  }
253
254
  ],
package/README.zh.md CHANGED
@@ -180,7 +180,7 @@ key input="" flags=[pageUp] raw=false
180
180
  | `/clear` | 清屏 |
181
181
  | `/config` | 打开配置中心(端点 / 模型 / 图片模型 / MCP 服务器 / Agent 定义 / 默认项 / 工具上限) |
182
182
  | `/model` | 切换当前会话使用的模型并写入配置:Agent 显式绑定过模型就改该 Agent 的绑定,否则改默认模型 |
183
- | `/think` `/effort` | 切换思考强度(可选档位由模型能力决定,如 `low/high/max`),写入当前 Agent 定义并立即生效;`/think default` 恢复跟随模型默认 |
183
+ | `/think` `/effort` | 切换思考强度(可选档位来自模型的思考策略表,如 `low/high/max`),写入当前 Agent 定义并立即生效;`/think default` 恢复跟随模型默认 |
184
184
  | `/key` | 设置当前端点的 API Key(保存后自动重建会话) |
185
185
  | `/handoff` | 编写任务交接文档(会话照旧,不弹确认) |
186
186
  | `/migrate` `/migration` | 交接 + 开启新会话(清空历史,需确认) |
@@ -195,7 +195,7 @@ key input="" flags=[pageUp] raw=false
195
195
 
196
196
  两种执行者:`self`(默认——原 agent 在会话内写,保真度最高)与 `summary`(一次独立模型调用,便宜但有损)。`self` 失败时**单向**降级为 `summary`。可用 `/handoff summary` 或 `/migrate self` 显式指定。
197
197
 
198
- 当 `usage.prompt_tokens` 超过模型的 `maxContextTokens`,交互式终端会弹出三选一选择器(自交接 / 独立摘要 / 跳过);管道等非交互场景按默认执行者迁移,不阻塞。
198
+ 当 `usage.prompt_tokens` 超过模型的 `tokenThresholds.handoff`,交互式终端会弹出三选一选择器(自交接 / 独立摘要 / 跳过);管道等非交互场景按默认执行者迁移,不阻塞。
199
199
 
200
200
  文档模板不在代码里:来自 `handoff` Skill(`~/.ai-zen/skills/handoff/SKILL.md`,由 SDK 释放并随版本同步;在 frontmatter 写 `metadata.custom: "true"` 可保留你自己的版本,也可在项目内覆盖)。完整链路、成本说明与模板章节见 [任务交接与迁移](./docs/zh/migration.md)。
201
201
 
@@ -229,7 +229,7 @@ ai hook uninstall
229
229
  | 端点 / 模型 / 图片模型、MCP 服务器、Agent 定义(含 Sub-agent)、默认项、工具输出上限 | 对话内 `/config`(配置中心,全面管理) |
230
230
  | 其它高级项(Skill / 用户工具等) | 手动编辑 `~/.ai-zen/` 下的文件 |
231
231
 
232
- 其中 `maxContextTokens` 是迁移触发阈值(通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
232
+ 其中 `tokenThresholds` 是两条用量线:`handoff`(交接软线,超过它触发任务交接)与 `guard`(强行阻断硬线,请求前超过它中断本轮)。两者都是绝对值,建议 `guard ≈ handoff × 1.5`(`handoff` 通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
233
233
 
234
234
  ```jsonc
235
235
  {
@@ -247,7 +247,8 @@ ai hook uninstall
247
247
  "name": "GPT-6.1 Sol",
248
248
  "endpointId": "openai",
249
249
  "modelName": "gpt-6.1-sol",
250
- "maxContextTokens": 250000,
250
+ "tokenThresholds": { "handoff": 250000, "guard": 375000 },
251
+ "reasoningPreset": "openai",
251
252
  "custom": true
252
253
  }
253
254
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7C,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEhD;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,oBAAoB;AACpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,eAAe,EAAE,CAE/E;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,eAAe,GAAG,SAAS,CAG7B;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,UAAU,CAWpG;AAED,2CAA2C;AAC3C,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAI1D"}
1
+ {"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,oBAAoB,CAAC;AAIvF,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7C,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEhD;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,oBAAoB;AACpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,eAAe,EAAE,CAE/E;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,eAAe,GAAG,SAAS,CAG7B;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,UAAU,CAWpG;AAED,2CAA2C;AAC3C,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAiC1D"}
@@ -9,7 +9,8 @@
9
9
  * 与「快照 + 写操作」的组装,便于 TUI 与单测共用。
10
10
  */
11
11
  import { AgentRepository } from "@ai-zen/agents-sdk";
12
- import { AGENTS_DIR, SUB_AGENTS_DIR } from "./config.js";
12
+ import { AGENTS_DIR, SUB_AGENTS_DIR, readConfig, readReasoningPresets } from "./config.js";
13
+ import { patchOf, presetFor } from "./reasoning-presets.js";
13
14
  /** 某个 kind 对应的定义目录 */
14
15
  export function agentDir(kind) {
15
16
  return kind === "agent" ? AGENTS_DIR : SUB_AGENTS_DIR;
@@ -43,8 +44,43 @@ export function createAgentStore(agents, subAgents) {
43
44
  }
44
45
  /** 从磁盘读取 Agent / Sub-agent 快照,并附带真实读写能力 */
45
46
  export async function readAgentStore() {
46
- const agents = await new AgentRepository(AGENTS_DIR).list();
47
- const subAgents = await new AgentRepository(SUB_AGENTS_DIR).list();
47
+ const repoAgents = new AgentRepository(AGENTS_DIR);
48
+ const repoSubAgents = new AgentRepository(SUB_AGENTS_DIR);
49
+ const [rawAgents, rawSubAgents] = await Promise.all([repoAgents.list(), repoSubAgents.list()]);
50
+ // 旧版 `/think` 把档位名写在 `reasoningEffort` 上;现在档位在写入时就展开成参数。
51
+ // 这里做一次性迁移:能查到策略就展开进 `modelParams`,查不到就只删旧字段。
52
+ const isLegacy = (def) => "reasoningEffort" in def;
53
+ const legacy = (defs) => defs.filter(isLegacy);
54
+ const needsMigration = legacy(rawAgents).length + legacy(rawSubAgents).length > 0;
55
+ if (!needsMigration)
56
+ return createAgentStore(rawAgents, rawSubAgents);
57
+ const [config, presets] = await Promise.all([readConfig(), readReasoningPresets()]);
58
+ const migrate = async (repo, defs) => {
59
+ const out = [];
60
+ for (const def of defs) {
61
+ if (!isLegacy(def)) {
62
+ out.push(def);
63
+ continue;
64
+ }
65
+ out.push(await migrateDefinition(repo, def, config, presets));
66
+ }
67
+ return out;
68
+ };
69
+ const agents = await migrate(repoAgents, rawAgents);
70
+ const subAgents = await migrate(repoSubAgents, rawSubAgents);
48
71
  return createAgentStore(agents, subAgents);
49
72
  }
73
+ /** 把旧 `reasoningEffort` 展开成 `modelParams` 并写回(只跑一次:写完旧字段就没了) */
74
+ async function migrateDefinition(repo, def, config, presets) {
75
+ const { reasoningEffort, ...rest } = def;
76
+ const modelId = rest.modelId ?? config.defaultModel;
77
+ const model = (config.models ?? []).find((item) => item.id === modelId);
78
+ const preset = model ? presetFor(model.id, model.reasoningPreset, presets) : undefined;
79
+ const patch = reasoningEffort ? patchOf(preset, reasoningEffort) : undefined;
80
+ const next = patch
81
+ ? { ...rest, modelParams: { ...(rest.modelParams ?? {}), ...patch } }
82
+ : rest;
83
+ await repo.write(next);
84
+ return next;
85
+ }
50
86
  //# sourceMappingURL=agents-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKzD,sBAAsB;AACtB,MAAM,UAAU,QAAQ,CAAC,IAAe;IACtC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;AACxD,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,cAAc,CAAC,IAAe;IAC5C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;AAClD,CAAC;AAUD,oBAAoB;AACpB,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,IAAe;IAC1D,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,IAAe,EACf,EAAsB;IAEtB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,gBAAgB,CAAC,MAAyB,EAAE,SAA4B;IACtF,OAAO;QACL,MAAM;QACN,SAAS;QACT,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YACzB,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -45,7 +45,7 @@
45
45
  * 3. ~/.ai-zen/skills/
46
46
  * 4. ~/.agents/skills/
47
47
  */
48
- import type { AppConfig } from "@ai-zen/agents-sdk";
48
+ import type { AppConfig, ReasoningPresets } from "@ai-zen/agents-sdk";
49
49
  export declare const AI_ZEN_DIR: string;
50
50
  export declare const CLI_DIR: string;
51
51
  export declare const CONFIG_FILE: string;
@@ -81,6 +81,13 @@ export declare const SHARED_MCP_CONFIG_FILE: string;
81
81
  */
82
82
  export declare function ensureConfigDir(): Promise<void>;
83
83
  export declare function readConfig(): Promise<AppConfig>;
84
+ /**
85
+ * 读取思考策略表(`~/.ai-zen/reasoning-presets.json`)。
86
+ *
87
+ * 这张表**只属于 CLI**:档位与参数补丁的对应关系是产品的编织知识,不在 SDK 里。
88
+ * 文件缺失或损坏时回落到出厂种子。
89
+ */
90
+ export declare function readReasoningPresets(): Promise<ReasoningPresets>;
84
91
  export declare function saveConfig(config: AppConfig): Promise<void>;
85
92
  /** MCP 配置的作用域:全局(~/.ai-zen/mcp.json) / 项目(<cwd>/.ai-zen/mcp.json) */
86
93
  export type McpScope = "global" | "project";
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -93,7 +93,7 @@ const sdkConfigMgr = new SdkConfigManager(CONFIG_FILE);
93
93
  * SDK 的出厂默认配置会自动写入 config.json(如果不存在)。
94
94
  */
95
95
  export async function ensureConfigDir() {
96
- // SDK bootstrap:目录 + config.json + default Agent + default SubAgent
96
+ // SDK bootstrap:目录 + config.json + default Agent + default SubAgent + 出厂思考策略表
97
97
  await sdkConfigMgr.bootstrap();
98
98
  // CLI 运行时目录
99
99
  const cliDirs = [CLI_DIR, CONVERSATIONS_DIR];
@@ -116,6 +116,16 @@ export async function readConfig() {
116
116
  await ensureConfigDir();
117
117
  return await sdkConfigMgr.read();
118
118
  }
119
+ /**
120
+ * 读取思考策略表(`~/.ai-zen/reasoning-presets.json`)。
121
+ *
122
+ * 这张表**只属于 CLI**:档位与参数补丁的对应关系是产品的编织知识,不在 SDK 里。
123
+ * 文件缺失或损坏时回落到出厂种子。
124
+ */
125
+ export async function readReasoningPresets() {
126
+ // 表归 SDK 管(CLI / 桌面端共享),此处只做透传;缺失/损坏时 SDK 会回落出厂种子
127
+ return await sdkConfigMgr.readReasoningPresets();
128
+ }
119
129
  export async function saveConfig(config) {
120
130
  await ensureConfigDir();
121
131
  await sdkConfigMgr.write(config);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,46 +1,58 @@
1
1
  /**
2
- * 思考强度(reasoning effort)—— CLI 侧读写
2
+ * 思考档位(reasoning level)—— CLI 侧读写
3
3
  *
4
- * 分两层,边界很硬:
5
- * - **能力上限在模型**(`Model.reasoning`,SDK 按厂商官方文档声明):决定菜单里能出现哪几档。
6
- * 发一个端点不认的值会被直接 400(智谱 GLM-5.3 系原文「其余输入将报错」)。
7
- * - **档位值存在 Agent**(`AgentDefinition.reasoningEffort`):同一个模型可以给编程 / 小说 /
8
- * 闲聊三个 Agent 配不同强度,而模型自身的 `defaultParams` 不动。
4
+ * ## 三层,边界很硬
9
5
  *
10
- * 本模块只做「读能力 → 校验 → 写 Agent 定义」,参数如何落到 `thinking` / `reasoning_effort`
11
- * 由 SDK 的 `resolveModelParams()` 在 `createModel` 阶段决定。
6
+ * - **协议差异在策略表**(`~/.ai-zen/reasoning-presets.json`):档位名 → 请求参数补丁,
7
+ * 由这张 CLI 自有的表声明,模型用 `reasoningPreset` 引用它。
8
+ * - **档位值存在 Agent 定义**(`AgentDefinition.modelParams`):**存的是展开后的参数**,
9
+ * 不是档位名。于是「配置即事实」——运行期 SDK 只做一次浅合并,不查表、不推导。
10
+ * - **本模块只管 UI 语义**:列可选档位、把参数反查成档位名、写回 Agent 定义。
11
+ *
12
+ * 代价(刻意接受):改了策略表**不会追溯**已配置的 Agent —— 它们存的是当时的参数。
13
+ * 这正是「配置即事实」的含义:表只是写配置那一刻的模板。
12
14
  */
13
15
  import type { AgentDefinition, AppConfig, Model } from "@ai-zen/agents-sdk";
16
+ import { type ReasoningPreset, type ReasoningPresets } from "./reasoning-presets.js";
14
17
  /**
15
- * 档位类型由 `AgentDefinition` 派生。
18
+ * 已知档位的中文标签。
16
19
  *
17
- * SDK 的 alpha.13 只导出了 `shared/reasoning.ts` 的函数,`ReasoningEffort` /
18
- * `TokenThresholds` 这两个别名还没进包入口;用类型查询拿到同一个类型,语义完全等价,
19
- * 等 SDK 下个版本补上导出后可无痛切换成直接 import。
20
+ * 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
21
+ * 未知名字直接显示原文,比显示「?」有用得多。
20
22
  */
21
- export type ReasoningEffort = NonNullable<AgentDefinition["reasoningEffort"]>;
22
- /** 上下文阈值结构(派生自 `Model`) */
23
- export type TokenThresholds = Model["tokenThresholds"];
24
- /** 档位 → 中文标签(状态栏与提示共用) */
25
- export declare const EFFORT_LABELS: Record<ReasoningEffort, string>;
26
- /** 一档都用不了的模型(未声明能力,或声明为空数组)*/
27
- export declare function isAdjustable(model?: Model | null): boolean;
28
- /** 可选档位(含 `off`,顺序即展示顺序) */
29
- export declare function effortChoices(model?: Model | null): ReasoningEffort[];
23
+ export declare const EFFORT_LABELS: Record<string, string>;
24
+ /** 档位 → 显示文案(未知档位名原样显示) */
25
+ export declare function effortLabel(level: string): string;
26
+ /** 模型关联的策略 */
27
+ export declare function presetOf(model: Model | null | undefined, presets: ReasoningPresets): ReasoningPreset | undefined;
28
+ /** 模型可选档位(空数组 = 不可调档) */
29
+ export declare function effortChoices(model?: Model | null, presets?: ReasoningPresets | null): string[];
30
+ /** 一档都用不了的模型 */
31
+ export declare function isAdjustable(model?: Model | null, presets?: ReasoningPresets | null): boolean;
32
+ /**
33
+ * 生效中的模型参数 = 模型默认参数 + Agent 级覆盖(与 SDK 的合并语义一致,浅合并)。
34
+ *
35
+ * 注意这里复刻的是**同一份事实**,不是另一套推导:状态栏显示的就是真正会发给 API 的
36
+ * 那几个参数里匹配到的那一档。
37
+ */
38
+ export declare function effectiveParams(model?: Model | null, definition?: Pick<AgentDefinition, "modelParams"> | null): Record<string, unknown>;
30
39
  /**
31
40
  * 状态栏文案。
32
41
  *
33
42
  * - 模型不可调档 → `—`
34
- * - Agent 显式声明了档位 → 「低」「中」「高」…(`off` 显示「关」)
35
- * - 可调但没声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂就是「开思考但未指定档位」)
43
+ * - 生效参数命中某档 → 「低」「中」「高」…(按 `EFFORT_LABELS`)
44
+ * - 有 Agent 级覆盖但不匹配任何档位 → 「自定义」(用户手改过参数)
45
+ * - 没有任何声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂只开思考不指定档位)
36
46
  */
37
- export declare function describeEffort(model?: Model | null, definition?: Pick<AgentDefinition, "reasoningEffort"> | null): string;
47
+ export declare function describeEffort(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): string;
38
48
  export interface SetAgentEffortOptions {
39
49
  config: AppConfig;
50
+ /** 思考策略表(`readReasoningPresets()` 的结果) */
51
+ presets: ReasoningPresets;
40
52
  /** 目标 Agent(缺省 default) */
41
53
  agentId?: string;
42
- /** 目标档位;`null` 表示清除声明、恢复跟随模型默认 */
43
- effort: ReasoningEffort | null;
54
+ /** 目标档位;`null` 表示清除思考参数、恢复跟随模型默认 */
55
+ effort: string | null;
44
56
  /** 注入用(测试) */
45
57
  readAgent?: (agentId: string) => Promise<AgentDefinition | null>;
46
58
  writeAgent?: (definition: AgentDefinition) => Promise<void>;
@@ -53,9 +65,12 @@ export interface SetAgentEffortResult {
53
65
  summary: string;
54
66
  }
55
67
  /**
56
- * 设置某 Agent 的思考档位并写入其定义文件。
68
+ * 设置某 Agent 的思考档位:查表拿补丁 → 写进 `definition.modelParams`。
69
+ *
70
+ * 写入前先剔除「整张表出现过的键」,所以 `max` → `off` 不会残留上一档的
71
+ * `reasoning_effort`;`effort: null` 就是剔除后若为空则删掉整个 `modelParams`。
57
72
  *
58
- * 抛错场景:Agent 不存在、Agent 未绑定可用模型、模型不可调档、档位不在模型能力范围内。
73
+ * 抛错场景:Agent 不存在、未绑定可用模型、模型未关联策略、策略里没有该档位。
59
74
  * 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
60
75
  */
61
76
  export declare function setAgentEffort(options: SetAgentEffortOptions): Promise<SetAgentEffortResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG5E;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9E,2BAA2B;AAC3B,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAGvD,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASzD,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE1D;AAED,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,eAAe,EAAE,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,GAAG,IAAI,GAC3D,MAAM,CAIR;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAwC/B"}
1
+ {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAShD,CAAC;AAEF,2BAA2B;AAC3B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,cAAc;AACd,wBAAgB,QAAQ,CACtB,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,EAAE,gBAAgB,GACxB,eAAe,GAAG,SAAS,CAE7B;AAED,yBAAyB;AACzB,wBAAgB,aAAa,CAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAChC,MAAM,EAAE,CAGV;AAED,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAE7F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GACvD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACjC,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GACvD,MAAM,CAQR;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAqD/B"}
@@ -1,19 +1,26 @@
1
1
  /**
2
- * 思考强度(reasoning effort)—— CLI 侧读写
2
+ * 思考档位(reasoning level)—— CLI 侧读写
3
3
  *
4
- * 分两层,边界很硬:
5
- * - **能力上限在模型**(`Model.reasoning`,SDK 按厂商官方文档声明):决定菜单里能出现哪几档。
6
- * 发一个端点不认的值会被直接 400(智谱 GLM-5.3 系原文「其余输入将报错」)。
7
- * - **档位值存在 Agent**(`AgentDefinition.reasoningEffort`):同一个模型可以给编程 / 小说 /
8
- * 闲聊三个 Agent 配不同强度,而模型自身的 `defaultParams` 不动。
4
+ * ## 三层,边界很硬
9
5
  *
10
- * 本模块只做「读能力 → 校验 → 写 Agent 定义」,参数如何落到 `thinking` / `reasoning_effort`
11
- * 由 SDK 的 `resolveModelParams()` 在 `createModel` 阶段决定。
6
+ * - **协议差异在策略表**(`~/.ai-zen/reasoning-presets.json`):档位名 → 请求参数补丁,
7
+ * 由这张 CLI 自有的表声明,模型用 `reasoningPreset` 引用它。
8
+ * - **档位值存在 Agent 定义**(`AgentDefinition.modelParams`):**存的是展开后的参数**,
9
+ * 不是档位名。于是「配置即事实」——运行期 SDK 只做一次浅合并,不查表、不推导。
10
+ * - **本模块只管 UI 语义**:列可选档位、把参数反查成档位名、写回 Agent 定义。
11
+ *
12
+ * 代价(刻意接受):改了策略表**不会追溯**已配置的 Agent —— 它们存的是当时的参数。
13
+ * 这正是「配置即事实」的含义:表只是写配置那一刻的模板。
12
14
  */
13
15
  import { AgentRepository } from "@ai-zen/agents-sdk";
14
- import { modelAllowedEfforts, resolveReasoningEffort } from "@ai-zen/agents-sdk";
15
16
  import { AGENTS_DIR } from "./config.js";
16
- /** 档位 → 中文标签(状态栏与提示共用) */
17
+ import { levelsOf, matchLevel, ownedKeys, patchOf, presetFor, } from "./reasoning-presets.js";
18
+ /**
19
+ * 已知档位的中文标签。
20
+ *
21
+ * 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
22
+ * 未知名字直接显示原文,比显示「?」有用得多。
23
+ */
17
24
  export const EFFORT_LABELS = {
18
25
  off: "关",
19
26
  none: "关",
@@ -24,35 +31,63 @@ export const EFFORT_LABELS = {
24
31
  xhigh: "极高",
25
32
  max: "最高",
26
33
  };
27
- /** 一档都用不了的模型(未声明能力,或声明为空数组)*/
28
- export function isAdjustable(model) {
29
- return modelAllowedEfforts(model).length > 0;
34
+ /** 档位 → 显示文案(未知档位名原样显示) */
35
+ export function effortLabel(level) {
36
+ return EFFORT_LABELS[level] ?? level;
37
+ }
38
+ /** 模型关联的策略 */
39
+ export function presetOf(model, presets) {
40
+ return presetFor(model?.id, model?.reasoningPreset, presets);
41
+ }
42
+ /** 模型可选档位(空数组 = 不可调档) */
43
+ export function effortChoices(model, presets) {
44
+ if (!presets)
45
+ return [];
46
+ return levelsOf(presetOf(model, presets));
30
47
  }
31
- /** 可选档位(含 `off`,顺序即展示顺序) */
32
- export function effortChoices(model) {
33
- return modelAllowedEfforts(model);
48
+ /** 一档都用不了的模型 */
49
+ export function isAdjustable(model, presets) {
50
+ return effortChoices(model, presets).length > 0;
51
+ }
52
+ /**
53
+ * 生效中的模型参数 = 模型默认参数 + Agent 级覆盖(与 SDK 的合并语义一致,浅合并)。
54
+ *
55
+ * 注意这里复刻的是**同一份事实**,不是另一套推导:状态栏显示的就是真正会发给 API 的
56
+ * 那几个参数里匹配到的那一档。
57
+ */
58
+ export function effectiveParams(model, definition) {
59
+ return { ...(model?.defaultParams ?? {}), ...(definition?.modelParams ?? {}) };
34
60
  }
35
61
  /**
36
62
  * 状态栏文案。
37
63
  *
38
64
  * - 模型不可调档 → `—`
39
- * - Agent 显式声明了档位 → 「低」「中」「高」…(`off` 显示「关」)
40
- * - 可调但没声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂就是「开思考但未指定档位」)
65
+ * - 生效参数命中某档 → 「低」「中」「高」…(按 `EFFORT_LABELS`)
66
+ * - 有 Agent 级覆盖但不匹配任何档位 → 「自定义」(用户手改过参数)
67
+ * - 没有任何声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂只开思考不指定档位)
41
68
  */
42
- export function describeEffort(model, definition) {
43
- if (!isAdjustable(model))
69
+ export function describeEffort(model, presets, definition) {
70
+ if (!presets || !isAdjustable(model, presets))
44
71
  return "—";
45
- const effective = resolveReasoningEffort(model, definition);
46
- return effective ? EFFORT_LABELS[effective] : "默认";
72
+ const params = effectiveParams(model, definition);
73
+ const matched = matchLevel(presetOf(model, presets), params);
74
+ if (matched)
75
+ return effortLabel(matched);
76
+ return definition?.modelParams && Object.keys(definition.modelParams).length > 0
77
+ ? "自定义"
78
+ : "默认";
47
79
  }
48
80
  /**
49
- * 设置某 Agent 的思考档位并写入其定义文件。
81
+ * 设置某 Agent 的思考档位:查表拿补丁 → 写进 `definition.modelParams`。
82
+ *
83
+ * 写入前先剔除「整张表出现过的键」,所以 `max` → `off` 不会残留上一档的
84
+ * `reasoning_effort`;`effort: null` 就是剔除后若为空则删掉整个 `modelParams`。
50
85
  *
51
- * 抛错场景:Agent 不存在、Agent 未绑定可用模型、模型不可调档、档位不在模型能力范围内。
86
+ * 抛错场景:Agent 不存在、未绑定可用模型、模型未关联策略、策略里没有该档位。
52
87
  * 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
53
88
  */
54
89
  export async function setAgentEffort(options) {
55
- const { config, effort } = options;
90
+ const { config, presets, effort } = options;
56
91
  const agentId = options.agentId || "default";
57
92
  const now = options.now ?? new Date();
58
93
  const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
@@ -65,20 +100,31 @@ export async function setAgentEffort(options) {
65
100
  const model = (config.models ?? []).find((item) => item.id === modelId);
66
101
  if (!model)
67
102
  throw new Error(`模型 "${modelId}" 不存在,请先用 /model 或 /config 检查`);
68
- const allowed = effortChoices(model);
103
+ const preset = presetOf(model, presets);
104
+ const allowed = levelsOf(preset);
69
105
  if (allowed.length === 0) {
70
- throw new Error(`模型 "${model.id}" 未声明可调档位,无法设置思考强度`);
106
+ throw new Error(`模型 "${model.id}" 未关联可用的思考策略(reasoningPreset),无法设置思考强度`);
107
+ }
108
+ const patch = effort === null ? undefined : patchOf(preset, effort);
109
+ if (effort !== null && !patch) {
110
+ throw new Error(`策略 "${model.reasoningPreset}" 没有档位 "${effort}"(可选:${allowed.join(" / ")})`);
71
111
  }
72
- if (effort !== null && !allowed.includes(effort)) {
73
- throw new Error(`模型 "${model.id}" 不支持档位 "${effort}"(可选:${allowed.join(" / ")})`);
112
+ // 先剔除思考相关键,再合并新补丁(`null` 即只剔除)
113
+ const owned = ownedKeys(presets);
114
+ const params = {};
115
+ for (const [key, value] of Object.entries(definition.modelParams ?? {})) {
116
+ if (!owned.has(key))
117
+ params[key] = value;
74
118
  }
119
+ if (patch)
120
+ Object.assign(params, patch);
75
121
  const next = { ...definition, updatedAt: now.toISOString() };
76
- if (effort === null)
77
- delete next.reasoningEffort;
122
+ if (Object.keys(params).length > 0)
123
+ next.modelParams = params;
78
124
  else
79
- next.reasoningEffort = effort;
125
+ delete next.modelParams;
80
126
  await writeAgent(next);
81
- const label = effort === null ? "跟随模型默认" : `「${EFFORT_LABELS[effort]}」`;
127
+ const label = effort === null ? "跟随模型默认" : `「${effortLabel(effort)}」`;
82
128
  return {
83
129
  definition: next,
84
130
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 思考预设 —— CLI 侧的表操作(纯函数)
3
+ *
4
+ * 表的**定义、出厂内容、读写**都在 SDK(`@ai-zen/agents-sdk` 的 `ReasoningPresets` /
5
+ * `FACTORY_REASONING_PRESETS` / `ConfigManager.readReasoningPresets()`),因为桌面端等
6
+ * 其它客户端也要用同一套档位知识。
7
+ *
8
+ * 本模块只负责「**利用**这张表」:CLI 用它限制 `/think` 的可选档位、把选中的档位展开成
9
+ * 请求参数写进 `AgentDefinition.modelParams`、以及把现有参数反查成档位名做展示。
10
+ *
11
+ * 全部是纯函数、不碰文件——SDK 不替我们决定这些,客户端自己掌握「怎么用表」。
12
+ */
13
+ import type { ReasoningPreset, ReasoningPresets } from "@ai-zen/agents-sdk";
14
+ export type { ReasoningPatch, ReasoningPreset, ReasoningPresets } from "@ai-zen/agents-sdk";
15
+ /** 模型关联的策略(未声明 `reasoningPreset` 或名字不存在 → `undefined`) */
16
+ export declare function presetFor(modelId: string | undefined, presetName: string | undefined, presets: ReasoningPresets): ReasoningPreset | undefined;
17
+ /** 某策略的全部档位(= `levels` 的键,顺序即声明顺序) */
18
+ export declare function levelsOf(preset: ReasoningPreset | undefined): string[];
19
+ /** 某策略某档的参数补丁 */
20
+ export declare function patchOf(preset: ReasoningPreset | undefined, level: string): Record<string, unknown> | undefined;
21
+ /**
22
+ * 整张表出现过的参数键。
23
+ *
24
+ * 换档时按此剔除旧值 —— 这样 `max` → `off` 不会残留上一个档位的 `reasoning_effort`,
25
+ * 而「哪些键属于思考」由表自己声明,代码零硬编码。「表里没有的键」一律当普通参数保留。
26
+ */
27
+ export declare function ownedKeys(presets: ReasoningPresets): Set<string>;
28
+ /**
29
+ * 反查:现有参数命中哪个档位(多张补丁同时命中取最具体的)。
30
+ *
31
+ * 纯展示用途 —— 状态栏要显示「当前是第几档」。命中不了返回 `undefined`。
32
+ */
33
+ export declare function matchLevel(preset: ReasoningPreset | undefined, params: Record<string, unknown> | undefined | null): string | undefined;
34
+ //# sourceMappingURL=reasoning-presets.d.ts.map