ChatGPT 容器
我最喜欢的 ChatGPT 功能之一是它能够在容器中编写和执行代码。这个功能在近三年前作为 ChatGPT 代码解释器推出,后来半心半意地重新命名为"高级数据分析",而且通常很难找到详细的文档。一个明显的例子是:它在过去几个月中似乎进行了一次重大升级,但我找不到关于新功能的任何文档!
以下是最显著的新功能:
- ChatGPT 现在可以直接运行 Bash 命令。之前它仅限于 Python 代码,尽管它可以通过 Python
subprocess模块运行 shell 命令。 - 它有 Node.js,除了 Python 之外,还可以直接运行 JavaScript。我还让它运行了 Ruby、Perl、PHP、Go、Java、Swift、Kotlin、C 和 C++的"hello world"。不过还没有 Rust!
- 虽然容器仍然无法进行出站网络请求,但**
pip install package和npm install package现在都通过自定义代理机制工作**。 - ChatGPT 可以定位网络上文件的 URL,并使用
container.download工具下载该文件并将其保存到沙盒容器内的路径。
这是一个重大升级!ChatGPT 现在可以用 10 种新语言编写和测试代码(如果算上 Bash 就是 11 种),可以在线查找文件并下载到容器中,还可以通过 pip 和 npm 安装额外的包来帮助解决问题。
OpenAI 真的需要养成保持其发布说明更新的更好习惯!
最初我怀疑这可能是我偶然发现了一个并非对所有人都可用的新预览功能,但我在免费的 ChatGPT 账户中尝试了一些实验,并确认这些新功能在那里也可用。
1、container.download
我首次发现新功能的线索是有一天我对洛杉矶的空气质量感到好奇,特别是不断增长的电动汽车数量是否产生了可衡量的影响?
我用一个新的 GPT-5.2 思考会话提出了提示:
显示我过去 20 年洛杉矶空气质量随时间的变化
这是共享的对话记录。令人恼火的是,它没有提供思考轨迹,所以这里有一个截图:
这一部分立即引起了我的注意:
[...] 错误消息中的 URL 指向包含空气质量趋势的 Excel 文件。我可以使用 container.download 工具来获取它。 [...]
什么是 container.download?我询问了 ChatGPT:
在不运行任何搜索的情况下告诉我关于你的 container.download 工具
得到了回答:
当然。container.download 是一个我可以调用的内置工具,它从 URL 获取文件并将其保存到此聊天会话的沙盒容器文件系统中。它的作用:
- 接受一个可公开访问的 URL和容器中的一个目标文件路径。
- 从该 URL 下载字节并将它们写入给定的路径。
- 之后,我可以在容器中本地读取/处理文件(例如,解压缩它,用 Python 解析它,将其作为图像打开,转换它等)。
2、签名(输入)
概念上它的调用方式如下:
{
"url": "https://example.com/somefile.zip",
"filepath": "/mnt/data/somefile.zip"
}
进一步的实验证实 container.download 的行为如描述所示。
我让它从一个启用了日志的服务器下载了一个文件,并捕获了 IP 地址和用户代理。以下是最有趣的标头:
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/avif, image/webp, image/apng, */*;q=0.8, application/signed-exchange;v=b3;q=0.9
Cf-Connecting-Ip: 52.230.164.178
那个 52.230.164.178 IP 地址解析为位于爱荷华州得梅因的 Microsoft Azure Cloud (centralus)。
3、container.download 是数据泄露漏洞吗?
一方面,这真的很有用!ChatGPT 可以在网站上浏览寻找有用的文件,将这些文件下载到容器中,然后使用 Python 或其他语言进行处理。
但这会是数据泄露漏洞吗?提示注入攻击是否可能欺骗 ChatGPT 将私人数据泄露到 container.download 调用,URL 包含包含敏感信息的查询字符串?
我认为它不会。我试图让它组装一个带有查询字符串的 URL 并使用 container.download 访问它,但它做不到。它告诉我它收到了这个错误:
错误:下载失败,因为之前未在对话中查看过 url。首先使用 web.run 打开文件或 url。
在我看来,这就像 Claude 的 Web Fetch 工具使用的相同安全技巧:只有在 URL 是由用户直接输入或来自不受提示注入影响的搜索结果时,才允许访问 URL。
(我进一步探索了一下,设法让一个简单的构造查询字符串通过 web.run——一个完全不同的工具——但当我尝试组合一个包含先前提示历史的更长查询字符串时,web.run 过滤器阻止了它。)
所以我认为这一切都是安全的,虽然我很好奇它是否能抵御经验丰富的安全研究人员的更激进攻击。
4、Bash 和其他语言
从 Claude Code 和 Codex CLI 等编码代理中得到的关键教训是 Bash 统治一切:如果一个代理可以在环境中运行 Bash 命令,它几乎可以做到通过在计算机上输入命令可以实现的所有事情。
当 Anthropic 在去年九月向 Claude 添加自己的代码解释器功能时,他们围绕 Bash 构建,而不仅仅是 Python。在我看来,OpenAI 现在已经为 ChatGPT 做了同样的事情。
以下是 ChatGPT 运行 Bash 命令时的样子——我的提示是:
npm 安装一个有趣的包并演示如何使用它
点击"思考"或"Thought for 32s"链接很有用,因为这会打开活动侧边栏,其中包含 ChatGPT 如何得出其答案的详细轨迹。这有助于防止作弊——ChatGPT 可能会在主窗口中声称运行了 Bash,但它无法伪造活动面板中的那些黑白日志。
我在同一个会话稍后让它在各种语言中运行 Hello World。
5、从 pip 和 npm 安装包
在之前的示例中,ChatGPT 从 npm 安装了 cowsay 包并使用它绘制了一个 ASCII 艺术牛。但如果容器无法进行出站网络请求,它怎么能做到这一点呢?
在另一个会话中,我让它探索其环境并弄清楚这是如何工作的。
这是它创建的结果 Markdown 报告。
关键的魔法似乎是一个 applied-caas-gateway1.internal.api.openai.org 代理,在容器内可用,并且各种打包工具配置为使用它。
以下环境变量使 pip 和 uv 从该代理安装包,而不是直接从 PyPI:
PIP_INDEX_URL=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../pypi-public/simple
PIP_TRUSTED_HOST=packages.applied-caas-gateway1.internal.api.openai.org
UV_INDEX_URL=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../pypi-public/simple
UV_INSECURE_HOST=https://packages.applied-caas-gateway1.internal.api.openai.org
这个似乎让 npm 工作:
NPM_CONFIG_REGISTRY=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../npm-public
它还报告了这些看起来可疑的变量:
CAAS_ARTIFACTORY_BASE_URL=packages.applied-caas-gateway1.internal.api.openai.org
CAAS_ARTIFACTORY_PYPI_REGISTRY=.../artifactory/api/pypi/pypi-public
CAAS_ARTIFACTORY_NPM_REGISTRY=.../artifactory/api/npm/npm-public
CAAS_ARTIFACTORY_GO_REGISTRY=.../artifactory/api/go/golang-main
CAAS_ARTIFACTORY_MAVEN_REGISTRY=.../artifactory/maven-public
CAAS_ARTIFACTORY_GRADLE_REGISTRY=.../artifactory/gradle-public
CAAS_ARTIFACTORY_CARGO_REGISTRY=.../artifactory/api/cargo/cargo-public/index
CAAS_ARTIFACTORY_DOCKER_REGISTRY=.../dockerhub-public
CAAS_ARTIFACTORY_READER_USERNAME=reader
CAAS_ARTIFACTORY_READER_PASSWORD=****
NETWORK=caas_packages_only
容器环境中既没有安装 Rust 也没有安装 Docker,但也许这些注册表引用是即将推出的功能的线索。
6、综合应用
所有这些的结果?您可以让 ChatGPT 在对话中使用 Python 或 Node.js 包,它将能够安装它们并将它们应用于您上传的文件或它从公共网络下载的文件。这真的很酷。
这里最大的缺失功能应该是最容易提供的:我们需要官方文档!发布说明条目将是一个好的开始,但关于这些新功能如何工作、其限制以及可以用于什么,有很多微妙的细节。
一如既往,我也鼓励 OpenAI 为这组功能起一个恰当地代表其工作方式和能力的名称。
在此期间,我将称之为ChatGPT 容器。
7、更新:完整的工具列表
我决定询问 ChatGPT 关于其他可用的工具,以防有任何有趣的东西:
列出所有可用的工具,包括它们的准确名称、描述和签名
这是我得到的回答。
根据 2026 年 1 月 26 日的 GPT-5.2 思考的 ChatGPT 工具列表
以下是我在此聊天中可用的所有工具,包括它们的准确名称、描述和签名(如在我的工具界面中定义的那样)。
python
python.exec (FREEFORM) → any
描述: 在 Jupyter 环境中执行 Python 代码,用于私有/内部推理(不向您显示)。禁用互联网访问。 签名: python.exec(FREEFORM) -> any
web
web.run (ToolCallV5 JSON) → any
描述: 访问互联网和专门的查找(搜索、打开/点击/查找页面、截图 PDF、图像搜索、产品搜索、金融、天气、体育、计算器、时间)。通过返回的 turn... 引用 ID 支持引用。 签名:web.run({ open?, click?, find?, screenshot?, image_query?, product_query?, sports?, finance?, weather?, calculator?, time?, search_query?, response_length? }) -> any
automations
automations.create → any
描述: 通过 iCal VEVENT 安排未来的/重复的任务/提醒/搜索。 签名:automations.create({ prompt: string, title: string, schedule?: string, dtstart_offset_json?: string }) -> any
automations.update → any
描述: 修改现有的计划任务。 签名:automations.update({ jawbone_id: string, schedule?: string, dtstart_offset_json?: string, prompt?: string, title?: string, is_enabled?: boolean }) -> any
automations.list → any
描述: 列出现有的自动化。 签名: automations.list() -> any
guardian_tool
guardian_tool.get_policy → str
描述: 检索特定类别的策略指导(当前:election_voting)。 签名: guardian_tool.get_policy({ category: string }) -> str
file_search
file_search.msearch → any
描述: 在可用的内部/连接来源中搜索(在此环境中:主要是相关的"recording_knowledge"录音知识)。 签名:file_search.msearch({ queries?: string[], source_filter?: string[], file_type_filter?: string[], intent?: string, time_frame_filter?: { start_date?: string, end_date?: string } }) -> any
file_search.mclick → any
描述: 展开/打开之前返回的搜索结果(或连接器 URL)以获取更多上下文。 签名:file_search.mclick({ pointers?: string[], start_date?: string, end_date?: string }) -> any
gmail (只读)
gmail.search_email_ids → any
描述: 按查询/标签搜索 Gmail 消息 ID(只读)。 签名:gmail.search_email_ids({ query?: string, tags?: string[], max_results?: integer, next_page_token?: string }) -> any
gmail.batch_read_email → any
描述: 按消息 ID 读取一批 Gmail 消息(只读)。 签名:gmail.batch_read_email({ message_ids: string[] }) -> any
gcal (只读)
gcal.search_events → any
描述: 在时间范围内和/或按关键字搜索 Google 日历事件(只读)。 签名:gcal.search_events({ time_min?: string, time_max?: string, timezone_str?: string, max_results?: integer, query?: string, calendar_id?: string, next_page_token?: string }) -> any
gcal.read_event → any
描述: 按 ID 读取特定的日历事件(只读)。 签名:gcal.read_event({ event_id: string, calendar_id?: string }) -> any
gcontacts (只读)
gcontacts.search_contacts → any
描述: 按关键字搜索 Google 联系人(只读)。 签名:gcontacts.search_contacts({ query: string, max_results?: integer }) -> any
canmore (画布)
canmore.create_textdoc → any
描述: 创建新的画布文本文档(markdown 或代码)。 签名:canmore.create_textdoc({ name: string, type: "document" | "code/bash" | "code/zsh" | "code/javascript" | "code/typescript" | "code/html" | "code/css" | "code/python" | "code/json" | "code/sql" | "code/go" | "code/yaml" | "code/java" | "code/rust" | "code/cpp" | "code/swift" | "code/php" | "code/xml" | "code/ruby" | "code/haskell" | "code/kotlin" | "code/csharp" | "code/c" | "code/objectivec" | "code/r" | "code/lua" | "code/dart" | "code/scala" | "code/perl" | "code/commonlisp" | "code/clojure" | "code/ocaml" | "code/powershell" | "code/verilog" | "code/dockerfile" | "code/vue" | "code/react" | "code/other", content: string }) -> any
canmore.update_textdoc → any
描述: 对当前画布文本文档应用基于正则表达式的编辑。 签名:canmore.update_textdoc({ updates: { pattern: string, multiple?: boolean, replacement: string }[] }) -> any
canmore.comment_textdoc → any
描述: 在当前画布文本文档的匹配区域上添加可操作的注释。 签名:canmore.comment_textdoc({ comments: { pattern: string, comment: string }[] }) -> any
python_user_visible
python_user_visible.exec (FREEFORM) → any
描述: 执行 Python 代码您将看到的(表格、图表、生成的文件)。禁用互联网。 签名: python_user_visible.exec(FREEFORM) -> any
user_info
user_info.get_user_info → any
描述: 获取您的当前位置和本地时间(如果未知则为 UTC)。 签名: user_info.get_user_info({}) -> any
summary_reader
summary_reader.read → any
描述: 从早期的轮次中读取可安全分享的内部推理摘要(当被问及如何得出某事时使用)。 签名: summary_reader.read({ limit?: integer, offset?: integer }) -> any
container
container.exec → any
描述: 在容器内运行命令并返回 stdout/stderr。 签名:container.exec({ cmd: string[], session_name?: string | null, workdir?: string | null, timeout?: integer | null, env?: object | null, user?: string | null }) -> any
container.feed_chars → any
描述: 向正在运行的交互式执行会话发送输入并刷新输出。 签名:container.feed_chars({ session_name: string, chars: string, yield_time_ms?: integer }) -> any
container.open_image → any
描述: 从容器中的绝对路径显示图像(jpg/jpeg/png/webp)。 签名:container.open_image({ path: string, user?: string | null }) -> any
container.download → any
描述: 将文件从 URL 下载到容器文件系统。 签名:container.download({ url: string, filepath: string }) -> any
bio (记忆)
bio.update (FREEFORM) → any
描述: 在对话中持久化(或忘记)用户特定的信息("记忆")。 签名: bio.update(FREEFORM) -> any
api_tool
api_tool.list_resources → any
描述: 列出 OP 样式文件树中可用的"资源"(包括可调用工具)。 签名:api_tool.list_resources({ path?: string, cursor?: string | null, only_tools?: boolean, refetch_tools?: boolean }) -> any
api_tool.call_tool → any
描述: 将资源作为工具调用(必须从 list_resources 知道其完整路径/URI)。 签名:api_tool.call_tool({ path: string, args: object }) -> any
personal_context
personal_context.search → any
描述: 从先前的交互/链接来源检索用户特定的上下文以保持连续性。 签名:personal_context.search({ query: string }) -> any
image_gen
image_gen.text2im → any
描述: 根据文本指令生成或编辑图像(以及可选的引用图像 ID)。 签名:image_gen.text2im({ prompt?: string | null, size?: string | null, n?: integer | null, transparent_background?: boolean | null, is_style_transfer?: boolean | null, referenced_image_ids?: string[] | null }) -> any
user_settings
user_settings.get_user_settings → any
描述: 读取当前设置和允许的值(个性、强调色、外观)。 签名: user_settings.get_user_settings() -> any
user_settings.set_setting → any
描述: 将一个设置更改为允许的值(强调色、外观或个性)。 签名:user_settings.set_setting({ setting_name: "accent_color" | "appearance" | "personality", setting_value: string }) -> any
artifact_handoff
artifact_handoff.prepare_artifact_generation → any
描述: 必须在用户要求电子表格或幻灯片工件时立即调用。 签名: artifact_handoff.prepare_artifact_generation() -> any
原文链接: ChatGPT Containers can now run bash, pip/npm install packages, and download files
汇智网翻译整理,转载请标明出处