> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# ChatGPT 容器
- URL: https://www.hubwiz.com/blog/chatgpt-container/
- Published: 2026-01-31T02:06:12.000Z
- Updated: 2026-01-31T02:06:12.000Z
- Description: ChatGPT 现在可以用 10 种新语言编写和测试代码，可以在线查找文件并下载到容器中，还可以通过 pip 和 npm 安装额外的包来帮助解决问题。
- Author: admin
- Tags: TOOL, CHATGPT, #Import 2026-10-14 14:41

我最喜欢的 ChatGPT 功能之一是它能够在容器中编写和执行代码。这个功能在近三年前作为 ChatGPT 代码解释器推出，后来半心半意地重新命名为"高级数据分析"，而且通常很难找到详细的文档。一个明显的例子是：它在过去几个月中似乎进行了一次*重大*升级，但我找不到关于新功能的任何文档！

以下是最显著的新功能：

1. ChatGPT 现在**可以直接运行 Bash 命令**。之前它仅限于 Python 代码，尽管它可以通过 Python `subprocess` 模块运行 shell 命令。
2. **它有 Node.js**，除了 Python 之外，还可以直接运行 JavaScript。我还让它运行了 **Ruby、Perl、PHP、Go、Java、Swift、Kotlin、C 和 C++**的"hello world"。不过还没有 Rust！
3. 虽然容器仍然无法进行出站网络请求，但\*\*`pip install package` 和 `npm install package` 现在都通过自定义代理机制工作\*\*。
4. ChatGPT 可以定位网络上文件的 URL，并使用 `container.download` 工具**下载该文件并将其保存到**沙盒容器内的路径。

这是一个重大升级！ChatGPT 现在可以用 10 种新语言编写和测试代码（如果算上 Bash 就是 11 种），可以在线查找文件并下载到容器中，还可以通过 `pip` 和 `npm` 安装额外的包来帮助解决问题。

