Files
beaver_project/app-instance/backend-old/change.md
steven_li 8a12c30141 feat(beaver): 完成Task Team功能v1实现,重构后端架构支持统一内核
新增内部Task系统,包括验证、反馈门控机制,实现自动质量验证
(通过率>=0.75)和用户反馈闭环(satisfied/revise/abandon)。

实现Agent Team v1协调器,支持sequence/parallel/dag执行策略,
sub-agent复用主AgentLoop,每个run使用独立memory snapshot。

建立Skill学习pipeline,包含draft/审核/发布/回滚完整生命周期,
通过Task验证通过且用户满意才生成学习候选。

重构目录结构,移除third_party依赖,建立统一engine内核,
所有agent共享运行时基础组件。

更新ContextBuilder清理provider消息字段,增强SkillContext版本管理,
集成TaskExecutionPlanner和TaskSkillResolver实现技能解析机制。
2026-05-08 17:14:14 +08:00

39 KiB
Raw Blame History

Beaver Backend 重构蓝图

命名说明

当前项目正式名称已经不是 nanobot,而是 beaver

这份文档里如果出现 nanobot/...,一律表示“当前仓库里还没迁走的历史代码路径 / 现状实现位置”,不代表目标命名。

后续重构目标应统一收敛到:

  1. 产品名、项目名、运行时内核名统一按 beaver 表达。
  2. nanobot 只作为迁移期遗留路径存在,最终应逐步退出目录、模块和文档命名。
  3. 新增目录、新增模块、新增文档都应优先使用 beaver 命名,而不是继续扩散 nanobot

1. 这次重构到底要解决什么

当前后端已经不是“功能不够”,而是“能力已经长出来了,但结构还停留在早期阶段”。

现在项目里同时存在这些事实:

  1. AgentLoop 已经承担了太多职责,既管主 agent 对话又管工具、委派、MCP、会话、事件、memory。
  2. web/server.py 已经变成超大文件FastAPI app factory、chat API、session、文件、skills、cron、A2A、Outlook 都放在一起。
  3. agent_team 已经接上了 swarms,但目前更像“业务层直接借用第三方 runtime”不是“我们自己的多智能体平台”。
  4. skills 已经有加载、安装、审核,但本质还是 Markdown 说明书,不是可学习、可演化、可评估的能力对象。
  5. 项目里已经隐约出现了三个方向,但还没有被统一成一个完整架构:
    • swarms 提供多智能体架构能力
    • hermes-agent 提供 skill 生命周期与长期演进思路
    • OpenHarness 提供模块化的 harness 设计方法

所以这次重构不是简单“整理目录”,而是把项目从“围绕一个 CLI 主 agent 生长出来的系统”升级成“所有 agent 共享同一内核的自有 agent harness 平台”。

1.1 当前落地状态2026-05-07

截至当前实现,新 app-instance/backend/beaver 已经把主链推进到:

  1. AgentService 前面增加了 Main Agent 路由层。
    • 简单问题直接走原有 AgentLoop 单轮回答。
    • 复杂任务自动进入内部 Task 模式。
    • 前端和外部调用仍只使用聊天入口,不暴露显式创建 Task 的产品 API。
  2. 新增内部 Task 子系统:
    • beaver/tasks/models.py
    • beaver/tasks/store.py
    • beaver/tasks/service.py
    • beaver/tasks/router.py
    • beaver/tasks/validation.py
  3. Task 模式已经能把一次或多次 RunRecord 归属到内部 task_id
    • RunRecord 增加 task_id
    • RunRecord 增加 attempt_index
    • RunRecord 增加 validation_result
  4. Task 模式每轮完成后会自动验证。
    • 验证输入包含 task goal、用户请求、可见 transcript excerpt、工具摘要、最终输出。
    • 验证通过标准为 passed=truescore >= 0.75
    • 验证失败自动重试一次;第一次失败尝试不会继续留在可见上下文。
  5. 用户反馈闭环已经接入最小产品面。
    • POST /api/chat/feedback
    • 前端最新 assistant 消息下显示“满意 / 需要修改 / 放弃”
    • 反馈通过 run_id -> task_id 找到内部 Task
    • 反馈状态会投影回 session 可见消息,刷新后仍保留
  6. 学习触发已经从“run 完成即候选”收紧为 Task 门控。
    • 普通 run 仍记录运行收据和 skill effect
    • Task 模式先只记录 receipts
    • 只有“自动验证通过 + 用户满意”才生成成功学习候选
    • “放弃”写 Failure Memory不生成成功 Skill draft
  7. Agent Team v1 已经落成 Beaver 自有轻量 coordinator。
    • TeamService.run_team(...) 是内部服务入口
    • LocalAgentRunner 让 sub-agent 复用主 AgentLoop.process_direct() / submit_direct()
    • 已支持 sequence / parallel / dag
    • parallel 和 DAG 同层节点保持真并发
    • 每个 run 使用独立 memory snapshot
    • 支持 pinned skill 继承和 per-node provider factory
    • sub-agent run 归入父 Task
    • 节点级异常归一成 NodeRunResult
  8. Agent Team 已接入 Task mode 内部执行策略。
    • TaskExecutionPlanner 使用 LLM JSON 规划 single / team
    • team node 只声明 skill_query / required_capabilities,不声明固定 specialist 人设
    • TaskSkillResolver 为 generic sub-agent 选择 published skill未命中时生成 draft-only skill并作为本次 run 的 ephemeral pinned instruction 使用
    • team 模式调用 TeamService.run_team(...) 产生 sub-agent runs
    • team 输出注入主 Agent synthesis run
    • 用户可见最终回答仍由主 Agent 生成,并继续走验证、反馈和学习门控
    • planner 失败或 graph 非法时降级 single

