请参阅 OpenAI Cookbook 中的应用管理和 webhook 管理示例。
工作原理
DigitalOcean 的 Managed Agents Runtime Services (M.A.R.S.) 使用 codex-agentapi 镜像启动 Firecracker 微型虚拟机。该镜像包含 Codex,并会启动执行器,由执行器向外连接到 Agents API。
选择 由 webhook 管理 的预配方式,即可根据 OpenAI 事件启动或恢复沙盒;也可以选择 由应用管理 的预配方式,从您的应用中控制沙盒。如需交互式快速入门,可使用可选的 DigitalOcean CLI 流程。有关连接和恢复行为,请参阅沙盒生命周期。
M.A.R.S. 目前处于仅限受邀用户参与的私有预览阶段。请通过 DigitalOcean 的私有预览公告申请访问权限。
开始之前
您需要一个已启用沙盒且具有 codex-agentapi 访问权限的 DigitalOcean 账户,以及一个具有 Agents API 访问权限的 OpenAI 项目。
为您的应用程序或 CLI 使用 OPENAI_API_KEY。将 OPENAI_EXECUTOR_API_KEY 设置为一个环境密钥。仅将环境密钥以 CODEX_API_KEY 的形式传入沙盒。
对于 webhook 控制器或 Python 应用程序,请设置 DIGITALOCEAN_TOKEN,并安装支持异步操作的 PyDo 测试版 SDK(pydo[aio])。使用 OpenAI SDK 发起 Agents API 请求。只有使用 CLI 流程时才需要安装 CLI。
由 webhook 管理
- 创建一个已存储的智能体,并将其 ID 保存为
OPENAI_AGENT_ID。在 DigitalOcean App Platform 中部署 HTTPS webhook 控制器,为其配置此 ID、用于读取会话的OPENAI_API_KEY、DIGITALOCEAN_TOKEN和OPENAI_EXECUTOR_API_KEY。 - 在您的 OpenAI 项目中注册其
/webhook端点。启用agent.session.action_required和agent.session.failed,然后将签名密钥保存为OPENAI_WEBHOOK_SECRET,并重新部署控制器。 - 按照会话操作步骤,使用相同的
OPENAI_AGENT_ID,并将/workspace设为工作目录。打开事件流并发送输入。当 OpenAI 请求environment_connection时,控制器会验证签名、重新获取当前会话,并检查其智能体 ID 和所需操作。它会在 DigitalOcean 中查找mars-{session_id},恢复已暂停的沙盒,或在没有活动沙盒时创建一个。 - 收到
agent.session.failed时,请重新获取会话,仅在当前会话状态仍为failed时删除其沙盒。
该镜像会将执行器连接到会话环境。您的应用通过 Agents API 发送输入并流式接收结果;控制器负责预配和重新连接。请对每个会话的预配操作进行串行处理,以应对重复和并发的事件投递。有关控制器要求,请参阅由 webhook 管理的生命周期指南。
使用 DigitalOcean CLI 试用
CLI 会创建这两项资源,并让您在终端中与智能体交互。它会直接预配沙盒,无需 webhook 控制器。
安装包含 harness-runtime 的 doctl 测试版,然后进行身份验证:
doctl auth init
将此清单保存为 agents.yaml:
name: openai-codex-session
agent: codex-agentapi
config:
agent:
model: gpt-5.6-sol
instructions: Work from the files in /workspace.
environment:
type: self_hosted
workspace_directory: /workspace
egress:
- api.openai.com
- codex-cloud-environments.chatgpt.com
env:
CODEX_ENVIRONMENT_ID: ${ENV_ID}
secrets:
CODEX_API_KEY: ${OPENAI_EXECUTOR_API_KEY}
config 块是向 OpenAI 发送的创建会话请求。CLI 使用 OPENAI_API_KEY 对该请求进行身份验证,根据响应填充 ${ENV_ID},并仅将环境密钥传入沙盒。不要将完成变量替换后的清单写入日志或纳入版本控制。将您的工具需要访问的所有目标地址添加到 egress。
创建会话和沙盒:
doctl harness-runtime create --spec agents.yaml
默认情况下,该命令最多等待 300 秒,直到资源就绪。请保存会话详情中的 OpenAI 会话 ID 和 DigitalOcean 会话 ID,然后连接到会话:
doctl harness-runtime launch openai-codex-session
让智能体将 hello 写入 /workspace/hello.txt,再读取其内容。按 Ctrl+D 可断开连接而不删除会话,运行相同的 launch 命令可重新连接。完成后,请按照清理步骤操作。
由应用管理
当您的应用负责创建会话和预配沙盒时,请使用此方式。首先创建 OpenAI 会话:
import OpenAI from "openai";
const client = new OpenAI();
const session = await client.beta.agents.sessions.create({
agent: {
model: "gpt-6-astra",
instructions:
"You are a helpful coding assistant. Write clean code and verify that it works.",
},
environment: {
type: "self_hosted",
workspace_directory: "/workspace",
},
});
console.log(session);按照连接沙盒中的说明,保存 session.id 和环境 ID。将这个仅包含沙盒配置的清单保存为 sandbox.yaml;智能体配置此前已发送给 OpenAI:
agent: codex-agentapi
egress:
- api.openai.com
- codex-cloud-environments.chatgpt.com
env:
CODEX_ENVIRONMENT_ID: ${ENV_ID}
secrets:
CODEX_API_KEY: ${OPENAI_EXECUTOR_API_KEY}
- 使用
DIGITALOCEAN_TOKEN创建pydo.aio.Client,并调用client.agents.create_session。将params.openai_session_id设为 OpenAI 会话 ID,将body.manifest设为sandbox.yaml的内容,并将body.variables设为包含ENV_ID和OPENAI_EXECUTOR_API_KEY及其对应值的映射。保存返回的 DigitalOceansession_id。 - 打开事件流并发送输入,让智能体写入并读取
/workspace/hello.txt。输入会等待执行器连接后再处理。确认已收到连接事件且已完成一轮交互,并检查智能体输出中是否存在工具失败的情况。 - 使用
workspace_download和相对路径hello.txt获取文件。保留这两项资源以供后续交互使用,或进行清理。
为设置和执行操作指定有限的超时时长,并在您的应用中处理连接失败。对于由您的应用或 CLI 直接管理的会话,请勿为其添加负责预配的 webhook 处理程序。
清理
保存您需要的所有文件,然后删除 OpenAI 会话并销毁 DigitalOcean 沙盒。删除会话不会触发 webhook,因此请执行这两项操作,并报告清理失败的情况。
使用 PyDo 时,请调用 client.agents.destroy_session 并传入 DigitalOcean 会话 ID。使用 CLI 时,请传入该 ID 或沙盒名称:
doctl harness-runtime remove openai-codex-session
删除 webhook 控制器之前,请先移除 OpenAI 中的 webhook 注册。