Architecture Explain · winBrain Creator OS

专家 = Agent?还是 Plugin?

为什么本分支把「专家」从执行单元降级为静态装载资产,以及它和旧设定的实质区别

员工 = Skill专家 = Plugin项目 = Claude Agent SDK窄门 · 结论前置
结论 区别 = 专家从【执行单元】降级为【静态只读资产】,执行职责交给项目级的一次 Claude SDK 会话。 旧设定:专家=agent(角色定义内嵌,每专家一个运行时);新设定:专家=plugin(plugin.json 声明身份 + skills/ 承载员工), 项目一次会话只读加载 N 个专家插件 + 本体 MCP + 员工 skills。角色定义没删,而是降级为 plugin 元数据 + systemPrompt 动态拼接。

SVG旧 vs 新 · 架构对照图

✗ 旧设定 · 专家 = Agent(执行单元) ✓ 新设定 · 专家 = Plugin(静态资产) 项目 → N 个独立 Agent 进程 Agent A(专家A)· 角色 prompt 内嵌 + 员工 skill × N · 自带会话/记忆 Agent B(专家B)· 角色 prompt 内嵌 + 员工 skill × N · 自带会话/记忆 运行时耦合 · 无法复用/版本化/组合 降级 项目 = 一次 SDK 会话 · 只读加载 专家A (Plugin) plugin.json 身份 skills/ 员工 × N 专家B (Plugin) plugin.json 身份 skills/ 员工 × N 本体 MCP × M ontologyMcps 只读 SDK 会话 systemPrompt 动态身份 可版本化 · 可退休归档 · 可发布 API 执行单元 · 有会话/记忆 · 每专家一进程 静态资产 · 无会话 · 项目一次会话聚合 // src/adapters/outbound/claude-agent-sdk.ts · buildChatOptions const plugins: SdkPluginConfig[] = context.pluginPaths.map(path => ({ type:"local", path, skipMcpDiscovery:true })); skills: context.skillNames, // 员工 = SDK skill 装载 systemPrompt: `…以「${context.label}」身份工作。项目层级:${hierarchy}…`

Table逐条对比 · 点击表头排序

8 项
维度 旧 · 专家=Agent 新 · 专家=Plugin
本质 执行单元:角色定义 + 独立运行时 静态只读资产:plugin.json + skills/ 目录
角色定义 内嵌在 agent 定义里,随执行实体走 降级为 plugin.json 元数据 + systemPrompt 动态拼接("以专家「X」身份工作")
会话 / 记忆 每专家独立会话与记忆 无独立会话;项目一次 SDK 会话内按专家切片(target 三级切换)
装载方式 每专家一个 agent 进程 plugins:[{type:"local", path}] 只读加载,与本体 MCP、员工 skills 同会话聚合
版本化 运行实体,难以快照/回滚 文件树资产:.versions/<expert-id>/<sha256>/ 原子归档,退休/回滚可审计
组合性 N 专家 = N 运行时,成本线性涨 N 专家 = 一次会话只读切片,权限边界天然清晰
发布 API 绑定执行生命周期 独立发布(expert-publication),不绑定执行
代价 无专家级持久记忆;身份靠 prompt 拼接,未来需在项目会话内按专家切片管理

Why为什么要这样做 · 3 条理由

理由 1 · 对齐 SDK 原生概念

  • Claude Agent SDK 没有"自定义 agent"首等概念
  • 只有 prompt + skills + plugins + MCP + hooks + sandbox
  • plugin = 官方扩展机制,skill = 官方指令机制
  • 专家做成 plugin = 零自研运行时

理由 2 · 组合性与成本

  • 项目聊天统一走一个 SDK 会话
  • 专家/员工只是只读上下文切片(ChatContext.target)
  • 省会话数、省模型成本
  • 多专家协同在一场对话内自然发生

理由 3 · 资产化

  • 专家变成可复用资产,而非执行进程
  • 发布、退休、回滚、草稿进化(.drafts/)全基于文件树
  • 可审计、可复现、可迁移
  • 对齐"本体 MCP 只读共享事实"的数据语义

诚实声明 · 代价

  • 专家不再有独立长期记忆/会话
  • 身份靠 systemPrompt 拼接
  • 若未来要"专家级持久记忆"
  • 需在项目会话内按专家切片管理

Action Loop理解确认 · 勾选 + 复制

核对你是否理解这次架构降级0/5
▸ 代码实证(展开查看:ExpertAsset / buildChatOptions / 文件树)

1. ExpertAsset —— 无任何 agent 运行时字段(src/application/organization.ts)

export type ExpertAsset = {
  id: string; name: string; description: string;
  pluginPath: string;          // .claude-plugin/plugin.json
  employees: EmployeeAsset[];  // skills/ 目录,员工 = Skill
  ontologyMcpIds?: string[]; mcpServerIds?: string[];
  status: ExpertLifecycleStatus; retiredAt?: string;
};

2. buildChatOptions —— 专家走 plugins 装载,员工走 skills(claude-agent-sdk.ts)

const plugins: SdkPluginConfig[] = context.pluginPaths.map((path) => ({
  type: "local", path, skipMcpDiscovery: true,
}));
// ...
skills: context.skillNames,
systemPrompt: `你正在 ${context.project.name} 的独享 Session Sandbox 中,
以${...}「${context.label}」身份工作。项目层级:${hierarchy}。…`

3. 专家目录即 Plugin 包(workspace/experts/expert-msn1bi5s/)

expert-msn1bi5s/
├── .claude-plugin/plugin.json   # name / description / ontologyMcps / mcpServers
├── README.md
└── skills/zhuizhen-diagnosis/   # 员工(SKILL.md + references/)

4. 迭代文档原文(docs/iterations/2026-07-27-ink-agent-sdk-creator-os.md)

- 员工 = Skill、专家 = Plugin、项目 = Claude Agent SDK。