# 26. 全自动招聘编排 — Creator → Skills → Innovator 流水线 > **版本**: v1.0 > **日期**: 2026-03-26 > **状态**: ✅ 已实现 > **关键提交**: `5b508ce feat: Automate full hiring orchestration (Creator → Skills → Innovator)` --- ## 一、核心问题 当 CEO 需要招聘一个**模板库中不存在**的角色(如"视频剪辑师")时,系统不能简单报错。 需要一套全自动编排流水线:从零定义 Agent → 注入技能 → 训练至合格。 --- ## 二、编排全景 ``` POST /api/company/:companyId/hire { role: "video-editor" } │ ▼ companyService.hireWithTraining() │ ├── 1. 在 templates/ 中查找 "video-editor" │ → ❌ 模板不存在 │ ├── 2. AgentScaffold 创建空白骨架目录 │ → data/{companyId}/agents/video-editor/ │ → 状态标记为 status: "training" │ ├── 3. [异步] Agent-Creator 编写定义文件 │ → POST /api/agent/agent-creator/chat │ → "为 video-editor 补充 agent.md, soul.md, identity.md..." │ ├── 4. [同步] Arena 技能搜索与注入 │ → skillDb.searchSkills("video-editor", { limit: 3 }) │ → 将匹配的 Skill 复制到 agents/video-editor/skills/ │ └── 5. [延时5s] Innovator FDE 训练 → POST /api/agent/innovator/chat → "对 video-editor 进行 FDE 训练,Benchmark ≥ 95" → Hunt → Digest → Evolve 循环 → 合格后自动部署 ``` --- ## 三、三阶段详解 ### 阶段 1: Agent-Creator 定义 Agent-Creator 是一个专门负责"写定义文件"的元 Agent。接到请求后: 1. 根据 role name 和 description 理解角色职责 2. 使用 `Write` 工具写入标准定义文件: - `agent.md` — 核心身份标识 + 职责描述 - `identity.md` — 名称、emoji、简介 - `soul.md` — 思维模式、价值观 - `user.md` — 上级偏好 - `tools.md` — 可用工具清单 3. 验证写入完成 **关键实现** (`server/routes/company.js` Line 399-407): ```javascript fetch(`http://127.0.0.1:${PORT}/api/agent/agent-creator/chat`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: `新员工 ${namespacedId} 已由脚手架创建空白目录...请补充完整的定义文件`, conversationId: `create-${companyId}-${role}-${Date.now().toString(36)}` }) }); ``` ### 阶段 2: Arena 技能搜索与注入 从技能数据库(Arena 技能商店)中搜索与角色匹配的现有技能,最多注入 3 个基础技能: 1. `skillDb.searchSkills(role, { limit: 3 })` — 按角色名关键词搜索 2. 将匹配的 Skill 目录递归复制到 Agent 的 `skills/` 目录下 3. 如果没有匹配的技能,日志输出"将交由 Innovator 凭空生成" **关键实现** (`server/routes/company.js` Line 409-438): ```javascript const skills = skillDb.searchSkills(role, { limit: 3 }); for (const skill of skills) { if (skill.directory && fs.existsSync(skill.directory)) { copyDir(skill.directory, path.join(skillsDir, skill.skillName)); console.log(`[Hire] 💉 成功为其注入基础技能: ${skill.skillName}`); } } ``` ### 阶段 3: Innovator FDE 训练 延时 5 秒(等 Creator 写入完毕)后,通知 Innovator 对新 Agent 进行 FDE 训练: 1. Innovator 评估当前 Agent 技能水平 2. 启动 **Hunt → Digest → Evolve** 训练流水线 3. 循环迭代直到 Benchmark 评分 ≥ 95 4. 训练完成后自动安装 SKILL.md **关键实现** (`server/routes/company.js` Line 441-451): ```javascript setTimeout(() => { fetch(`http://127.0.0.1:${PORT}/api/agent/innovator/chat`, { method: 'POST', body: JSON.stringify({ message: `公司 ${companyId} 的员工 ${role} 骨架和基础技能已注入完毕。 请使用 FDE pipeline 进行评测和进化训练,直到 Benchmark 达标 (Score ≥ 95)。` }) }); }, 5000); ``` --- ## 四、招聘后的动态心跳挂载 招聘成功后(无论是从模板还是训练完成),系统会立即为新 Agent 注册心跳定时器: ```javascript const heartbeatService = require('../services/heartbeat-service'); const namespacedId = `${companyId}:${role}`; heartbeatService._setupAgentHeartbeat(namespacedId); ``` --- ## 五、与模板招聘的对比 | 维度 | 模板招聘 (Template) | 全自动编排 (Orchestration) | |------|-------------------|--------------------------| | 触发条件 | templates/ 下存在对应模板 | templates/ 下**不存在** | | 耗时 | < 1 秒 | 数分钟 (FDE 训练) | | 流程 | 复制 → 注入上下文 → 上岗 | Scaffold → Creator → Skills → FDE → 上岗 | | Agent 状态 | 直接 `ready` → `active` | `training` → (训练完成) → `ready` | | 模板沉淀 | 不需要 | 训练合格后自动 `deposit-template` 到 templates/ | --- ## 六、模板沉淀 (Deposit Template) 训练合格的新角色会被自动沉淀为模板,供未来复用: ``` POST /api/company/:companyId/deposit-template { "agentId": "video-editor", "benchmarkScore": 96 } ``` **沉淀内容**:只保存骨架文件(agent.md, soul.md, config.json 等),不含 memory 和 workspace。 --- ## 七、关键代码文件 | 文件 | 位置 | 职责 | |------|------|------| | `server/routes/company.js` | Line 376-474 | `POST /:companyId/hire` — 完整招聘 + 编排 | | `server/routes/company.js` | Line 528-542 | `POST /:companyId/deposit-template` — 模板沉淀 | | `server/services/company-service.js` | `hireWithTraining()` | 模板查找 + 骨架创建 | | `server/services/skill-db.js` | `searchSkills()` | Arena 技能搜索 |