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:
# 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:
# 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 receberagent.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.failedouagent.session.turn.cancelledpara saber como o turno terminou. - Fornecer os dados solicitados: Ao receber
agent.session.requires_action, recupere a sessão e examinerequired_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:
- Itens da sessão: Liste os itens para recuperar as mensagens e chamadas de ferramentas do agente raiz ao longo dos turnos.
- Turnos: Liste os turnos para consultar o trabalho realizado na sessão. Recupere um turno pelo ID para examinar o status, os registros de data e hora, os dados de uso e o erro do turno.
- Itens de um turno: Para um turno do agente raiz, use o endpoint que lista os itens do turno. Cada subagente tem seu próprio histórico de itens e um endpoint para consultar itens por turno.
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:
- Abra um novo fluxo e armazene temporariamente os eventos recebidos.
- Mantenha o fluxo conectado enquanto recupera a sessão e seus itens salvos.
- Restaure o estado local a partir desses itens, usando o ID de cada item como chave.
- 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. - 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.