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
Theme

Eventos e itens

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

Os eventos informam o que acontece enquanto o agente trabalha. Os itens são as mensagens e chamadas de ferramentas que ficam salvas para consulta posterior. Use os eventos para atualizar seu aplicativo em tempo real e os 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 a saída gerada e as mudanças na sessão. Para saber como enviar dados de entrada, consulte Executar e continuar sessões.

Consumir um fluxo de eventos

Inscreva-se no fluxo antes de enviar uma tarefa para que seu aplicativo receba os primeiros eventos do turno. Passe o cliente da API, o ID da sessão da conversa e uma função para tratar os eventos:

Receber eventos da sessão em tempo real
# 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 para a sua função de tratamento e, em seguida, verifica os tipos de evento mais comuns. Ela continua a execução ao receber agent.session.idle e retorna quando o turno do agente raiz é concluído. Ela lança um erro se o turno do agente raiz falhar ou for cancelado, se a sessão ou o ambiente falhar ou se receber um evento error. Eventos de turnos de subagentes não encerram o fluxo. Sua função de tratamento define 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 encerrado antes do fim de um turno, a função auxiliar lança um erro. Consulte Como recuperar um fluxo após uma desconexão.

Enviar uma mensagem após se inscrever no fluxo

Esta versão recebe uma mensagem e a envia depois de abrir o fluxo:

Enviar uma mensagem e acompanhar os eventos em tempo real
# 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.")

Tratar atualizações

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

  • Exibir texto: Acrescente o trecho de texto recebido em agent.session.turn.output_text.delta à parte correspondente do conteúdo. Ao receber agent.session.turn.output_text.done, substitua essa parte pelo texto completo. É possível que nenhum trecho incremental seja enviado.
  • Acompanhar o progresso: Os eventos de sessão, turno e item informam o andamento do trabalho. Verifique se recebeu agent.session.turn.completed, agent.session.turn.failed ou agent.session.turn.cancelled para saber como o turno terminou.
  • Fornecer os dados solicitados: Ao receber agent.session.requires_action, recupere a sessão e examine required_actions. Talvez seu código precise retornar o resultado de uma função, conectar um ambiente ou lidar com o acesso a uma origem ou o login no navegador.

O fato de a sessão estar ociosa ou de o fluxo ter sido encerrado não basta para confirmar o sucesso da operação. A conclusão de um turno também não garante que todas as ferramentas tenham sido executadas com sucesso. Examine a saída do agente.

Use item_id, output_index e content_index para associar as atualizações de texto à mesma parte do conteúdo. Por exemplo, estes eventos abreviados atualizam a mesma 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 comum aos eventos identifica o item salvo, que contém o conteúdo, o status e a fase da mensagem. Consulte Recuperar o trabalho salvo.

Consulte a referência de eventos de streaming para ver todos os tipos de evento e seus campos. Os eventos desse fluxo são diferentes dos webhooks. Para acompanhar a atividade dos subagentes e identificar qual agente executou cada comando, consulte Acompanhar a delegação.

Buscar itens e turnos

Use o ID da sessão armazenado 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 para o mais recente.

Como recuperar um fluxo após uma desconexão

Use os itens salvos para recuperar a saída que seu aplicativo deixou de receber. Para restaurar o que o aplicativo exibe:

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

Ao se reconectar a uma sessão que falhou, você recebe pelo fluxo os detalhes da falha registrada e, em seguida, o fluxo é encerrado. Se a sessão recuperada tiver status: "failed" ou se você receber agent.session.failed, interrompa as tentativas de reconexão e siga as orientações para recuperar a sessão.

Restaure os formulários de entrada pendentes a partir de required_actions da sessão recuperada. Os itens do histórico não indicam quais solicitações ainda aguardam resposta. Para as aprovações no navegador, associe os formulários às solicitações pelo request_id e remova os formulários cujas solicitações já não estão pendentes. Após a reconexão, você não precisa reenviar a tarefa nem as aprovações anteriores.

Um evento output_text.done pode substituir o texto acumulado em um buffer temporário pelo texto completo. Os itens salvos permitem recuperar o trabalho concluído, mas nem sempre é possível recuperar todos os eventos intermediários perdidos.