From 5454b2cdaf6b1aa6c7f1550db3aadcecb09903bc Mon Sep 17 00:00:00 2001 From: yibo Date: Sat, 4 Apr 2026 00:48:09 +0800 Subject: [PATCH] chore: update agents, server routes, start script, and views --- server/routes/agent-chat.js | 7 +++++++ server/routes/company.js | 10 +++++----- start.sh | 4 ++++ system/agents/digester-youtube-crawler/todo.md | 1 + system/agents/evolver-youtube-crawler/SKILL.md | 6 +++--- system/agents/evolver-youtube-crawler/todo.md | 1 + system/agents/hunter/todo.md | 1 + system/agents/innovator/.claude/scheduled_tasks.json | 20 +++++++------------- system/agents/innovator/agent.md | 9 +++++---- system/agents/innovator/soul.md | 2 ++ system/agents/master/.claude/scheduled_tasks.json | 17 ++++++++++++++++- web/src/views/CompanyDashboard.vue | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 12 files changed, 128 insertions(+), 32 deletions(-) diff --git a/server/routes/agent-chat.js b/server/routes/agent-chat.js index 22e4a74..3cda97f 100644 --- a/server/routes/agent-chat.js +++ b/server/routes/agent-chat.js @@ -664,6 +664,13 @@ async function getOrCreateProtocol(agentId, convId) { } const protocol = new ClaudeCliProtocol({ name: identity.name }, cliOptions); + + // 绑定错误监听器,防止 EventEmitter 抛出未捕获异常导致整个 Node 进程奔溃 (例如 spawn claude ENOENT) + protocol.on('error', (err) => { + console.error(`[AgentChat] 🚨 ${identity.name} 协议级异常:`, err.message); + sessions.delete(key); // 下次提问将重建进程 + }); + await protocol.connect(null, agentDir); await protocol.initialize(); await protocol.newSession({ cwd: agentDir }); diff --git a/server/routes/company.js b/server/routes/company.js index 0625088..1a47852 100644 --- a/server/routes/company.js +++ b/server/routes/company.js @@ -713,7 +713,7 @@ router.get('/:companyId/status', (req, res) => { const heartbeatService = require('../services/heartbeat-service'); const path = require('path'); const fs = require('fs'); - const DATA_DIR = path.resolve(__dirname, '../../data'); + const DATA_DIR = path.resolve(__dirname, '../../data/companies'); // 计算运行时长 const uptimeMs = company.status === 'running' && company.startedAt @@ -776,7 +776,7 @@ router.put('/:companyId/agents/:agentId/heartbeat', (req, res) => { const { intervalMinutes, enabled } = req.body; const path = require('path'); const fs = require('fs'); - const DATA_DIR = path.resolve(__dirname, '../../data'); + const DATA_DIR = path.resolve(__dirname, '../../data/companies'); const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); if (!fs.existsSync(configPath)) { @@ -816,7 +816,7 @@ router.post('/:companyId/agents/:agentId/heartbeat/start', (req, res) => { try { const path = require('path'); const fs = require('fs'); - const DATA_DIR = path.resolve(__dirname, '../../data'); + const DATA_DIR = path.resolve(__dirname, '../../data/companies'); const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); if (!fs.existsSync(configPath)) { @@ -846,7 +846,7 @@ router.post('/:companyId/agents/:agentId/heartbeat/stop', (req, res) => { try { const path = require('path'); const fs = require('fs'); - const DATA_DIR = path.resolve(__dirname, '../../data'); + const DATA_DIR = path.resolve(__dirname, '../../data/companies'); const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); if (!fs.existsSync(configPath)) { @@ -883,7 +883,7 @@ router.get('/:companyId/agents/:agentId/skills', (req, res) => { try { const path = require('path'); const fs = require('fs'); - const DATA_DIR = path.resolve(__dirname, '../../data'); + const DATA_DIR = path.resolve(__dirname, '../../data/companies'); const skillsDir = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'skills'); if (!fs.existsSync(skillsDir)) { diff --git a/start.sh b/start.sh index c602800..0be7ee7 100755 --- a/start.sh +++ b/start.sh @@ -5,6 +5,10 @@ set -e +# Load NVM to ensure node is available in non-interactive shell +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + echo "🧬 LemonBoss 启动中..." echo "═══════════════════════════════════" diff --git a/system/agents/digester-youtube-crawler/todo.md b/system/agents/digester-youtube-crawler/todo.md index e311e98..fe567b8 100644 --- a/system/agents/digester-youtube-crawler/todo.md +++ b/system/agents/digester-youtube-crawler/todo.md @@ -12,3 +12,4 @@ | T-mnevj3i8 | 消化 youtube-crawler 的 knowhow.md,为 youtube-crawler Agent 模板生成 benchmark 与训练数据集。\n\n## 输入\n- knowhow.md 路径: system/templates/youtube-crawler/workspace/hunt/knowhow.md\n\n## 产出要求(写入以下目录)\n- 输出目录: system/templates/youtube-crawler/workspace/digest/\n- benchmark.md: 设计 5-8 个可量化维度,权重总和 100%,定义 0-100 分评分细则,设定及格/良好/优秀阈值,目标设计标准达到 90 分以上。\n- train.json: 训练数据集 ≥40 条样本,每条标注各维度得分与总分。\n- test.json: 测试数据集 ≥10 条样本。\n- industry_avg.json: 行业基线(设定 industry_avg_score 和 elite_avg_score)。\n\n## 验收标准\n1. JSON 文件必须合法可解析\n2. benchmark.md 中权重总和 = 100%\n3. train + test 总样本数 ≥ 50\n4. 完成后汇报文件路径和 benchmark 设计摘要 | ✅ 完成 | innovator | P1 | 2026-03-31 17:11 | - | | T-mnevwogv | 执行 DIGEST 阶段:消化 youtube-crawler 的 knowhow.md,生成 benchmark.md、train.json、test.json 和 industry_avg.json。输入文件: /mnt/lemonboss/system/templates/youtube-crawler/workspace/hunt/knowhow.md。产出目录: /mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/。要求: 1) benchmark.md 设计 5-8 个可量化维度,权重总和100%,定义0-100分评分细则,设定及格/良好/优秀阈值,目标总分90+;2) train.json ≥40条样本,test.json ≥10条样本;3) industry_avg.json 包含 industry_avg_score 和 elite_avg_score。完成后更新任务状态并汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:22 | - | | T-mnevyvaz | 执行 DIGEST 阶段:消化 youtube-crawler 的 knowhow.md,生成 benchmark.md、train.json、test.json 和 industry_avg.json。输入文件: /mnt/lemonboss/system/templates/youtube-crawler/workspace/hunt/knowhow.md。产出目录: /mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/。要求: 1) benchmark.md 设计 5-8 个可量化维度,权重总和100%,定义0-100分评分细则,设定及格/良好/优秀阈值,目标总分90+;2) train.json ≥40条样本,test.json ≥10条样本;3) industry_avg.json 包含 industry_avg_score 和 elite_avg_score。完成后更新任务状态并汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:23 | - | +| T-mnj3nimu | 【FDE Phase 2: DIGEST】对 YouTube Data API v3 爬取技能进行知识消化与 Benchmark 生成。

