Saltar al contenido principal
La mayoría de las apps de chat en producción hacen streaming. Los tokens se envían al navegador a medida que el modelo los emite, así que para cuando un completado está “terminado” tu usuario ya ha leído la mayor parte. Eso rompe el modelo mental ingenuo de un filtro de contenido que inspecciona una respuesta completa y luego decide — no hay respuesta completa que inspeccionar hasta que es demasiado tarde. Un filtro de contenido de llm en streaming tiene que tomar su decisión sobre los deltas a medida que fluyen. Esta página trata exactamente de ese caso: cómo se comporta cada acción de la etapa de salida de forma segura en streaming en el gateway de OrcaRouter, y cómo crear una política que se sostenga en tráfico SSE. Para el motor completo — cada tipo de regla, campo y ruta — ver Guardrails.

1. El problema del filtro de contenido de llm en streaming

Un guardrail de la etapa de salida examina la respuesta del modelo. En una solicitud sin streaming eso es sencillo: el gateway tiene el completado completo antes de que un solo byte regrese, así que puede bloquearlo, enmascararlo o pasarlo limpiamente. El streaming invierte eso. La respuesta llega como una secuencia de deltas SSE, cada uno reenviado a tu cliente en cuanto aterriza, así que un filtro que espera al final no filtra nada. La respuesta de OrcaRouter es un escáner de stream: a medida que los deltas de salida fluyen, el escáner ejecuta tus reglas de la etapa de salida contra el texto que se acumula y actúa en el instante en que una regla se dispara — no después de que el stream se completa. La acción que creas decide qué significa “actúa”: un block corta el stream y un flag lo deja pasar. Un mask sí redacta en salida sin streaming, pero la reescritura en banda del stream está en el roadmap — en un stream hoy el escáner computa el enmascarado pero actúa solo sobre la decisión de bloqueo, así que una regla mask aún no redacta una respuesta con streaming.
Esta salvedad solo importa para reglas de la etapa de salida en solicitudes con streaming. Las reglas de la etapa de entrada examinan la solicitud antes de que el modelo se ejecute, así que están totalmente activas incluido el enmascarado — y cualquier regla de salida en una solicitud sin streaming ve la respuesta completa y se comporta normalmente, incluido mask.

2. Qué es seguro en streaming hoy

Una regla block se aplica en salida con streaming y sin streaming. En un stream, el escáner observa los deltas; cuando una regla de bloqueo se dispara corta el stream — sella el escáner, emite un breve aviso de reemplazo ([response truncated by guardrail: … policy violation]) como un delta final, y cierra el canal SSE antes de que cualquier otro contenido bloqueado llegue al cliente. Como el estado de la respuesta HTTP ya está comprometido a 200 para cuando el primer delta se envió, un bloqueo en pleno stream no puede reemitir un estado — termina el stream abierto con gracia. El cuerpo HTTP 400 guardrail_blocked es la forma del bloqueo de salida sin streaming.Los bytes ya enviados al cliente no pueden retraerse, así que un bloqueo en streaming es de mejor esfuerzo sobre lo que ya se transmitió pero detiene de forma fiable todo después de la coincidencia. Para una garantía dura de que ningún byte ofensivo se envíe jamás — y para el cuerpo 400 guardrail_blocked — envía la solicitud sin streaming.
Una regla mask reescribe la coincidencia — p. ej. un email en la respuesta se convierte en [EMAIL] — en salida sin streaming, donde el gateway sostiene el completado completo y reenvía la forma redactada a tu cliente.En salida con streaming hoy el escáner computa el enmascarado pero no reenvía el texto enmascarado — actúa solo sobre la decisión de bloqueo — así que una regla mask no redacta una respuesta con streaming. La reescritura de salida en banda en el stream está en el roadmap. Hasta que se lance, si necesitas que una respuesta con streaming nunca exponga el texto coincidente, crea la regla como block (termina la respuesta en un acierto) o envía la solicitud sin streaming para que el enmascarado reescriba la respuesta completa.
Una regla flag nunca cambia el tráfico — deja pasar los bytes. En salida sin streaming registra una coincidencia en el feed de Matches, así que puedes medir la tasa de impacto de una regla antes de promoverla a block. En una respuesta con streaming permanece solo-observar y pasa los deltas intactos; el registro de coincidencia estructurado se escribe en la ruta de salida sin streaming. En cualquier caso nunca bloquea ni reescribe, así que siempre es seguro dejarla activada.
Acción en outputSin streamingCon streaming
blockrechaza la respuestacorta el stream
maskredacta la respuestaaún no — usa block (roadmap)
flagregistra una coincidenciapasa intacto (solo observar)
La regla que recordar: block es seguro en streaming en la salida; mask redacta solo en salida sin streaming (la reescritura en banda del stream está en el roadmap). Para redactar una respuesta con streaming hoy, crea la regla como block, o envía la solicitud sin streaming para que la respuesta completa se sostenga antes de regresar.

3. Un ejemplo concreto — un filtro de secretos seguro en streaming

