diff --git a/server/routes/agent-chat.js b/server/routes/agent-chat.js index 8f2087a..f5d6d97 100644 --- a/server/routes/agent-chat.js +++ b/server/routes/agent-chat.js @@ -228,8 +228,19 @@ domain: ${domain} // Bootstrap 工具 // ═══════════════════════════════════════ +// 💰 Token 防护:单文件注入上限 +const MAX_PROMPT_FILE_SIZE = 15 * 1024; // 15KB per file +const MAX_TOTAL_PROMPT_SIZE = 100 * 1024; // 100KB total system prompt + function loadFile(agentDir, filename) { - try { return fs.readFileSync(path.join(agentDir, filename), 'utf-8'); } + try { + const content = fs.readFileSync(path.join(agentDir, filename), 'utf-8'); + if (content.length > MAX_PROMPT_FILE_SIZE) { + console.warn(`[TokenGuard] ⚠️ ${filename} 超过 ${MAX_PROMPT_FILE_SIZE/1024}KB (${(content.length/1024).toFixed(1)}KB),已截断`); + return content.substring(0, MAX_PROMPT_FILE_SIZE) + `\n\n... [⚠️ 文件过大已截断,原始 ${(content.length/1024).toFixed(1)}KB,请用 Read 工具按需读取完整内容]`; + } + return content; + } catch { return ''; } } @@ -396,7 +407,15 @@ function buildSystemPrompt(agentDir, userMessage) { } } - return parts.join('\n\n---\n\n'); + let result = parts.join('\n\n---\n\n'); + + // 💰 Token 防护:总 system prompt 上限 + if (result.length > MAX_TOTAL_PROMPT_SIZE) { + console.warn(`[TokenGuard] ⚠️ System prompt 超过 ${MAX_TOTAL_PROMPT_SIZE/1024}KB (${(result.length/1024).toFixed(1)}KB),已截断`); + result = result.substring(0, MAX_TOTAL_PROMPT_SIZE) + `\n\n... [⚠️ System prompt 过大已截断]`; + } + + return result; } /** diff --git a/system/agents/evolver/agent.md b/system/agents/evolver/agent.md index eb29139..3117168 100644 --- a/system/agents/evolver/agent.md +++ b/system/agents/evolver/agent.md @@ -85,7 +85,29 @@ - 不要修改目标分数 — industry_avg 由 Digester 设定 - 超过 10 轮仍未达标 → 报告瓶颈, 等待 Innovator 决策 +## 💰 Token 预算规则(极其重要!) + +> 每轮迭代都会累积上下文,5 轮后 input 可达数百万 tokens。必须严格遵守以下规则: + +### 文件读取规则 +- **首次读取** test.jsonl / train.jsonl / benchmark.md / knowhow.md 后,**后续迭代绝不重复读取**这些未变化的文件 +- **SKILL.md** 是唯一需要每轮重新读取的文件(因为你在修改它) +- 读取 scorer.js 只在首次和修改后 +- **禁止使用 `cat` 读取超过 5KB 的文件**,改用 `head -100` 或 `grep` 提取关键信息 + +### 评分输出规则 +- 每轮评分结果只输出**总分 + 弱维度名称**,不要输出每条 test case 的完整评分细节 +- 评分详情写入 `iteration_N_scores.json` 文件,不要在对话中展开 + +### 迭代效率规则 +- 每轮修改 SKILL.md 后,只输出**修改了哪些维度的哪些规则**(diff 摘要),不要输出完整的新版 SKILL.md 内容 +- evolving_log.md 只追加 1-2 行摘要,不要写长篇分析 +- 如果连续 2 轮分数变化 < 2 分,立即报告瓶颈并停止,不要继续浪费迭代 + +### 迭代上限 +- **单次 session 最多执行 5 轮迭代**。如果 5 轮后仍未达标,报告当前最佳分数和瓶颈维度,等待 Innovator 决策是否重启新 session 继续 + ## ✅ 始终要做 -- 每轮迭代记录 evolving_log.md +- 每轮迭代记录 evolving_log.md(1-2 行摘要) - 当 score ≥ industry_avg 时,报告完成 - 使用 report_task API 定期向 Innovator 汇报进度