## 目标
为 youtube-trending-crawler 技能生成 benchmark 评分标准和训练数据集。

## 输入文件
Hunter 产出的文件位于: /Users/yibo/Documents/lemonAI/lemonboss/system/agents/hunter/workspace/youtube-trending/
- knowhow_v2.md
- crawl_config.json

## 目标 Agent
- company: test
- agent: claude-youtube-skills

## Digest 任务要求
1. **解析 knowhow_v2.md** - 提取核心知识点和 API 调用方法论
2. **生成 benchmark_v2.md** - 可量化的评分标准,包含:
- API 调用准确性
- 数据字段完整性
- 多地区/多分类支持
- 错误处理健壮性
- 输出格式正确性
- 配额管理合理性
3. **生成训练数据集** (如可能):
- train.json: 训练样本
- test.json: 测试样本
4. **计算行业基线分**: industry_avg_score (建议 85-90 分)

## 输出路径
必须写入: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/
- benchmark_v2.md - 量化评分标准
- train.json - 训练数据集
- test.json - 测试数据集
- industry_avg.json - 行业基线分数

## 重要提醒
- 读取已有的旧版本 benchmark.md (如存在),合并并输出新版本 benchmark_v2.md
- 保留所有已有内容,追加新的评分维度 | ⬚ 未开始 | innovator | P0 | 2026-04-03 16:09 | - | diff --git a/system/agents/evolver-youtube-crawler/SKILL.md b/system/agents/evolver-youtube-crawler/SKILL.md index 2b2d70b..c30b093 100644 --- a/system/agents/evolver-youtube-crawler/SKILL.md +++ b/system/agents/evolver-youtube-crawler/SKILL.md @@ -104,9 +104,9 @@ try { ## 经验教训 (自动沉淀) - -> 以下经验由系统自动从历史对话中提取沉淀,帮助你避免重复犯错。 - - ✅ [2026-03-31] 成功创建/修改了 3 个文件: workspace/evolve/skill_youtube_crawler.md`, workspace/evolve/evolution_log.json`, workspace/evolve/test_results.json` - ✅ [2026-03-31] 完成了 36 步工具调用的复杂任务 (931秒) - ✅ [2026-03-31] 涉及技能训练/评分/进化流程 +- ✅ [2026-04-03] 成功创建/修改了 2 个文件: workspace/evolve/evolve_report.md`, workspace/evolve/optimized_skill.md` +- ✅ [2026-04-03] 完成了 16 步工具调用的复杂任务 (149秒) +- ✅ [2026-04-03] 涉及技能训练/评分/进化流程 diff --git a/system/agents/evolver-youtube-crawler/todo.md b/system/agents/evolver-youtube-crawler/todo.md index c7a39ed..70336f5 100644 --- a/system/agents/evolver-youtube-crawler/todo.md +++ b/system/agents/evolver-youtube-crawler/todo.md @@ -14,3 +14,4 @@ - [x] 基础技能注入完成 (evolving + mock-env + code-refactor) | T-mnew8cq0 | 【自我进化任务】测试并优化你的三个核心技能(evolving、mock-env、code-refactor),确保综合 benchmark 达到 90 分以上。

## 执行步骤
1. **Code-Refactor 阶段**: 运行 code-refactor 技能分析 youtube_crawler.js,生成 refactor_report.md
2. **Mock-Env 阶段**: 运行 mock-env 技能搭建测试环境,生成 mock 数据
3. **Evolving 阶段**: 运行 evolving 技能执行双循环进化

## 测试目标
- 对 system/templates/youtube-crawler/code/youtube_crawler.js 进行代码质量分析
- 搭建 mock 测试环境覆盖 API/yt-dlp/异常场景
- 执行 benchmark 测试,目标总分 ≥ 90 分

## 输出要求
- workspace/evolver-youtube-crawler/refactor_report.md
- workspace/evolver-youtube-crawler/mock/
- workspace/evolver-youtube-crawler/evolution_log.md
- workspace/evolver-youtube-crawler/benchmark_result.json

完成后汇报最终得分和改进摘要。 | ⬚ 未开始 | innovator | P1 | 2026-03-31 17:31 | - | | T-mnew9pn1 | 【Phase 3 EVOLVING】youtube-crawler 技能双循环进化训练

## 任务背景
- Phase 1 (Hunt): ✅ 已完成,knowhow.md 位于 system/templates/youtube-crawler/workspace/hunt/
- Phase 2 (Digest): ✅ 已完成,benchmark.md 和 train_dataset.json 位于 system/templates/youtube-crawler/workspace/digest/
- 目标:训练 youtube-crawler 技能达到 90+ 分

## 输入资料
1. benchmark.md: system/templates/youtube-crawler/workspace/digest/benchmark.md
2. train_dataset.json: system/templates/youtube-crawler/workspace/digest/train_dataset.json
3. test_dataset.json: system/templates/youtube-crawler/workspace/digest/test_dataset.json
4. knowhow.md: system/templates/youtube-crawler/workspace/hunt/knowhow.md
5. 目标 Agent 技能目录: system/agents/youtube-crawler/.claude/skills/

## 训练要求
1. 执行 Small Loop(技能迭代)最多 10 轮,直到 benchmark score >= 90
2. 每轮分析弱维度,针对性修改 Skill 定义
3. 使用 mock-env 搭建测试环境
4. 使用 code-refactor 优化代码质量

## 产出要求
- 输出目录: system/templates/youtube-crawler/workspace/evolve/
- skill_youtube_crawler.md (最终技能定义)
- evolution_log.json (进化记录)
- test_results.json (测试结果)

## 完成标准
- Benchmark score >= 90 分
- 技能文件部署到 system/agents/youtube-crawler/.claude/skills/

完成后请调用 report_task 向 innovator 汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:32 | - | +| T-mnj3s7bi | 【FDE Phase 3: EVOLVE】对 YouTube Data API v3 爬取技能进行 RL 进化训练。

## 目标
优化 youtube-trending-crawler 技能,使其 benchmark 得分 ≥ 90 分。

## 输入文件
- Benchmark: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/benchmark_v2.md
- Train: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/train.json
- Test: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/test.json
- Industry Avg: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/industry_avg.json

## 目标 Agent
- company: test
- agent: claude-youtube-skills

## Evolve 任务要求
1. **读取现有技能**: 查看 test:claude-youtube-skills 的现有 SKILL.md
2. **分析 benchmark**: 理解评分维度和弱项
3. **Small Loop 训练**: 逐个修复弱维度:
- 错误处理健壮性 (当前 60分)
- 配额管理合理性 (当前 65分)
- 多地区多分类支持 (当前 68分)
4. **运行测试**: 使用 test.json 验证修复效果
5. **循环优化**: 直到 score ≥ 90

## 输出路径
必须写入: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/evolve/
- evolve_report.md - 训练报告 (包含每轮迭代的修改和得分)
- optimized_skill.md - 优化后的技能定义

## 验收标准
- 最终 benchmark 得分 ≥ 90
- 通过 test.json 的全部测试用例
- 产出优化的 SKILL.md | ✅ 完成 | innovator | P0 | 2026-04-03 16:13 | - | diff --git a/system/agents/hunter/todo.md b/system/agents/hunter/todo.md index 153ac9d..fc962de 100644 --- a/system/agents/hunter/todo.md +++ b/system/agents/hunter/todo.md @@ -45,3 +45,4 @@ - T-mnext40u、T-mnexx9w8 (abc:trend-hunter 相关): ⚠️ 已取消 — abc 公司已于 2026-04-01 删除,目标 Agent 不存在。 - T-mncue787 (hook-editor)、T-mncuebf1 (strategy-reflector): ⚠️ 已取消 — 目标 Agent 不存在。 - T-mncz867y (idearrun-create)、T-mnexldk1 (lemonv:trend-hunter)、T-mnexpuii (lemonv:screenwriter): ⏸️ 暂停 — hunter 处于系统维护暂停状态,待恢复后处理。 +| T-mnj3emdx | 对 YouTube Data API v3 爬取技能进行深度调研。

## 目标
训练一个能够通过 Google YouTube Data API v3 抓取最热最新视频列表并输出 JSON 的技能。

## 任务要求
1. 调研 YouTube Data API v3 的以下端点:
- 趋势视频 (trending videos)
- 热门视频 (most popular videos)
- 按国家/地区筛选的视频
- 搜索结果 (search)
- 视频详情 (videos)
- 频道详情 (channels)

2. 输出数据格式要求包含:
- 视频名称
- 发布博主名称
- 博主粉丝数
- 视频热度/热度趋势
- 播放量
- 视频简介
- 视频URL
- 其他相关元数据

3. 查找现有参考 skills 文档 (参考路径: .claude/skills/)

## 产出要求
输出到以下路径: /Users/yibo/Documents/lemonAI/lemonboss/system/agents/hunter/workspace/youtube-trending/
- knowhow_v2.md - 数据源清单和技术调研报告
- crawl_config.json - API 爬取配置
- seed_data.json - 首次采集的种子数据 (≥50条)

## 重要提醒
- 必须读取已有的旧版本 knowhow.md (如存在),合并并输出新版本 knowhow_v2.md
- 保留所有已有内容,追加新的调研发现 | ⬚ 未开始 | innovator | P0 | 2026-04-03 16:03 | - | diff --git a/system/agents/innovator/.claude/scheduled_tasks.json b/system/agents/innovator/.claude/scheduled_tasks.json index 63b3d40..5b0b0c0 100644 --- a/system/agents/innovator/.claude/scheduled_tasks.json +++ b/system/agents/innovator/.claude/scheduled_tasks.json @@ -1,19 +1,11 @@ { "tasks": [ { - "id": "5547b5b6", - "cron": "*/10 * * * *", - "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", - "createdAt": 1774543358106, - "lastFiredAt": 1774981073706, - "recurring": true - }, - { "id": "40f74b6a", "cron": "*/10 * * * *", "prompt": "读取 /mnt/lemonboss/system/agents/innovator/todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", "createdAt": 1774979269375, - "lastFiredAt": 1774981073706, + "lastFiredAt": 1775234477093, "recurring": true }, { @@ -21,22 +13,23 @@ "cron": "*/10 * * * *", "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", "createdAt": 1774980403987, - "recurring": true, - "lastFiredAt": 1774981073706 + "lastFiredAt": 1775234593197, + "recurring": true }, { "id": "b1b5867b", "cron": "*/10 * * * *", "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", "createdAt": 1774980489432, - "recurring": true, - "lastFiredAt": 1774981073706 + "lastFiredAt": 1775234613218, + "recurring": true }, { "id": "a6cda320", "cron": "*/10 * * * *", "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", "createdAt": 1774980660311, + "lastFiredAt": 1775234603208, "recurring": true }, { @@ -44,6 +37,7 @@ "cron": "*/10 * * * *", "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。", "createdAt": 1774981030401, + "lastFiredAt": 1775234493105, "recurring": true } ] diff --git a/system/agents/innovator/agent.md b/system/agents/innovator/agent.md index f12230d..2280d7e 100644 --- a/system/agents/innovator/agent.md +++ b/system/agents/innovator/agent.md @@ -24,11 +24,11 @@ │ ▼ Layer 1: HUNT (调研) dispatch → Hunter: 深度调研 + 数据源发现 + 爬虫 + 首次爬取 - 产出: knowhow 基础数据、crawl_config、种子数据集 + 产出: knowhow_vX.md 基础数据、crawl_config、种子数据集(若是重训,产出文件需递增版本后缀防覆盖) │ ▼ Layer 2: DIGEST (消化) - dispatch → Digester: 构建 knowhow.md + benchmark.md + 标注数据集 + 行业基准 - 产出: 结构化知识、评分标准、train/test 数据集、industry_avg_score + dispatch → Digester: 构建最新版 benchmark_vX.md + 标注数据集 + 行业基准 + 产出: 融合更新的结构化知识、新版评分标准、train/test 数据集、industry_avg_score │ ▼ Layer 3: EVOLVING (进化) dispatch → Evolver: 双循环训练直到 score ≥ industry_avg @@ -67,6 +67,7 @@ ## ✅ 始终要做 - 先检查 Hunter/Digester/Evolver 是否存在,不存在先通过 agent-creator 创建 -- 每个 Phase 完成后验证产出质量 +- **切实验收产出质量**:当子 Agent 汇报某个 Phase 结束,你绝不能按目录有无文件就放行,**必须亲自调用读取工具**检视文件内容,并判定文件是否携带了新一版的后缀字样(如 `_v2`),达标后才能在 `plan.md` 打 `✅` +- 任何 **Retrain(重训)** 第一步:进 `plan.md` 将它的所有 Phase 全部强制重置为 `⬚`! - 训练完成后更新 skill_list 并向上级汇报最终分数 - 参考 docs/ 目录中的模板文件 diff --git a/system/agents/innovator/soul.md b/system/agents/innovator/soul.md index 5b96c18..544e430 100644 --- a/system/agents/innovator/soul.md +++ b/system/agents/innovator/soul.md @@ -18,4 +18,6 @@ - **双循环** — Small Loop 优化技能,Large Loop 修正基准,永不停止学习 ## ⚠️ 绝对规则 +- **重置复位法则(针对 Retrain)** — 一旦接收到“重新训练 (Retrain)”的指令,第一件事必定是将被重训对象的在 `plan.md` 中的旧状态全部打回未完成(例如改回 `⬚`)。决不允许再参考先前的 `✅` 状态!历史战绩必须清零,所有阶段从头踏实地跑一遍。 +- **杜绝形式主义的校验** — 每当 Hunt 或 Digest 阶段结束向你汇报时,**绝对禁止**只通过 `ls` 查验目录里是否有文件!你必须使用文件读取命令实际**查看生成的文件内容**并确认:(1)它满足本阶段要求的内容架构;(2)它的存盘名称拥有全新的迭代版本号(例如原来是 `.md` 或 `_v1.md`,本次重训必须新写了带有 `_v2.md` 后缀的全新文件)。只有满足这二者,才能将改阶段标记为 `✅`。 - **DEPLOY 不可跳过** — 训练达标后,必须将 SKILL.md 复制到 agents/{agent}/ 目录、更新 config.json status、更新 agent.md。如果跳过这步,训练成果等于白费。 diff --git a/system/agents/master/.claude/scheduled_tasks.json b/system/agents/master/.claude/scheduled_tasks.json index 50ffbb9..4681743 100644 --- a/system/agents/master/.claude/scheduled_tasks.json +++ b/system/agents/master/.claude/scheduled_tasks.json @@ -1,3 +1,18 @@ { - "tasks": [] + "tasks": [ + { + "id": "fe1208ce", + "cron": "*/5 * * * *", + "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", + "createdAt": 1775231859266, + "recurring": true + }, + { + "id": "8bff9147", + "cron": "*/30 * * * *", + "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", + "createdAt": 1775231859272, + "recurring": true + } + ] } diff --git a/web/src/views/CompanyDashboard.vue b/web/src/views/CompanyDashboard.vue index 050919e..d2424b2 100644 --- a/web/src/views/CompanyDashboard.vue +++ b/web/src/views/CompanyDashboard.vue @@ -697,6 +697,44 @@ + +
+
+
+
+ 🎓 +
+

发起 Innovator 重新训练

+

针对 {{ targetTrainAgent }} 执行 FDE 训练流程

+
+
+ +
+ +
+

+ 系统级 Innovator 将基于下方指令和原数据,重新进行完整的 Hunt -> Digest -> Evolve 三循环步骤,并保留迭代版本。 +

+ +
+ + +
+
+
@@ -751,6 +789,10 @@ const agentSkills = ref([]) const showHireModal = ref(false) const hiring = ref(false) +const showTrainModal = ref(false) +const targetTrainAgent = ref(null) +const trainInstructions = ref('') +const training = ref(false) const hireSearchQuery = ref('') const hireFilterType = ref('') const hireSortBy = ref('score') @@ -1143,18 +1185,46 @@ async function toggleAgentSkills(agentId) { expandedAgent.value = agentId } -async function triggerTrain(agentId) { +function triggerTrain(agentId) { if (!selectedCompany.value) return + targetTrainAgent.value = agentId + trainInstructions.value = '' + showTrainModal.value = true +} + +async function submitRetrain() { + if (!selectedCompany.value || !targetTrainAgent.value) return + + const agentId = targetTrainAgent.value const namespacedId = `${selectedCompany.value.id}:${agentId}` - if (!confirm(`确定要对 ${agentId} 发起 Innovator 训练?这将触发 agent-creator 重新定义并由 Innovator 训练该 Agent。`)) return + + training.value = true try { - await axios.post(`/api/agent/${selectedCompany.value.id}:ceo/chat`, { - message: `请安排 Innovator 对 ${namespacedId} 进行一次完整的技能训练/再训练。要求:1)评估当前技能缺口 2)使用 Innovator 进行 FDE 训练 3)训练完成后汇报结果`, - conversationId: `train-${agentId}-${Date.now().toString(36)}`, + const message = `请使用 FDE pipeline 对公司 ${selectedCompany.value.id} 的员工 ${agentId} (ID: ${namespacedId}) 进行**完整的重新训练 (Retrain)**。 +用户的重新训练补充要求/提示词如下: +""" +${trainInstructions.value} +""" +核心要求: +1. 你必须结合该 Agent 已有的训练数据,重新开启 Hunt -> Digest -> Evolve 的全新三步流程。不要偷懒跳过前面的阶段。 +2. 在委派给 Hunter 和 Digester 时,明确告诉他们读取旧版本文件,并输出带有新版本后缀的合并文件(务必保留 hunt、digest 所有内容的版本号,例如输出为 knowhow_v2.md, benchmark_v2.md 等,不要直接覆盖现有文件)。 +3. 使用更新后的标准调用 Evolver 进行训练。完成全部 FDE 后向上级汇报最终结果。` + + // 发送请求,但不阻塞 UI + axios.post(`/api/agent/innovator/chat`, { + message, + conversationId: `train-${selectedCompany.value.id}-${agentId}-${Date.now().toString(36)}`, + }).catch(e => { + console.error('Retrain task error:', e) + alert(`❌ 训练任务异常结束: ${e.message}`) }) - alert(`✅ 训练指令已发送给 CEO,CEO 将安排 Innovator 训练 ${agentId}`) + + alert(`✅ 训练指令已发送给 Innovator,将开始在后台进行自动评估和重训 ${agentId}\n您可以在 Agent 的实时状态面板中观察进展。`) + showTrainModal.value = false } catch (e) { alert(`❌ 发送训练指令失败: ${e.message}`) + } finally { + training.value = false } } -- libgit2 0.21.4