Referência de Eventos SSE¶
Referência completa de todos os Server-Sent Events emitidos pela API de streaming do Nodexa (stream: true).
Formato dos Eventos¶
Cada evento é enviado como duas linhas seguidas de uma linha em branco:
O stream termina com:
Heartbeat¶
A cada 15 segundos de inatividade, uma linha de comentário é enviada para manter a conexão ativa:
Comentários SSE (linhas começando com :) são ignorados pelos parsers padrão.
Índice de Eventos¶
| Evento | Descrição |
|---|---|
response.created |
Stream iniciado, processamento começa |
response.status |
Atualização de status de processamento |
response.output_text.delta |
Token de texto do assistant |
response.reasoning_summary_text.delta |
Token de resumo de raciocínio (apenas modelos de raciocínio) |
response.function_call_arguments.delta |
Argumentos parciais de chamada de função |
response.function_call_arguments.done |
Argumentos de chamada de função completos |
response.output_item.added |
Novo item de saída adicionado (message, mcp_call, handover, oauth_required) |
response.output_item.done |
Item de saída completo |
response.mcp_call.in_progress |
Uma chamada de tool de servidor está rodando (assistant ou especialista) |
response.mcp_call.completed |
Essa chamada retornou |
response.mcp_call.failed |
Essa chamada falhou |
response.web_search_call.in_progress |
Busca na web iniciando |
response.web_search_call.searching |
Consulta de busca na web submetida |
response.web_search_call.completed |
Resultados de busca na web prontos |
response.completed |
Resposta totalmente completa |
response.error |
Erro ocorrido, stream encerrando |
Detalhes dos Eventos¶
response.created¶
Emitido imediatamente quando a plataforma começa a processar a request.
{
"type": "response.created",
"response": {
"id": "resp_01234567-89ab-cdef-0123-456789abcdef",
"status": "in_progress"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.created" |
response.id |
string |
ID único de resposta para threading |
response.status |
string |
Sempre "in_progress" neste ponto |
Caso de uso: Exibir um indicador de carregamento/digitação.
response.status¶
Emitido quando o status de processamento interno muda (por exemplo, o assistant decide chamar tools, uma tool executa, um especialista é consultado, a resposta é regenerada em um conector de fallback).
{
"type": "response.status",
"code": "tool_calling",
"message": "Calling 2 tool(s)",
"metadata": { "tools": ["get_forecast", "create_risk_alert"] }
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.status" |
code |
string |
Código de status legível por máquina (veja abaixo) |
message |
string |
Descrição legível por humanos, para logs — não é localizada |
metadata |
object |
Payload estruturado para os códigos que o carregam; ausente nos demais |
| Código | Significado |
|---|---|
tool_calling |
O modelo pediu tools nesta iteração. metadata.tools lista as tools de servidor pelo nome, uma entrada por chamada, na ordem das chamadas. Function tools do lado do cliente não aparecem aqui: elas chegam como itens function_call. |
tool_executing |
Uma tool de servidor está executando. metadata.toolName diz qual, metadata.callId identifica a chamada, metadata.arguments é o JSON que o modelo pediu. Repete enquanto uma tool lenta roda (keepalive). Uma tool executada por um especialista consultado traz metadata.specialistId / specialistName. |
tool_complete |
Essa chamada terminou. Mesmo metadata mais metadata.outcome: success, ou error com metadata.error. A mesma chamada também sai como um item mcp_call, que é a forma indicada para montar uma UI de progresso. |
generating |
O modelo está produzindo saída sem nada mais no fio (mantém a conexão viva) |
regenerating |
A resposta está sendo regenerada em um conector de fallback; descarte os itens interim recebidos até aqui |
iteration_limit |
O loop de tools atingiu o limite de iterações; a resposta é o que o modelo produziu |
Medindo o que um turno fez
Um turno que consultou dados e um turno que só conversou ficam iguais no response.completed. Os eventos tool_calling distinguem os dois: junte metadata.tools ao longo do turno e você sabe quais tools rodaram, sem inspecionar o texto do usuário.
response.output_text.delta¶
Emitido para cada token de texto. Concatene todos os valores delta para reconstruir o texto completo.
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.output_text.delta" |
delta |
string |
Token(s) a adicionar ao buffer de texto atual |
Caso de uso: Adicione cada delta ao seu buffer de exibição de texto.
let textBuffer = '';
if (event.type === 'response.output_text.delta') {
textBuffer += event.delta;
updateUI(textBuffer);
}
response.reasoning_summary_text.delta¶
Emitido durante a fase de raciocínio de modelos que expõem um resumo de raciocínio (por exemplo, OpenAI o1, o3-mini). Esses tokens representam o processo de "pensamento" visível do modelo, não a resposta final.
{
"type": "response.reasoning_summary_text.delta",
"delta": "The user is asking about the history of"
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.reasoning_summary_text.delta" |
delta |
string |
Token(s) de resumo de raciocínio |
Caso de uso: Opcionalmente exibir uma seção "pensando...". Esses tokens chegam antes dos eventos response.output_text.delta.
Note
Emitido apenas por modelos de raciocínio. Não aparece para modelos de chat padrão.
response.function_call_arguments.delta¶
Emitido enquanto o modelo gera argumentos JSON para uma function call. Útil para exibir um indicador de "preparando para chamar tool".
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.function_call_arguments.delta" |
delta |
string |
String de argumentos JSON parcial |
Caso de uso: Exibir um indicador de chamada de tool na interface.
response.function_call_arguments.done¶
Emitido quando os argumentos da function call estão completamente montados. Este é o evento que aciona a execução da tool no lado do cliente.
{
"type": "response.function_call_arguments.done",
"name": "get_weather",
"call_id": "call_abc123",
"arguments": "{\"city\": \"Paris\", \"unit\": \"celsius\"}"
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.function_call_arguments.done" |
name |
string |
Nome da função a chamar |
call_id |
string |
ID único para esta chamada — inclua em function_call_output |
arguments |
string |
String de argumentos completa codificada em JSON |
Caso de uso: Faça parse de arguments, execute a função, colete o call_id e envie uma request de acompanhamento. Confira Function Calling.
response.output_item.added¶
Emitido quando o modelo adiciona um item estruturado ao seu array de saída. O item.type determina que tipo de item é.
Item de mensagem¶
{
"type": "response.output_item.added",
"item": {
"type": "message",
"role": "assistant",
"content": []
}
}
Item de chamada MCP¶
Uma chamada de tool de servidor do turno, no formato mcp_call da OpenAI Responses — o item para o qual uma UI de progresso no estilo ChatGPT desenha um card. Emitido para as tools do próprio assistant e para as tools que um especialista consultado executa: server_label diz quem rodou ("assistant", ou o nome do especialista), e a chamada de um especialista também traz specialist_id / specialist_name. O item é adicionado com status: "in_progress", seguido de response.mcp_call.in_progress enquanto roda e response.mcp_call.completed ou response.mcp_call.failed quando termina, e então response.output_item.done com o item final. output é sempre null: o resultado da tool é material do modelo, a resposta é o que o usuário recebe.
{
"type": "response.output_item.added",
"output_index": 1,
"item": {
"type": "mcp_call",
"id": "mcp_01234567-89ab-cdef-0123-456789abcdef",
"status": "in_progress",
"server_label": "Analista de Operações Portuárias",
"specialist_id": "55425e00-124f-4a9e-9148-9d596578b9bf",
"specialist_name": "Analista de Operações Portuárias",
"name": "ClosureStudyController_getRiskTiers",
"arguments": "{\"port\":\"Santos\"}",
"output": null,
"error": null
}
}
| Campo | Tipo | Descrição |
|---|---|---|
item.type |
"mcp_call" |
Identifica uma chamada de tool de servidor |
item.id |
string |
Id do item (mcp_<uuid>), o mesmo em todos os eventos do seu ciclo de vida |
item.status |
string |
in_progress, completed ou failed |
item.server_label |
string |
Quem rodou a tool: "assistant" ou o nome do especialista consultado. Não é um identificador de servidor MCP hoje, então não condicione comportamento por servidor a ele |
item.name |
string |
Nome técnico da tool, como o modelo a chamou (mapeie para o seu próprio rótulo) |
item.arguments |
string |
Argumentos em JSON que o modelo produziu |
item.output |
null |
Nunca enviado. O resultado da tool é material do modelo e a única superfície por onde um segredo buscado poderia vazar; a resposta é o que o usuário recebe |
item.error |
string? |
Por que a chamada falhou, quando status é failed |
item.specialist_id |
string? |
Presente quando um especialista consultado rodou a tool |
item.specialist_name |
string? |
Presente quando um especialista consultado rodou a tool |
Caso de uso: mostre uma linha de atividade por chamada ("Consultando risco de fechamento…") e atualize conforme os eventos do ciclo de vida chegam. No fim, response.completed.output lista todo mcp_call do turno, e é assim que você sabe o que o turno fez sem cruzar eventos. Function tools do lado do cliente não são itens mcp_call: continuam como itens function_call, já que quem as executa é você.
Item de handover¶
Emitido quando o controle é transferido de um Agente Especialista para outro.
{
"type": "response.output_item.added",
"item": {
"type": "handover",
"from_specialist": "General Assistant",
"to_specialist": "Technical Support",
"reason": "User is asking about API integration details"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
item.type |
"handover" |
Identifica isso como uma notificação de handover |
item.from_specialist |
string |
Nome de exibição do Agente Especialista que estava ativo |
item.to_specialist |
string |
Nome de exibição do Agente Especialista que assumiu |
item.reason |
string |
Explicação do motivo do handover |
Caso de uso: Registrar informações de roteamento ou exibir um aviso "conectando você ao [Agente Especialista]".
Item OAuth required¶
Emitido quando uma tool precisa de credenciais OAuth que não estão presentes na request.
{
"type": "response.output_item.added",
"item": {
"type": "oauth_required",
"plugin_id": "plugin_abc123",
"plugin_name": "Google Calendar",
"provider_id": "google",
"required_scopes": ["https://www.googleapis.com/auth/calendar.readonly"],
"auth_url": "https://your-admin.example.com/oauth/google/authorize?state=xyz"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
item.type |
"oauth_required" |
Identifica isso como um prompt OAuth |
item.plugin_id |
string |
Identificador interno do plugin |
item.plugin_name |
string |
Nome legível do plugin |
item.provider_id |
string |
Identificador do provedor OAuth (ex.: "google") |
item.required_scopes |
string[] |
Escopos OAuth necessários |
item.auth_url |
string |
URL para iniciar o fluxo de autorização OAuth |
Caso de uso: Redirecionar o usuário para auth_url e depois retentar a requisição com o token obtido em x-user-tokens.
response.output_item.done¶
Emitido quando um item de saída está completamente montado (após todos os eventos delta para aquele item).
{
"type": "response.output_item.done",
"item": {
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "The complete assembled response text."
}
]
}
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.output_item.done" |
item |
object |
O item de saída completamente montado |
response.mcp_call.in_progress¶
Emitido enquanto uma chamada de tool de servidor (um item mcp_call) está rodando. Repete a cada poucos segundos enquanto uma tool lenta executa, para a conexão continuar viva e a UI de progresso manter a linha ativa.
{
"type": "response.mcp_call.in_progress",
"item_id": "mcp_01234567-89ab-cdef-0123-456789abcdef",
"output_index": 1
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.mcp_call.in_progress" |
item_id |
string |
O item mcp_call a que este evento pertence |
output_index |
number |
Sua posição no array de saída |
response.mcp_call.completed¶
Emitido quando essa chamada retornou. response.output_item.done vem em seguida com o item em status: "completed".
{
"type": "response.mcp_call.completed",
"item_id": "mcp_01234567-89ab-cdef-0123-456789abcdef",
"output_index": 1
}
response.mcp_call.failed¶
Emitido quando essa chamada falhou, ou pediu uma tool que não existe. response.output_item.done vem em seguida com o item em status: "failed" e o mesmo error. O assistant segue com a resposta, então uma chamada falha é informação para a UI, não o fim da resposta.
{
"type": "response.mcp_call.failed",
"item_id": "mcp_01234567-89ab-cdef-0123-456789abcdef",
"output_index": 1,
"error": "HTTP request failed (404)"
}
response.web_search_call.in_progress¶
Emitido quando uma tool de busca na web é invocada e a busca vai começar.
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.web_search_call.in_progress" |
call_id |
string |
Identificador único para esta chamada de busca |
response.web_search_call.searching¶
Emitido quando a query de busca foi determinada e submetida.
{
"type": "response.web_search_call.searching",
"call_id": "ws_call_abc123",
"query": "latest AI regulation news 2024"
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.web_search_call.searching" |
call_id |
string |
Identificador para esta chamada de busca |
query |
string |
A consulta de busca submetida |
Caso de uso: Exibir "Buscando por: [consulta]" na sua interface.
response.web_search_call.completed¶
Emitido quando os resultados de busca estão disponíveis e sendo incorporados.
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.web_search_call.completed" |
call_id |
string |
Identificador para esta chamada de busca |
results_count |
number |
Número de resultados de busca encontrados |
response.completed¶
Emitido quando a resposta completa está pronta e o stream está prestes a fechar. Contém o objeto de resposta completo.
{
"type": "response.completed",
"response": {
"id": "resp_01234567-89ab-cdef-0123-456789abcdef",
"object": "response",
"status": "completed",
"model": "asst_01234567-89ab-cdef-0123-456789abcdef",
"output_text": "The complete response text.",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "The complete response text."
}
]
}
],
"usage": {
"input_tokens": 12000,
"input_tokens_details": { "cached_tokens": 10400 },
"output_tokens": 350,
"output_tokens_details": { "reasoning_tokens": 0 },
"total_tokens": 12350
},
"created_at": 1700000000
}
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.completed" |
response.id |
string |
ID único de resposta — salve para continuidade de conversas |
response.status |
string |
"completed" ou "requires_action" |
response.output_text |
string |
Campo de conveniência com texto completo montado |
response.output |
array |
Array de saída estruturada completo |
response.usage.input_tokens |
number |
Tokens de entrada de todas as chamadas de modelo do turno (loop de tools e consultas a especialistas incluídos) |
response.usage.input_tokens_details.cached_tokens |
number |
A parte de input_tokens servida do cache de prompt do provedor. Presente só quando o provedor informou — ausente significa "não informado", nunca "nada cacheado" |
response.usage.output_tokens |
number |
Tokens de saída, somados da mesma forma |
response.usage.output_tokens_details.reasoning_tokens |
number |
Tokens de raciocínio dentro de output_tokens, quando o provedor informa |
response.usage.total_tokens |
number |
input_tokens + output_tokens |
response.created_at |
number |
Timestamp Unix |
O mesmo objeto usage é retornado na resposta sem streaming. Os totais são os que a tela de uso mostra para o turno.
requires_action em response.completed
Se response.status for "requires_action", o assistant chamou uma function tool do lado do cliente e está aguardando os resultados. Você deve executar a função e enviar uma request de acompanhamento. Confira Function Calling.
response.error¶
Emitido quando ocorre um erro fatal durante o streaming. O stream fecha após este evento.
{
"type": "response.error",
"error": {
"type": "server_error",
"code": "upstream_timeout",
"message": "The LLM provider did not respond within the timeout period."
}
}
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Sempre "response.error" |
error.type |
string |
Categoria do erro (ex.: "server_error", "invalid_request_error") |
error.code |
string |
Código de erro legível por máquina |
error.message |
string |
Descrição do erro legível por humanos |
Confira Erros para todos os códigos de erro e seus significados.
Sequência Típica de Eventos¶
Resposta de texto simples¶
response.created
response.output_item.added (type: message)
response.output_text.delta (repetido N vezes)
response.output_item.done
response.completed
[DONE]
Resposta com busca na web¶
response.created
response.web_search_call.in_progress
response.web_search_call.searching
response.web_search_call.completed
response.output_item.added (type: message)
response.output_text.delta (repetido N vezes)
response.output_item.done
response.completed
[DONE]
Resposta com handover de Agente Especialista¶
response.created
response.output_item.added (type: handover)
response.output_item.done
response.output_item.added (type: message)
response.output_text.delta (repetido N vezes)
response.output_item.done
response.completed
[DONE]
Resposta que requer function call¶
response.created
response.output_item.added (type: function_call - geralmente não emitido separadamente)
response.function_call_arguments.delta (repetido)
response.function_call_arguments.done
response.completed (status: requires_action)
[DONE]