Open-PTC-Agent
Anthropic PTC范式的开源实现,让AI Agent通过代码执行调用MCP工具,token消
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Anthropic PTC范式的开源实现,让AI Agent通过代码执行调用MCP工具,token消
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2025年末,Anthropic 在一篇工程博客中抛出了一个尖锐的问题:大模型擅长写代码,却被迫用笨拙的 JSON 描述工具调用,这本身就是一种浪费。
传统 Agent 的工具调用模式是这样的:模型每需要一次数据,就要发起一次 JSON 格式的 tools/call 请求。比如获取10只股票一年的每日价格数据——2500多条 OHLCV 记录、每个数据点都要转成 token 塞进上下文窗口。仅计算一个投资组合摘要,就要消耗数万个 token。这不是工具调用,这是对上下文窗口的"污染"。
Anthropic 给出的答案叫 Programmatic Tool Calling(PTC)——让模型直接写 Python 代码来调用工具,代码在沙箱中执行,处理完数据后只返回最终结果,token 消耗减少 85-98%。
Chen-zexi/open-ptc-agent 是这一理念的开源实现,发布仅两个多月便获得 700+ stars,成为 MCP 生态中关注度最高的项目之一。
PTC 的工作流程可以概括为三个步骤:
1. 工具发现(Tool Discovery):Agent 首先了解当前会话中有哪些可用的 MCP 工具——不是一次性加载所有工具定义(那样会消耗大量 token),而是按需发现,在需要时才了解工具的接口和用法。
2. 代码生成(Code Writing):Agent 拿起"它最擅长的武器"——写 Python 代码。代码中调用 tool() 函数来触发 MCP 工具,tool() 内部完成参数组装、HTTP 请求发送、响应解析等所有脏活累活。Agent 只需写业务逻辑,比如:
# 获取数据
data = tool("yfinance", symbol="NVDA", period="2y")
# 处理数据(过滤、聚合、可视化)
filtered = data[data['Close'] > 150]
result = filtered.groupby(filtered.index.to_period('M')).mean()
# 保存结果到 data/ 目录
result.to_csv("data/monthly_avg.csv")
3. 沙箱执行(Sandbox Execution):代码交给 Daytona 云沙箱执行。Daytona 提供了文件系统隔离——代码无法访问宿主机资源,只能操作 data/ 目录下的文件。所有中间计算都在沙箱内完成,最终只有结果文件返回给 Agent。
用户任务
↓
PTCAgent(工具发现 + 代码生成)
↓
Daytona 沙箱(MCP工具执行)
↓
结果文件 + 最终输出
项目基于 LangGraph 构建核心 Agent 编排逻辑。graph.py 中定义了 StateGraph(MessagesState),入口节点 ptc_node 负责:
PTCAgent.create_agent() 创建深度 Agent 实例这种懒加载设计非常重要——LangGraph Cloud/Studio 部署时,沙箱连接在请求到达前不应该建立,否则会导致连接超时或资源浪费。
agent.py 中的 PTCAgent 类是真正的执行引擎。它通过 LangChain 的 create_agent 接口组装 Agent,但关键在于自定义的中间件栈(Middleware Stack):
task_output() 获取结果。sandbox.py 中 PTCSandbox 是整个系统的执行底座。它:
daytona-sdk>=0.0.1)连接 Daytona 云服务MCPRegistry 负责将任意 MCP 服务器的工具转换为 Python 函数。项目自带两个示例 MCP 服务器:
yfinance_mcp_server.py:Yahoo Finance 金融数据tickertick_mcp_server.py:任务管理数据用户也可以自己实现 MCP 服务器,通过 mcp_upload 部署到沙箱中。
项目采用 monorepo 结构,两个核心库:
libs/ptc-agent/:核心 Agent 库(ptc_agent/)libs/ptc-cli/:交互式 CLI 应用(ptc_cli/)代码质量配置极为严格:
pytest-asyncio 支持异步测试,覆盖率报告(pytest-cov)CI 流程包含三个 workflow:
ci.yml:标准测试 + lintclaude-code-review.yml:Claude Code 辅助代码审查claude.yml:自动化代码改进整体代码质量评分:8.5/10(类型安全严格、中间件设计优雅、CI 完备扣分项为无 Dockerfile/compose 部署支持)。
项目在纯工具调用之外构建了丰富的扩展能力:
| 功能 | 描述 |
|---|---|
| Agent Skills | 基于 agentskills.io 标准的可扩展技能系统(PDF/XLSX/DOCX/PPT 操作,财务建模) |
| 图表自动上传 | matplotlib 图表自动上传到云存储(Cloudflare R2 / AWS S3 / 阿里云 OSS) |
| 子 Agent 并行 | 多子 Agent 异步执行,主 Agent 协调结果 |
| 多 LLM 支持 | OpenAI / Anthropic / DeepSeek / 任何 LangChain 支持的模型 |
| LangGraph 部署 | 支持 LangGraph Cloud / Studio 部署 |
需要明确告知用户的:
Daytona 是核心依赖:代码执行完全依赖 Daytona 云服务,没有 Daytona API Key 项目无法运行。这意味着存在供应商锁定风险——Daytona 服务不可用时,整个工具链瘫痪。
API Key 满天飞:项目需要同时配置 Daytona Key + LLM Provider Key(OpenAI/Anthropic/DeepSeek),如果配置文件中不小心提交了真实 Key,会造成安全隐患。
Python 3.12+ 门槛:项目明确要求 Python >= 3.12,部分企业内网环境仍在使用 3.9/3.10,可能遇到兼容性问题。
Token 减少是双刃剑:虽然减少了 token 消耗,但代码执行本身有延迟,对于需要快速响应的场景(如实时聊天),PTC 的优势不明显。
Open PTC Agent 的出现代表了一个重要趋势:大模型正在从"对话机器"进化为"代码执行器"。传统的 JSON 工具调用本质上是让模型用自然语言描述 API 调用,这是对模型编程能力的浪费。PTC 允许模型做它最擅长的事——写代码——同时保持工具调用的灵活性。
从更宏观的视角看,这个项目处于三个前沿领域的交汇点:
2026年,随着 MCP 生态的成熟和更多云沙箱方案的涌现,PTC 模式很可能成为 Agent 开发的事实标准。这个项目的 700+ stars,已经说明了社区的态度。