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
| Nombre | Tipo | Obligatorio | Valores aceptados / rango | Default | Descripción |
|---|---|---|---|---|---|
| X-Api-Key (header) | string | Sí | Clave activa de tu tenant | — | Autentica la integración. |
| X-Tenant-Id (header) | UUID | Condicional | Tenant autorizado para la clave | Tenant de la clave | Envíalo si tu clave permite varios tenants; los ejemplos lo incluyen siempre. |
| query | string | Sí | Texto no vacío | — | Pregunta del usuario. |
| conversationId | string | No | ID devuelto por la primera respuesta | Nueva conversación | Reutiliza el mismo ID para agrupar turnos y cargar historial. |
| channel | string | No | api, telegram, whatsapp, web, widget, playground | api con API key | Canal de origen para los defaults RAG. |
| mode / promptMode | string | No | default, botMode, strictMode, conversational, researcher, psychologist; alex según configuración | default / canal | mode controla el modo general; promptMode es atajo de options.promptMode. |
| documentId | string numérico | No | ID decimal de documento | Todos | Atajo de options.documentId. |
| temperature | number | No | 0–1 | 0.7 | Atajo de options.temperature. |
| maxChunks | integer | No | -1–1000 | 6 | Atajo de options.maxChunks; -1 significa ilimitado. |
| model / provider | string | No | Modelo y proveedor configurados en tu tenant | Configuración del tenant | Selección de LLM. |
| userId / userName / clientIp | string | No | Identificadores de tu integración | — | Metadatos del usuario y cliente. |
| conversationHistory | array | No | {role: user|assistant, content: string}[] | Historial guardado | Historial explícito para el prompt. |
| persistConversation | boolean | No | true, false | true | Con API key siempre persiste; false solo se respeta con JWT del dueño. |
| options.minScore | number | No | 0–1 | 0.3 | Similitud mínima. |
| options.topK | integer | No | -1–1000 | 20 | Candidatos recuperados. |
| options.maxChunks | integer | No | -1–1000 | 6 | Fragmentos en el contexto; options prevalece sobre el atajo. |
| options.temperature | number | No | 0–1 | 0.7 | Creatividad; options prevalece sobre el atajo. |
| options.maxTokens | integer | No | 50–2048 | 512 | Límite de tokens de respuesta. |
| options.maxHistoryTurns | integer | null | No | -1–50; 0 desactiva historial | Default del canal | Al cargar historial guardado automáticamente, el servicio aplica un tope efectivo de 10 turnos. |
| options.maxContextSize | integer | No | -1–200000 | 40000 | Límite de caracteres del contexto. |
| options.documentId / documentIds | integer / integer[] | No | IDs del tenant | Todos | Filtra documentos; documentIds prevalece. |
| options.strictMode | boolean | No | true, false | true | Restringe la respuesta al contexto recuperado. |
| options.useLLMContext | boolean | null | No | true, false | false | Controla la inclusión de contexto documental según el servicio. |
| options.pinnedNotes | string | No | Texto libre | — | Notas añadidas al prompt. |
| options.botPromptConfiguration | string | No | Hasta 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}