From 71011400d209429da17580a7b9358efac12544c0 Mon Sep 17 00:00:00 2001 From: Youzini-afk <13153778771cx@gmail.com> Date: Thu, 26 Mar 2026 00:02:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=AD=A3=E5=88=99=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E4=BB=8E=209=20=E4=B8=AA=E7=BB=86=E5=88=86=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E4=B8=BA=E8=BE=93=E5=85=A5/=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E4=B8=A4=E5=A4=A7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 9 个细粒度阶段 → 2 个:input(所有 prompt 阶段)、output(模型返回阶段) - 默认值:enabled=true, input=true, output=true(全部打开) - task-regex.js: shouldApplyRuleForStage 映射旧 stage 名到 input/output - UI: 合并为单组「执行阶段」列表 --- panel.js | 60 +++++++++------------------------------------------ task-regex.js | 26 ++++++++-------------- 2 files changed, 19 insertions(+), 67 deletions(-) diff --git a/panel.js b/panel.js index ba6cfbb..fd7682c 100644 --- a/panel.js +++ b/panel.js @@ -108,15 +108,8 @@ const TASK_PROFILE_GENERATION_GROUPS = [ ]; const TASK_PROFILE_REGEX_STAGES = [ - { key: "finalPrompt", label: "最终 Prompt", desc: "最终 system prompt" }, - { key: "input.userMessage", label: "用户消息", desc: "用户消息进入编排前" }, - { key: "input.recentMessages", label: "近期消息", desc: "最近消息进入编排前" }, - { key: "input.candidateText", label: "候选文本", desc: "候选节点文本进入编排前" }, - { key: "input.finalPrompt", label: "组装后 Prompt", desc: "最终 assembled prompt" }, - { key: "rawResponse", label: "原始返回", desc: "模型原始输出" }, - { key: "beforeParse", label: "解析前", desc: "解析 JSON 前" }, - { key: "output.rawResponse", label: "输出原始响应", desc: "输出阶段原始响应" }, - { key: "output.beforeParse", label: "输出解析前", desc: "输出阶段解析前" }, + { key: "input", label: "输入阶段", desc: "对发送给 LLM 的 prompt 执行正则替换。" }, + { key: "output", label: "输出阶段", desc: "对 LLM 返回的结果执行正则替换。" }, ]; let panelEl = null; @@ -1996,9 +1989,9 @@ function _renderTaskRegexTab(state) { .join("")} -
输入阶段
+
执行阶段
- ${TASK_PROFILE_REGEX_STAGES.filter((s) => !s.key.startsWith("output.") && s.key !== "rawResponse" && s.key !== "beforeParse").map( + ${TASK_PROFILE_REGEX_STAGES.map( (stage) => ` - `, - ).join("")} -
- -
输出阶段
-
- ${TASK_PROFILE_REGEX_STAGES.filter((s) => s.key.startsWith("output.") || s.key === "rawResponse" || s.key === "beforeParse").map( - (stage) => ` - `, @@ -2812,7 +2786,7 @@ function _normalizeTaskProfileDraft(profile = {}) { const draft = profile || {}; draft.blocks = _normalizeTaskBlocks(draft.blocks); draft.regex = { - enabled: false, + enabled: true, inheritStRegex: true, sources: { global: true, @@ -2820,15 +2794,8 @@ function _normalizeTaskProfileDraft(profile = {}) { character: true, }, stages: { - finalPrompt: true, - "input.userMessage": false, - "input.recentMessages": false, - "input.candidateText": false, - "input.finalPrompt": false, - rawResponse: false, - beforeParse: false, - "output.rawResponse": false, - "output.beforeParse": false, + input: true, + output: true, }, localRules: [], ...(draft.regex || {}), @@ -2839,15 +2806,8 @@ function _normalizeTaskProfileDraft(profile = {}) { ...(draft.regex?.sources || {}), }, stages: { - finalPrompt: true, - "input.userMessage": false, - "input.recentMessages": false, - "input.candidateText": false, - "input.finalPrompt": false, - rawResponse: false, - beforeParse: false, - "output.rawResponse": false, - "output.beforeParse": false, + input: true, + output: true, ...(draft.regex?.stages || {}), }, localRules: Array.isArray(draft.regex?.localRules) diff --git a/task-regex.js b/task-regex.js index ae600c8..a3ef5b2 100644 --- a/task-regex.js +++ b/task-regex.js @@ -215,14 +215,16 @@ function collectLocalRules(regexConfig = {}) { .filter((rule) => rule.enabled && rule.findRegex); } -function shouldApplyRuleForStage(rule, stage = "") { +function shouldApplyRuleForStage(rule, stage = "", stagesConfig = {}) { + // 将细粒度的 stage 名映射到 input / output 两大类 if (PROMPT_STAGES.has(stage)) { - return rule.destinationFlags.prompt !== false; + return stagesConfig.input !== false && rule.destinationFlags.prompt !== false; } if (OUTPUT_STAGES.has(stage)) { - return true; + return stagesConfig.output !== false; } - return rule.destinationFlags.prompt !== false; + // 未知 stage 回退到 input + return stagesConfig.input !== false && rule.destinationFlags.prompt !== false; } function shouldApplyRuleForRole(rule, role = "system") { @@ -280,18 +282,8 @@ export function applyTaskRegex( return input; } - const stageEnabled = regexConfig?.stages?.[stage] === true; - if (!stageEnabled) { - pushDebug(debugCollector, { - taskType, - stage, - enabled: true, - appliedRules: [], - sourceCount: { tavern: 0, local: 0 }, - skipped: "stage_disabled", - }); - return input; - } + // 阶段检查已移到 shouldApplyRuleForStage 中,无需单独 gate + const stagesConfig = regexConfig?.stages || {}; const tavernRules = collectTavernRules(regexConfig); const localRules = collectLocalRules(regexConfig); @@ -300,7 +292,7 @@ export function applyTaskRegex( let output = input; for (const rule of orderedRules) { - if (!shouldApplyRuleForStage(rule, stage)) continue; + if (!shouldApplyRuleForStage(rule, stage, stagesConfig)) continue; if (!shouldApplyRuleForRole(rule, role)) continue; const result = applyOneRule(output, rule, stage);