For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal

Eventos y elementos

Consume actualizaciones en tiempo real y recupera el trabajo guardado.

Los eventos informan lo que sucede mientras un agente trabaja. Los elementos son los mensajes y las llamadas a herramientas que se guardan y que puedes recuperar más adelante. Usa los eventos para actualizar tu aplicación en tiempo real y los elementos para mostrar su historial guardado.

Tu aplicación envía eventos de entrada para enviar mensajes, cancelar turnos o devolver resultados de herramientas. El agente envía eventos que informan sobre la salida y los cambios en la sesión. Consulta Ejecutar y continuar sesiones para saber cómo enviar entradas.

Consumir un flujo

Suscríbete antes de enviar trabajo para que tu aplicación reciba los primeros eventos del turno. Pasa tu cliente de API, el ID de sesión de la conversación y un manejador de eventos:

Transmitir eventos de sesión
# Pass your saved session ID to this helper.
def stream_session(client: OpenAI, session_id: str, handle_event):
    with client.beta.agents.sessions.events.stream(session_id) as events:
        for event in events:
            handle_event(event)
            match event.type:
                case "agent.session.idle":
                    continue
                case "error":
                    raise RuntimeError(event.error.message)
                case "agent.session.failed" | "agent.session.environment.failed":
                    raise RuntimeError(f"Agent lifecycle failure: {event.type}")
                case "agent.session.turn.failed":
                    if event.turn.subagent_id is None:
                        detail = event.turn.error.message if event.turn.error else ""
                        raise RuntimeError(f"{event.type}: {detail}")
                case "agent.session.turn.cancelled":
                    if event.turn.subagent_id is None:
                        raise RuntimeError("The agent turn was cancelled")
                case "agent.session.turn.completed":
                    if event.turn.subagent_id is None:
                        return
    raise RuntimeError("Stream closed before a turn ended. Retrieve the saved state.")

La función auxiliar pasa cada evento a tu manejador y luego comprueba los tipos de eventos comunes. Continúa al recibir agent.session.idle y retorna cuando se completa el turno raíz. Genera un error si el turno raíz falla o se cancela, si la sesión o el entorno fallan, o si llega un evento error. Los eventos de turnos de subagentes no finalizan el flujo. Tu manejador decide cómo mostrar la salida; el código que invoca la función auxiliar maneja los errores que esta genera. Si el flujo se cierra antes de que termine un turno, la función auxiliar genera un error. Consulta Recuperar un flujo desconectado.

Enviar un mensaje después de suscribirte

Esta versión acepta un mensaje y lo envía después de abrir el flujo:

Enviar y transmitir un mensaje
# Pass your saved session ID and message to this helper.
def send_and_stream(client: OpenAI, session_id: str, text, handle_event):
    with client.beta.agents.sessions.events.stream(session_id) as events:
        client.beta.agents.sessions.events.create(
            session_id,
            events=[
                {
                    "type": "agent.session.input.message",
                    "input": [
                        {
                            "role": "user",
                            "content": [{"type": "input_text", "text": text}],
                        }
                    ],
                }
            ],
        )
        for event in events:
            handle_event(event)
            match event.type:
                case "agent.session.idle":
                    continue
                case "error":
                    raise RuntimeError(event.error.message)
                case "agent.session.failed" | "agent.session.environment.failed":
                    raise RuntimeError(f"Agent lifecycle failure: {event.type}")
                case "agent.session.turn.failed":
                    if event.turn.subagent_id is None:
                        detail = event.turn.error.message if event.turn.error else ""
                        raise RuntimeError(f"{event.type}: {detail}")
                case "agent.session.turn.cancelled":
                    if event.turn.subagent_id is None:
                        raise RuntimeError("The agent turn was cancelled")
                case "agent.session.turn.completed":
                    if event.turn.subagent_id is None:
                        return
    raise RuntimeError("Stream closed before a turn ended. Retrieve the saved state.")

Manejar actualizaciones

Usa el type del evento para decidir qué debe hacer tu aplicación:

  • Mostrar texto: agrega agent.session.turn.output_text.delta al final de la parte de contenido correspondiente. Cuando llegue agent.session.turn.output_text.done, reemplaza esa parte por su texto completo. Es posible que no haya deltas.
  • Seguir el trabajo: los eventos de sesión, turno y elemento informan sobre el progreso. Comprueba si se recibe agent.session.turn.completed, agent.session.turn.failed o agent.session.turn.cancelled para determinar el resultado del turno.
  • Proporcionar la entrada requerida: al recibir agent.session.requires_action, recupera la sesión e inspecciona required_actions. Es posible que tu código deba devolver el resultado de una función o conectar un entorno.

Una sesión inactiva o un flujo cerrado no indican por sí solos que el trabajo haya tenido éxito. Un turno completado tampoco garantiza que todas las herramientas hayan tenido éxito. Inspecciona la salida del agente.

Usa item_id, output_index y content_index para asociar las actualizaciones de texto con la misma parte de contenido. Por ejemplo, estos eventos abreviados actualizan una parte:

{
  "type": "agent.session.turn.output_text.delta",
  "item_id": "msg_789",
  "output_index": 0,
  "content_index": 0,
  "delta": "Acme competes"
}
{
  "type": "agent.session.turn.output_text.done",
  "item_id": "msg_789",
  "output_index": 0,
  "content_index": 0,
  "text": "Acme competes on price and distribution."
}

Cada evento tiene su propio event_id. El item_id compartido identifica el elemento guardado, que incluye el contenido, el estado y la fase del mensaje. Consulta Recuperar el trabajo guardado.

Consulta la referencia de eventos de transmisión continua para conocer todos los tipos de eventos y sus campos. Estos eventos del flujo son distintos de los webhooks. Para obtener información sobre la actividad de los subagentes y la atribución de comandos, consulta Observar la delegación.

Obtener elementos y turnos

Usa el ID de sesión del estado de la conversación de tu aplicación para recuperar el trabajo guardado:

Los puntos de acceso de listado devuelven una página a la vez. Usa las funciones auxiliares de paginación del SDK o el cursor after para recuperar más resultados. Es posible que una sola página no contenga todos los elementos de un turno. Usa order: "asc" para leer los elementos del más antiguo al más reciente.

Cómo recuperar un flujo desconectado

Los flujos no vuelven a transmitir los eventos perdidos. Para restaurar la vista de tu aplicación:

  1. Abre un nuevo flujo y almacena los eventos entrantes en un búfer.
  2. Recupera la sesión y sus elementos guardados mientras el flujo permanece conectado.
  3. Restaura tu estado local a partir de esos elementos, usando el ID de cada elemento como clave.
  4. Aplica las actualizaciones de elementos almacenadas en el búfer usando item_id. Descarta las actualizaciones de los elementos que ya alcanzaron su estado final en el historial recuperado.
  5. Reanuda el manejo de eventos en tiempo real.

Un evento output_text.done puede reemplazar un búfer temporal de texto por el texto completo. Los elementos guardados te permiten recuperar el trabajo completado, pero no todos los eventos intermedios que te perdiste.