For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal

Eventos e itens

Consuma atualizações em tempo real e recupere o trabalho salvo.

Os eventos informam o que acontece enquanto um agente trabalha. Os itens são as mensagens e chamadas de ferramentas salvas que você pode recuperar depois. Use eventos para atualizar seu aplicativo em tempo real e itens para exibir o histórico salvo.

Seu aplicativo envia eventos de entrada para enviar mensagens, cancelar turnos ou retornar resultados de ferramentas. O agente envia eventos que informam as saídas e as alterações na sessão. Para enviar entradas, consulte Execute e continue sessões.

Consuma um fluxo

Inscreva-se antes de enviar trabalho para que seu aplicativo receba os primeiros eventos do turno. Passe seu cliente da API, o ID da sessão da conversa e um manipulador de eventos:

Receba eventos da sessão em streaming
# 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.")

A função auxiliar passa cada evento ao seu manipulador e, em seguida, verifica os tipos de evento comuns. Ela continua ao receber agent.session.idle e retorna quando o turno raiz é concluído. Ela lança um erro se o turno raiz falhar ou for cancelado, se a sessão ou o ambiente falhar ou se um evento error chegar. Eventos de turnos de subagentes não encerram o fluxo. Seu manipulador decide como exibir a saída; o código que chama a função auxiliar trata os erros que ela lança. Se o fluxo for fechado antes que um turno termine, a função auxiliar lança um erro. Consulte Recuperar um fluxo desconectado.

Envie uma mensagem após se inscrever

Esta versão aceita uma mensagem e a envia após abrir o fluxo:

Envie uma mensagem e acompanhe o fluxo
# 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.")

Trate as atualizações

Use o type do evento para decidir o que seu aplicativo deve fazer:

  • Exiba texto: Acrescente agent.session.turn.output_text.delta à parte correspondente do conteúdo. Quando agent.session.turn.output_text.done chegar, substitua essa parte pelo texto completo. Os deltas podem estar ausentes.
  • Acompanhe o trabalho: Os eventos de sessão, turno e item informam o progresso. Verifique se recebeu agent.session.turn.completed, agent.session.turn.failed ou agent.session.turn.cancelled para determinar o resultado do turno.
  • Forneça a entrada necessária: Ao receber agent.session.requires_action, recupere a sessão e inspecione required_actions. Seu código pode precisar retornar o resultado de uma função ou conectar um ambiente.

Uma sessão ociosa ou um fluxo encerrado, por si só, não indica sucesso. Um turno concluído também não garante que todas as ferramentas tenham sido executadas com sucesso. Inspecione a saída do agente.

Use item_id, output_index e content_index para associar atualizações de texto à mesma parte do conteúdo. Por exemplo, estes eventos abreviados atualizam uma única 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 tem seu próprio event_id. O item_id compartilhado identifica o item salvo, que inclui o conteúdo, o status e a fase da mensagem. Consulte Recupere o trabalho salvo.

Consulte a referência de eventos de streaming para conhecer todos os tipos de evento e campos. Esses eventos de fluxo são distintos dos webhooks. Para saber mais sobre a atividade dos subagentes e a atribuição de comandos, consulte Observe a delegação.

Busque itens e turnos

Use o ID da sessão presente no estado da conversa do seu aplicativo para recuperar o trabalho salvo:

Os endpoints de listagem retornam uma página por vez. Use as funções auxiliares de paginação do SDK ou o cursor after para recuperar mais resultados. Uma única página pode não conter todos os itens de um turno. Use order: "asc" para ler os itens do mais antigo ao mais recente.

Como recuperar um fluxo desconectado

Os fluxos não retransmitem eventos perdidos. Para restaurar a visualização do seu aplicativo:

  1. Abra um novo fluxo e armazene os eventos recebidos em um buffer.
  2. Recupere a sessão e seus itens salvos enquanto o fluxo permanece conectado.
  3. Restaure seu estado local a partir desses itens, usando o ID de cada item como chave.
  4. Aplique as atualizações de itens armazenadas no buffer usando item_id. Descarte as atualizações dos itens que já atingiram seu estado final no histórico recuperado.
  5. Retome o tratamento dos eventos em tempo real.

Um evento output_text.done pode substituir um buffer temporário de texto pelo texto completo. Os itens salvos permitem recuperar o trabalho concluído, mas não todos os eventos intermediários que você perdeu.