Variante em streaming de POST /chat: mesma autenticação, mesmos parâmetros de entrada, mesmo processamento (IA + busca + persistência da conversa) — a diferença é que a resposta é entregue como uma sequência de eventos Server-Sent Events (SSE) à medida que o modelo a vai gerando, em vez de um único JSON ao final.
Este endpoint consome tokens de IA da conta do cliente, igual ao /chat.
Este endpoint está sujeito a um flag de habilitação do lado do servidor (chatai.streaming). Se estiver desabilitado, o endpoint responde com um JSON de erro (STREAMING_DISABLED) em vez de abrir o stream — sua integração deve conseguir fazer fallback para POST /chat nesse caso.
| Informação do recurso | |
|---|---|
| Autenticação | Obrigatória (Token de API, Bearer) |
| Scope | mapaprop-chat-ai |
| HTTP Method | POST |
| Response | text/event-stream (SSE). Se o streaming estiver desabilitado ou a validação de entrada falhar, application/json |
| Version | 1 |
URL do recurso
https://mapaprop.app/api/action/mapaprop-chat-ai-v1/chat/stream
Parâmetros
Idênticos aos de POST /chat: message (obrigatório), questionId, leadName, leadEmail, leadPhone, sessionId, mode, propertyIds, useVectorSearch, searchCriteria, propertyActive, searchContext, customerSearch, sourceUrl. Veja essa página para o detalhe completo de cada um.
Código de exemplo
POST /api/action/mapaprop-chat-ai-v1/chat/stream HTTP/1.1
Host: mapaprop.app
Content-Type: application/json
Authorization: Bearer {access_token}
Accept: text/event-stream
{
"message": "¿Tenés departamentos de 2 ambientes en Palermo?",
"questionId": 481203
}
Resposta
A resposta é um stream de eventos SSE. Cada evento é uma linha data: {json}\n\n. O campo type de cada evento indica como interpretá-lo:
| type | Quando aparece | Campos do payload |
|---|---|---|
text-delta | Turno de chat livre (sem contexto de busca ativo). Um ou vários por turno, à medida que o modelo gera texto. | text (string): o fragmento de texto a concatenar. |
bridge | Turno de chat livre: o modelo decidiu oferecer buscar imóveis ou encaminhar para contato humano, em vez de continuar conversando. | bridgeType (string): switch_to_property_search ou offer_human_contact. message (string): texto sugerido para exibir. |
search-result | Turno de busca/imóvel/sem-resultados (quando você enviou propertyIds, useVectorSearch ou propertyActive). É emitido uma única vez, logo antes do evento done. | payload (object): a resposta completa, com a MESMA forma do JSON de POST /chat (response, action, success, propertyIds, buttons, allPropertyIds, hasMoreResults, focusedPropertyId, focusedPropertyCode, searchCriteria, tokensUsed, error). Este payload é a versão autoritativa: se você exibiu texto aos poucos com os text-delta, substitua-o por payload.response ao receber este evento. |
done | Sempre o último evento do stream. | questionId (int): o ID da conversa (pode ser -1 se o salvamento falhar). inputTokens (int), outputTokens (int). |
error | Erro em nível de stream. Não tentar novamente automaticamente. | errorCode (string), message (string). |
Diferente do POST /chat, aqui o evento done inclui sim questionId. É a forma mais simples de obter o ID da conversa se você estiver usando o modo streaming.
Um turno de chat livre é: zero ou mais text-delta, opcionalmente um bridge, e sempre termina em done. Um turno de busca/imóvel/sem-resultados é: um único search-result seguido de done (não emite text-delta nem bridge).
Gate de validação anterior ao stream
Se faltar o campo message, ou se o streaming estiver desabilitado do lado do servidor, o endpoint responde com um JSON normal (não SSE) antes de abrir o stream — seu cliente HTTP pode tratá-lo como uma resposta de erro comum.
| Erro | Causa |
|---|---|
STREAMING_DISABLED | O modo streaming não está habilitado neste ambiente. Faça fallback para POST /chat. |
REQUIRED_INPUT — "message is required" | Falta o campo message no body. |
Exemplo de resposta
Turno de chat livre:
data: {"type":"text-delta","text":"Hola! "}
data: {"type":"text-delta","text":"En qué puedo ayudarte hoy?"}
data: {"type":"done","questionId":481203,"inputTokens":410,"outputTokens":38}
Turno de busca:
data: {"type":"search-result","payload":{"response":"Encontré 3 departamentos de 2 ambientes en Palermo.","action":"show_properties","success":true,"propertyIds":[2601234,2601987,2602111],"hasMoreResults":false,"tokensUsed":{"input":812,"output":143,"total":955}}}
data: {"type":"done","questionId":481203,"inputTokens":812,"outputTokens":143}
Resposta quando o streaming está desabilitado (JSON, não SSE):
{
"error": "STREAMING_DISABLED",
"message": "El modo streaming no está habilitado en este entorno."
}