当前仍未落地的部分:

  1. Agent Team 不暴露产品级聊天路由或显式 Task API当前作为 Task 内部 sub-agent 执行策略。
  2. moa / hierarchy / heavy / group_chat / forest / maker / router 仍是策略预留,不是 v1 完整行为。
  3. 自动验证目前是 LLM validator不是 replay sandbox。
  4. Skill draft synthesis / review / publish 安全链已有基础服务,但还没有做成完整后台学习 pipeline。
  5. /api/agents 和 agent registry 可作为未来外部 agent/A2A 管理面保留,但不参与 Task sub-agent 选择。
  6. 不允许在线直接改 published skill这条约束保持不变。

1.2 参考项目核对说明

这版蓝图不是只根据印象在写。2026-05-06 我们已经重新核对过下面三个参考项目的公开入口文档:

  1. OpenHarness
  2. hermes-agent
  3. swarms

这一步的目的不是“照着抄目录”,而是把“到底借什么、不借什么”明确写死,避免后续施工时又把第三方项目的实现细节直接揉回 Beaver。

2. 我是怎么想的

我的核心判断是我们不能继续把第三方库、业务流程、执行控制、UI/API 接口揉在一起,而是应该先定义我们自己的稳定边界,再让第三方能力挂进来。

换句话说,目标不是“把仓库改得更像 swarms / hermes / OpenHarness”而是

  1. swarms 的强项来解决“团队编排”。
  2. hermes-agent 的强项来解决“skills 怎么创建、维护、学习、沉淀”。
  3. OpenHarness 的强项来解决“工程边界、模块职责、可维护性”。
  4. 最终收口成我们自己的抽象和目录,而不是长期让第三方结构反向塑造我们。

这里把三者的借鉴边界再说得更具体一点:

  1. OpenHarness
    • 借它的 harness 分层方式:engine / tools / skills / permissions / memory / coordinator / prompts / config
    • 借它“一条统一 loop + 明确 tool registry / permission / hook 边界”的工程组织方式
    • 不直接照搬它的 CLI/TUI、commands、plugin 生态,也不要求 Beaver 长成它的目录镜像
  2. hermes-agent
    • 借它的 memory / session / session_search / skills 运行时关系
    • 借它对 FTS5 transcript 搜索、长期记忆、显式 skill 注入、session lineage 的处理方向
    • 不把“自动学习闭环、完整渠道网关、全部终端后端、Honcho 用户建模”当成当前阶段必须同步迁入的范围
  3. swarms
    • 借它已经验证过的多智能体执行形态,例如 sequential / hierarchy / rearrange / router 这类 orchestration 结构
    • 借它作为 team execution backend 的角色,而不是借它来定义 Beaver 的主 runtime、session、tool、provider 契约
    • 不再允许 Beaver 上层直接感知 third_party/swarmsSwarmRouter 参数细节或 import 副作用

这意味着后续所有设计都应遵守四条原则:

2.1 我们要有自己的抽象

不能让业务代码直接依赖:

  • third_party/swarms 的导入路径
  • SwarmRouter 的参数细节
  • 某个第三方 skill 文件格式
  • 某个第三方 runtime 的副作用

我们应该先定义自己的核心对象,例如:

  • AgentDescriptor
  • SkillSpec
  • SkillVersion
  • TeamSpec
  • ExecutionPlan
  • ProcedureRecord
  • RunRecord
  • BridgeResult

第三方库只能作为 adapter / backend 存在。

2.2 所有 agent 共享同一套运行内核

后面不应该再保留“CLI 单 agent”和“其他 agent 另一套执行方式”这种概念分叉。

正确做法应该是:

  1. 所有 agent 都复用同一个 AgentLoop / engine。
  2. 主 agent、subagent、team member、A2A local specialist 都只是不同的运行配置和上下文。
  3. tools、skills、memory、permissions、MCP、delegation 都在同一套内核里装载。
  4. CLI 只是一个 interface作用是把用户输入送进内核而不是代表一种单独的 agent 类型。

这样做的意义是:

  1. 所有 agent 的能力边界一致。
  2. 不会再出现“这个能力只在 CLI 主 agent 可用,子 agent 不一致”的问题。
  3. agent 的差异只存在于 profile / policy / prompt / runtime context而不是存在于不同执行栈里。

