feat(complexity): 新增 AUTO·由模型判断 复杂度档位 (tsk_zacmwH3chZpG)

新建任务时除手选 hard/medium/easy 外,新增 AUTO 档:先以 medium 落库
占位,建任务后异步用 sonnet 起一次轻量分类调用回填三档结果并记录理由,
不阻塞建任务返回;模型不可用/解析失败一律兜底 medium,绝不报错。

- web 看板:复杂度 seg 增加第四档 AUTO(默认选中,cyan 样式),提交 complexity='auto'
- src/api/server.ts:POST tasks 接受 'auto' → medium 占位 + 异步 classify 回填(可注入 classify 测试)
- src/executor/classify.ts(新增):buildClassifyPrompt/parseClassification/classifyComplexity
  复用 cc.ts/models.ts,sonnet 省额度,无工具、限轮限时
- src/executor/models.ts:pickClassifierModel(复用 executor easy 档 + MAESTRO_MODEL_EASY 覆盖)
- src/store/store.ts:applyAutoComplexity 回填复杂度+重置状态+理由入产出字段+广播 task.updated
- test/classify.test.ts:解析映射/兜底、prompt、回填、建任务集成(13 例)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-13 10:46:37 +08:00
parent 872354cf7c
commit 13572a5416
7 changed files with 348 additions and 4 deletions
+9
View File
@@ -45,6 +45,15 @@ export function resolvedExecutorModels(project: Project): Record<Complexity, str
return out;
}
/**
* AUTO 复杂度分类器用的模型:复用 executor easy 档(claude-sonnet,省额度),
* env MAESTRO_MODEL_EASY 可覆盖。单次轻量调用,不走 project.model。
*/
export function pickClassifierModel(): string {
const [env, fallback] = MODEL_TABLE.executor.easy;
return process.env[env]?.trim() || fallback;
}
/** 错误信息是否像“模型不可用”(not_found / invalid / permission 等模式 + 提到 model */
export function isModelError(msg: string): boolean {
if (!/model/i.test(msg)) return false;