Przejdź do głównej treści
Większość produkcyjnych aplikacji czatu strumieniuje. Tokeny wypychają się do przeglądarki, gdy model je emituje, więc zanim odpowiedź jest “skończona”, twój użytkownik już przeczytał jej większość. To łamie naiwny model myślowy filtra treści, który inspekcjonuje całą odpowiedź, a potem decyduje — nie ma całej odpowiedzi do inspekcji, dopóki nie jest za późno. Filtr treści streamingowego llm musi podjąć decyzję na deltach, gdy płyną. Ta strona jest dokładnie o tym przypadku: jak każda akcja na etapie wyjścia zachowuje się bezpiecznie dla streamingu na bramie OrcaRouter i jak autorzyć politykę, która trzyma na ruchu SSE. Pełny silnik — każdy typ reguły, pole i trasę — znajdziesz w Guardrails.

1. Problem filtra treści streamingowego llm

Guardrail na etapie wyjścia sprawdza odpowiedź modelu. Na żądaniu nie-streamingowym to proste: brama ma pełną odpowiedź, zanim jeden bajt wróci, więc może ją zablokować, zamaskować lub przepuścić czysto. Streaming to odwraca. Odpowiedź przybywa jako sekwencja delt SSE, każda przesyłana do twojego klienta, gdy tylko wyląduje, więc filtr, który czeka na koniec, niczego nie filtruje. Odpowiedzią OrcaRouter jest skaner strumienia: gdy delty wyjścia płyną, skaner uruchamia twoje reguły na etapie wyjścia wobec akumulującego się tekstu i działa w chwili, gdy reguła zadziała — nie po zakończeniu strumienia. Akcja, którą autorzysz, decyduje, co “działa” znaczy: block przecina strumień, a flag go przepuszcza. mask redaguje na wyjściu nie-streamingowym, ale przepisywanie strumienia w paśmie jest w planach — na strumieniu dziś skaner oblicza maskę, ale działa tylko na decyzji block, więc reguła mask nie redaguje jeszcze strumieniowanej odpowiedzi.
To zastrzeżenie ma znaczenie tylko dla reguł na etapie wyjścia na żądaniach streamingowych. Reguły na etapie wejścia sprawdzają żądanie przed uruchomieniem modelu, więc są w pełni żywe, w tym maskowanie — a dowolna reguła wyjścia na żądaniu nie-streamingowym widzi całą odpowiedź i zachowuje się normalnie, w tym mask.

2. Co jest bezpieczne dla streamingu dziś

