Pi Coding Agent 开发理念
原文:《What I learned building an opinionated and minimal coding agent》 作者:Mario Zechner 源码:https://github.com/MarioAriasC/pi-coding-agent
背景
Mario Zechner 基于实践总结了构建极简编程 Agent 的经验。他没有采用 LangChain、Vercel AI SDK 等成熟框架,而是从底层自建所有组件。核心动机来自 Armin 的博文《agents are hard》:直接基于 provider SDK 有更多控制力,API 设计更自由,surface area 更小。
四大核心组件
| 组件 | 职责 |
|---|---|
| pi-ai | 统一 LLM API 层,支持多 provider(Anthropic/OpenAI/Google/xAI/Groq/Cerebras/OpenRouter 等) |
| pi-agent-core | Agent 循环,处理 tool 执行、验证、事件流 |
| pi-tui | 最小化终端 UI 框架,差分渲染,无闪烁更新 |
| pi-coding-agent | CLI,整合以上三个组件 |
设计哲学:极简主义
pi-coding-agent 明确选择"不做什么":
| 设计决策 | 说明 |
|---|---|
| Minimal system prompt | 最简系统提示词,避免过度工程 |
| Minimal toolset | 最小工具集,只提供核心能力 |
| YOLO by default | 默认直接执行,不用 preview 确认 |
| No built-in to-dos | 不内置待办管理 |
| No plan mode | 无计划模式,减少复杂性 |
| No MCP support | 不支持 MCP(Model Context Protocol) |
| No background bash | 无后台 bash |
| No sub-agents | 无子代理,保持单层架构 |
这种"做减法"的思路值得借鉴:每增加一个特性,都会带来维护成本和复杂度。极简不是功能少,而是确保每个功能都必要。
pi-ai 核心技术要点
统一 API 层设计
只实现了 4 种底层 API:
- OpenAI Completions
- OpenAI Responses
- Anthropic Messages
- Google Generative AI
Provider 差异处理
各 provider 对字段的支持不一致(如 Cerebras/xAI/Mistral/Chutes),需要逐一适配。这是多 provider 统一抽象的代价。
跨 Provider Context Handoff
Anthropic 的 thinking traces 无法直接传给其他 provider,通过将 thinking 内容转换为 <thinking> 标签文本解决。
Tool Results 分层
Tool 结果分为两部分:
- LLM 可见部分:供模型继续推理
- UI 展示部分:供用户查看
这种 split 设计让界面展示和模型推理解耦。
其他技术细节
- TypeBox schema 验证 tool 参数
- Request abort 和 partial results 支持
- Streaming JSON 渐进式解析:边接收边解析,不用等完整响应
pi-tui 技术要点
两种渲染模式
- Full screen:独占 viewport,完整 TUI 体验
- Incremental:追加到 scrollback,适合日志式输出
差分渲染
通过检测状态变化,只更新必要的 UI 部分,避免全局刷新带来的闪烁。
内置组件
- Autocomplete 编辑器
- Markdown 渲染
为何自建而非用 Vercel AI SDK
Mario 的选择基于 Armin 的观点:
直接基于 provider SDK 有更多控制,API 设计更自由,surface area 更小。
Vercel AI SDK 等框架屏蔽了大量细节,但同时也限制了灵活性。对于需要深度定制(如 streaming JSON 解析、tool result 分层展示)的场景,从底层构建反而更高效。
我的总结
| 维度 | 启发 |
|---|---|
| 做减法 | 极简不是功能少,而是每个功能都经过必要性检验 |
| 分层设计 | pi-ai/pi-agent-core/pi-tui 职责清晰,组件可独立测试 |
| 控制大于抽象 | 在需要深度定制的场景,手写底层比依赖框架更可控 |
| UI 解耦 | Tool result 分 LLM 可见和 UI 展示两层,思路值得借鉴 |
| 避免过度工程 | No MCP、No sub-agents、No plan mode — 每次拒绝都是对复杂度的控制 |
pi-coding-agent 的最大启示是:Agent 的复杂度往往来自我们自行添加的特性,而非底层问题本身。