Streaming SSE #

Recibe la respuesta en fragmentos mientras se genera.

Prepara tu terminal una vez

Variables para bash o zsh
export FLOWORDR_BASE_URL="https://app.flowordr.com"
export FLOWORDR_API_KEY="<tu-api-key>"
export FLOWORDR_TENANT_ID="<tu-tenant-id>"

Ejecuta este bloque antes de los cURL. Sustituye los valores entre ángulos por tus credenciales; ningún ejemplo contiene claves reales.

El stream usa el mismo body que chat. Reutiliza conversationId para mantener el hilo; si lo omites, cada llamada crea otra conversación y consume el cupo del plan.

POST /api/rag/answer/stream

NombreTipoObligatorioValores aceptados / rangoDefaultDescripción
X-Api-Key (header)stringSíClave activa de tu tenant—Autentica la integración.
X-Tenant-Id (header)UUIDCondicionalTenant autorizado para la claveTenant de la claveEnvíalo si tu clave permite varios tenants; los ejemplos lo incluyen siempre.
querystringSíTexto no vacío—Pregunta del usuario.
conversationIdstringNoID devuelto por la primera respuestaNueva conversaciónReutiliza el mismo ID para agrupar turnos y cargar historial.
channelstringNoapi, telegram, whatsapp, web, widget, playgroundapi con API keyCanal de origen para los defaults RAG.
mode / promptModestringNodefault, botMode, strictMode, conversational, researcher, psychologist; alex según configuracióndefault / canalmode controla el modo general; promptMode es atajo de options.promptMode.
documentIdstring numéricoNoID decimal de documentoTodosAtajo de options.documentId.
temperaturenumberNo0–10.7Atajo de options.temperature.
maxChunksintegerNo-1–10006Atajo de options.maxChunks; -1 significa ilimitado.
model / providerstringNoModelo y proveedor configurados en tu tenantConfiguración del tenantSelección de LLM.
userId / userName / clientIpstringNoIdentificadores de tu integración—Metadatos del usuario y cliente.
conversationHistoryarrayNo{role: user|assistant, content: string}[]Historial guardadoHistorial explícito para el prompt.
persistConversationbooleanNotrue, falsetrueCon API key siempre persiste; false solo se respeta con JWT del dueño.
options.minScorenumberNo0–10.3Similitud mínima.
options.topKintegerNo-1–100020Candidatos recuperados.
options.maxChunksintegerNo-1–10006Fragmentos en el contexto; options prevalece sobre el atajo.
options.temperaturenumberNo0–10.7Creatividad; options prevalece sobre el atajo.
options.maxTokensintegerNo50–2048512Límite de tokens de respuesta.
options.maxHistoryTurnsinteger | nullNo-1–50; 0 desactiva historialDefault del canalAl cargar historial guardado automáticamente, el servicio aplica un tope efectivo de 10 turnos.
options.maxContextSizeintegerNo-1–20000040000Límite de caracteres del contexto.
options.documentId / documentIdsinteger / integer[]NoIDs del tenantTodosFiltra documentos; documentIds prevalece.
options.strictModebooleanNotrue, falsetrueRestringe la respuesta al contexto recuperado.
options.useLLMContextboolean | nullNotrue, falsefalseControla la inclusión de contexto documental según el servicio.
options.pinnedNotesstringNoTexto libre—Notas añadidas al prompt.
options.botPromptConfigurationstringNoHasta 10000 caracteres—Prompt completo personalizado.
cURL
curl -N -X POST "$FLOWORDR_BASE_URL/api/rag/answer/stream" -H "X-Api-Key: $FLOWORDR_API_KEY" -H "X-Tenant-Id: $FLOWORDR_TENANT_ID" -H "Content-Type: application/json" -H "Accept: text/event-stream" -d '{"query":"¿Cuál es la política de devoluciones?"}'

Respuesta: 200 text/event-stream con líneas data: y tipos start, delta, done y meta; antes de abrir SSE, 429 JSON si se agotó el cupo mensual.

Al terminar, el stream guarda el turno y, después de done, envía un evento meta con conversationId, turnNumber y saved. Envía ese conversationId en el body del siguiente stream para continuar la conversación; sin ID, cada stream crea otra conversación y consume el cupo del plan.
Si cancelas la conexión antes de done, el turno no se guarda y no llega meta. Con API key el turno se guarda aunque envíes persistConversation: false; solo el JWT del dueño puede desactivarlo. Cuando el turno no se guarda (persistencia desactivada o cupo de conversaciones agotado), meta trae saved: false, turnNumber: null y el conversationId que enviaste (o null).
Dos streams en la misma conversación
PRIMERA=$(curl -sN -X POST "$FLOWORDR_BASE_URL/api/rag/answer/stream" -H "X-Api-Key: $FLOWORDR_API_KEY" -H "X-Tenant-Id: $FLOWORDR_TENANT_ID" -H "Content-Type: application/json" -d '{"query":"¿Cuáles son sus horarios?"}' | tee /dev/stderr)
CONVERSATION_ID=$(printf '%s' "$PRIMERA" | sed -n 's/^data: //p' | jq -r 'select(.type == "meta") | .conversationId')
curl -N -X POST "$FLOWORDR_BASE_URL/api/rag/answer/stream" -H "X-Api-Key: $FLOWORDR_API_KEY" -H "X-Tenant-Id: $FLOWORDR_TENANT_ID" -H "Content-Type: application/json" -d "{"query":"¿Y los sábados?","conversationId":"$CONVERSATION_ID"}"
Es un POST con body JSON. EventSource solo hace GET; usa fetch o curl -N.
text
data: {"type":"start"}

data: {"type":"delta","text":"Según"}

data: {"type":"done","sources":[],"model":"modelo-configurado","processingTimeSeconds":1.2}

data: {"type":"meta","conversationId":"3f2c9a1e-…","turnNumber":1,"saved":true}