你让模型回答一个关于客户上传的CSV文件的问题,它得跑一段Python才能算出答案。这段代码在哪跑?
一种选择是自己搭。用E2B或Modal这类沙箱平台,或者自己在Docker上开容器,再加上一堆活:把它和数据库、外网隔开,限制运行时长,定期给镜像打补丁。
另一种选择是服务端代码执行工具。你在API请求里加上这个工具,模型自己决定什么时候要跑东西,服务商在自己的沙箱里执行命令,并在同一次请求里把输出交回给模型。这里的沙箱指的是一个隔离的Linux容器,有自己的文件系统、有时间限制、默认没有网络访问。
模型自己不执行任何东西
模型从不自己运行任何东西。它调用工具时,只是发出一个请求,写明工具名和参数,总得有东西去执行它。客户端工具的执行者是你的应用代码或你用的Agent框架——你的应用收到调用、执行、再在后续请求里把结果发回去。服务端工具则由服务商在自己的基础设施上执行,并在同一次请求里把结果返回给模型,你的应用里根本没有对应的处理函数。
你可能已经在用这种模式的工具了。网页搜索让模型去实时网络上查东西,网页抓取让它读取某个URL的内容。这两种情况都是你在请求里加一条,剩下的服务商来做。代码执行就是把同样的模式套用到运行命令上。
这个流程对任何服务端代码执行工具都适用。模型跑一段东西、读输出、判断要不要再来一条命令,然后继续。这个循环正是代码执行工具的价值所在——模型可以拿真实输出核对自己的工作,而不是靠猜。
这个循环是有上限的。max_tool_calls字段决定一次请求最多能走多少步服务端工具。OpenRouter的服务端工具参考文档里,默认值和最大值都写的是30。
四家服务商,各管各的模型
自己跑沙箱,意味着服务商本来替你管的部分你都得自己扛:选基础镜像、准备算力、接入SDK来启动运行和读取输出、管理每次运行的生命周期,安全边界也是你的。托管工具则用JSON数组里的一条记录换掉这些控制权——你不用给容器定规格、打补丁、运维它。
目前提供托管代码执行的有OpenAI、Anthropic、Google和OpenRouter四家。把它们区分开的关键,是各自能为哪些模型跑代码。
OpenAI的shell工具在它自己管理的容器里跑命令,走Responses API。文档里写的托管运行时是Debian 12,默认工作目录是/mnt/data。命令不以sudo运行,也不支持交互式TTY会话。文档列出的预装语言包括Python 3.11、Node.js 22.16、Java 17、PHP 8.2、Ruby 3.1和Go 1.23。
托管容器默认没有对外网络访问。要开启,需要组织管理员在OpenAI后台配置允许列表,并在请求里给容器环境设置network_policy。容器可以通过在container_reference环境里传它的id来跨请求复用,过期时间在容器创建时设定。OpenAI另有一个独立的代码解释器工具,专门跑Python。
Anthropic的代码执行工具在它管理的沙箱里跑Python和Bash,走Messages API。文档描述的环境是Linux x86_64容器,Python 3.11,5 GiB内存,5 GiB工作区存储,一个CPU。网络访问被禁用,不允许任何对外连接,所以Claude只能用预装的库,运行过程中装不了包。
它有三个工具版本,所有受支持的模型都接受这三个版本。code_execution_20250825支持Bash命令和文件操作。code_execution_20260120增加了跨请求保留的Python解释器状态,这依赖Anthropic的程序化工具调用,在Claude Haiku 4.5上不可用。容器在创建30天后过期。闲置约5分钟后容器会被检查点保存,在30天窗口内带着它的id发请求就能恢复。
Google的代码执行工具在它管理的沙箱里跑Python,通过在请求的tools里加一条code_execution来启用。文档写明模型只能生成和执行Python,代码环境最长运行30秒,不能安装自己的库。Google公布了环境包含的库列表。
跨模型的那一家
上面三家工具各自只服务一家公司的模型。OpenRouter的工具则能配合Responses和Messages API上的任何模型,因为沙箱跑在路由层,而不是某一家模型服务商内部。
它提供两个代码执行工具。对开发者来说,这意味着换模型时不用动工具代码——工具是挂在路由层的,模型换了,调用方式不变。
热门跟贴