2.3 Harness 和业务要分开

当前很多逻辑混在一起:既有“平台级能力”,也有“具体产品接入”。

后面应该分成两层:

  1. Harness 层
    • tool use
    • skills
    • memory
    • delegation
    • orchestration
    • governance
  2. Product / Interface 层
    • web API
    • gateway
    • channel adapters
    • Outlook / WhatsApp / 外部服务接入

这样平台能力才能稳定,接入层才能随产品变化而变化。

2.4 多智能体是平台能力,不是工具技巧

现在 spawn_agent_team 已经存在,但在结构上还像“一个高级工具”。

后面应该把 multi-agent 当成正式 runtime 能力:

  • 有 plan 层 (计划)
  • 有 strategy 层 (策略)
  • 有 execution backend 层 (执行后端)
  • 有 result normalization 层 (结果归一化)
  • 有 memory / procedure reuse 层 (内存/过程重用)
  • 有 governance / safety / skill constraints (治理/安全/技能限制)

这里要特别说明 2.42.5 的关系:

  1. multi-agent 不是独立于 skills 的第二套指导系统。
  2. 我们仍然保留之前的群组讨论机制,也就是“探索式协作 + 流程化执行”两种能力都保留。
  3. 但无论是探索式 group discussion还是流程化 sequential / rearrange / hierarchy都必须受 skills 指引和约束。
  4. 也就是说skills 决定“应该如何思考、遵守什么边界、优先采用什么方法”,而 multi-agent 负责“由几个人、以什么结构去执行”。

所以后续正确关系应是:

skills -> 约束与方法指导 multi-agent -> 在 skills 约束下进行探索、讨论、流程化执行

2.5 skills 必须变成生命周期系统

现在的 skills 更像可读文档包,适合“手工维护”,不适合“自动学习”。

如果以后要做到自动创建、自动修订、自动推荐、自动淘汰skills 必须具备:

  • 结构化元数据
  • 版本号
  • 来源与 lineage
  • 审核状态
  • 效果统计
  • 与 procedure 的映射关系
  • 可回滚、可禁用、可发布

并且这里的 skills 不应只服务于“工具使用技巧”,而应成为整个 agent 系统的统一指引层,包括:

  1. 主 agent 如何规划和执行
  2. subagent / team member 如何行动
  3. memory 如何参与判断
  4. procedure reuse 如何被触发和约束
  5. multi-agent 讨论时允许采用哪些方法、角色分工和输出习惯

换句话说:

  1. memory / procedure reuse 不是独立于 skills 的平行系统。
  2. 但 memory 的实现标准要以 hermes-agent 为准,而不是继续沿用当前偏自由发挥的记忆模型。
  3. skills 提供全局行为指引memory 只保存跨会话仍然有价值的稳定事实session_search 负责找回历史细节procedure 只作为可选优化层。

这里要明确四者分工:

  1. skills
    • 指导“怎么做”
    • 约束工具使用、讨论方式、流程化执行方式
  2. memory
    • 保存 durable facts
    • 例如用户偏好、环境事实、项目约定、工具 quirks
  3. session_search
    • 检索历史会话细节
    • 不把大量过程细节直接塞进 memory
  4. procedure
    • 作为 coordinator 内部的复用优化
    • 不是主 memory 契约,也不是主要 prompt 注入来源

3. 现有项目现在是咋样的

3.1 当前的主结构

从代码上看,app-instance/backend 当前大致是这几块。

