@mars.liu/dsh-cybernetics 0.25.0 → 0.25.2
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/README.zh-CN.md +1 -1
- package/docs/CHANGELOG.md +5 -1
- package/lib/client.js +59 -2
- package/package.json +1 -1
- package/src/modelPresets.ts +13 -14
package/README.zh-CN.md
CHANGED
|
@@ -170,7 +170,7 @@ goal 一经存在不再原地修改。`revise` 是唯一的改目标动词(必
|
|
|
170
170
|
**作用范围(用户裁定,最高优先)**:**session agent 不在本功能范围内**——session 模型由用户随时自行调整,因此选择方案与自动推荐只写三个子 agent 角色的配置:`src/modelPresets.ts` 的 `ALLOWED_OP_PATHS` 把可写字段结构性地钉死为六个扁平子 agent 字段(三个模型字段 + 三个思考强度字段);推荐 prompt 明令输出只允许 task/verify/triage 三个键、禁止 session 键(解析器对模型万一直出的 session 键丢弃并显式注明);各厂商的 session 推荐仅作参考数据保留在注册表(`variant.session`),卡片上常驻「session 由用户自行管理,方案不应用此项」提示,永远不会进入任何写入。
|
|
171
171
|
|
|
172
172
|
- **厂商方案(数据驱动,`status: 'ready'`)**:每厂商含逐角色模型 + 思考强度 token(异构:OpenAI/Minimax 五档 low/medium/high/xhigh/max、DeepSeek thinking 开关、其余模型默认)、可升级档、可用性 fallback、逐角色 rationale、厂商备注(⚠️ 注意事项——如 Qwen 的「verify 绝不用 Turbo(幻觉共振)」、Kimi 的避开退役 K2、DeepSeek 的「成本不应成为降级 verify 的理由」)与**多变体**(Claude 常规/高要求,Qwen A/B/C,DeepSeek 仅本家/verify 外置,Kimi 长期组合/最高验收质量,火山 A/B,GLM 标准组合/重活命名角色)。选择方案应用其**默认变体**(第一个);结果记录披露所应用变体并列出其余变体。厂商原生模型 id 逐字应用——部署目录中不存在的 id 会显示卡片不可用警告,轮内可用性 fallback(v0.8)保证轮次存活。
|
|
173
|
-
- **自动推荐(v0.18.2 起 = session agent 交办,用户裁定)**:选择 auto 时插件**不发起任何独立 LLM 调用、不新起任何子 agent**(v0.17.2 及之前的「一次一次性 LLM 调用 + 推荐所用模型配置项」已删除——另起一次调用等于把上下文重复提交一遍,时间与经济性都不合理)。现在的流程:插件探测实时目录(`probeCatalogOptions`,与智能选择同源),把推荐交办单——内嵌目录(唯一可选来源)、跨厂商通用原则(
|
|
173
|
+
- **自动推荐(v0.18.2 起 = session agent 交办,用户裁定)**:选择 auto 时插件**不发起任何独立 LLM 调用、不新起任何子 agent**(v0.17.2 及之前的「一次一次性 LLM 调用 + 推荐所用模型配置项」已删除——另起一次调用等于把上下文重复提交一遍,时间与经济性都不合理)。现在的流程:插件探测实时目录(`probeCatalogOptions`,与智能选择同源),把推荐交办单——内嵌目录(唯一可选来源)、跨厂商通用原则(task/verify/triage 三角色可灵活配置,允许同款模型或任意档位组合;verify 不能过度自信;省成本先压 task/triage、verify 最后动且成本不是降级 verify 的理由;triage 轻量)、当前角色配置与全部厂商方案(仅作参考)——经插件注册的 `preset_recommend` 工具交给 session agent,并在卡片写入 `pending` 记录、向在线 session agent 投递一条 steer/followup 提醒。session agent 在**自己的上下文中**读取目录、给出 task/verify/triage 的答案,再次调用该工具提交;插件只负责校验(逐字命中目录;逐角色 `reasoningEffort` 经 `ctx.llm.resolveModelInfo` 校验,不支持时降为模型默认并注明)与写入。session agent 未作答时卡片保持 pending;答案不可用(未命中目录/不可解析/零选择)时降级为带原因的 `degraded` 记录并回执给 session agent 修正重交——不应用任何更改、不阻塞任何轮次。该工具在硬门禁 allowlist 下与 cybernetics 工具一同保留。
|
|
174
174
|
- **选择是一次性的**:重复选择同一项不会再次触发(处理器按最后处理值守卫;跨重启持久化的值不会在启动时重放)。要重复应用某项,先切「(未选择)」再选。
|
|
175
175
|
- **`/cybernetics use [方案id]`(v0.22.0,命令通道)**:不开设置卡片,直接把角色组合切换为任意预置方案。无参数时命令回执纯文本清单——全部内置方案 id + 已配置的自定义方案(`custom:<id>`)——并提示用户再次输入 `/cybernetics use <id>` 确认;带 id 时复用与下拉框完全相同的应用管线(`handlePresetSelection`:六字段白名单 ops + 结果记录),回执与卡片保持一致;方案 id 大小写保留(自定义 id 逐字匹配)。与下拉框不同,重复输入同一条 `use <id>` 会**再次应用**(命令路径同步维护一次性守卫 `lastHandledPresetPlan` 并刻意绕过它),无需先切「(未选择)」。此方式应用的方案为 profile 全局生效——影响所有并发会话。
|
|
176
176
|
- **编辑器侧方案选择器(v0.24.1,popupSelect)**:选择器只在你表达 `use` 意图之后出现。在 / 菜单点选 `\cybernetics` 只把编辑器文本补全为 `/cybernetics`(不弹层——继续输入 `use ...` 即可);对裸 `/cybernetics` 回车弹出可搜索的方案选择器(12 个内置 id 与已配置的 `custom:<id>` 条目分组列出,输入即模糊过滤,当前方案高亮);键入 `\cybernetics use` 回车则先落地纯文本清单,随后同一弹层在其上弹出。点选一项即经同一条命令通道提交 `/cybernetics use <id>`(校验/应用/回执仍以服务端为唯一权威,错误就地显示在弹层)。实现走宿主为「带可选值的命令」提供的原生机制(`commandUi.decorate` + 公开的 `popupFor`/`command/executed` 面,与官方 `/model` 选择器同一模式);宿主无 commandUi 服务时保持 v0.22 纯文本行为,键入路径 `/cybernetics use <id>` 完全不动。说明:草稿内的参数级补全(输入 `use ` 后就地弹下拉)在宿主协议下不可实现——斜杠触发扫描遇空格即止(v0.25.0 复核:宿主 composer 不对外发射任何草稿变更事件,四个 `slash/input-*` 作用域事件均为插件→shell 的 bail 请求通道,触发源 outcome 仅 `{claim}/{text}/{insert}` 三种,均无法在回车前感知 `/cybernetics use` 草稿)。**请输入 `/cybernetics use` 后按 Enter 唤起方案选择器**(无参回车先落地纯文本清单,弹层随即在其上出现)。
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
> 当下的功能与使用方式以 [README.md](../README.md) 为准;协议细节见 [protocol.md](protocol.md)。
|
|
5
5
|
> 约定:`src/` 改动需宿主重载生效;`lib/client.js` 改动需重启宿主(客户端模块图在宿主启动时构建)并刷新浏览器;`workflows/round.js` 改动热生效。
|
|
6
6
|
|
|
7
|
+
## v0.25.1(2026-11-10):去除 verify≥task 且跨家族独立的硬约束,角色配置改为灵活权衡
|
|
8
|
+
|
|
9
|
+
**变更**:删除「verify 档位不得低于 task 且与 task 保持跨代际/跨家族独立(同家族 verify 升高一档补偿)」这条硬约束。保留的底线仅两条:triage 选便宜快速的模型;verify 不能过度自信(优先判断力强、能承认不确定性的模型)。task/verify/triage 三个角色改为可灵活配置——允许同款模型或任意档位组合,由使用者/推荐者按任务需要权衡审计增益与成本。同步修改:`src/modelPresets.ts` 的 `CROSS_VENDOR_PRINCIPLES` 与推荐 system prompt 规则第 2 条(reasoningEffort 规则第 5 条改为「verify 建议 high,可按需调整」)、绑定被删约束的厂商 rationale 措辞改为中性描述(预置方案本身不变)、`test/v17-model-presets.mjs` 断言更新(新原则存在、旧硬约束与「跨家族独立」不存在)、README 预置方案章节描述同步。
|
|
10
|
+
|
|
7
11
|
## v0.25.0(2026-11-08):「输入 `/cybernetics use` 未回车即弹方案选择器」调研结论——协议内不可行;弹层文案与文档明确「按 Enter 唤起」
|
|
8
12
|
|
|
9
13
|
**背景(用户新诉求)**:v0.24.1 之后用户反馈:当前 `/cybernetics use` 必须**按 Enter** 才弹方案列表;希望输入到「/cybernetics use 」(以空格结尾、尚未回车)时就自动弹出。本轮做只读调研并尽力实现;若协议不支持则明确结论并在文档/弹层文案提示按 Enter。
|
|
@@ -196,7 +200,7 @@
|
|
|
196
200
|
- **注册表填全 8 家厂商(全 `status: 'ready'`)**:OpenAI(gpt-6.1-sol task/verify + gpt-6-luna triage,effort 五档)、Claude(常规/高要求两变体,verify 恒高一档补偿单家族)、Gemini(家族 + 最新版本运行时解析,不硬编码旧版本号)、DeepSeek(仅本家/verify 外置两变体,verify thinking 档,「成本不应成为降级 verify 的理由」)、Kimi(长期组合/最高验收质量两变体,避开退役 K2)、Qwen(A/B/C 三变体,⚠️ verify 绝不用 Turbo——幻觉共振)、火山 Coding Plan(A/B 两变体,Seed 池 + GLM-5.3 备选边界)、Minimax(M3.1-Flash high/xhigh + M3 verify,缓存读 4 倍差价备注)。每厂商:多变体(`variants`,`roles` 恒为默认变体的同一对象引用)、逐角色 effort token/可升级档/fallback/rationale、厂商 note、session 参考(`variant.session`)+ 常量 `PRESET_SESSION_NOTE`。
|
|
197
201
|
- **session 范围结构性钉死**:`ALLOWED_OP_PATHS` = 恰好六个扁平子 agent 字段(task/verify/triage × model/effort),所有 apply-ops 构建器经 `filterAllowedOps` 过滤;推荐 prompt 明令「输出 JSON 只允许 task/verify/triage 三个键,禁止 session 键」;`parseRecommendation` 对万一直出的 session 键丢弃并置 `ignoredSession`;厂商 session 数据只存 `variant.session`,卡片常驻「session 由用户自行管理」提示——任何代码路径都触不到 session 配置。
|
|
198
202
|
- **effort 全链路**:`SettingsOp` 扩展 `unset`(角色换模型时清掉旧档位回模型默认);厂商方案按变体配置写入 effort token(异构:五档/thinking/默认),`recommendationApplyOps` 携带 AI 推荐的 effort;自动推荐的 effort 经 `validatePickEfforts` 软校验(`ctx.llm.resolveModelInfo`,不支持 → 丢档保模型 + 注明;调用面缺失/抛错 → 保留不阻断)。
|
|
199
|
-
- **跨厂商通用原则注入推荐 prompt**(仅作用于 task/verify/triage
|
|
203
|
+
- **跨厂商通用原则注入推荐 prompt**(仅作用于 task/verify/triage,v0.25.1 起为灵活权衡表述):task/verify/triage 三角色可灵活配置(允许同款模型或任意档位组合);verify 不能过度自信;省成本先压 task/triage、verify 最后动、成本不是降级 verify 的理由;triage 轻量。
|
|
200
204
|
- **结果记录增润**:`PresetRecommendationRecord` 增加 `efforts`/`variant`/`otherVariants`/`notes`(session 范围声明 + 厂商 ⚠️ 备注 + effort 校验注记),卡片渲染逐角色「模型(effort X | 模型默认)」+ 变体 + 备注。
|
|
201
205
|
- **顺手修复(本轮 typecheck 发现的既有缺口)**:Config 接口补齐 `presetPlan`/自动推荐请求路由字段/`presetRecommendation` 三个字段(schema 有、接口漏);`controller.ts` 的 `startRound`/`runRound` `parent: unknown` → `Agent`(`@deepseek-ai/dsh-workflow` 的 `WorkflowStartRequest.parent` 本就要求 Agent 类型,types 可解析时 strict 检查暴露);`tsc --noEmit` 现已零错误(仅存代码库级 TS5097 风格噪声)。
|
|
202
206
|
- **测试**:`test/v17-model-presets.mjs` 全量重写(接替占位版)——注册表完整性(9 id、8 家全 ready、变体数对表、roles===variants[0].roles 同一性、session 仅存 variant.session)、请求构建(session 禁令/原则/effort 契约/目录 200 行上限)、解析(fenced/裸模型/`{"task":42}` 形状容忍/session 键忽略/effort 形状丢弃)、effort 软校验三态、apply-ops 六字段围栏 + `filterAllowedOps`、全注册表变体应用(显式/未知 variantId 回退默认、effort set/unset、session 数据零泄漏)、`recommendModels` 端到端(ok 带 notes/全降级带原因与请求)、插件处理器 7 场景(one-shot、记录增润、降级、未知 id、启动种子不重放、清除零写入、新选择触发)、设置卡片(9+1 选项镜像服务端 id 序、session 提示、记录渲染含 effort 后缀/变体/备注、volatile 写路径、zh/en 26 个 locale key 完整)。复跑 `node test/v17-model-presets.mjs` 全过;v03(75 checks)/v09–v16 全绿。
|
package/lib/client.js
CHANGED
|
@@ -221,6 +221,10 @@ window.__ModuleLoader__.load({
|
|
|
221
221
|
// richer mode.tip.* wording (source + round detail).
|
|
222
222
|
'mode.pillCounts': '控制模式:{stopped}/{total}',
|
|
223
223
|
'mode.pillUnknown': '控制模式:…',
|
|
224
|
+
// 编辑器下方提示条标签(v0.25.3):括号式「控制模式({stopped}/{total})({plan})」,
|
|
225
|
+
// plan 为当前会话使用的 agent preset(方案)名称,未选择任何方案时为「未命名」。
|
|
226
|
+
'mode.hintCounts': '控制模式({stopped}/{total})({plan})',
|
|
227
|
+
'mode.plan.unnamed': '未命名',
|
|
224
228
|
'mode.state.on': '开',
|
|
225
229
|
'mode.state.off': '关',
|
|
226
230
|
'mode.state.unknown': '…',
|
|
@@ -407,6 +411,11 @@ window.__ModuleLoader__.load({
|
|
|
407
411
|
// v0.18.x: same label contract as the zh dictionary (key parity).
|
|
408
412
|
'mode.pillCounts': 'Control {stopped}/{total}',
|
|
409
413
|
'mode.pillUnknown': 'Control …',
|
|
414
|
+
// Composer hint bar label (v0.25.3): parenthesized segments
|
|
415
|
+
// 「控制模式({stopped}/{total})({plan})」 — plan = the session's
|
|
416
|
+
// active agent-preset name, or "Unnamed" when none is selected.
|
|
417
|
+
'mode.hintCounts': '控制模式({stopped}/{total})({plan})',
|
|
418
|
+
'mode.plan.unnamed': 'Unnamed',
|
|
410
419
|
'mode.state.on': 'On',
|
|
411
420
|
'mode.state.off': 'Off',
|
|
412
421
|
'mode.state.unknown': '…',
|
|
@@ -2392,6 +2401,43 @@ window.__ModuleLoader__.load({
|
|
|
2392
2401
|
const PILL_RING_STROKE = 2;
|
|
2393
2402
|
const PILL_RING_DASHARRAY = '28.3 9.4';
|
|
2394
2403
|
|
|
2404
|
+
// v0.25.2: resolve the display name of the session's active agent
|
|
2405
|
+
// preset (方案) for the composer hint bar's third segment. Data
|
|
2406
|
+
// source: the plugin ConfigForm snapshot's live value — `presetPlan`
|
|
2407
|
+
// is the current selector ('' = nothing selected → 「未命名」;
|
|
2408
|
+
// 'custom:<id>' = a user-saved preset whose display name lives in
|
|
2409
|
+
// the `customPresets` JSON list; anything else = a built-in vendor
|
|
2410
|
+
// preset id whose label comes from PRESET_CHOICES via the locale
|
|
2411
|
+
// dicts). Shape-tolerant everywhere: a malformed/missing snapshot
|
|
2412
|
+
// or a dangling custom id degrades to 「未命名」, never throws.
|
|
2413
|
+
// Exported on module.exports for offline unit tests.
|
|
2414
|
+
function resolvePlanName(cfgSnap, t) {
|
|
2415
|
+
const cfg = cfgSnap !== undefined && cfgSnap !== null && typeof cfgSnap === 'object'
|
|
2416
|
+
&& cfgSnap.status === 'ready' && cfgSnap.value !== null && typeof cfgSnap.value === 'object'
|
|
2417
|
+
? cfgSnap.value
|
|
2418
|
+
: {};
|
|
2419
|
+
const plan = typeof cfg.presetPlan === 'string' ? cfg.presetPlan : '';
|
|
2420
|
+
if (plan === '') return t('mode.plan.unnamed');
|
|
2421
|
+
if (plan.startsWith('custom:')) {
|
|
2422
|
+
const customId = plan.slice('custom:'.length);
|
|
2423
|
+
try {
|
|
2424
|
+
const parsed = JSON.parse(cfg.customPresets);
|
|
2425
|
+
if (Array.isArray(parsed)) {
|
|
2426
|
+
for (const entry of parsed) {
|
|
2427
|
+
if (entry !== null && typeof entry === 'object'
|
|
2428
|
+
&& entry.id === customId
|
|
2429
|
+
&& typeof entry.name === 'string' && entry.name.trim() !== '') {
|
|
2430
|
+
return entry.name.trim();
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
}
|
|
2434
|
+
} catch { /* corrupt payload → unnamed */ }
|
|
2435
|
+
return t('mode.plan.unnamed');
|
|
2436
|
+
}
|
|
2437
|
+
const choice = PRESET_CHOICES.find((opt) => opt.id === plan);
|
|
2438
|
+
return choice ? t(choice.labelKey) : plan;
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2395
2441
|
// v0.12.0: the running-state animation styles, injected into document.head
|
|
2396
2442
|
// exactly once per page load (guarded by the data attribute). Later
|
|
2397
2443
|
// change: the running indicator is a slowly rotating ring instead of a
|
|
@@ -2646,7 +2692,18 @@ window.__ModuleLoader__.load({
|
|
|
2646
2692
|
style: modeIndicatorStyles.hint,
|
|
2647
2693
|
children: [
|
|
2648
2694
|
renderModeRing(running.count > 0, MODE_ON_COLOR),
|
|
2649
|
-
|
|
2695
|
+
// v0.25.2: three-segment label「控制模式|{stopped}/{total}|{plan}」
|
|
2696
|
+
// — same goal counts as the session pill, plus the active
|
|
2697
|
+
// agent-preset name (「未命名」 when no preset is selected).
|
|
2698
|
+
// The insert/queue wording stays in the tooltip.
|
|
2699
|
+
jsx.jsx('span', {
|
|
2700
|
+
style: { overflow: 'hidden', textOverflow: 'ellipsis' },
|
|
2701
|
+
children: t('mode.hintCounts', {
|
|
2702
|
+
stopped: counts.stopped,
|
|
2703
|
+
total: counts.total,
|
|
2704
|
+
plan: resolvePlanName(cfgSnap, t),
|
|
2705
|
+
}),
|
|
2706
|
+
}),
|
|
2650
2707
|
],
|
|
2651
2708
|
});
|
|
2652
2709
|
}
|
|
@@ -3145,7 +3202,7 @@ window.__ModuleLoader__.load({
|
|
|
3145
3202
|
// singleton) exported for the offline harness (test/v20-home-entry.mjs).
|
|
3146
3203
|
module.exports = {
|
|
3147
3204
|
name, inject, apply, countRunningGoals, countGoals, readHintLocation,
|
|
3148
|
-
usePopupRows,
|
|
3205
|
+
usePopupRows, resolvePlanName,
|
|
3149
3206
|
homeSessionOf, requestHome, consumeHomeRequest,
|
|
3150
3207
|
};
|
|
3151
3208
|
return module.exports;
|
package/package.json
CHANGED
package/src/modelPresets.ts
CHANGED
|
@@ -191,8 +191,7 @@ export const PRESET_SESSION_NOTE = 'session agent 由用户自行管理:方案
|
|
|
191
191
|
|
|
192
192
|
/** The cross-vendor principles injected into the auto prompt (sub-agents only). */
|
|
193
193
|
export const CROSS_VENDOR_PRINCIPLES: string[] = [
|
|
194
|
-
'verify
|
|
195
|
-
'verify 与 task 保持跨代际/跨家族独立,避免同一模型自我确认偏误;确需同家族时 verify 升高一档补偿。',
|
|
194
|
+
'verify 与 task 可灵活配置(允许同款模型或任意档位组合),由使用者按任务需要权衡审计增益与成本。',
|
|
196
195
|
'verify 不能过度自信:优先判断力强、能承认不确定性的模型。',
|
|
197
196
|
'需要省成本时先压缩 task/triage,verify 最后动;成本不应成为降级 verify 的理由。',
|
|
198
197
|
'triage 是轻量收敛分拣,选便宜快速的模型即可。',
|
|
@@ -235,7 +234,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
235
234
|
verify: {
|
|
236
235
|
provider: 'openai', model: 'gpt-6.1-sol', reasoningEffort: 'high',
|
|
237
236
|
upgradeTo: 'gpt-6.1-sol (xhigh)',
|
|
238
|
-
rationale: 'verify 与 task 同模型但高一档 effort
|
|
237
|
+
rationale: 'verify 与 task 同模型但高一档 effort,以更强思考深度增强审计判断力。',
|
|
239
238
|
},
|
|
240
239
|
triage: {
|
|
241
240
|
provider: 'openai', model: 'gpt-6-luna', reasoningEffort: 'low',
|
|
@@ -248,7 +247,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
248
247
|
label: '标准组合',
|
|
249
248
|
roles: {
|
|
250
249
|
task: { provider: 'openai', model: 'gpt-6.1-sol', reasoningEffort: 'medium', upgradeTo: 'gpt-6.1-sol (high/xhigh)', rationale: '主力执行模型,effort 五档可调。' },
|
|
251
|
-
verify: { provider: 'openai', model: 'gpt-6.1-sol', reasoningEffort: 'high', upgradeTo: 'gpt-6.1-sol (xhigh)', rationale: 'verify 高一档 effort
|
|
250
|
+
verify: { provider: 'openai', model: 'gpt-6.1-sol', reasoningEffort: 'high', upgradeTo: 'gpt-6.1-sol (xhigh)', rationale: 'verify 高一档 effort 增强审计判断力。' },
|
|
252
251
|
triage: { provider: 'openai', model: 'gpt-6-luna', reasoningEffort: 'low', upgradeTo: 'gpt-6-luna (medium)', rationale: '轻量分拣。' },
|
|
253
252
|
},
|
|
254
253
|
session: { provider: 'openai', model: 'gpt-6-astra', reasoningEffort: 'high', upgradeTo: 'gpt-6-astra (xhigh/max)', rationale: 'session 主脑用旗舰 astra(仅参考)。' },
|
|
@@ -264,7 +263,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
264
263
|
status: 'ready',
|
|
265
264
|
roles: {
|
|
266
265
|
task: { provider: 'anthropic', model: 'claude-sonnet-5-5', rationale: '常规档 task 用 Sonnet 5.5(claude-sonnet-5-5):性价比主力。' },
|
|
267
|
-
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'claude-fable-5-1', rationale: 'verify
|
|
266
|
+
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'claude-fable-5-1', rationale: 'verify 配置更强的模型(Opus 5.5)以增强审计判断力。' },
|
|
268
267
|
triage: { provider: 'anthropic', model: 'claude-haiku-5-5', rationale: '轻量分拣。' },
|
|
269
268
|
},
|
|
270
269
|
variants: [
|
|
@@ -273,7 +272,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
273
272
|
label: '常规',
|
|
274
273
|
roles: {
|
|
275
274
|
task: { provider: 'anthropic', model: 'claude-sonnet-5-5', rationale: '性价比主力执行。' },
|
|
276
|
-
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'claude-fable-5-1', rationale: 'verify
|
|
275
|
+
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'claude-fable-5-1', rationale: 'verify 高一档增强审计判断力。' },
|
|
277
276
|
triage: { provider: 'anthropic', model: 'claude-haiku-5-5', rationale: '轻量分拣。' },
|
|
278
277
|
},
|
|
279
278
|
session: { provider: 'anthropic', model: 'claude-opus-5-5', rationale: 'session 主脑用 Opus 5.5(仅参考)。' },
|
|
@@ -343,7 +342,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
343
342
|
label: 'verify 外置',
|
|
344
343
|
roles: {
|
|
345
344
|
task: { provider: 'deepseek-official', model: 'deepseek-v4-pro', fallback: 'deepseek-v4-pro (thinking)', rationale: '本家 task 不变。' },
|
|
346
|
-
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'gpt-6-astra / gemini-pro-latest', rationale: 'verify 优先外置旗舰(Claude Opus / GPT 旗舰 / Gemini Pro
|
|
345
|
+
verify: { provider: 'anthropic', model: 'claude-opus-5-5', fallback: 'gpt-6-astra / gemini-pro-latest', rationale: 'verify 优先外置旗舰(Claude Opus / GPT 旗舰 / Gemini Pro),配置更强的模型以增强审计判断力。' },
|
|
347
346
|
triage: { provider: 'deepseek-official', model: 'deepseek-flash', rationale: '轻量分拣。' },
|
|
348
347
|
},
|
|
349
348
|
session: { provider: 'deepseek-official', model: 'deepseek-v4-pro (非 thinking)', fallback: 'deepseek-flash', rationale: 'session 用 deepseek-v4-pro 非思考档或 deepseek-flash(仅参考)。' },
|
|
@@ -360,7 +359,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
360
359
|
status: 'ready',
|
|
361
360
|
roles: {
|
|
362
361
|
task: { provider: 'kimi', model: 'kimi-for-coding-highspeed', rationale: '高速执行主力(本部署目录内的高速 coding 档)。' },
|
|
363
|
-
verify: { provider: 'kimi', model: 'k3', fallback: 'k3-256k', rationale: 'verify 用上一代 k3
|
|
362
|
+
verify: { provider: 'kimi', model: 'k3', fallback: 'k3-256k', rationale: 'verify 用上一代 k3:配置差异化模型增强审计判断力;最高验收质量可换 k3-256k。' },
|
|
364
363
|
triage: { provider: 'kimi', model: 'kimi-for-coding-highspeed', rationale: '轻量分拣同执行主力(高速版成本低)。' },
|
|
365
364
|
},
|
|
366
365
|
variants: [
|
|
@@ -520,7 +519,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
520
519
|
label: '重活命名角色(frontend 等)',
|
|
521
520
|
roles: {
|
|
522
521
|
task: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'max', rationale: '官方建议复杂 coding 用 max;按需触发,只在难 subgoal 上生效。' },
|
|
523
|
-
verify: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'max', rationale: 'verify 与 task 同级 max
|
|
522
|
+
verify: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'max', rationale: 'verify 与 task 同级 max,以最高思考档增强审计判断力。' },
|
|
524
523
|
triage: { provider: 'zai-coding-cn', model: 'glm-5.3-flash', reasoningEffort: 'low', rationale: '轻量分拣不变。' },
|
|
525
524
|
},
|
|
526
525
|
session: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'high', rationale: 'session 同标准组合(仅参考)。' },
|
|
@@ -536,7 +535,7 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
536
535
|
status: 'ready',
|
|
537
536
|
roles: {
|
|
538
537
|
task: { provider: 'zai-coding-cn', model: 'glm-5.3-flash', rationale: '量最大的角色用 Flash:成本低、速度快。' },
|
|
539
|
-
verify: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'medium', rationale: 'verify 升到 glm-5.3 中档 effort
|
|
538
|
+
verify: { provider: 'zai-coding-cn', model: 'glm-5.3', reasoningEffort: 'medium', rationale: 'verify 升到 glm-5.3 中档 effort,配置更强的模型以增强审计判断力。' },
|
|
540
539
|
triage: { provider: 'zai-coding-cn', model: 'glm-5.3-flash', reasoningEffort: 'minimal', rationale: '轻量分拣走 minimal effort,压成本与 wall-clock。' },
|
|
541
540
|
},
|
|
542
541
|
variants: [{
|
|
@@ -554,11 +553,11 @@ export const VENDOR_PRESETS: VendorPreset[] = [
|
|
|
554
553
|
{
|
|
555
554
|
id: 'builtin-deepseek-fast',
|
|
556
555
|
label: 'deepseek 快速',
|
|
557
|
-
description: '用户自定义 DeepSeek 快速组合:task deepseek-official/deepseek-flash / verify deepseek-official/deepseek-flash(effort high) / triage deepseek-account/deepseek-flash(effort low)。全 Flash 档拉满速度,verify 以 high effort
|
|
556
|
+
description: '用户自定义 DeepSeek 快速组合:task deepseek-official/deepseek-flash / verify deepseek-official/deepseek-flash(effort high) / triage deepseek-account/deepseek-flash(effort low)。全 Flash 档拉满速度,verify 以 high effort 增强审计判断力。',
|
|
558
557
|
status: 'ready',
|
|
559
558
|
roles: {
|
|
560
559
|
task: { provider: 'deepseek-official', model: 'deepseek-flash', rationale: 'Flash 档执行主力:速度优先。' },
|
|
561
|
-
verify: { provider: 'deepseek-official', model: 'deepseek-flash', reasoningEffort: 'high', rationale: 'verify 同模型但开 high effort
|
|
560
|
+
verify: { provider: 'deepseek-official', model: 'deepseek-flash', reasoningEffort: 'high', rationale: 'verify 同模型但开 high effort,以更强思考深度增强审计判断力。' },
|
|
562
561
|
triage: { provider: 'deepseek-account', model: 'deepseek-flash', reasoningEffort: 'low', rationale: '轻量分拣 low 档(deepseek-account 为同款另一计费渠道)。' },
|
|
563
562
|
},
|
|
564
563
|
variants: [{
|
|
@@ -681,10 +680,10 @@ export function buildRecommendationPrompt(input: RecommendationRequestInput): Re
|
|
|
681
680
|
'范围(最高优先):session agent(主会话 agent)不在推荐范围内,其模型由用户自行管理——输出 JSON 只允许 task/verify/triage 三个键,禁止输出 session 键。',
|
|
682
681
|
'规则:',
|
|
683
682
|
'1. 只能从「可用模型列表」中选择,逐字使用其中的 provider/model;列表外的模型一律禁止推荐。',
|
|
684
|
-
'2. 通用原则:
|
|
683
|
+
'2. 通用原则:task/verify/triage 三个角色可灵活配置,允许同款模型或任意档位组合,按任务需要权衡;verify 不能过度自信;省成本先压 task/triage、verify 最后动;成本不是降级 verify 的理由;triage 选便宜快速的模型。',
|
|
685
684
|
'3. 某个角色如维持现状更好(例如当前配置已是最优、或列表中没有更好的选择),输出 null 保持现状。',
|
|
686
685
|
'4. 「厂商预置方案」只是参考资料(各家产品思路),不是可选项——目录里没有的模型组合不要采纳。',
|
|
687
|
-
'5. reasoningEffort 可选:仅当你确知该模型提供该思考强度档位时输出(例如 low/medium/high/xhigh/max 等),否则省略该字段;task 建议 medium/high,verify
|
|
686
|
+
'5. reasoningEffort 可选:仅当你确知该模型提供该思考强度档位时输出(例如 low/medium/high/xhigh/max 等),否则省略该字段;task 建议 medium/high,verify 建议 high、可按需调整,triage 建议 low。',
|
|
688
687
|
'6. 只输出一个 JSON 对象,不要解释、不要 markdown 代码块之外的文字。格式:',
|
|
689
688
|
'{"task":{"provider":"<provider>","model":"<model>","reasoningEffort":"<可选>"}|null,"verify":...,"triage":...}',
|
|
690
689
|
].join('\n')
|