Reguła block jest egzekwowana na wyjściu streamingowym i nie-streamingowym. Na strumieniu skaner obserwuje delty; gdy reguła block zadziała, przecina strumień — pieczętuje skaner, emituje krótkie powiadomienie zastępcze ([response truncated by guardrail: … policy violation]) jako finalną deltę i zamyka kanał SSE, zanim jakakolwiek dalsza zablokowana treść dotrze do klienta. Ponieważ status odpowiedzi HTTP jest już zatwierdzony na 200 w chwili, gdy pierwsza delta się wypchnęła, blokada w środku strumienia nie może ponownie wystawić statusu — łagodnie kończy otwarty strumień. Ciało HTTP 400 guardrail_blocked to kształt blokady wyjścia nie-streamingowej.Bajty już wypchnięte do klienta nie mogą być cofnięte, więc blokada streamingowa jest best-effort wobec tego, co już się przesłało, ale niezawodnie zatrzymuje wszystko po dopasowaniu. Po twardą gwarancję, że żaden obraźliwy bajt nigdy nie zostanie wysłany — i po ciało 400 guardrail_blocked — wysyłaj żądanie nie-streamingowe.
Reguła mask przepisuje dopasowanie — np. email w odpowiedzi staje się [EMAIL] — na wyjściu nie-streamingowym, gdzie brama trzyma całą odpowiedź i przesyła zredagowaną formę do twojego klienta.Na wyjściu streamingowym dziś skaner oblicza maskę, ale nie przesyła zamaskowanego tekstu — działa tylko na decyzji block — więc reguła mask nie redaguje strumieniowanej odpowiedzi. Przepisywanie wyjścia streamingowego w paśmie jest w planach. Dopóki nie wyjdzie, jeśli potrzebujesz, by strumieniowana odpowiedź nigdy nie ujawniła dopasowanego tekstu, autorzuj regułę jako block (kończy odpowiedź na trafieniu) lub wysyłaj żądanie nie-streamingowe, by maska przepisała pełną odpowiedź.
Reguła flag nigdy nie zmienia ruchu — przepuszcza bajty. Na wyjściu nie-streamingowym rejestruje dopasowanie w strumieniu Matches, więc możesz zmierzyć wskaźnik trafień reguły, zanim promujesz ją do block. Na odpowiedzi streamingowej pozostaje tylko-obserwacja i przepuszcza delty nietknięte; ustrukturyzowany zapis dopasowania jest zapisywany na ścieżce wyjścia nie-streamingowej. Tak czy inaczej nigdy nie blokuje ani nie przepisuje, więc zawsze bezpiecznie zostawić ją włączoną.
Akcja na outputNie-streamingStreaming
blockodrzuca odpowiedźprzecina strumień
maskredaguje odpowiedźjeszcze nie — zamiast tego block (plany)
flagrejestruje dopasowanieprzepuszcza (tylko obserwacja)
Jedna reguła do zapamiętania: block jest bezpieczne dla streamingu na wyjściu; mask redaguje wyłącznie na wyjściu nie-streamingowym (przepisywanie strumienia w paśmie jest w planach). Aby zredagować strumieniowaną odpowiedź dziś, autorzuj regułę jako block lub wysyłaj żądanie nie-streamingowe, by cała odpowiedź była trzymana, zanim wróci.

3. Jeden konkretny przykład — bezpieczny dla streamingu filtr sekretów

