平台说明
整体技术方案与架构说明
本节将介绍 Poco AI Agent 的整体架构,并给出技术方案说明。
1. 系统定位与核心目标
一个“多服务协同的 AI Agent 执行平台”,核心目标是把“用户任务”稳定地转化为“可执行的 Agent 运行”,并提供:
- 任务编排与执行(即时、定时、夜间窗口)
- 会话与运行状态全链路可追踪(SSE + 持久化事件)
- 插件化能力装配(MCP、Skill、Plugin、Subagent、Slash Command)
- 可回放产物(Workspace 文件、归档、截图)
- 面向外部生态的 OpenAPI 兼容入口
2. 功能全景(按业务域)
| 业务域 | 核心能力 | 主要实现位置 |
|---|---|---|
| 会话与任务 | 会话创建、任务入队、分叉、停止、历史恢复 | backend/app/api/v1/sessions.py backend/app/services/task_service.py backend/app/services/session_service.py |
| 运行队列 | claim/start/fail、租约、状态恢复、用量汇总 | backend/app/services/run_service.py |
| 回调与事件 | 高频流事件直达、普通回调落库、状态补丁、SSE 广播与历史回放 | backend/app/services/stream_ingress_service.py backend/app/services/callback_service.py backend/app/services/stream_event_service.py |
| 调度与分发 | APScheduler 拉取队列、定时任务分发、执行前资源装配 | executor_manager/app/core/lifespan.py executor_manager/app/services/run_pull_service.py |
| 执行引擎 | Agent 执行器运行、Hook 扩展、Plan 模式、人机交互 | executor/app/core/engine.py executor/app/api/v1/task.py |
| 能力管理 | MCP/Skill/Subagent/Plugin/SlashCommand 配置与安装 | backend/app/api/v1/mcp_servers.py skills.py subagents.py plugins.py slash_commands.py |
| 定时任务 | Cron、多步骤、复用会话、通知策略 | backend/app/services/scheduled_task_service.py |
| 智能工作台 | 主题聚合、洞察分析、产物索引、通知策略 | backend/app/api/v1/workbench.py backend/app/services/workbench_service.py |
| 外部兼容 | /openapi/v1/messages、/openapi/v1/chat/completions | backend/app/api/openapi_v1/*.py |
| 前端交互 | Home 编排、Chat 执行态、Capabilities 能力中心、Admin | frontend/features/* |
3. 总体架构图
4. 分层架构说明
4.1 Frontend(交互与编排层)
- 技术栈:Next.js 16 + React 19 + TypeScript + Tailwind + shadcn/ui
- 关键交互:
- Home 页任务编排:提示词、附件、仓库、浏览器、能力选择、计划模式、定时模式
- Chat 执行页:聊天面板 + 电脑面板 + 产物面板三联动
- SSE 驱动实时状态(会话流 + 侧边栏状态流)
- 按
stream_seq缓冲乱序事件,发现缺口时从历史接口补齐,再按顺序渲染 - 终态刷新服务端消息历史,用持久化结果校准本地流式内容
- Capabilities 中心统一管理 Skill/MCP/Subagent/Plugin/定时任务等
- 代理策略:
frontend/app/api/v1/[...path]/route.ts与v2路由作为同源代理层
源码依据:
frontend/features/home/components/home-page-client.tsxfrontend/features/chat/hooks/use-execution-session.tsfrontend/components/shared/sidebar/main-sidebar.tsxfrontend/lib/api-client.ts
4.2 Backend(控制面与数据面核心)
- 路由分层:
/api/v1:主业务 API/api/v2/turns:回合式入口/openapi/v1/*:外部兼容入口- 核心职责:
- 会话/运行/消息/工具执行/用量持久化
- 任务入队与幂等(
idempotency_key) - 高频流事件先通过 SSE 分发,再按批次持久化,避免数据库写入阻塞用户看到回复
- 按 run 维护接收与持久化进度,支持重复请求去重、序号缺口检查和历史补拉
- 回调处理与终态补偿(message reconcile、通知、workbench 触发)
- 中间件:
RequestContextMiddleware、RequestLoggingMiddleware、AuthMiddleware
源码依据:
backend/app/main.pybackend/app/api/v1/__init__.pybackend/app/core/middleware/*.pybackend/app/services/task_service.pybackend/app/services/callback_service.pybackend/app/services/callback/backend/app/services/stream_ingress_service.pybackend/app/services/stream_event_service.py
回调服务目录说明:
backend/app/services/callback_service.py:对外兼容入口,继续导出CallbackService,保持旧导入路径稳定。backend/app/services/callback/orchestrator.py:回调主编排,串联 session 更新、run 状态推进、消息落库、usage 记录、事件持久化和终态副作用。backend/app/services/callback/parsing.py:Poco Agent 消息、任务系统消息、stream event、UUID、stop reason 等纯解析逻辑。backend/app/services/callback/message_service.py:会话消息落库、工具执行记录、pre_compact消息和 stopped run 的 partial assistant 消息补偿。backend/app/services/callback/usage_service.py:ResultMessageusage 持久化、stream usage 回填、用户/团队 quota counter 增量同步。backend/app/services/callback/run_state_service.py:run 解析、run 状态同步、scheduled task / step 的 last run 状态同步。backend/app/services/callback/stream_builder.py:callback 到 stream records / transient envelopes 的构建,以及 stream event 持久化策略判断。backend/app/services/callback/terminal_effect_service.py:终态后的 message reconcile、session summary、webhook、通知、workbench 触发、自动发布和产物推荐入队。
4.3 Executor Manager(调度与运行时编排)
- 调度内核:APScheduler + Pull 模式队列消费
- 关键能力:
claim_run -> prepare -> dispatch -> start_run- 预备阶段状态回传(environment/skills/mcp/plugins/subagent/ready)
- 容器池(ephemeral/persistent warm container)
- 为每个 run 签发限权实时令牌,并把 Backend 实时入口与 Manager 普通回调入口一并下发给 Executor
- 高频直达失败时接收 Executor 的有序批量降级回调
- 终态后 workspace 导出与回传
- 浏览器基础沙箱(per-user base browser)生命周期管理
源码依据:
executor_manager/app/core/lifespan.pyexecutor_manager/app/services/run_pull_service.pyexecutor_manager/app/services/container_pool.pyexecutor_manager/app/services/callback_service.py
4.4 Executor(执行引擎层)
- 关键职责:
- 准备工作区(代码仓、输入文件、插件目录、上下文)
- 构造执行引擎运行选项与 hook
- 执行工具权限门禁(Plan 模式)
- AskUserQuestion/ExitPlanMode 人机交互回路
- 注入内置 MCP(时间、图像理解、Playwright)
- 高频流事件写入本地 journal(待发送记录),并按
stream_seq直达 Backend;确认持久化后再清理记录 - 直达通道持续失败时,把未持久化事件按批次交给 Executor Manager 转发
- 停止机制(soft interrupt + hard cancel)
源码依据:
executor/app/api/v1/task.pyexecutor/app/core/engine.pyexecutor/app/core/task_registry.pyexecutor/app/hooks/*.py
5. 核心时序
与主分支的关键差异
| 对比项 | 主分支 | 当前分支 |
|---|---|---|
| 高频流消息 | Executor 先回调 Executor Manager,再由 Manager 转发 Backend | Executor 携带 stream_seq 直达 Backend,正常流量不进入 Manager 队列 |
| 用户端展示 | 回调处理和事件落库后再进入 SSE | Backend 接收后先进行 SSE 广播,数据库在后台批量写入 |
| 可靠恢复 | 主要依靠普通回调重试和 SSE 历史 | Executor 本地待发送记录、已落库进度、Manager 批量降级和历史缺口补拉共同保证 |
| 消息顺序 | 主要依赖到达顺序 | 前端与 OpenAI 兼容流都按连续 stream_seq 消费,缺口补齐后再继续 |
| Executor Manager 职责 | 同时承担调度与高频消息中转 | 负责调度、普通状态、终态和异常降级,不承载正常高频流量 |
5.1 即时任务执行链路
5.2 实时消息异常降级链路
正常情况下,高频流事件不经过 Executor Manager。只有直达 Backend 持续失败时,Executor 才会启用已有的 Manager 回调通道;因此异常降级不会把正常流量重新压回 Manager。
5.3 定时任务分发链路
5.4 Plan 模式(先计划后执行)
6. 数据模型与状态机
6.1 核心实体关系
6.2 Run 状态机
6.3 关键业务对象
- 会话:
agent_sessions(用户上下文、配置快照、导出状态、直接父会话与 fork 点) - 运行:
agent_runs(队列状态、调度模式、权限模式、租约、错误) - 事件:
agent_stream_events(SSE 回放与恢复基础) - 定时任务:
agent_scheduled_tasks+agent_scheduled_task_steps - 工作台:
workbench_scope/workbench_insight/workbench_artifact
多级分叉不复制数据库消息。读取某个分支时,后端通过递归 CTE 沿 parent_session_id 向上解析会话链,并用每一级的 fork_point_message_id 限制祖先消息和运行记录的可见范围。查询包含同用户校验和循环保护;首次执行分支时只复制直接父分支的一份快照。运行前 Manager 优先使用当前会话的活动工作区,其次恢复当前会话的本地完整归档;只有仍处于 fork_pending 的首次分叉才会恢复并复制直接父工作区,已运行分支不会回退到父快照。
7. 能力装配与执行前准备机制
运行前装配由 Manager 统一完成,避免执行容器内做重复配置读取:
- MCP:按用户安装 + 会话显式选择解析
- Skill:落地到用户技能目录(执行时从 user/project setting source 加载)
- Plugin:解压并转换为本地插件路径注入
- Subagent:解析定义并落地
- Slash Commands:同步至会话上下文
- CLAUDE.md / System Prompt / AGENTS.md:按用户配置装配
- input_files:附件分发/拉取后注入任务配置
源码依据:
executor_manager/app/services/config_resolver.pyexecutor_manager/app/services/*_stager.pyexecutor/app/core/engine.py
7.1 Agent 与多 Agent 能力分层方案
- 单 Agent 执行层(当前主链路)
- 一条任务对应一个主执行会话,负责规划、调用工具、产出结果、回调状态。
- 对应本项目:
TaskService -> RunService -> RunPullService -> AgentExecutor -> CallbackService。
- Subagent(子代理)层(同会话内隔离执行)
- 子代理定位:针对特定子任务的“专用执行单元”,独立上下文窗口、独立系统提示词、独立工具权限。
- 主 Agent 负责“委派 + 汇总”,子代理聚焦局部问题,减少主上下文污染。
- 适合场景:代码审查、专项排障、文档整理、只读分析等高频子任务。
- 多 Agent 并行层(同会话内并发委派)
- 由主 Agent 并行拉起多个子代理处理互不依赖的研究路径,再统一合并结论。
- 适合场景:模块并行调研、跨目录影响分析、并行测试诊断。
- 约束:子代理链路需控制深度,避免“无限嵌套委派”导致成本和复杂度失控。
- Agent Team 层(跨会话协同团队)
- 由 Lead Agent + Teammates 构成,使用共享任务列表与消息机制协作。
- 每个 teammate 保持完整独立上下文,可直接互通消息,适合需要“讨论/挑战/协商”的复杂任务。
- 适合场景:跨前后端大改造、多假设并行排障、复杂方案评审。
7.2 上下文自动压缩与会话治理方案
为保证长会话稳定性与成本可控,目前将“自动压缩 + 主动治理”作为执行器标准能力:
- 自动压缩
- 会话接近上下文上限时自动进行历史压缩,保留关键决策与有效结论。
- 与 prompt caching 联动,降低重复上下文的 token 消耗。
- 手动压缩与压缩策略注入
- 支持通过压缩指令追加“保留重点”(如代码片段、API 约束、测试结论)。
- 支持在项目级指令文件中配置压缩偏好(例如优先保留错误栈和改动摘要)。
- 会话切换治理
- 对无关任务建议随时开启新会话,同时支持分叉会话功能等手段,避免上下文持续膨胀。
- 对高体量工具定义(如大量 MCP)采用延迟加载/按需加载策略(借助
ToolsSearch工具实现),降低常驻上下文占用。
- 观测与告警
- 在事件流中增加上下文水位与压缩事件(如
context.usage、context.compact_boundary)。 - 对“压缩失败、压缩后关键信息缺失、会话恢复失真”建立告警和兜底策略。
8. 实时通信与可观测性
8.1 SSE 设计
- 会话流:
/api/v1/sessions/{session_id}/stream - 侧栏状态流:
/api/v1/sessions/sidebar-status/stream - 高频流入口:
/api/v1/callback/stream - 持久化确认:
/api/v1/callback/stream/flush
消息分成实时展示和可靠恢复两层:
- Backend 接收单个 run 内连续递增的
stream_seq后,先广播给在线订阅者,再由后台任务批量写入agent_stream_events。 - Executor 同时保留本地待发送记录;只有 Backend 返回
durable_through(已持久化到的序号)后,才删除对应记录。 - 前端只按连续
stream_seq渲染。后到事件会先缓冲,缺失事件通过stream-events?run_id=...&from_stream_seq=...补齐。 - SSE 重连继续使用
Last-Event-ID和事件历史;订阅队列溢出后也会触发 catch-up。 run.done/run.error不会跳过尚未补齐的流事件,终态后再刷新消息历史进行最终校准。- OpenAI 兼容流复用 Backend 的 run 级有序事件源,遇到缺口时先恢复历史,再继续输出后续内容和终态。
SSE 空闲期间发送心跳 ping,用于保持连接和及时发现断线。
8.2 可观测性
- 全链路
request_id/trace_id - 调度关键阶段埋点(
timingstep 日志) - 失败场景抓取容器日志(终态失败时)
源码依据:
backend/app/services/stream_event_service.pybackend/app/api/v1/sessions.pyexecutor_manager/app/scheduler/task_dispatcher.pyexecutor_manager/app/services/callback_service.py
9. 安全与权限模型
- API 鉴权:
- 外部:
Authorization: Bearer <token> - 内部:
X-Internal-Token - API Key 能力边界:
conversation/global/adminscope 分级 - 普通回调安全:Executor Manager 使用内部 token 调用 Backend
- 实时回调安全:Executor 使用仅限单个 session/run、带有效期的
X-Stream-Token,不持有全局内部 token - Plan 模式工具门禁:未审批前禁止写入/执行类工具
源码依据:
backend/app/core/middleware/auth.pybackend/app/core/deps.pybackend/app/api/v1/callback.pyexecutor/app/core/engine.py
10. 部署拓扑与运行方案
10.1 容器镜像分层
docker/sandbox:默认full基础运行时,包含桌面/浏览器能力docker/executor:在 sandbox 之上组装执行器,预装 Playwright MCP、universal-db-mcp 和 agent-browser,并作为latest单镜像使用docker/executor/start.sh:控制是否启动桌面/VNC/code-server 相关服务
10.2 运行模式建议
- 开发环境:四服务分开启动,便于调试路由与回调
- 生产环境:Backend + Manager 高可用,Executor 按需弹性扩展
- 浏览器能力:通过
ENABLE_SANDBOX_SERVICES按容器运行时启用,非浏览器任务不启动桌面/VNC/code-server 服务
11. 稳定性与容错设计总结
- 幂等:
idempotency_key防重复入队 - 租约:claim lease + 超时回收,避免僵尸任务占用
- 运行恢复:stale running 自动 fail,保证状态收敛
- 容器容错:启动重试、不健康容器清理、容量保护
- 流式容错:Executor 本地待发送记录 + 接收/持久化双进度 + 有界重试 + Manager 批量降级
- 顺序恢复:
stream_seq连续消费 + SSE 断线重连 + 历史缺口补拉 + event replay - 终态补偿:workspace 导出异步回调 + message reconcile
附录 A:关键源码索引
- Frontend:
frontend/features/*frontend/components/shared/* - Backend API:
backend/app/api/v1backend/app/api/v2backend/app/api/openapi_v1 - Backend 核心服务:
backend/app/services/task_service.pyrun_service.pycallback_service.pycallback/stream_ingress_service.pystream_event_service.py - Executor Manager:
executor_manager/app/services/run_pull_service.pycontainer_pool.py - Executor:
executor/app/core/engine.pyexecutor/app/api/v1/task.pyexecutor/app/core/stream_callback.pyexecutor/app/hooks/callback.py - Frontend 消息顺序:
frontend/features/chat/components/execution/chat-panel/hooks/use-chat-messages.tsfrontend/features/chat/utils/stream-sequence-buffer.ts - 部署:
docker/sandbox/*docker/executor/*