> OpenAI *真的*需要养成[保持其发布说明更新](https://help.openai.com/en/articles/6825453-chatgpt-release-notes?ref=hubwiz.com)的更好习惯！

最初我怀疑这可能是我偶然发现了一个并非对所有人都可用的新预览功能，但我在免费的 ChatGPT 账户中[尝试了一些实验](https://chatgpt.com/share/6977aa7c-7bd8-8006-8129-8c9e25126fed?ref=hubwiz.com)，并确认这些新功能在那里也可用。

- [container.download](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com#container-download)
- [container.download 是数据泄露漏洞吗？](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com#is-container-download-a-data-exfiltration-vulnerability-)
- [Bash 和其他语言](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com#bash-and-other-languages)
- [从 pip 和 npm 安装包](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com#installing-packages-from-pip-and-npm)
- [综合应用](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com#adding-it-all-together)

## 1、container.download

我首次发现新功能的线索是有一天我对洛杉矶的空气质量感到好奇，特别是不断增长的电动汽车数量是否产生了可衡量的影响？

我用一个新的 GPT-5.2 思考会话提出了提示：

> 显示我过去 20 年洛杉矶空气质量随时间的变化

这是[共享的对话记录](https://chatgpt.com/share/6977a80d-e6e4-8006-b4fe-ed8478fe99d8?ref=hubwiz.com)。令人恼火的是，它没有提供思考轨迹，所以这里有一个截图：

![探索获取 AQI 数据和报告的方法 下载洛杉矶的 AQI 数据  我找到了一个标题为"2000-2023 年按城市划分的空气质量统计"的 xlsx 文件，应该包括洛杉矶的数据。当用户请求使用提供的 URL 下载文件的数据时  错误消息中的 URL 指向包含空气质量趋势的 Excel 文件。我可以使用 container.download 工具来获取它。让我们继续使用这种方法，看看是否可以直接下载文件！分析  解析和分析洛杉矶的数据  既然我们已经下载了数据，我将使用 Python 解析它。首先，我将专注于识别对应洛杉矶的行，可能标记为"Los Angeles-Long Beach-Anaheim, CA。"之后，我将绘制"中位数 AQI"和"良好天数"等指标随时间变化的图表来可视化趋势。让我们开始！](https://www.hubwiz.com/blog/content/images/2026/01/container-download-1.jpg)

这一部分立即引起了我的注意：

> \[...\] 错误消息中的 URL 指向包含空气质量趋势的 Excel 文件。我可以使用 container.download 工具来获取它。 \[...\]

什么是 `container.download`？我[询问了 ChatGPT](https://chatgpt.com/share/6977aab0-b874-8006-9b54-d3d216ed884b?ref=hubwiz.com)：

> 在不运行任何搜索的情况下告诉我关于你的 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 地址[解析为](http://ip-api.com/json/52.230.164.178?ref=hubwiz.com)位于爱荷华州得梅因的 Microsoft Azure Cloud (centralus)。

## 3、container.download 是数据泄露漏洞吗？

一方面，这真的很有用！ChatGPT 可以在网站上浏览寻找有用的文件，将这些文件下载到容器中，然后使用 Python 或其他语言进行处理。

但这会是数据泄露漏洞吗？提示注入攻击是否可能欺骗 ChatGPT 将私人数据泄露到 `container.download` 调用，URL 包含包含敏感信息的查询字符串？

我认为它不会。我试图让它组装一个带有查询字符串的 URL 并使用 `container.download` 访问它，但它做不到。它告诉我它收到了这个错误：

> 错误：下载失败，因为之前未在对话中查看过 url。首先使用 web.run 打开文件或 url。

在我看来，这就像 [Claude 的 Web Fetch 工具使用的相同安全技巧](https://simonwillison.net/2025/Sep/10/claude-web-fetch-tool/?ref=hubwiz.com)：只有在 URL 是由用户直接输入或来自不受提示注入影响的搜索结果时，才允许访问 URL。

（我进一步探索了一下，设法让一个简单的构造查询字符串通过 `web.run`——一个完全不同的工具——但当我尝试组合一个包含先前提示历史的更长查询字符串时，`web.run` 过滤器阻止了它。）

所以我*认为*这一切都是安全的，虽然我很好奇它是否能抵御经验丰富的安全研究人员的更激进攻击。

## 4、Bash 和其他语言

从 Claude Code 和 Codex CLI 等编码代理中得到的关键教训是 Bash 统治一切：如果一个代理可以在环境中运行 Bash 命令，它几乎可以做到通过在计算机上输入命令可以实现的所有事情。

当 Anthropic 在[去年九月](https://simonwillison.net/2025/Sep/9/claude-code-interpreter/?ref=hubwiz.com)向 Claude 添加自己的代码解释器功能时，他们围绕 Bash 构建，而不仅仅是 Python。在我看来，OpenAI 现在已经为 ChatGPT 做了同样的事情。

以下是 ChatGPT 运行 Bash 命令时的样子——我的提示是：

> npm 安装一个有趣的包并演示如何使用它

![ChatGPT 5.2 思考界面的截图，带有活动面板。主聊天显示用户提示"npm install a fun package and demonstrate using it"和响应"Thought for 32s > Yep — here's a fun one: cowsay 🐄 我用 npm 安装了它并运行了一个微小的 Node 脚本："后跟包含"的 bash 代码块 mkdir -p /mnt/data/npmfun cd /mnt/data/npmfun npm init -y npm install cowsay --no-fund --no-audit node -e "const cowsay=require('cowsay'); console.log(cowsay.say({text:'Hel"和输出：部分显示 ASCII 牛艺术说"< Hello from npm inside the container! >"以及由字符组成的牛图。右侧的活动面板（32秒）显示："Running npm install in container"带有 bash 命令和输出"v22.16.0 10.9.2"，"Inspecting npm command output and container status"带有目录列表显示"drwxr-xr-x 2 root oai_shared 80 Jan 26 17:32 . drwxrwxr-x 2 oai oai_shared 60 Jan 26 17:32 .. -rw-r--r-- 1 root root"，"Re-running npm install"关于 node_modules 缺失的说明，以及"Rerunning npm install with output"显示"added 41 packages in 2s"。](https://www.hubwiz.com/blog/content/images/2026/01/chatgpt-bash-1.jpg)

点击"思考"或"Thought for 32s"链接很有用，因为这会打开活动侧边栏，其中包含 ChatGPT 如何得出其答案的详细轨迹。这有助于防止作弊——ChatGPT 可能会在主窗口中声称运行了 Bash，但它无法伪造活动面板中的那些黑白日志。

我在同一个会话稍后让它[在各种语言中运行 Hello World](https://chatgpt.com/share/6977b890-f1c0-8006-b39a-9a02c7ca1993?ref=hubwiz.com)。

![显示多种语言的"Hello, world"程序的终端截图。顶部部分显示代码：swift -e 'print("Hello, world from Swift!")'后跟 cat > hello.kts <<'KTS' / println("Hello, world from Kotlin!") / KTS / kotlinc -script hello.kts，然后 cat > hello.c <<'C' / #include <stdio.h> / int main(){ puts("Hello, world from C!"); return 0; } / C / gcc hello.c -o hello_c / ./hello_c，然后 cat > hello.cpp <<'CPP' / #include  / int main(){ std::cout << "Hello, world from C++!" << std::endl; } / CPP / g++ hello.cpp -o hello_cpp / ./hello_cpp。底部部分显示输出：Hello, world from Ruby! / Hello, world from Perl! / Hello, world from PHP! / Hello, world from Go! / Hello, world from Java! / Hello, world from Swift! / Hello, world from Kotlin! / Hello, world from C! / Hello, world from C++!. UI 底部显示"Thought for 2m 29s"和"Done"。](https://www.hubwiz.com/blog/content/images/2026/01/chatgpt-hello-worlds-1.jpg)

## 5、从 pip 和 npm 安装包

在之前的示例中，ChatGPT 从 npm 安装了 `cowsay` 包并使用它绘制了一个 ASCII 艺术牛。但如果容器无法进行出站网络请求，它怎么能做到这一点呢？

在[另一个会话](https://chatgpt.com/share/69773501-b6d8-8006-bbf2-fa644561aa26?ref=hubwiz.com)中，我让它探索其环境并弄清楚这是如何工作的。

这是它创建的[结果 Markdown 报告](https://github.com/simonw/research/blob/main/chatgpt-container-environment/README.md?ref=hubwiz.com)。

关键的魔法似乎是一个 `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 关于其他可用的工具，以防有任何有趣的东西：

> 列出所有可用的工具，包括它们的准确名称、描述和签名

这是[我得到的回答](https://chatgpt.com/share/6977ffa0-df14-8006-9647-2b8c90ccbb81?ref=hubwiz.com)。

根据 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](https://simonwillison.net/2026/Jan/26/chatgpt-containers/?ref=hubwiz.com)

汇智网翻译整理，转载请标明出处