For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主导航

会话 Webhook

响应智能体生命周期的变化。

使用 Webhook 响应会话状态变化,无需保持事件流连接。Webhook 处理程序可以启动或重新连接沙盒计算资源、更新您的应用程序或触发工作流程。

支持的事件

事件触发时机
agent.session.created会话创建时。
agent.session.action_required会话需要函数结果、首次连接环境或重新连接环境时。
agent.session.in_progress会话开始处理一个轮次时。
agent.session.idle会话处于空闲状态,可以接收更多输入时。
agent.session.failed会话进入失败状态时。

agent.session.action_required 事件包含会话 ID,以及 值为 function_callenvironment_connectionrequired_action.type

{
  "type": "agent.session.action_required",
  "data": {
    "id": "sess_abc123",
    "required_action": { "type": "function_call" }
  }
}

获取会话并检查 required_actions,以查看调用 ID、参数或 环境 ID。Webhook 不包含这些详细信息。

设置 Webhook

按照通用的 Webhook 设置指南创建端点并选择 Agents API 事件。保存端点的签名密钥,用于验证签名

接收事件

每当订阅的事件发生时,OpenAI 都会发送带有签名的 HTTP POST 请求:

{
  "id": "evt_123",
  "object": "event",
  "created_at": 1750287018,
  "type": "agent.session.created",
  "data": {
    "id": "sess_abc123",
    "environment_id": "ccarenv_abc123",
    "environment_type": "self_hosted",
    "connect": {
      "remote_url": "https://api.openai.com/v1/agents/api"
    }
  }
}

在配置沙盒资源之前,先获取会话的当前状态。请参阅沙盒生命周期

启动执行器

对于自托管会话,agent.session.created 包含启动执行器所需的环境 ID 和连接 URL。将 ENVIRONMENT_ID 设置为 data.environment_id,将 REMOTE_URL 设置为 data.connect.remote_url。此 URL 与会话中通过 environment.remote_url 返回的 URL 相同。保存这两个值,并在重新连接时复用:

CODEX_API_KEY="$OPENAI_ENVIRONMENT_KEY" \
codex exec-server \
  --remote "$REMOTE_URL" \
  --environment-id "$ENVIRONMENT_ID"

使用环境密钥作为 CODEX_API_KEY。将您的应用程序 API 密钥保存在环境之外。

验证并处理事件

设置 OPENAI_API_KEYOPENAI_WEBHOOK_SECRET。如果使用 Python,请安装 fastapiuvicornopenai。如果使用 JavaScript,请安装 expressopenai

这些处理程序会验证签名,并监听端口 8000。设置 PORT 可更改端口。在生产环境中,请将耗时较长的工作放入队列

Webhook 处理程序
import json
import os

import uvicorn
from fastapi import FastAPI, Request, Response
from openai import AsyncOpenAI, InvalidWebhookSignatureError

app = FastAPI()
webhooks = AsyncOpenAI(webhook_secret=os.environ["OPENAI_WEBHOOK_SECRET"])


@app.post("/webhooks/openai")
async def handle_webhook(request: Request):
    payload = await request.body()
    try:
        webhooks.webhooks.verify_signature(payload=payload, headers=request.headers)
    except (InvalidWebhookSignatureError, ValueError):
        return Response("Invalid signature", status_code=400)

    event = json.loads(payload)
    if event["type"] == "agent.session.idle":
        session_id = event["data"]["id"]
        session = await webhooks.beta.agents.sessions.retrieve(session_id, timeout=10)
        print("session idle event:", session.id)
    else:
        print("session event:", event["type"], event["data"]["id"])
    return Response(status_code=200)


if __name__ == "__main__":
    uvicorn.run(app, port=int(os.environ.get("PORT", "8000")))

环境连接事件

当初始输入或后续输入需要使用尚未连接的自托管执行器时,API 会添加一项 environment_connection 必需操作。API 会在 开始等待连接之前 发出 agent.session.action_required 事件。

获取会话并确认 required_actions 仍在请求连接。使用 session.environment.idsession.environment.remote_url 启动执行器。此 Webhook 不包含 connect.remote_url。如果执行器在等待超时之前建立连接,API 会清除该必需操作并继续处理此次提交,无需客户端重新提交。

API 最多等待五分钟以建立连接。在此期间,后续输入请求可能会一直保持连接。请据此配置客户端和代理的超时时间。agent.session.in_progress 表示执行已开始,并不表示 API 正在等待连接。

如果等待超时,提交就会失败。初始输入可能异步失败,并使会话进入 failed 状态。连接等待机制不提供持久化输入队列。进程崩溃或客户端断开连接后,可能需要重试。

会话和轮次的结果

agent.session.idle 表示会话已准备好接收更多输入,并不表示上一轮次已成功。请检查该轮次的状态,或监听会话流中的 agent.session.turn.completedagent.session.turn.failedagent.session.turn.cancelled 事件。已完成的轮次仍可能包含失败的工具调用。请检查工具结果和智能体的最终响应。

agent.session.failed 报告的是会话失败,并非每次轮次失败。删除会话没有对应的 Webhook,也不会停止提供商侧的计算资源运行。