注意:下面这些路径仍写作 nanobot/...,是因为这里描述的是“现状代码位置”,不是目标命名。

  1. 启动与装配
    • nanobot/cli/commands.py
    • nanobot/__main__.py
  2. agent 运行时
    • nanobot/agent/loop.py
    • nanobot/agent/context.py
    • nanobot/agent/tools/*
    • nanobot/session/*
    • nanobot/providers/*
  3. 多 agent / 委派
    • nanobot/agent/delegation.py
    • nanobot/agent_team/*
    • nanobot/a2a/*
  4. Web / Gateway / Channels
    • nanobot/web/server.py
    • nanobot/channels/*
    • bridge/
  5. 技能与插件
    • nanobot/skills/*
    • nanobot/agent/skills.py
    • nanobot/agent/plugins.py
  6. 外部运行时耦合点
    • 当前主要是 vendored swarms

3.2 当前已经有的优点

这套代码不是没基础,相反已经有几个很有价值的雏形:

  1. 已经有 AgentRegistryDelegationManageragent_team,说明“统一委派层”思路已经出现。
  2. 已经有 ProcedureMemoryRunMemory,说明“从执行中学习”的基础数据层已经出现。
  3. 已经有 skills 的加载、安装、审核,说明“受控扩展机制”已经存在。
  4. 已经有 SwarmsBridgeSwarmsPolicySwarmsRunPlanner,说明多智能体桥接已经不是空白。

所以这次重构不是推倒重来,而是把这些散落的雏形收敛成一个完整架构。

3.3 当前最主要的问题

问题一:装配逻辑散落

同一个后端能力,在 CLI、Web、Gateway 中经常重复装配,甚至行为已经开始漂移。

这会导致:

  1. 同样的配置在不同入口行为不同。
  2. 改一个入口容易漏另一个入口。
  3. 测试覆盖变难。

问题二:AgentLoop 太重,但又没有成为唯一内核

AgentLoop 已经不是纯 loop而是“半个 runtime 内核”。

这会导致:

  1. 主 agent 与其他 agent 的边界不清。
  2. tool、memory、delegation、session、events 相互缠绕。
  3. 很多能力只能靠继续往 AgentLoop 里塞。
  4. 同时又没有真正做到“所有 agent 都统一复用它”。

问题三:swarms 接入边界不干净,而且 third_party 目录本身会持续恶化维护成本

当前 agent_team 虽然有 bridge但仍然直接依赖

  1. sys.path 注入 vendored swarms
  2. 顶层 swarms 包导入副作用
  3. SwarmRouter 的参数细节
  4. AutoSwarmBuilder 自己的 LLM 栈

这意味着现在不是“我们调度 swarms”而是“我们的平台有一部分被 swarms runtime 反向定义了”。

另外,third_party/ 这种目录在这个项目里不应该长期存在。它会带来两个问题:

  1. 仓库边界不清,到底哪些代码是我们的,哪些不是,很难维护。
  2. 一旦改动第三方源码,升级、回滚、排障都会变得更脆弱。

问题四skills 还是静态文档包

现在的 skill 系统适合:

  • 展示
  • 人工安装
  • prompt 注入

但不适合:

  • 自动学习
  • 自动合并
  • 自动评估
  • 版本回滚
  • 基于效果做选择

问题五:接口层和核心层耦合过深

web/server.py 过大说明一个事实:

平台内核与外部 API、外部接入、外部服务没有完成分层。

4. 后面应该怎么改

4.1 先把系统改成 OpenHarness 风格的能力分组

这里我建议明确参考 OpenHarness 那种“按能力分组、核心目录更扁平”的结构,而不是继续按历史演化路径堆目录。

核心思路是:

  1. engine 作为唯一运行内核。
  2. coordinator 负责委派和多 agent 编排。
  3. toolsskillsmemorypermissions 作为独立能力层。
  4. interfaces 只放 CLI / Web / Gateway / Channels 这类入口。
  5. integrations 放外部协议和外部系统适配。

这样拆完之后,模块关系应变成:

interfaces -> engine/coordinator/tools/skills/memory -> foundation

而不是像现在这样互相横穿。

4.2 彻底去掉 third_party/,把 swarms 改造成可替换 backend

旧实现状态

agent_team 曾经接通:

  • GroupChat
  • SequentialWorkflow
  • ConcurrentWorkflow
  • AgentRearrange
  • MixtureOfAgents
  • HierarchicalSwarm

但这些能力还不是 Beaver 的正式能力集合,而是“旧 bridge 恰好能跑通的一部分 swarms 类型”。

更重要的是,当前它们依赖 third_party/swarms 这个 vendored 目录,这是后续必须去掉的。

当前 Beaver 状态

新后端已经先落地了不依赖 third_party/swarms 的 Agent Team v1

  1. 自有核心模型:
    • AgentDescriptor
    • DelegationEnvelope
    • ExecutionNode
    • ExecutionGraph
    • NodeRunResult
    • TeamRunResult
  2. 内部服务入口:
    • TeamService.run_team(...)
  3. 本地 delegated runner
    • LocalAgentRunner
    • sub-agent 复用主 AgentLoop.process_direct() / submit_direct()
  4. 已实现策略:
    • sequence
    • parallel
    • dag
  5. 已固定的安全语义:
    • parent Task 必须存在且 session 匹配
    • sub-agent run_ids 回填父 Task
    • team/sub-agent 默认只写 receipts/effects不生成 learning candidates
    • learning candidates 仍只由 Task feedback gate 触发
    • 节点级异常归一成 NodeRunResult
    • summary 只聚合成功输出并列出失败节点

目标状态

后续应该继续沿用我们自己的团队执行抽象:

TeamSpec
 -> TeamPlanner
 -> ExecutionPlan
 -> StrategyBackend
 -> NormalizedResult

然后:

  1. SwarmsBackend 如果以后存在,也只能是 StrategyBackend 的一个实现。
  2. 平台对外暴露的是自己的策略名和能力矩阵。
  3. swarms 只提供可选执行或策略参考,不再负责定义平台边界。
  4. 仓库内不再保留 third_party/
  5. 高级策略可以先编译成 Beaver ExecutionGraph 或 step loop而不是直接暴露 swarms runtime。

具体改法

  1. 保留当前 coordinator/models.py / local.py / execution/scheduler.py 作为 v1 core。
  2. 在平台层继续扩展正式支持的 strategy。
    • 已实现:sequence / parallel / dag
    • 预留:moa / hierarchy / heavy / group_chat / forest / maker / router
  3. 高级 strategy preset 先转成 ExecutionGraph 或 step loop。
  4. 如果后续接外部 swarms单独放进 coordinator/backends/swarms/,并统一输入输出为 Beaver models。

结果

改完之后:

  1. third_party/ 目录消失。
  2. 上层不再知道 third_party/swarms 这个路径。
  3. 对上层透明的是 Beaver 自有 team model 和 TeamService,不是 vendored 源码目录。

4.3 把 skills 从静态文档升级成能力生命周期系统

当前状态

现在 skill 基本等于:

  • 一个目录
  • 一个 SKILL.md
  • 一点 frontmatter
  • 一点审核流程

目标状态

后续 skill 至少要分成三类对象:

  1. SkillDraft
    • 自动生成或人工创建
    • 还没发布
  2. SkillVersion
    • 某个稳定版本
    • 可启用/禁用/回滚
  3. SkillRuntimeView
    • 当前对模型暴露的生效版本

同时 skill 应该带这些元信息:

  • id
  • name
  • version
  • summary
  • usage_rules
  • inputs
  • outputs
  • dependencies
  • source
  • derived_from_procedure
  • review_status
  • metrics

自动学习建议

不要直接让 agent 在线改 live skills。

正确链路应该是:

Task -> validated run result -> user feedback -> learning candidate -> skill draft -> review -> publish -> runtime use

这比“自动改 SKILL.md”安全得多,也更适合生产环境。

把它再展开成运行时视角,应该是下面这种树形过程:

一次 Task 模式 run 完成
│
├─ 记录本轮结果并归属内部 Task
│  ├─ RunRecord
│  ├─ task_id / attempt_index
│  ├─ SkillActivationReceipt[]
│  └─ SkillEffectRecord[]
│
├─ 自动验证
│  ├─ ValidationResult
│  ├─ task_validation_snapshotted hidden event
│  └─ RunRecord.validation_result
│
├─ 如果验证失败
│  ├─ 自动修订一次
│  ├─ 失败草稿尝试从可见上下文隐藏
│  └─ 第二次仍失败则等待用户反馈,不进入成功学习
│
├─ 用户反馈
│  ├─ satisfied验证通过后关闭 Task并生成成功学习候选
│  ├─ reviseTask 进入 needs_revision下一条消息复用该 Task
│  └─ abandonTask 进入 abandoned写 Failure Memory
│
├─ 聚合 skill 历史表现
│  └─ SkillPerformanceSnapshot
│
├─ 生成学习候选
│  ├─ revise_skill
│  ├─ new_skill
│  ├─ merge_skills
│  └─ retire_skill
│
├─ 如需真正演化:
│  ├─ evidence selection
│  ├─ skill draft synthesis
│  ├─ review
│  ├─ publish / disable / rollback
│  └─ runtime catalog 切换到新的 published version
│
└─ 明确禁止:
   └─ agent 直接在线改 live `SKILL.md`

结果

改完之后skills 不再只是 prompt 资源,而是平台知识层的一等对象。

4.4 以 hermes-agent 的 memory 模型为基线重做 memory 层

这里要明确:新的 memory 设计不再以当前 ProcedureMemory 为中心,而是以 hermes-agent 的 memory 模型为准。

主 memory 契约

新的主 memory 契约应是:

  1. 一个统一的 memory tool
  2. 三个核心动作:
    • add
    • replace
    • remove
  3. 两个目标存储:
    • memoryagent 的环境事实、项目约定、工具经验
    • user:用户画像、偏好、习惯、纠正记录

它的行为应对齐 Hermes

  1. add
    • 追加新条目
    • 精确重复时跳过
    • 超限时返回当前条目和占用情况
  2. replace
    • old_text 的短语义片段匹配条目并整体替换
    • 多条匹配时要求更精确的 old_text
  3. remove
    • 也是通过 old_text 的语义片段删除
    • 多条匹配时同样要求更精确匹配

这里要采用“子串匹配”而不是 UUID因为这更符合 LLM 的操作习惯。

写入安全与并发安全

新的 memory 层应保留 Hermes 这几个关键约束:

  1. 写入前扫描注入/渗透模式
  2. 在锁内重新从磁盘加载目标文件
  3. 做重复检测和字符上限检测
  4. 通过临时文件 + os.replace() 做原子写入

也就是说,并发安全的关键不是“先读后写”,而是:

scan -> lock -> reload -> validate -> atomic write

冻结快照模式

新的 memory 层必须采用 frozen snapshot而不是“每次 memory 写入都改 system prompt”。

规则是:

  1. 会话开始时,从磁盘加载 memoryuser
  2. 立刻冻结成 system prompt snapshot
  3. 会话中写入 memory 时,只更新磁盘上的 live state
  4. 当前会话里的 system prompt 保持不变
  5. 下一个会话开始时,再重新加载最新 memory

session_search 取代“把所有过程细节塞进 memory”

大量过程细节不应继续塞进 memory

因此新后端应该明确区分:

  1. memory
    • 保存小而精的、跨会话稳定有效的事实
  2. session_search
    • 检索历史会话
    • 支持“无 query 浏览最近会话”和“有 query 的全文搜索 + 摘要”

这个能力后续应在 Beaver 中落成:

  • beaver/memory/curated/*
  • beaver/memory/search/*
  • beaver/tools/builtins/memory.py
  • beaver/tools/builtins/session_search.py

ProcedureMemory 的新定位

这不表示 ProcedureMemory 没价值,而是它的地位要下降:

  1. ProcedureMemory 不再是主 memory 契约
  2. 它不应该直接承担“跨会话记忆”职责
  3. 它更适合作为 coordinator 内部的流程复用与路由优化层

新的优先级应是:

  1. 用户偏好、纠正、环境事实 -> memory
  2. 历史会话细节 -> session_search
  3. 稳定方法论和工作法 -> skills
  4. 团队/流程复用优化 -> ProcedureMemory

4.5 CLI 不再代表单 agent 模式,只保留为薄入口

当前入口层太厚,后续应该改成:

  1. CLI 只做参数解析与 runtime 启动
  2. Web 只做 API 与 request/response 映射
  3. Gateway 只做渠道接入与消息转发

所有核心能力都由统一的 application services 提供,例如:

  • ChatApplicationService
  • DelegationApplicationService
  • TeamRunApplicationService
  • SkillApplicationService
  • MemoryApplicationService

同时要明确一条原则:

CLI 不是“单 agent 专用模式”。

它只是这些 interface 之一:

  • CLI
  • Web
  • Gateway
  • Channel

无论从哪个入口进来,最终都进入同一套 AgentLoop / engine。

这样就不会再出现“CLI 一套 agent其他入口另一套 agent”的问题。

5. 具体改动后会是什么样

5.1 所有 agent 共用同一套 engine

现在

CLI/Web/Gateway -> 各自装配一套 AgentLoop 或相关依赖

之后

CLI/Web/Gateway/Channel -> AgentEntryService -> AgentLoop(engine) -> tools/skills/memory/permissions/delegation

结果是:

  1. 主 agent、subagent、team member 复用同一套 engine。
  2. 装载逻辑只在 engine 内统一处理一次。
  3. 不再保留“CLI 单 agent 概念”。
  4. 测试可以直接测 engine 和 service而不是分别测入口分支。

5.2 多 agent 场景

现在

TeamService.run_team -> TeamGraphScheduler -> LocalAgentRunner -> AgentLoop.process_direct / submit_direct

Task mode 内部已经变成:

AgentService._run_task_mode -> TaskExecutionPlanner -> optional TeamService.run_team -> 主 Agent synthesis run -> ValidationService

之后

TeamService -> strategy preset -> ExecutionGraph -> TeamGraphScheduler -> LocalAgentRunner / optional StrategyBackend -> NormalizedTeamResult

结果是:

  1. 团队能力不再绑定某个第三方 runtime 结构。
  2. v1 已经支持 sequence / parallel / dag
  3. 可以逐步增加高级 preset 或第二种 backend而不推翻平台层。
  4. swarms 只是其中一个可插拔执行器。

5.3 skill 场景

现在

SkillsLoader -> 读 SKILL.md -> 摘要注入 / 手动审核安装

之后

SkillCatalog -> SkillDraftStore -> SkillReviewService -> SkillPublisher -> SkillRuntimeResolver

结果是:

  1. skill 可以有版本。
  2. skill 可以从 procedure 生成。
  3. skill 可以审核和回滚。
  4. skill 可以做效果分析和推荐。

5.4 运行学习场景

现在

新后端已经不再把复杂任务学习完全混在 session / memory / procedure 中。

当前实际状态是:

Chat input -> MainAgentRouter -> simple answer 或 internal Task -> RunRecord + TaskEvent + ValidationResult -> /api/chat/feedback -> satisfied / revise / abandon

也就是说:

  1. Task 是复杂任务的内部执行容器。
  2. Run 仍是一次模型/tool loop 的执行收据。
  3. ValidationResult 是进入学习前的自动质量门。
  4. 用户反馈是成功学习和失败记忆的最终门控。

之后

Run transcript -> session_search index

Durable fact -> memory(add/replace/remove)

Stable method / workaround / reusable workflow -> SkillCandidateGenerator -> SkillDraft -> Review -> Publish

Repeated execution pattern -> optional ProcedureMemory

结果是:

  1. durable facts、历史细节、稳定方法三类信息终于分层。
  2. 自动学习不会把临时过程污染到主 memory。
  3. skills 仍是最高层指导系统,而 memory 变成受控 CRUD 系统。
  4. 成功 Skill 学习只能来自验证通过且用户满意的 Task。
  5. 放弃或验证失败只进入 Failure Memory / 风险记忆,不污染 published skill。

6. 分阶段落地建议

这次重构不应该一次性推翻,建议分四期做。

第一期:边界清理

目标:

  1. 把入口装配统一掉
  2. web/server.py 开始拆分
  3. 先落地 Beaver 自有 Agent Team v1 core避免继续依赖 vendored swarms

交付物:

  • 统一 app factory / service wiring
  • 初步拆分 web routes
  • coordinator/models.py / local.py / execution/scheduler.py

第二期:平台抽象固化

目标:

  1. 定义 team / skill / memory / session_search 的正式模型
  2. 让上层只依赖平台模型

交付物:

  • AgentDescriptor / ExecutionGraph / TeamRunResult
  • SkillSpec
  • ExecutionPlan
  • MemoryEntry
  • MemorySnapshot
  • SessionSearchResult
  • SkillDraft
  • SkillVersion

第三期skills 生命周期

目标:

  1. 从“文档技能”升级到“版本化能力”
  2. 打通“稳定方法 -> SkillDraft”
  3. 按 Hermes 基线完成 memory CRUD、frozen snapshot、session_search

这一期里的“学习/自进化”过程,建议始终按下面这条线施工:

run
│
├─ receipt collection
│  ├─ RunRecord
│  ├─ SkillActivationReceipt
│  └─ SkillEffectRecord
│
├─ evidence aggregation
│  ├─ session transcript
│  ├─ curated memory
│  ├─ current published skill version
│  └─ repeated user corrections / outcomes
│
├─ learning candidate generation
│  ├─ new_skill
│  ├─ revise_skill
│  ├─ merge_skills
│  └─ retire_skill
│
├─ draft lifecycle
│  ├─ create draft
│  ├─ review
│  ├─ publish
│  ├─ disable
│  └─ rollback
│
└─ runtime use
   └─ 只暴露 published version 给运行时

交付物:

  • skill catalog
  • review/publish flow
  • runtime resolver
  • memory tool
  • session search tool

第四期:高级多智能体能力

目标:

  1. 放开更多正式支持的 strategy
  2. 评估 GraphWorkflowHeavySwarm
  3. 增加 fallback / retry / policy routing

交付物:

  • 完整 strategy registry
  • 多 backend 能力矩阵
  • team execution fallback

7. 重构后的推荐目录

下面这个目录我已经按你说的方向收紧了:

  1. 不保留 third_party/
  2. 不保留“CLI 单 agent”这类结构暗示
  3. 尽量参考 OpenHarness 那种按能力分组、观感更规整的布局
  4. 每个目录后面都加中文说明
app-instance/backend/
├── change.md                        # 这份重构蓝图
├── README.md                        # 后端总说明
├── workflow.md                      # 运行链路说明
├── docs/                            # 架构文档和迁移文档
│   ├── architecture/                # 核心架构说明
│   └── migration/                   # 分阶段迁移计划
├── beaver/
│   ├── foundation/                  # 最底层公共设施:配置、模型、事件、错误、工具函数
│   │   ├── config/                  # 配置定义与加载
│   │   ├── models/                  # 全局共享数据模型
│   │   ├── events/                  # 统一事件模型与事件派发
│   │   ├── errors/                  # 统一错误类型
│   │   └── utils/                   # 通用工具函数
│   ├── engine/                      # 统一 agent 内核,所有 agent 都复用这里
│   │   ├── loop.py                  # AgentLoop 主循环与执行入口
│   │   ├── loader.py                # tools、skills、memory、permissions 的统一装载
│   │   ├── context/                 # 上下文拼装
│   │   ├── session/                 # 会话状态与持久化
│   │   ├── providers/               # LLM provider 适配
│   │   └── runtime/                 # 运行时辅助对象与执行上下文
│   ├── tools/                       # 工具系统
│   │   ├── registry/                # 工具注册与发现
│   │   ├── builtins/                # 内置工具
│   │   ├── mcp/                     # MCP 工具适配
│   │   └── policies/                # 工具权限与调用约束
│   ├── skills/                      # 技能系统
│   │   ├── builtin/                 # 内置技能内容
│   │   ├── catalog/                 # 技能目录、索引与查询
│   │   ├── drafts/                  # 自动生成或待审核的 skill draft
│   │   ├── reviews/                 # 技能审核流
│   │   ├── publisher/               # 技能发布与版本切换
│   │   └── resolver/                # 运行时技能解析与注入
│   ├── memory/                      # 记忆与经验沉淀系统
│   │   ├── curated/                 # Hermes 风格的 MEMORY / USER 持久记忆
│   │   ├── search/                  # session_search 与历史会话检索
│   │   ├── runs/                    # 单次执行记录
│   │   ├── procedures/              # 可选的流程复用优化层
│   │   └── stores/                  # 底层存储与原子写实现
│   ├── tasks/                       # 内部 Task 系统:自动 Task 化、验证、反馈、失败记忆入口
│   │   ├── models.py                # TaskRecord / TaskEvent / ValidationResult
│   │   ├── store.py                 # Task 文件存储
│   │   ├── service.py               # Task 状态机与反馈处理
│   │   ├── router.py                # MainAgentRouter simple/task 分类
│   │   └── validation.py            # LLM validator 与验证结果归一化
│   ├── permissions/                 # 权限、沙箱、治理规则
│   │   ├── policies/                # 权限策略
│   │   ├── guards/                  # 执行前检查
│   │   └── profiles/                # 不同 agent 运行权限画像
│   ├── coordinator/                 # 多 agent 协调层,参考 OpenHarness 的 coordinator 风格
│   │   ├── models.py                # AgentDescriptor / ExecutionGraph / TeamRunResult
│   │   ├── local.py                 # LocalAgentRunner复用主 AgentLoop
│   │   ├── execution/               # sequence / parallel / dag 调度与聚合
│   │   ├── backends/                # 后续可替换多 agent backend
│   │   └── team/                    # team 级模型 re-export / 后续高级编排对象
│   ├── services/                    # application services对外提供统一能力入口
│   │   ├── agent_service.py         # 统一 agent 运行入口
│   │   ├── team_service.py          # 多 agent 执行入口
│   │   ├── skill_service.py         # 技能管理入口
│   │   ├── memory_service.py        # memory 查询与写入入口
│   │   └── admin_service.py         # 平台管理入口
│   ├── interfaces/                  # 薄入口层,不承载核心业务
│   │   ├── cli/                     # CLI 入口,只负责把请求送进 services/engine
│   │   ├── web/                     # FastAPI 接口层
│   │   │   ├── app.py               # Web app factory
│   │   │   ├── routes/              # 路由拆分
│   │   │   ├── schemas/             # Web 请求/响应模型
│   │   │   └── deps.py              # Web 依赖装配
│   │   ├── gateway/                 # 常驻 worker / gateway 入口
│   │   └── channels/                # Telegram/Slack/Email 等渠道入口
│   ├── integrations/                # 外部系统与协议集成
│   │   ├── a2a/                     # A2A 协议与 client
│   │   ├── mcp/                     # MCP 连接与管理
│   │   ├── outlook/                 # Outlook 集成
│   │   ├── whatsapp/                # WhatsApp bridge 适配
│   │   └── providers/               # 外部 provider 特定集成
│   ├── plugins/                     # 插件系统
│   │   ├── loader.py                # 插件发现与装载
│   │   ├── registry.py              # 插件注册表
│   │   └── hooks.py                 # 插件 hooks
│   └── templates/                   # 默认模板、system prompt 模板、内置文本资源
├── tests/                           # 测试
│   ├── unit/                        # 单元测试
│   ├── integration/                 # 集成测试
│   ├── e2e/                         # 端到端测试
│   └── fixtures/                    # 测试数据与夹具
└── bridge/                          # 独立 Node/bridge 代码,作为外部桥接层保留

8. 最终结论

这次重构的本质不是“把代码拆小一点”,而是完成三件事:

  1. 把当前项目从“围绕 AgentLoop 生长的单体系统”升级成“所有 agent 共用一个 engine 的可维护 harness 平台”。
  2. swarms 从“放在 third_party/ 里的深耦合运行时”降级成“可替换的多智能体 backend”。
  3. skills 从“静态 Markdown 包”升级成“可学习、可审核、可发布、可回滚的能力系统”。

如果这三件事做成了,后面再扩多智能体架构、自动学习、插件生态、外部接入,代码就不会继续失控。


9. 最新落地状态Task Team 后三件套

本轮已经把 Task Team 融合后的三个缺口推进到 v1 可用状态:

  1. Task Sub-agent Skill Resolver

    • 新增 beaver/tasks/skill_resolver.py
    • sub-agent 是临时 generic worker不承载固定角色人设。
    • TaskExecutionPlanner 的 team node 输出 skill_query / required_capabilities / expected_output
    • TaskSkillResolver 从 published skill catalog 中选择合适 skill并写入 node pinned skills。
    • 如果没有命中 published skill会创建 draft-only skill并把 draft 内容作为本次 sub-agent 的 ephemeral pinned skill context 使用。
    • draft 不自动 approve/publish不进入 runtime catalog后续仍走 review/publish。
    • agent registry / target resolver 不参与 Task sub-agent strategy可作为未来外部 agent/A2A 管理面保留。
  2. Task Team Process Projection

    • Task attempt 隐藏事件增加 skill_queries / selected_skill_names / generated_skill_draft_ids / skill_resolution_report / node_results / task_synthesis_completed
    • 新增 GET /api/sessions/{session_id}/process
    • 前端 ChatWorkbench 已接入 ProcessLane 和移动端 Process tab。
    • 展示规划、skill selection、draft-only ephemeral guidance、team node、main synthesis、validation/retry不把 team summary 直接当最终回答。
  3. Learning Pipeline 闭环

    • 新增 SkillLearningPipelineService
    • Web API 覆盖 candidates、drafts、submit、approve、reject、publish、disable、rollback。
    • /skills 页面增加 Published / Candidates / Drafts tabs。
    • publish 仍要求 approved draftrejected draft 不可 publishdraft 不进入 runtime catalog。

验证状态:

  • 后端:76 passed
  • 前端:npm run typecheck 通过,npm test 通过,npm run lint 通过但仍有既有 warnings。