4.Agent开发框架
企业级Agent产品
1.产品形态
市面上的 Agent 产品形态包括:
- 功能型:在传统应用中添加ai助手、widget等功能,内部本质就是一性次的ai大模型调用。
- 工作流:通过工作流编排,实现原本不好实现的业务功能。agent充当复杂逻辑的处理者。高级一些的工作流,是通过skills等方式将流程给到agent,agent根据流程自行编排任务。
- 纯粹agent:通过chat界面,内部集成大量工具、mcp、skills等,帮助用户实现复杂的业务逻辑。
2.实现方案
- 最底层的是:基于LangChain或者LangGraph的实现。简单功能实现简单,复杂功能实现复杂。
- 中层的是:基于DeepAgent或者AgentScope的实现。类似于脚手架,任需开发大量业务逻辑和基础功能。
- 最高层的是:基于Pi、Claude Code、OpenCode的实现。开箱即用,只需控制好权限、上下文、工具调用等即可。
3.为什么会选择cc等工具
为什么公司自研 Agent 都在用 Claude Code、pi、OpenCode 做底座?
本质是一套分工逻辑:模型层不赚钱也难差异化,真正决定 Agent 上限的是"模型外的工程层",而这些工具恰好把这层最难啃的部分(工具调用、上下文管理、执行循环、权限沙箱)做完了。
企业基于它们做二次开发,只需要叠加业务工具链和权限体系,就能把原型到生产的周期从数月压缩到数周。
先厘清一个关键概念:Agent Harness
2025–2026 年行业的一个共识正在收敛:竞争焦点从"谁的模型强"转向了"谁的 harness 好"。 Coinbase(Forge)、Shopify(River)、Ramp(Inspect)都自研了内部编码 Agent,但没有一家试图重写底层模型,而是自研 harness——即负责上下文注入、权限审批、工具调度、结果验证的那一层。 LangChain 后来开源的 Open SWE 就是对这套在 Stripe、Ramp、Coinbase 内部已经跑通的模式的公开复刻。
Anthropic 自己也把这条边界挑明了:Claude Code 的 harness(Claude Agent SDK)可以驱动任何类型的 Agent, Anthropic 内部用它跑深度研究、视频生成、笔记等所有非编码场景。
为什么是这三款工具,而不是 LangChain 那类框架?
一个容易被忽视的原因:这三款工具都是"先在真实终端工作流里被验证过的产品",而不是"为做 Agent 而设计的框架"。 Claude Code 是 Anthropic 内部先用起来的,pi 的作者 Mario Zechner 是 libGDX 的创造者,OpenCode 背后是 SST 这样有多年工程化交付经验的团队。 它们的工具调用 schema、bash 执行语义、错误恢复逻辑,都是被真实开发者日常敲打过的,而不是设计文档里推演出来的。
另一层是成本与锁定规避。有分析直接指出:模型层正在收敛、可替换性最强,真正的粘性在工具集成和遥测上——把 prompt、eval、遥测建立在一个可插拔的 harness 上, 等市场定价变化时可以随时切到更便宜的选项。 Claude Code 给企业的是"调优到极致的 Claude 循环",pi 和 OpenCode 给的是"模型无关的白盒底座",三者正好覆盖了"要极致效果"和"要完全自主"两端的需求谱系。
4.Claude Code、pi、OpenCode 三款 Agent 工具全维度对比
- Claude Code 是 Anthropic 官方的"结构化工作流引擎"——闭源但调优到极致,深度绑定 Claude 模型;
- OpenCode 是 SST 的"全栈开放标准产品"——多端覆盖、75+ 提供商、工程完整度最高,适合产品化交付;
- pi 是 badlogic 的"极简可插拔内核"——原语最少、可改写性最强,适合深度自研;
| 维度 | Claude Code | pi | OpenCode |
|---|---|---|---|
| 出品方 | Anthropic | Mario Zechner (badlogic,libGDX 作者) | SST 团队 |
| 开源情况 | 闭源(源码因 .map 泄露扩散) | 开源(11.3K star) | 开源(社区更大) |
| 设计哲学 | 工作流引擎,"gather → act → verify → repeat" | "原语而非特性",让 Pi 适应你的工作流 | 开放标准优先的全栈产品 |
| 模型绑定 | 深度绑定 Claude(Opus 折扣价) | 15+ 提供商 | 75+ 提供商,含本地模型 |
| 内置工具数 | ~43 个工具 | 7 个原语(read/bash/edit/write/grep/find/ls) | 完整工具集 |
| 子代理 | 内置(可编排 15+ 并行) | 不内置,靠扩展实现 | 支持 |
| Plan Mode | 内置 | 不内置,靠扩展实现 | 内置 |
| MCP 支持 | 原生 | 原生(可与内置 MCP 并存) | 原生 |
| LSP 支持 | 无 | 无 | 原生 |
| ACP(可被外部调用) | 无 | 无 | 原生 |
| 运行模式 | CLI、IDE 插件、Headless | 4 种:交互式/Print JSON/RPC/SDK | TUI、IDE、Desktop、Server 远程 |
| SDK 嵌入方式 | Claude Agent SDK | SDK + JSON RPC 协议 | opencode serve REST 接口 |
| 会话管理 | 线性会话 | 树形结构 + 分支 + /share 导出 | 多会话管理 |
| 上下文工程 | 自动 Compaction | AGENTS.md/SYSTEM.md/Skills/Prompt 模板/动态注入 | 标准工程化 |
| 扩展机制 | Hooks、Skills、subagents、MCP | Extension API 拦截 20+ 生命周期事件 | MCP/ACP/LSP 三协议 |
| System Prompt | ~10k token | ~200 token | ~2-3k token |
| 定价 | $20–200/月订阅或 API 计费 | 免费自付 API | 免费自付 API |
| Composio 实测结论 | 想要 Opus 折扣价+开箱即用选它 | 效率、可改写性、原始效果胜出 | 特性、Provider 支持、多端面胜出 |
4.1 模块卡片:各工具的核心差异点
Claude Code — 为"即刻能用"而生:优势在于开箱即用和模型协同优化:43 个工具的 schema、bash 执行语义、错误恢复全部经过 Anthropic 内部打磨, sub-agent 并行(可同时编排 15 个)、自动 Compaction、Hooks/Skills/MCP 形成完整闭环。劣势是闭源 + 绑死 Claude 生态, 模型不可替换、不能改内核,扩展点虽然多但嵌在官方循环里"只能接上去、很难改里面"。适合个人开发者和不想折腾工程的团队。
pi — 为"彻底掌控"而生:核心理念是"原语而非特性":子代理、Plan Mode、权限门禁、路径保护、SSH、沙箱、MCP 这些其他 Agent 硬编码的东西, 在 pi 里全部通过扩展实现,官方提供 50+ 示例包。 独有的树形会话结构(/tree 切换任意分支、/share 导出可分享 URL)和四种运行模式(含 stdin/stdout JSON RPC)让它特别适合被嵌入其他系统。 缺点是上手曲线陡——工作流全部自己搭,TypeScript 工程能力是硬门槛。
OpenCode — 为"工程交付"而生:Client/Server 分离是它的招牌:核心引擎作为服务端运行,TUI/Web/Desktop 全是客户端,opencode serve 暴露 REST 接口供外部调用。 MCP(外部工具)+ ACP(自身可被调用)+ LSP 三协议原生支持,对需要把 Agent 接入 CI/CD、Slack、内部平台的企业是直接可用的标准件。 75+ Provider(含本地模型)让它成为三款中模型自由度最高的选择。缺点是底层循环不如 Claude Code 那样经过极限调优。
4.2 分场景选型建议
- 个人开发者 / 想立刻提升编码效率:Claude Code。订阅即用,调优好的工作流,工程摩擦最小。
- 创业团队 / 快速搭建业务 Agent 原型:OpenCode。多端覆盖 + 多模型路由 + Server 模式让它像可交付的产品,平台团队只需补权限和审计的胶水层。
- 大企业 / 平台工程团队做长期 Agent 自研:pi。如果 Agent 被定位为未来 3-5 年的平台能力,需要在消息送达模型前后、工具调用前后、权限弹窗这些环节全部植入自家逻辑,pi 的 Extension API 是比另外两者更彻底的抓手。
- 编码场景优先 / 追求单任务效果和 token 效率:pi。Composio 100 小时实测里 pi 的"raw results"反而最优,代价是要接受工程自建的负担。
- 需要 Agent 被外部系统调用 / 跨系统集成:OpenCode。ACP 协议让它天然可作为服务端被其他系统调用,这在三者中是独有的。
5.构建 Agent 应用注意事项速查表
| 类别 | 风险点 | 典型表现 | 规避方法 / 最佳实践 |
|---|---|---|---|
| 上下文管理 | 上下文腐化 | 长会话后半段遗忘前期约定、重复犯错 | 关键约定写入 CLAUDE.md / AGENTS.md / SYSTEM.md 稳定注入;长任务拆分为 subagent 或子会话;监控每次请求 token 构成,主动截断过大的工具返回 |
| 成本控制 | Token 成本失控 | 单次任务账单几十美元,subagent 并行线性放大消耗 | 设置 max-turns 和每任务 token 上限;简单步骤降级到 Haiku/Sonnet;利用 prompt caching(可省 90%+) |
| 执行安全 | 循环跑飞 / 工具滥用 | 反复调用同一工具、bash 无限重试 | 设置 max iterations 硬上限;工具结果返回明确错误信号;用 subagent 隔离易失败任务 |
| 执行安全 | Shell 注入 / 沙箱逃逸 | 模型生成 rm -rf 或拼接恶意命令 | 用 Docker / Firecracker / Vercel Sandbox 隔离执行环境;白名单命令;限制文件系统与网络出口 |
| 执行安全 | 提示词注入 | Agent 读取邮件/网页/issue 后被隐藏指令操控 | 工具结果与用户指令分层处理;对外部内容做消毒;敏感操作强制人工审批 |
| 执行安全 | MCP 工具投毒 | 第三方 MCP server 在 tool description 里注入指令 | 只接白名单 MCP;对 tool description 和返回结果做二次审查;使用 MCP Gateway 做白名单管控 |
| 稳定性 | 错误恢复缺失 | 一次工具调用失败导致整个会话崩溃 | 工具层加重试 + 超时;session 持久化到磁盘;关键节点写入可恢复状态 |
| 权限模型 | 权限粒度过粗 | 只能"全部允许"或"每步都问",无法分级 | 按 tool + 参数分级(读放行、写审批、网络阻断);audit log 全量记录 |
| 质量保障 | 无 eval 直接上生产 | 效果回归无人知晓,改一个字 prompt 全盘崩 | 构建 10–50 个典型场景的回归任务集;每次改动跑自动化评测;LLM-as-judge 辅助打分 |
| 质量保障 | 可观测性缺失 | 出问题无法定位到具体步骤 | 全链路 tracing(OpenTelemetry → Grafana/Datadog);记录每次 tool call 输入输出、耗时、token;保留 session 回放能力 |
| Claude Code 专属 | 闭源 + 生态锁定 | 模型切换成本极高,出问题只能等官方修 | 通过 Claude Agent SDK 生产化;自行补齐沙箱、会话持久化、权限审批;评估长期订阅成本 |
| Claude Code 专属 | 扩展点受限 | Hooks/subagent 只能"接上去",很难"改里面" | 深度定制需求建议另选 pi;利用 headless 模式跑批处理时务必加 max-turns |
| pi 专属 | 工程自建负担重 | 内核仅 7 个原语,权限门禁、Plan Mode、TODO、subagent 全要自己实现 | 用 Extension API 拦截 20+ 生命周期事件搭建工作流;要求团队具备强 TypeScript 能力;善用官方 50+ 示例包 |
| pi 专属 | 优势未被利用 | 忽略树形会话等独有能力 | 利用 /tree 分支探索、/share 导出、四种运行模式(含 JSON RPC)嵌入外部系统 |
| OpenCode 专属 | Prompt 跨模型失效 | 在一个模型上跑通的 prompt 换模型直接失效 | 为每个主力模型单独做 prompt 调优和 eval;建立模型级回归测试 |
| OpenCode 专属 | Server 模式安全缺口 | REST 接口暴露后无鉴权、多租户隔离缺失 | 自己加鉴权层与租户隔离;利用 ACP/MCP/LSP 标准协议对接 CI/CD 与内部平台 |
一句话总结:这三款工具都把 harness 搭好了,但沙箱、权限、eval、可观测性这四道生产闸门没有一款会替你装——建议先在非关键业务上跑真实 PoC, 让成本账单和故障日志决定优先填哪些坑。
所以上生产要自己写 harness,就控三件事:
- 可观测:每一步输入输出全摊开,能插桩拦截。
- 成本:分层压缩上下文,保住缓存命中率。
- 调度:管好并发、串行和超时中断。
LangChain
- 官网:https://www.langchain.com/
- 国内文档:https://docs.langchain.org.cn/
- 包括 LangChain、LangGraph、LangSmith、Deep Agents 等。
LangChain 1.0 是全新大版本,API 完全重构。
LangChain 是代理工程平台。Replit、Clay、Rippling、Cloudflare、Workday 等 AI 团队用 LangChain 工程化可靠的代理。
- LangChain:代理基于 LangGraph 构建,提供持久执行、流式处理、人工干预、持久性等功能,LangChain 提供更灵活自主的程序。
- LangGraph:通过低级编排、内存和人机协作支持控制自定义代理的每一步。
- LangSmith:帮助 AI 团队利用实时生产数据持续测试和改进的平台。
- 可观测性:详细追踪和聚合趋势指标,了解代理如何思考和行动。
- 评估:对生产数据和离线数据集上的代理行为测试和评分。
- 部署:为长时间运行任务构建的可扩展基础设施,一键发布代理。
安装
# langchain 核心
pip install -U langchain
# LangChain 提供与数百个 LLM 和数千个集成的独立提供商包
pip install -U langchain-deepseek
pip install -U langchain-openai
pip install -U langchain-anthropic
核心组件
模型
LLM 能像人一样解释和生成文本,可撰写内容、翻译语言、总结和回答问题,无需针对每个任务专门训练。
除文本生成外,许多模型还支持:
- 工具调用 - 调用外部工具(如数据库查询或 API 调用)并在响应中使用结果。
- 结构化输出 - 模型响应被限制为遵循定义的格式。
- 多模态 - 处理和返回除文本之外的数据,如图像、音频和视频。
- 推理 - 模型执行多步推理以得出结论。
LangChain 提供:动态模型、工具调用、输出格式化、多模态、提示缓存、限流、URL 代理、日志概率、token 用量、调用配置(用 LangSmith 监控调试、日志监控、资源使用等)。
消息
消息是包含以下内容的对象:
- 角色 - 识别消息类型(如 system、user)
- 内容 - 表示消息的实际内容(如文本、图像、音频、文档等)
- 元数据 - 可选字段,如响应信息、消息 ID 和令牌使用情况
工具
工具是 LangChain 调用并执行操作的组件。工作流程:
- 通过模型明确的输入和输出。
- LangChain 工具封装一个可调用函数及其输入模式,传递给兼容的聊天模型,模型决定是否调用工具及使用哪些参数。
- 工具调用使模型能生成符合指定输入模式的请求。
访问上下文:工具通过 ToolRuntime 参数访问运行时信息。
- 上下文:通过
runtime.context访问不可变配置和上下文数据,如用户 ID、会话详细信息或应用配置。 - 内存(存储):用存储跨对话访问持久数据。通过
runtime.store访问,保存和检索用户特定或应用特定数据。 - 流写入器:用
runtime.stream_writer在工具执行时流式传输自定义更新。向用户提供工具正在做什么的实时反馈。
记忆
记忆上下文,包括内存、Redis、数据库等。
流式
LangChain 流式传输功能:
- 流式传输 agent 进度 - 在每个 agent 步骤之后获取状态更新。
- 流式传输 LLM Tokens - 在语言模型生成 token 时流式传输。
- 流式传输自定义更新 - 发送用户定义的信号(如"已获取 10/100 条记录")。
- 流式传输多种模式 - 从 updates(agent 进度)、messages(LLM token + 元数据)或 custom(任意用户数据)中选择。
中间件
中间件用途:
- 监控:用日志、分析和调试跟踪代理行为。
- 修改:转换提示、工具选择和输出格式。
- 控制:添加重试、回退和提前终止逻辑。
- 强制执行:应用速率限制、防护栏和 PII 检测。
LangChain 内置中间件:
- 总结:接近令牌限制时自动总结对话历史。
SummarizationMiddleware。 - 人工干预:在工具调用执行前暂停代理,进行人工批准、编辑或拒绝。
- Anthropic 提示缓存:通过 Anthropic 模型缓存重复提示前缀降低成本。
- 模型调用限制:限制模型调用次数,防止无限循环或过高成本。
- 工具调用限制:限制特定工具或所有工具的调用次数。
- 模型回退:主模型失败时自动回退到备用模型。
- PII 检测:检测和处理对话中的个人身份信息。
- 规划:为复杂多步骤任务添加待办事项列表管理。
- LLM 工具选择器:调用主模型前用 LLM 智能选择相关工具。
- 工具重试:自动重试失败的工具调用,可配置指数退避。
- LLM 工具模拟器:用 LLM 模拟工具执行进行测试,用 AI 生成响应替换实际工具调用。
- 上下文编辑:通过修剪、总结或清除工具使用管理对话上下文。
自定义中间件:通过实现代理执行流程中特定点的钩子构建。方式:
- 基于装饰器 - 适合单钩子中间件,快速简单。
- 基于类 - 适合多钩子复杂中间件,功能更强。
结构化输出
响应格式控制代理如何返回结构化数据:
ToolStrategy[StructuredResponseT]:用工具调用做结构化输出。ProviderStrategy[StructuredResponseT]:用提供商原生结构化输出。type[StructuredResponseT]:架构类型,根据模型能力自动选最佳策略。None:无结构化输出。
最佳实践
安全防护
在代理执行关键点验证和过滤内容,构建安全合规应用。常见用例:
- 防止 PII 泄漏。对电子邮件、信用卡、IP、Mac、url 等脱敏,策略包括编辑、掩码、哈希、阻止等。
- 检测并阻止提示注入攻击。
- 阻止不适当或有害内容。
- 强制执行业务规则和合规要求。
- 验证输出质量和准确性。
实现:通过中间件在关键节点(agent 执行前后、工具调用前后)拦截处理。
MCP
模型上下文协议(MCP)是开放协议,标准化应用程序向 LLM 提供工具和上下文的方式。通过 @mcp.tool 自定义 MCP 服务。
pip install langchain-mcp-adapters
multi-agent
agent 间协同完成复杂任务,通过工具调用或控制权交接实现任务执行。实现原理是主 agent 控制各子 agent 执行。
核心是上下文工程,需控制:
- 对话或状态的哪些部分传递给每个智能体。
- 为子智能体量身定制的专用提示。
- 包含/排除中间推理。
- 为每个智能体定制输入/输出格式。
检索-RAG
| 架构 | 描述 | 控制 | 灵活性 | 延迟 | 示例用例 |
|---|---|---|---|---|---|
| 两步 RAG | 检索总在生成之前发生。简单可预测 | ✅高 | ❌低 | ⚡快 | 常见问答、文档机器人 |
| 代理式 RAG | LLM 驱动的代理决定推理过程中何时以及如何检索 | ❌低 | ✅高 | ⏳可变 | 可访问多种工具的研究助手 |
| 混合 | 结合两种方法特点,带验证步骤 | ⚖️中 | ⚖️中 | ⏳可变 | 带质量验证的领域特定问答 |
Studio
Studio 是 LangChain 提供的免费代理 IDE,与 LangSmith 集成,实现跟踪、评估和提示工程。精确查看代理如何思考,跟踪每个决策,发布更智能可靠的代理。
集成测试
LangChain 的 AgentEvals 通过执行轨迹匹配或 LLM 判断器评估智能体轨迹(确切消息序列,含工具调用)。
pip install agentevals
- 轨迹匹配评估器:
create_trajectory_match_evaluator将智能体轨迹与参考轨迹匹配。 - LLM-as-Judge 评估器:用 LLM 和
create_trajectory_llm_as_judge评估执行路径。不需要参考轨迹,但可用时可以提供。 - 异步支持:所有 agentevals 评估器支持 Python asyncio。工厂函数评估器在函数名
create_后加async获得异步版本。
LangSmith 集成
将评估器结果记录到 LangSmith,跟踪随时间变化的实验。LangSmith 提供两种评估方法:pytest 集成和 evaluate 函数。
LangGraph
LangGraph 是构建、管理和部署长时间运行、有状态智能体的低级编排框架和运行时。Klarna、Replit、Elastic 等公司在用。
LangGraph 非常低级,专注智能体编排,普遍用 LangChain 组件集成模型和工具。专注对智能体编排至关重要的底层功能:持久执行、流式传输、人机协作等。
AgentScope
AgentScope 是阿里达摩院推出的开源 AI Agent 框架,有 Python 和 Java 两版。 Python 版主打生产级多 Agent 应用的可观测性("可见、可懂、可信");Java 版专为 Java 17+ 生态打造,解决类型安全、生产可控性、生态集成需求。
核心特性
- 推理范式:采用 ReAct(Reasoning and Acting)范式。Agent 在"观察-推理-行动"循环中动态规划任务路径,能处理意外情况。
- 生产级控制:
- 运行时干预:支持安全中断、优雅取消,Agent 状态可保留与恢复。
- Hook 系统(Human-in-the-Loop):支持在任意推理步骤插入人工审核或干预,适用于敏感操作场景。
- 内置工具链:
- PlanNotebook:结构化任务管理,支持 Agent 自主创建、追踪和修改计划。
- 结构化输出:自动将模型输出映射为 Java POJO,具备格式自纠错能力。
- 长期记忆:支持持久化、基于语义搜索的记忆存储,具备多租户隔离能力。
- RAG 集成:内置检索增强生成支持,可对接企业知识库或云服务(如阿里云百炼)。
- 协议与生态:
- MCP 协议:原生支持 Anthropic 的 Model Context Protocol,可接入实现 MCP 服务端的工具(如数据库、浏览器)。
- A2A 协议:支持 Agent-to-Agent 通信,可通过服务注册中心(如 Nacos)实现多 Agent、跨语言(如 Java 与 Python)的微服务式协作。
生产就绪能力
- 高性能架构:基于 Project Reactor 的响应式编程,支持高并发与非阻塞执行;支持 GraalVM 原生镜像编译,冷启动降至 200ms 级别,适合 Serverless 与 K8s 环境。
- 安全与可观测性:
- 安全沙箱:为工具代码提供隔离执行环境,防止 Agent 越权操作。
- 可观测性:集成 OpenTelemetry,支持全链路分布式追踪;提供 AgentScope Studio 可视化调试界面。
与 Spring AI 的关系
- 定位差异:Spring AI 将 LLM 作为工作流中的可控节点,适合在既定业务流程中嵌入 AI 能力;AgentScope Java 将 LLM 视为自主决策的"大脑",适合路径不固定、需 Agent 动态规划的场景。
- 互补可能:两者可协同使用,如用 Spring AI 管理主流程,在需自主决策的环节调用 AgentScope Java 构建的 Agent。
Pi Agent
Pi Agent(简称 Pi)是极简、可高度定制的开源 AI 编码智能体/Agent 框架,由 Mario Zechner(libGDX 作者)于 2024 年推出,是 OpenClaw 的核心引擎。
主打:内核极小、工具极少、扩展极强、模型无关。
Pi Agent = 极简内核 + 4 个原子工具 + 全模型兼容 + 无限扩展。适合做轻量、可控、可定制的自动化任务与编程助手。
1.介绍
1.1.核心设计哲学
内核只做 4 件事,只有 4 个内置工具:
- read:读文件/代码上下文
- write:新建文件/写代码
- edit:精准修改文件
- bash:执行终端命令(编译、运行、部署)
没有计划模式、子 Agent、审批流程。复杂度交给扩展,核心只留最薄执行层。
系统提示词极短(约 1000 token),对比 Claude Code / Cursor 动辄 8000–15000 token。好处是上下文利用率高、速度快、成本低、不易跑偏。
模型无关,统一接口:支持 OpenAI、Anthropic、Google、xAI、Groq、Ollama、vLLM 等 15+ 大模型。换模型只需改配置,不用重写适配层。
1.2.适用场景
- 终端 AI 编程助手:直接在命令行写代码、改 Bug、跑测试、部署。
- 自动化运维:服务器操作、日志分析、脚本执行。
- 构建自定义 Agent:通过 TypeScript 扩展/技能包,添加新工具、新流程。
- 嵌入到其他系统:作为 OpenClaw、IDE 插件、内部平台的底层引擎。
1.3.与 Claude Code / Cursor 的区别
- Pi Agent:极简内核、4 工具、短提示词、高度可扩展、终端优先、开源
- Claude Code:功能大而全、内置规划/子 Agent、提示词极长、闭源
- Cursor:IDE 深度集成、图形界面、闭源、定制化弱
1.4.简单使用
# 安装
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
# 运行(默认用 OpenAI GPT-5-mini)
pi-agent "写一个 Python 快速排序"
# 切换模型
pi-agent --model ollama:codellama "解释这段代码"
Package Catalog:https://pi.dev/packages
2.架构(pi-mono 5 个包)
2.1.架构图
pi 的架构是一个典型的"分层单体":五层从底到顶依次是 pi-ai(LLM 抽象层)→ pi-agent-core(Agent 运行时)→ pi-coding-agent(CLI 编排层)→ pi-tui(终端 UI)→ 扩展系统,外加一个独立的 pi-server 做多实例编排。 它把"Agent 必需的最小内核"压到极薄,然后靠 TypeScript Extension API 让上层的一切(subagent、Plan Mode、权限门禁、MCP)都能被你重新实现。
┌─────────────────────────────────────────────────────────────┐
│ Extensions / Skills / Themes / Prompt Templates │ ← 扩展层
│ (TS 模块,通过 ExtensionAPI 拦截 20+ 生命周期事件) │
├─────────────────────────────────────────────────────────────┤
│ pi-coding-agent: AgentSession 编排层 │
│ ┌─────────┬──────────┬─────────┬──────────┐ │
│ │Interactive│ Print │ RPC │ SDK │ ← 四种运行模式 │
│ └─────────┴──────────┴─────────┴──────────┘ │
│ SessionManager (JSONL 树形持久化) · SettingsManager │
│ DefaultResourceLoader (资源发现) · Compaction │
├─────────────────────────────────────────────────────────────┤
│ pi-agent-core: Agent 运行时 │
│ ┌────────────────────────────────────────────┐ │
│ │ AgentHarness (高层编排) │ │
│ │ ├─ Agent (状态机: _state, 队列) │ │
│ │ ├─ agentLoop() (LLM↔工具循环) │ │
│ │ └─ Session (树形转录) │ │
│ └────────────────────────────────────────────┘ │
│ PendingMessageQueue (steering / follow-up) │
├─────────────────────────────────────────────────────────────┤
│ pi-ai: LLM 统一抽象层 │
│ stream / streamSimple → api-registry → provider 实现 │
│ (OpenAI / Anthropic / Google / Bedrock / Mistral / NIM...) │
│ MODELS 目录 · AuthStorage (OAuth) · calculateCost │
├─────────────────────────────────────────────────────────────┤
│ pi-tui: 终端 UI 库 (独立包,无 AI 依赖) │
│ TUI 差异渲染 · Component/Container · Overlay · Editor │
└─────────────────────────────────────────────────────────────┘
↕ 旁路
pi-server (多 Agent 实例编排 · SQLite 会话 · Radius 远程)
2.2.第 1 层:pi-ai 统一抽象
这一层把 15+ 家 Provider 的差异全部抹平,是整个架构的基石。
- 核心入口:
stream/complete(Provider 原生参数)和streamSimple/completeSimple(Provider 无关,统一reasoning?: ThinkingLevel,取值 minimal/low/medium/high/xhigh) - API 注册表:
api-registry.ts把 6 种 wire protocol(anthropic-messages、openai-completions、openai-responses、bedrock-converse-stream、google-generative-ai、openai-codex-responses)映射到对应实现 - 核心类型:
Model<TApi>、Context(可序列化,支持跨模型切换)、Message(UserMessage/AssistantMessage/ToolResultMessage判别联合)、Tool(TypeBox schema) - 模型白名单:目录里只收录支持 function calling 的模型,这是 Agent 工作流的硬前提
- 认证与成本:
AuthStorage处理 OAuth(GitHub Copilot、Gemini CLI、OpenAI Codex),calculateCost基于模型元数据算费用
2.3.第 2 层:pi-agent-core 运行时
这一层被刻意分成低层 Agent 和高层 AgentHarness 两个概念。
低层 Agent Loop(状态机)
Agent类维护_state、steeringQueue(用户插话队列)、followUpQueue(后续消息队列)agentLoop()是函数式入口,管理多轮对话循环(LLM 调用 ↔ 工具执行)PendingMessageQueue配合QueueMode(all 或 one-at-a-time)实现 Steering——用户可以在 Agent 执行中插话改变走向- Transport 抽象通过
AgentMessage实现,支持通过 declaration merging 扩展自定义消息类型,让 TUI/Web/RPC 都能跑在同一套内核上
工具管道(严格的五段生命周期):支持 parallel / sequential 两种模式;parallel 模式下 tool_execution_end 按完成顺序触发,但结果消息保持 assistant 源顺序。
tool_execution_start → beforeToolCall hook → 执行 → afterToolCall hook → tool_execution_end
高层 AgentHarness(编排)
- 管理"Turn Snapshot"——单次 LLM 请求所需的 tools/model/resources 的时点快照
- 动态加载
Skill(从 SKILL.md)和PromptTemplate - 提供
compact()(自动压缩上下文)和generateBranchSummary()(跨分支摘要)两个上下文管理原语
2.4.第 3 层:pi-coding-agent 编排层
这是 pi 命令行工具的主战场,核心类是 AgentSession。 四种运行模式共享同一套内核
| 模式 | 接口 | 会话持久化 | 实现类 |
|---|---|---|---|
| Interactive | 完整 TUI(editor + commands + overlays) | 自动保存 | InteractiveMode |
| 单次 stdout(文本或 JSON) | 有 | runPrintMode() | |
| RPC | stdio 上的 JSON events/commands | 有 | runRpcMode() |
| SDK | 编程式嵌入 API | 可配置 | createAgentSession() |
- 资源发现管道:
DefaultResourceLoader从全局目录(~/.pi/agent/)、项目本地目录(.pi/)和已安装的 pi 包中发现扩展、Skills、Prompt Templates、Themes,项目本地优先于全局。 - 会话持久化:JSONL 文件(
log.jsonl),每条记录带id+parentId构成树形结构,SessionManager提供appendEntry()、branch()、buildSessionContext()方法——这是 pi 独有的树形会话/分支探索能力的底层实现。 - 配置合并层级:CLI 参数 > 项目
.pi/settings.json> 全局~/.pi/agent/settings.json> 内置默认。
2.5.第 4 层:pi-tui — 终端 UI 库
独立发布为 @mariozechner/pi-tui,没有任何 AI/Agent 依赖,可以单独用在任何 Node.js CLI 项目里。
- 差异化渲染:只重绘变化的行,用 CSI 2026 做原子屏幕更新,消除闪烁
- 组件架构:所有可见元素实现
Component接口(render(width)/handleInput(data)/invalidate()),通过Container组合 - Overlay 系统:模态对话框/面板浮层
- 输入抽象:支持 legacy 终端序列和 Kitty keyboard protocol,
Editor支持 IME 硬件光标定位(CJK 输入友好) - 内置组件:Editor(多行/自动补全/kill-ring)、Input、SelectList、Markdown、Image(Kitty/iTerm2 内联图片)
2.6.第 5 层:Extension 系统
Extension 是 TypeScript 模块,通过 ExtensionAPI 注入——你可以注册新工具、新 slash 命令、新快捷键,并监听生命周期事件(如 before_agent_start)。 扩展、Skills、Themes、Prompt Templates 可以打包成 pi packages(npm 风格的包)分发,未固定的包在新版本出现时会自动安装或更新。
2.7.旁路:pi-server 编排
独立的服务端进程,负责多 Agent 实例管理、IPC、SQLite 会话存储、Radius 远程连接集成,用于把 pi 变成一个可被外部系统编排的多实例平台。
3.设计哲学:为什么是这样的架构
理解 pi 架构的关键是"原语而非特性"这条贯穿始终的原则。
pi-ai只有 LLM 调用 + 工具 schema 两个原语——没有 RAG、没有 Agent 编排、没有 Chain 之类的概念,只做"把任何模型的任何调用统一成一套可序列化的类型"pi-agent-core只有循环 + 消息队列 + 工具执行三个原语——subagent、Plan Mode、权限门禁、MCP、TODO 这些在其他 Agent 里被硬编码的特性,这里全部留给扩展实现pi-coding-agent只内置 4-7 个原语工具(read/write/edit/bash/grep/find/ls)——没有内置 subagent、没有内置 plan、没有内置 approval workflow,全部通过 Extension API 让你自己拼pi-tui只有 Component/Overlay 两个原语——但靠组合能搭出任何终端界面
这种"极简内核 + 强扩展点"的架构和 Claude Code 形成镜像对照:
- Claude Code 是把调优好的工作流焊死在内核里,扩展只能"接上去";
- pi 是把工作流全部交出去,内核只保证事件链可以被拦截和改写。
- 一个 system prompt 约 200 token,另一个约 10k token,就是这个哲学差异最直观的体现。
如果你想深入某个具体子系统(比如 Extension 事件的完整列表、Compaction 的实现细节、RPC 协议的具体格式), pi-mono 的 DeepWiki 索引页有 20 多个子页面对应到每个模块的源码文件,可以直接按图索骥。
插件
pi官方自带插件平台:https://pi.dev/packages
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/21.机器学习/2.大模型基础/4.Agent开发框架.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。