Powiedzmy, że twój model może wydobyć poświadczenie z kontekstu RAG, a twoja aplikacja strumieniuje. Chcesz, by brama zabiła strumień w chwili, gdy pojawi się dopasowanie w kształcie sekretu, zamiast go maskować — wyciekły sekret powinien zakończyć odpowiedź, nie być częściowo zredagowany. Autorzuj to w konsoli — edycja polityki to akcja zarządzania w twojej sesji, bramkowana do Developer+; klucz relay tylko wysyła ruch /v1/*:
  • Otwórz /console/guardrails, New guardrail, nazwij go stream-safe-out.
  • Dodaj jedną regułę:
    • Typ: regex (lub reguła pii z encjami sekretów jak aws_access_key / api_key_openai / jwt)
    • Etap: output
    • Akcja: block ← kończy odpowiedź na trafieniu sekretu; mask zamiast tego by go zredagował i pozwolił reszcie odpowiedzi kontynuować
  • Zapisz, potem powiąż go na /console/token przez rozwijaną listę Guardrail klucza.
Teraz wywołaj bramę z stream: true, dokładnie jak wcześniej:
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"}
    ]
  }'
Jeśli delta się dopasuje, skaner przecina strumień w locie, emituje powiadomienie zastępcze i zamyka kanał — twój klient nigdy nie otrzymuje reszty. Jeśli odpowiedź jest czysta, każda delta strumieniuje się nietknięta.
Blokada streamingowa zatrzymuje wszystko po dopasowaniu, ale nie może cofnąć bajtów już wypchniętych, zanim dopasowanie wylądowało. Jeśli twoja polityka wymaga, by ani jeden obraźliwy bajt nigdy nie dotarł do klienta, sprawdzaj żądanie nie-streamingowo, gdzie cała odpowiedź jest trzymana, dopóki polityka jej nie przepuści.

4. PII Shield na strumieniu

Preset PII Shield to pojedyncza reguła pii, akcja mask, etap both. Na etapie wejścia jest w pełni żywy — przepisuje żądanie, zanim model je zobaczy, streaming lub nie. Na etapie wyjścia maskowanie redaguje na odpowiedziach nie-streamingowych, gdzie brama trzyma całą odpowiedź, zanim wróci. Na wyjściu streamingowym maska nie redaguje jeszcze — skaner oblicza maskę, ale działa tylko na decyzji block, więc strumieniowana odpowiedź jest przepuszczana, nie przepisywana. Przepisywanie wyjścia streamingowego w paśmie jest w planach. Więc jeśli twoim celem jest, by PII nigdy nie było obserwowalne w strumieniowanej odpowiedzi, albo:
  • autorzuj regułę wyjścia jako block, akceptując, że trafienie kończy odpowiedź, a nie redaguje ją, albo
  • wysyłaj żądanie nie-streamingowe, by maska przepisała pełną odpowiedź z całą odpowiedzią w ręku.
Zobacz PII Shield i formaty maskowania po same tagi redakcji.

5. Udowodnij to, zanim wyślesz

Nie zgaduj, która kombinacja etap/akcja trzyma — zweryfikuj ją.

Zakładka Test

Każdy edytor guardrail ma zakładkę Test: wklej próbkę, wybierz etap output i uruchom bieżącą politykę bez wywołania w górę i bez kwoty. Zobacz werdykt i, dla reguł mask, wyrenderowany tekst. Uruchamianie piaskownicy to akcja Developer+ (może odpalać płatne reguły judge / external).

Zakładka Eval

Zakładka Eval ocenia guardrail wobec dołączonych lub niestandardowych korpusów JSONL — przydatne, by potwierdzić, że reguła block wychwytuje znany wyciek w korpusie, zanim powiążesz klucz.
Oba biegną w twojej sesji przez management API. Po głębię zobacz testowanie i eval i strojenie fałszywie pozytywnych.

6. Co kosztuje blokada streamingowa

Blokada streamingowa niesie tę samą księgowość co każda blokada wyjścia — model nadrzędny już przebiegł, więc brama obsługuje zwrot za ciebie:
  • Strumień jest kończony łagodną deltą obcięcia (status jest już 200); blokada wyjścia nie-streamingowa zwraca ciało HTTP 400 guardrail_blocked nazywające guardrail i regułę, która zadziałała.
  • Żadna kwota nie jest naliczana. Gdy blokada wyjścia odrzuca odpowiedź, brama zwraca wstępnie pobraną kwotę, więc zablokowane wywołanie jest dla ciebie darmowe, mimo że model wyprodukował tokeny.
  • Żądanie jest oznaczone jako skip-retry — ponowne uruchomienie tego samego promptu po prostu znów by zablokowało, więc brama nie spali ponowienia na innym kanale.
Ścieżka wyjścia nie-streamingowa rejestruje każdą uruchomioną regułę wyjścia jako dopasowanie w strumieniu Matches przestrzeni roboczej (GET /api/guardrail/match, otwarty dla każdego Member); dopasowany podłańcuch jest przechwytywany tylko, gdy przełącznik Log raw content guardrail jest włączony (domyślnie wyłączony). Pełny szczegół żyje w błędzie guardrail_blocked i strumieniu dopasowań.

7. Dokąd dalej

Etap wyjścia

Pełny etap wyjścia — sprawdzanie odpowiedzi modelu, block vs. mask i grounding.

Pokrycie streamingu

Kompletna macierz tego, co jest egzekwowane na streamingu vs. nie-streamingu we wszystkich etapach i akcjach.

Akcje

block, mask i flag w głąb — kiedy każda jest właściwym wyborem.

Etap wejścia

Lustrzane odbicie — maskowanie jest tu w pełni żywe, w tym na streamingu.
Guardrails — każdy typ reguły, pole i trasa, w tym grounding i sędzia LLM.