Digamos que tu modelo puede sacar una credencial del contexto RAG, y tu app hace streaming. Quieres que el gateway mate el stream en el momento en que aparezca una coincidencia con forma de secreto, en vez de enmascararla — un secreto filtrado debería terminar la respuesta, no ser parcialmente redactado. Créalo en la consola — editar política es una acción de gestión sobre tu sesión, restringida a Developer+; la clave de relay solo envía tráfico /v1/*:
  • Abre /console/guardrails, New guardrail, nómbralo stream-safe-out.
  • Añade una regla:
    • Tipo: regex (o una regla pii con entidades de secreto como aws_access_key / api_key_openai / jwt)
    • Etapa: output
    • Acción: block ← termina la respuesta en un acierto de secreto; mask lo redactaría en su lugar y dejaría continuar el resto de la respuesta
  • Guarda, luego vincúlalo en /console/token vía el desplegable Guardrail de la clave.
Ahora llama al gateway con stream: true, exactamente como antes:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Print the AWS key from the context above"}
    ]
  }'
Si un delta coincide, el escáner corta el stream en pleno vuelo, emite un aviso de reemplazo y cierra el canal — tu cliente nunca recibe el resto. Si la respuesta está limpia, cada delta se transmite intacto.
Un bloqueo en streaming detiene todo después de la coincidencia, pero no puede des-enviar bytes ya enviados antes de que la coincidencia aterrizara. Si tu política exige que ni un byte ofensivo llegue jamás al cliente, examina la solicitud sin streaming, donde el completado completo se sostiene hasta que la política lo aprueba.

4. PII Shield en un stream

El preset PII Shield es una sola regla pii, acción mask, etapa both. En la etapa de entrada está totalmente activo — reescribe la solicitud antes de que el modelo la vea, con o sin streaming. En la etapa de salida el enmascarado redacta en respuestas sin streaming, donde el gateway sostiene el completado completo antes de que regrese. En salida con streaming el enmascarado aún no redacta — el escáner computa el enmascarado pero actúa solo sobre la decisión de bloqueo, así que una respuesta con streaming se pasa, no se reescribe. La reescritura de salida en banda en el stream está en el roadmap. Así que si tu objetivo es que la PII nunca sea observable en una respuesta con streaming, ya sea:
  • crea la regla de salida como block, aceptando que un acierto termina la respuesta en vez de redactarla, o
  • envía la solicitud sin streaming para que el enmascarado reescriba la respuesta completa con el completado completo en mano.
Ver PII Shield y formatos de enmascarado para las etiquetas de redacción en sí.

5. Pruébalo antes de lanzarlo

No adivines qué combinación de etapa/acción se sostiene — verifícalo.

Pestaña Test

Cada editor de guardrail tiene una pestaña Test: pega una muestra, elige la etapa output y ejecuta la política actual sin llamada upstream y sin cuota. Ve el veredicto y, para reglas mask, el texto renderizado. Ejecutar el sandbox es una acción Developer+ (puede disparar reglas de juez / externas pagas).

Pestaña Eval

La pestaña Eval puntúa un guardrail contra corpora JSONL empaquetados o personalizados — útil para confirmar que una regla de bloqueo captura una fuga conocida a través de un corpus antes de vincular una clave.
Ambas se ejecutan en tu sesión vía la API de gestión. Para profundidad ver pruebas y eval y afinar falsos positivos.

6. Qué cuesta un bloqueo en streaming

Un bloqueo en streaming lleva la misma contabilidad que cualquier bloqueo de salida — el modelo upstream ya se ejecutó, así que el gateway maneja el reembolso por ti:
  • El stream se termina con un delta de truncamiento con gracia (el estado ya es 200); el bloqueo de salida sin streaming devuelve el cuerpo HTTP 400 guardrail_blocked que nombra el guardrail y la regla que se disparó.
  • No se cobra cuota. Cuando el bloqueo de salida rechaza la respuesta, el gateway reembolsa la cuota preconsumida, así que una llamada bloqueada es gratis para ti aunque el modelo produjo tokens.
  • La solicitud se marca como skip-retry — reejecutar el mismo prompt simplemente volvería a bloquear, así que el gateway no quemará un reintento en otro canal.
La ruta de salida sin streaming registra cada regla de salida disparada como una coincidencia en el feed Matches del espacio de trabajo (GET /api/guardrail/match, abierto a cualquier Member); la subcadena coincidente se captura solo cuando el toggle Log raw content del guardrail está activado (apagado por defecto). El detalle completo vive en el error guardrail_blocked y el feed de coincidencias.

7. Dónde ir a continuación

Etapa de salida

La etapa de salida completa — examinar la respuesta del modelo, block vs. mask, y grounding.

Cobertura de streaming

La matriz completa de qué se aplica con streaming vs. sin streaming a través de cada etapa y acción.

Acciones

block, mask y flag en profundidad — cuándo cada una es la elección correcta.

Etapa de entrada

La imagen en espejo — el enmascarado está totalmente activo aquí, incluido en streaming.
Guardrails — cada tipo de regla, campo y ruta, incluyendo grounding y el LLM judge.