OpenRouter 平台功能
OpenRouter 平台功能
Shell
3 分钟阅读
Shell
在 Responses 和 Messages API 上为任意模型提供沙箱化的托管 Shell
测试版(Beta)
服务端工具目前处于测试阶段。API 与行为可能会变更。
openrouter:shell 服务端工具为模型提供托管 Shell——这是 OpenAI 托管 shell 工具的沙箱版实现,可与任意模型配合使用。当模型需要运行命令时,会发出 Shell 调用;OpenRouter 在隔离的 Linux 容器中于服务端执行这些命令,并返回每条命令的 stdout、stderr 以及退出或超时结果。
与 Bash 工具不同,Shell 工具没有客户端执行模式:命令始终在托管环境中运行,要么是 OpenAI 的原生 Shell,要么是 OpenRouter 的沙箱。
工作原理
- 在 Responses 或 Messages API 请求的
tools数组中加入{ "type": "openrouter:shell" }。在 Responses API 上,你也可以发送 OpenAI 的原生shell工具形态——在非 OpenAI 模型上,它会自动路由到 OpenRouter 沙箱。 - 模型根据提示词决定运行一条或多条 Shell 命令,并发出 Shell 调用。
- OpenRouter 按顺序执行这些命令,每条命令各自一次调用,均在沙箱容器内进行。
- 每条命令的
stdout、stderr和结果(退出码或超时)返回给模型。 - 模型纳入这些结果,并可能在同一次请求中继续运行后续命令批次。
快速开始
配置
Shell 工具接受可选的 parameters,用于选择执行引擎和环境:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
engine | string | auto | 使用哪个 Shell 引擎:openrouter 在 OpenRouter 沙箱中于服务端运行命令;auto 在可用时保留服务提供商的原生托管 Shell(OpenAI),并在其他服务提供商上路由到 OpenRouter 沙箱 |
environment | object | container_auto | 执行环境。使用 { "type": "container_auto" } 获取由 OpenRouter 管理的临时容器,或使用 { "type": "container_reference", "container_id": "..." } 复用已有容器。不支持 local 环境 |
sleep_after_seconds | integer | 900 | 容器在最后一条命令后保持热状态的时长,之后进入休眠。基于空闲时间:每条命令都会重置计时器。上限为 2592000(30 天) |
默认值和上限反映当前服务端强制执行的限制,在该工具处于测试阶段时可能会变更。
调用参数
模型生成调用参数,与 OpenAI 托管 Shell 的 shell_call.action 一致:
| 字段 | 类型 | 说明 |
|---|---|---|
commands | string[] | 要运行的 Shell 命令,每条命令各自一次调用,按顺序执行 |
timeout_ms | integer | 应用于每条命令的最大执行时间(毫秒) |
max_output_length | integer | 每个流返回的最大字符数——stdout 和 stderr 各自按此值封顶,且按命令分别计算 |
OpenAI 原生 Shell 工具
在 Responses API 上,你也可以发送 OpenAI 的原生工具形态({ "type": "shell" },或旧版 Codex 的 local_shell),而不是 openrouter:shell。在 OpenAI 模型上,这会使用 OpenAI 自己的托管 Shell;在任何其他模型上,OpenRouter 会透明地将调用路由到其沙箱。无论哪种情况,响应都会发出原生 shell_call 输出项。
响应格式
该工具为每条命令返回一项,与 OpenAI 的 shell_call_output.output[] 一致:
每条命令的 outcome 要么是 { "type": "exit", "exit_code": <int> },要么是 { "type": "timeout" }。非零退出码表示命令失败;错误输出会返回在 stderr 上,以便模型读取并作出反应。
安全性
Shell 执行在设计上就是沙箱化的:
- 命令在隔离容器中执行——不在 OpenRouter 基础设施上,也不在你的机器上。使用
container_auto时容器是临时的;使用container_reference时它会跨请求持久存在。 - 容器按账户和工作区隔离,因此永远不会跨租户共享。
- 执行时间受
timeout_ms限制(会被钳制到服务端最大值)。 stdout和stderr各自截断到max_output_length(按流封顶,其本身也会被钳制到服务端最大值)。