diff --git a/docs/system-design/24-company-layer-architecture.md b/docs/system-design/24-company-layer-architecture.md index 82aec30..c6e6194 100644 --- a/docs/system-design/24-company-layer-architecture.md +++ b/docs/system-design/24-company-layer-architecture.md @@ -89,36 +89,33 @@ data/agents/ ``` data/ -├── agents/ ← 全局 Agent(Master + 跨公司工具类 Agent) +├── agents/ ← 全局 Agent(Master + 跨公司基础设施 Agent) │ ├── master/ │ ├── agent-creator/ │ └── innovator/ │ -├── companies/ ← 📦 新增:公司实例目录 -│ ├── wechat-media-co/ ← 公司实例 1 -│ │ ├── company.json ← 公司元数据 -│ │ ├── sop.md ← 公司 SOP(运营标准流程) -│ │ ├── agents/ ← 该公司的专属 Agent 池 -│ │ │ ├── ceo/ -│ │ │ ├── content-writer/ -│ │ │ ├── editor/ -│ │ │ ├── publisher/ -│ │ │ └── data-analyst/ -│ │ ├── goals/ ← 该公司的 OKR 树 -│ │ │ └── G-001/ -│ │ ├── pipelines/ ← 该公司的 SOP 流水线定义 -│ │ │ └── daily-content.json -│ │ └── workspace/ ← 该公司的共享工作区 -│ │ ├── content/ -│ │ └── assets/ -│ │ -│ └── manga-studio/ ← 公司实例 2 -│ ├── company.json -│ ├── agents/ -│ ├── goals/ -│ └── ... +├── templates/ ← 📦 Agent 模板库(招聘时优先查找) +│ ├── ceo/ ← CEO 通用模板 +│ ├── qa-judge/ ← 质量仲裁模板 +│ ├── content-writer/ ← 内容写手模板 +│ ├── editor/ ← 编辑模板 +│ ├── video-editor/ ← 剪辑师模板 +│ ├── hot-topic-hunter/ ← 热点搜索模板 +│ └── data-analyst/ ← 数据分析师模板 │ -└── goals/ ← 全局 OKR (跨公司的顶层战略目标) +├── {company-id}/ ← 公司实例(顶层目录,扁平化) +│ ├── company.json ← 公司元数据 + 状态 + 配置 +│ ├── sop.md ← 公司 SOP(运营标准流程) +│ ├── agents/ ← 该公司的专属 Agent 池 +│ │ ├── ceo/ +│ │ ├── content-writer/ +│ │ ├── editor/ +│ │ └── data-analyst/ +│ ├── goals/ ← 该公司的 OKR 树(所有目标都在公司层级下) +│ ├── pipelines/ ← 该公司的 SOP 流水线定义 +│ └── workspace/ ← 该公司的共享工作区(成品、品牌资产) +│ +└── skills/ ← 全局 Skill(可被任何公司的 Agent 调用) ``` ### 3.2 company.json 结构 @@ -132,20 +129,14 @@ data/ "createdAt": "2026-03-25T17:00:00Z", "createdBy": "master", - "ceo": "ceo-wechat", + "ceo": "ceo", "sop": { "pipeline": "daily-content", "description": "选题 → 写稿 → 审核 → 排版 → 发布 → 数据回收" }, - "agents": [ - "ceo-wechat", - "content-writer-01", - "editor-01", - "publisher-01", - "data-analyst-01" - ], + "agents": ["ceo", "content-writer", "editor", "publisher", "data-analyst"], "heartbeat": { "enabled": true, @@ -165,37 +156,213 @@ data/ --- -## 四、生命周期流程 +## 四、Agent 招聘系统 (Hiring Pipeline) + +> **核心理念**: 公司需要某个角色时,不是凭空创造,而是走一套完整的**招聘流程**—— +> 先从人才市场(模板库)找现成的,找不到就培养一个新人,培训合格后才能上岗。 -### 4.1 公司创建流程 +### 4.1 招聘流程总览 + +```mermaid +flowchart TD + A["CEO 需要一个角色
(如: 热点搜索员)"] --> B{"在 templates/ 中
查找匹配模板?"} + + B -->|"✅ 找到模板"| C["复制模板到
公司 agents/ 目录"] + C --> D["注入公司上下文
(改写 agent.md, soul.md, user.md)"] + D --> E["直接上岗 ✅"] + + B -->|"❌ 模板库无此角色"| F["调用 agent-creator
从零创建 Agent 骨架"] + F --> G["调用 innovator
进入 FDE 训练流水线"] + G --> H{"Benchmark
评分 ≥ 95?"} + + H -->|"❌ 不合格"| I["继续 Evolve 迭代
(自动重训)"] + I --> H + + H -->|"✅ 合格"| J["毕业 → 存入 templates/
(供未来复用)"] + J --> C +``` + +### 4.2 招聘三阶段详解 + +#### 阶段 A: 模板库查找 (Template Lookup) + +```javascript +// 伪代码: hire(roleName, companyId) +function hire(roleName, companyId) { + const templateDir = path.join(DATA_DIR, 'templates', roleName); + + if (fs.existsSync(templateDir)) { + // ✅ 模板存在 → 直接复制 + 定制 + copyDir(templateDir, `data/${companyId}/agents/${roleName}/`); + injectCompanyContext(companyId, roleName); + return { status: 'hired_from_template', ready: true }; + } else { + // ❌ 模板不存在 → 进入培养流程 + return trainNewAgent(roleName, companyId); + } +} +``` + +**模板库是不断扩充的人才市场**: +- 初始模板:`ceo`, `qa-judge`, `content-writer`, `editor` 等通用角色 +- 每次从零培养的新角色,训练合格后**自动沉淀回 `templates/`**,下次招聘同类角色时就能直接使用 +- 模板只保存骨架(agent.md, soul.md, skills/, config.json),不带记忆和工作区 + +#### 阶段 B: 从零培养 (Create + Train) + +当模板库中没有对应角色时,进入培养流水线: + +``` +Step 1: agent-creator 创建骨架 + → 生成 agent.md, soul.md, identity.md, config.json + → 定义角色的核心职责和工具清单 + → 此时 Agent 状态为 "training"(不可执行正式任务) + +Step 2: innovator 执行 FDE 训练 + → F (Find): 调研该角色领域的最佳实践和行业知识 + → D (Digest): 消化知识转化为 Agent 的技能定义 (SKILL.md) + → E (Evolve): 循环迭代优化,直到技能评分达标 + +Step 3: Benchmark 评估 + → 运行标准化的能力测试用例 + → 评分维度:任务完成度、输出质量、工具使用准确性、响应时间 + → 合格线:综合评分 ≥ 95 分 +``` + +#### 阶段 C: 合格上岗 + 模板沉淀 + +``` +训练合格后: + 1. Agent 状态从 "training" → "ready" + 2. 复制干净骨架到 templates/ (不含训练过程中的 memory 和 workspace) + 3. 注入公司上下文到公司实例 + 4. 正式加入公司 agents/ 池 + 5. 更新 company.json 的 agents 列表 + 6. CEO 收到通知:"新员工 {roleName} 已入职" +``` + +### 4.3 Agent 状态机 + +``` + ┌── training ──► ready ──► active + │ │ + (从零培养) │ │ (公司暂停/开除) + │ ▼ + │ suspended + │ + (模板复制) └── ready ─────────────► active +``` + +| 状态 | 含义 | 能否接任务 | +|------|------|-----------| +| `training` | 正在被 Innovator 训练中,Benchmark 尚未达标 | ❌ 不能 | +| `ready` | 训练完毕或模板复制完毕,等待上岗 | ❌ 等待分配 | +| `active` | 已加入公司,处于正式工作状态 | ✅ 能 | +| `suspended` | 被 CEO 暂停(表现不佳或公司调整) | ❌ 暂停 | + +### 4.4 模板库管理 + +模板库 `data/templates/` 是一个**不断进化的人才市场**: + +``` +data/templates/ +├── ceo/ ← 通用 CEO 模板 +│ ├── agent.md ← 通用的 CEO 职责(不含特定公司信息) +│ ├── soul.md ← CEO 通用思维模式 +│ ├── identity.md +│ ├── config.json ← type: "cxo" +│ └── skills/ ← CEO 通用技能 +│ +├── content-writer/ ← 内容写手模板 +├── video-editor/ ← 剪辑师模板 +├── hot-topic-hunter/ ← 热点搜索员模板 +├── data-analyst/ ← 数据分析师模板 +├── qa-judge/ ← 质量仲裁模板 +│ +└── _registry.json ← 模板注册表(索引所有可用模板) +``` + +**`_registry.json` 结构**: +```json +[ + { + "id": "ceo", + "name": "CEO / 首席执行官", + "type": "cxo", + "description": "公司战略规划、团队管理、OKR 制定", + "benchmarkScore": 97, + "trainedAt": "2026-03-20", + "usedCount": 3 + }, + { + "id": "hot-topic-hunter", + "name": "热点搜索员", + "type": "specialist", + "description": "全网热点监控、选题建议、趋势分析", + "benchmarkScore": 96, + "trainedAt": "2026-03-25", + "usedCount": 0 + } +] +``` + +### 4.5 复制时的上下文注入 + +从模板复制到公司后,必须改写以下文件: + +| 文件 | 注入内容 | +|------|---------| +| `agent.md` | 追加:所属公司名称、公司使命、公司特定的约束规则 | +| `soul.md` | 追加:公司文化和价值观(如"我们是一家注重数据驱动的自媒体") | +| `user.md` | 重写:上级是该公司的 CEO(而非 Master),写入 CEO 的偏好 | +| `config.json` | 添加 `companyId` 字段,更新 `parent_id` | +| `memory/memory.md` | 初始化为空白(新公司、新记忆,不继承模板记忆) | + +--- + +## 五、生命周期流程 + +### 5.1 公司创建 + 招聘全流程 ```mermaid sequenceDiagram participant User as 用户 participant Master as Master Agent participant System as 系统 API + participant AC as agent-creator + participant Inno as innovator participant CEO as 新 CEO Agent User->>Master: "帮我创建一家做公众号运营的公司" Master->>Master: 理解意图 → 确定公司定位和核心 SOP Master->>System: POST /api/company/create - Note over System: 1. mkdir data/companies/wechat-media-co/
2. 生成 company.json
3. 初始化 agents/, goals/, workspace/ + Note over System: 1. mkdir data/wechat-media-co/
2. 生成 company.json
3. 初始化 agents/, goals/, workspace/ System-->>Master: ✅ 公司创建成功 - - Master->>System: POST /api/company/:id/hire-ceo - Note over System: 1. 使用 agent-creator 创建 CEO Agent
2. CEO agent.md 写入公司使命
3. CEO user.md 写入:上级是 Master - System-->>Master: ✅ CEO 已上任 - + + Master->>System: POST /api/company/:id/hire { role: "ceo" } + Note over System: 在 templates/ 查找 "ceo" → ✅ 找到 + System->>System: 复制 templates/ceo → wechat-media-co/agents/ceo/ + System->>System: 注入公司上下文 (agent.md, user.md) + System-->>Master: ✅ CEO 已入职 + Master->>CEO: TaskDispatch: "你是这家公司的 CEO,请规划战略并组建团队" - - CEO->>CEO: 分析公司定位 → 设计内容流水线 SOP - CEO->>System: POST /api/company/:id/agents/create (批量创建) - Note over CEO: 创建: 内容策划、写手、编辑、发布、数据分析 + + CEO->>CEO: 分析公司定位 → 确定需要哪些角色 + CEO->>System: POST /api/company/:id/hire { role: "content-writer" } + Note over System: templates/ 查找 → ✅ 找到 → 复制 + 注入 + CEO->>System: POST /api/company/:id/hire { role: "hot-topic-hunter" } + Note over System: templates/ 查找 → ❌ 没有 + System->>AC: 创建 "hot-topic-hunter" Agent 骨架 + AC-->>System: 骨架已就绪 + System->>Inno: 启动 FDE 训练 (hot-topic-hunter) + Inno->>Inno: Find → Digest → Evolve (循环至 ≥95) + Inno-->>System: ✅ Benchmark 97 分,训练合格 + System->>System: 沉淀到 templates/hot-topic-hunter/ + System->>System: 复制到 wechat-media-co/agents/ + 注入上下文 + System-->>CEO: ✅ 热点搜索员已入职 + CEO->>System: POST /api/company/:id/goals/create - Note over CEO: 创建: 公司 OKR(如:30天粉丝破万) CEO->>System: POST /api/company/:id/pipelines/create - Note over CEO: 定义: 每日内容产出 SOP 流水线 - CEO-->>Master: "团队组建完毕,流水线已就绪,开始自主运行" ``` @@ -250,9 +417,9 @@ sequenceDiagram --- -## 五、API 设计 +## 六、API 设计 -### 5.1 Company CRUD +### 6.1 Company CRUD | 方法 | 路径 | 说明 | |------|------|------| @@ -262,22 +429,31 @@ sequenceDiagram | `PUT` | `/api/company/:companyId` | 更新公司信息 | | `POST` | `/api/company/:companyId/shutdown` | 关停公司 | -### 5.2 Company 内部:Agent 管理 +### 6.2 招聘与 Agent 管理 | 方法 | 路径 | 说明 | |------|------|------| -| `POST` | `/api/company/:companyId/agents/create` | 在公司内创建 Agent | +| `POST` | `/api/company/:companyId/hire` | 招聘 Agent (模板优先 → 培养兜底) | | `GET` | `/api/company/:companyId/agents` | 列出公司内所有 Agent | -| `POST` | `/api/company/:companyId/hire-ceo` | 为公司任命 CEO | +| `POST` | `/api/company/:companyId/agent/:agentId/chat` | 与公司内 Agent 对话 | +| `POST` | `/api/company/:companyId/fire` | 解雇 Agent (suspend) | -### 5.3 Company 内部:OKR 管理 +### 6.3 模板库 | 方法 | 路径 | 说明 | |------|------|------| -| `POST` | `/api/company/:companyId/goals/create` | 创建公司级 OKR | +| `GET` | `/api/templates` | 列出所有可用模板 | +| `GET` | `/api/templates/:templateId` | 查看模板详情 | + +### 6.4 Company 内部:OKR 管理 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/company/:companyId/goals/create` | 创建公司 OKR | | `GET` | `/api/company/:companyId/goals` | 获取公司 OKR 列表 | +| `PUT` | `/api/company/:companyId/goals/:goalId` | 更新 OKR 节点 | -### 5.4 Company 运营 +### 6.5 Company 运营 | 方法 | 路径 | 说明 | |------|------|------| @@ -286,94 +462,102 @@ sequenceDiagram --- -## 六、与现有系统的兼容设计 +## 七、与现有系统的兼容设计 -### 6.1 Agent 寻址变化 +### 7.1 Agent 寻址变化 当前系统的 Agent 通过 `agentId` 全局唯一寻址(如 `ceo`)。 引入 Company 后,Agent 的寻址变为 **Company 限定**: ```javascript -// 旧: 全局 Agent -const agentDir = path.join(DATA_DIR, agentId); -// 即: data/agents/ceo/ +// 全局 Agent(不属于任何公司) +const agentDir = path.join(DATA_DIR, 'agents', agentId); +// 即: data/agents/master/ -// 新: 公司内 Agent -const agentDir = path.join(COMPANIES_DIR, companyId, 'agents', agentId); -// 即: data/companies/wechat-media-co/agents/ceo-wechat/ - -// 新: 全局 Agent(不属于任何公司) -const agentDir = path.join(DATA_DIR, agentId); -// 即: data/agents/master/ ← 不变 +// 公司内 Agent +const agentDir = path.join(DATA_DIR, companyId, 'agents', agentId); +// 即: data/wechat-media-co/agents/ceo/ ``` **兼容策略**: - `config.json` 增加 `companyId` 字段(可选)。 -- **有 `companyId`** → 在 `data/companies/{companyId}/agents/` 下。 +- **有 `companyId`** → 在 `data/{companyId}/agents/` 下。 - **无 `companyId`** → 在 `data/agents/` 下(全局)。 -- 路由层通过 resolveAgentDir(agentId) 统一封装,向上层透明化。 +- 路由层通过 `resolveAgentDir(companyId, agentId)` 统一封装,向上层透明化。 + +### 7.2 OKR/Goals — 全部归属 Company -### 6.2 OKR/Goals 隔离 +Goals/OKR 不再有全局作用域。**每个 Goal 都必须隶属于一个 Company**: ``` -data/goals/ ← 全局大盘(跨公司的顶级战略目标) -data/companies/{co}/goals/ ← 公司内部的执行类 OKR +data/wechat-media-co/goals/G-001/ ← 自媒体公司的 OKR +data/manga-studio/goals/G-001/ ← 漫剧公司的 OKR(ID 互不冲突) ``` -GoalsService 增加一个 `scope` 参数: -- `scope = 'global'` → 读写 `data/goals/` -- `scope = companyId` → 读写 `data/companies/{companyId}/goals/` +GoalsService 改造: +- 构造时必须传入 `companyId`:`new GoalsService(companyId)` +- 数据路径变为 `data/{companyId}/goals/` +- `_index.json` 也随之放在公司目录下 -### 6.3 Memory 隔离 +### 7.3 Memory 隔离 -Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下(`agents/{id}/memory/`)。 -当公司内的 Agent 在 `data/companies/{co}/agents/{id}/memory/` 下时,自动与全局 Agent 的记忆完全隔离。无代码改动。 +Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下。 +公司内的 Agent 在 `data/{companyId}/agents/{agentId}/memory/` 下,自动与其他公司和全局 Agent 的记忆完全隔离。无额外代码改动。 -### 6.4 Heartbeat 集成 +### 7.4 Heartbeat 集成 HeartbeatService 扩展扫描范围: -- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent。 -- 遍历 `data/companies/*/agents/` 下有 `heartbeat.enabled` 的公司内 Agent。 -- 可以在 `company.json` 层级设置整个公司的心跳开关。 +- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent(如 master)。 +- 遍历每个 `data/{companyId}/` 下,读取 `company.json` 的心跳配置。 +- 若公司心跳开启,唤醒该公司的 CEO 作为入口(CEO 自行决定唤醒下属)。 --- -## 七、实现计划 — Todo List +## 八、实现计划 — Todo List + +### Phase 1: 数据结构 + 模板库基础 + +- [ ] **1.1** 创建 `data/templates/` 目录,迁移现有 Agent 为模板(ceo, qa-judge 等) +- [ ] **1.2** 实现 `company-service.js`:Company CRUD (create / get / list / shutdown) +- [ ] **1.3** 实现 `resolveAgentDir(companyId, agentId)` 统一寻址函数 +- [ ] **1.4** 实现 `_registry.json` 模板注册表,记录模板的 benchmarkScore、usedCount -### Phase 1: 数据结构基础 +### Phase 2: Agent 招聘系统 (Hiring Pipeline) -- [ ] **1.1** 创建 `data/companies/` 目录和 `company-service.js` -- [ ] **1.2** 实现 Company CRUD:create / get / list / update / shutdown -- [ ] **1.3** 实现 `resolveAgentDir(agentId, companyId?)` 统一寻址函数 -- [ ] **1.4** 修改 `agent-chat.js` 路由支持 `companyId` 上下文 +- [ ] **2.1** 实现 `POST /api/company/:id/hire` — 模板查找 → 复制 → 上下文注入 +- [ ] **2.2** 招聘兜底:模板不存在时自动调用 `agent-creator` 创建 + `innovator` FDE 训练 +- [ ] **2.3** Benchmark 质量门禁:评分 ≥ 95 才允许上岗,不合格自动 re-evolve +- [ ] **2.4** 训练合格后自动沉淀骨架到 `templates/`,更新 `_registry.json` -### Phase 2: CEO 自动建制 +### Phase 3: CEO 自动建制 + OKR -- [ ] **2.1** 实现 `POST /api/company/:id/hire-ceo`(调用 agent-creator 并自动填充上下文) -- [ ] **2.2** CEO 的 `agent.md` 模板:包含公司使命、员工创建权限、SOP 设计权限 -- [ ] **2.3** CEO 首次运行后自动规划(通过 TaskDispatch 触发"规划战略并组建团队") +- [ ] **3.1** 公司创建后自动招聘 CEO(从模板),CEO agent.md 注入公司使命 +- [ ] **3.2** CEO 首次运行后自主规划:确定角色需求 → 批量调用 hire API → 创建 OKR +- [ ] **3.3** GoalsService 改造:所有 OKR 存储在 `data/{companyId}/goals/` 下 -### Phase 3: SOP 流水线 +### Phase 4: SOP 流水线 -- [ ] **3.1** 设计 Pipeline 数据结构(`pipelines/*.json`) -- [ ] **3.2** 实现 Pipeline 执行引擎(按步骤自动触发对应 Agent) -- [ ] **3.3** CEO 可以通过工具动态调整 Pipeline +- [ ] **4.1** 设计 Pipeline 数据结构(`{companyId}/pipelines/*.json`) +- [ ] **4.2** 实现 Pipeline 执行引擎(按步骤自动触发公司内对应 Agent) +- [ ] **4.3** CEO 可以通过工具动态调整 Pipeline -### Phase 4: 前端 Dashboard +### Phase 5: 前端 Dashboard -- [ ] **4.1** 公司列表页(展示所有公司卡片 + 运行状态) -- [ ] **4.2** 公司详情页(组织架构图 + OKR 大盘 + Agent 列表) -- [ ] **4.3** 公司日报/周报自动生成与展示 +- [ ] **5.1** 公司列表页(展示所有公司卡片 + 运行状态 + 员工数) +- [ ] **5.2** 公司详情页(组织架构图 + 公司 OKR 大盘 + Agent 列表 + 招聘状态) +- [ ] **5.3** 模板库页面(展示所有可用模板、评分、使用次数) +- [ ] **5.4** 公司日报/周报自动生成与展示 --- -## 八、关键技术决策 +## 九、关键技术决策 | # | 问题 | 决策 | 说明 | |---|------|------|------| -| 1 | Agent ID 全局唯一还是公司内唯一? | **全局唯一** | 使用 `{role}-{companySlug}` 命名法,如 `ceo-wechat` | -| 2 | 原有的 `data/agents/ceo` 怎么处理? | **渐进迁移** | 旧的全局 Agent 保留不动,新建公司时在 companies 下创建 | -| 3 | Company 的 CEO 是新建还是复用? | **每家公司新建独立 CEO** | 避免记忆污染和注意力分散 | +| 1 | Agent ID 全局唯一还是公司内唯一? | **公司内唯一** | 如 ceo 在每家公司内都叫 ceo,通过 companyId + agentId 联合定位 | +| 2 | 原有 `data/agents/` 里的 Agent | **迁移为模板** | ceo、qa-judge 等迁入 `data/templates/`,master/innovator 保留为全局 | +| 3 | 招聘时模板不存在怎么办? | **agent-creator 创建 + innovator 训练到 ≥95** | 训练合格后自动沉淀为新模板,下次复用 | | 4 | Company 可以嵌套 Company 吗? | **v1.0 不支持** | 先做单层,未来有需求再做集团架构 | -| 5 | 跨公司 Agent 共享(如 innovator)| **全局 Agent 池** | `data/agents/` 下的 Agent 可以被任何公司调用 | -| 6 | 公司的"关停"语义 | **软关停** | 标记 status=shutdown,停止心跳,保留数据 | +| 5 | 跨公司 Agent 共享(如 innovator) | **全局 Agent 池** | `data/agents/` 下的 Agent 可被任何公司调用 | +| 6 | 公司的"关停"语义 | **软关停** | status=shutdown,停止心跳,保留数据 | +| 7 | Goals/OKR 作用域 | **全部归属 Company** | 不设全局 OKR,每个目标都隶属于一个具体公司 |