Chuyển đến nội dung chính
Nếu app của bạn stream, bạn cần một câu trả lời thẳng thắn trước khi bạn tin một chính sách nội dung: cái gì thực sự được thực thi trên một phản hồi SSE. Một guardrail kiểm tra một phản hồi toàn bộ dễ suy luận; một guardrail phải hành động trên các delta khi chúng tuôn ra trình duyệt thì không. Trang này là ma trận phạm vi guardrail streaming — mọi hành động, trên các giai đoạn input và output, trên traffic streaming và non-streaming — được viết để chính xác về cách mỗi ô hành xử trên một stream trực tiếp. Về engine đầy đủ — mọi loại quy tắc, trường, và route — xem Guardrails. Về cơ chế cách một stream bị cắt, xem quy tắc an toàn-stream.

1. Câu hỏi phạm vi guardrail streaming

Một quy tắc guardrail mang một giai đoạn (input, output, hoặc both) và một hành động — một trong năm: block, mask, flag, annotate, hoặc spotlight. Giai đoạn quyết định khi nào gateway chạy nó; hành động quyết định nó làm gì. Nơi duy nhất streaming thay đổi hình dạng của câu trả lời là giai đoạn output — vì đó là giai đoạn duy nhất nơi gateway đang chuyển tiếp các byte tới client của bạn khi chúng đến, không có cơ hội giữ toàn bộ payload trước. Nên ma trận có hai ô nơi streaming quan trọng, và chúng hành xử khác nhau: block output hoàn toàn được thực thi trên một stream (scanner cắt nó), nhưng mask output chỉ được thực thi trên phản hồi non-streaming. Trên một phản hồi streaming, scanner vẫn phát hiện match và có thể hành động trên một quyết định block, nhưng nó không viết lại văn bản đã che vào stream hôm nay — masking output streaming trong luồng nằm trong lộ trình.
Input không bao giờ là vấn đề. Quy tắc giai đoạn input chạy trước mô hình — gateway sàng lọc (và, với mask, viết lại) request của bạn, rồi chuyển tiếp phiên bản đã làm sạch lên thượng nguồn. Việc phản hồi có stream hay không không liên quan; request là một payload hoàn chỉnh mà gateway giữ đầy đủ. Quét input hoàn toàn trực tiếp, gồm cả masking, trên mọi request.

2. Ma trận phạm vi

Đọc cái này từ trên xuống dưới. Mọi ô block trực tiếp, gồm cả streaming — nhưng output + mask + streaming là ô duy nhất không được thực thi trong stream: một quy tắc mask redact một phản hồi non-streaming, và trên một phản hồi streaming nó phát hiện match mà không viết lại delta (masking output trong-stream nằm trong lộ trình).
Giai đoạn · hành độngNon-streamingStreaming
input · blocktừ chối requesttừ chối request
input · maskviết lại requestviết lại request
output · blocktừ chối phản hồicắt stream
output · maskredact phản hồiphát hiện match; không redact trong-stream (lộ trình)
bất kỳ · flagchỉ ghi lạichỉ ghi lại
annotatespotlight gắn một ghi chú (hoặc bọc văn bản đã match) mà không từ chối traffic và là các hành động giai đoạn input trên thực tế, nên chúng không thay đổi các ô output/streaming ở trên; chúng ghi lại một match như bất kỳ quy tắc nào khác.
Quy tắc giai đoạn input sàng lọc request trước khi mô hình thượng nguồn chạy. Một block ngắn mạch cuộc gọi (HTTP 400 guardrail_blocked, trước khi đo lường, nên nó không tốn quota). Một mask viết lại các trường đã match trong prompt tại chỗ — văn bản đã làm sạch là cái đi lên thượng nguồn, và mô hình không bao giờ thấy bản gốc. Không cái nào trong số này phụ thuộc vào việc phản hồi có stream hay không.
Trên một phản hồi non-streaming, completion được sàng lọc đầy đủ trước khi nó trả về — một block hiện ra như HTTP 400 guardrail_blocked. Trên một phản hồi streaming, một stream scanner theo dõi các delta khi chúng tuôn chảy; khi một quy tắc block kích hoạt, nó cắt stream — niêm phong scanner, phát một thông báo thay thế ngắn thay cho phần còn lại, và đóng kênh SSE trước khi nội dung bị block nữa đến client. Vì các header SSE 200 đã ra đi đến lúc đó, một block streaming không thể trả về một 400: nó giao block như một delta cuối trong luồng thay vì một lỗi HTTP.
Trên một phản hồi non-streaming, một quy tắc mask viết lại completion — ví dụ một email trở thành [EMAIL] — và văn bản đã làm sạch là cái client của bạn nhận. Trên một phản hồi streaming, stream scanner vẫn phát hiện match và tính toán mask, nhưng nó không chuyển tiếp văn bản đã che vào delta — output đã che bị loại bỏ và chỉ một quyết định block được hành động. Nên một quy tắc mask không redact một phản hồi streaming hôm nay; masking output streaming trong luồng nằm trong lộ trình. Nếu bạn cần PII được giữ khỏi một phản hồi streamed ngay bây giờ, soạn quy tắc thành block (scanner cắt stream khi match) hoặc sàng lọc non-streaming.
Một quy tắc flag không bao giờ thay đổi traffic — nó ghi lại một match và cho các byte đi qua. Giai đoạn và stream không thay đổi hành vi của nó. Dùng nó để đo tỷ lệ kích hoạt của một quy tắc trước khi bạn thăng cấp nó lên block.
Một dòng cần nhớ: block output được thực thi trực tiếp trên cả hai phương thức truyền — gồm cả streaming — và masking input luôn trực tiếp. mask output chỉ redact phản hồi non-streaming; trên một stream nó phát hiện match nhưng chưa viết lại delta (masking output trong-stream nằm trong lộ trình). Để giữ PII khỏi một phản hồi streamed hôm nay, soạn quy tắc thành block hoặc sàng lọc non-streaming.

3. Một ví dụ cụ thể — giữ PII khỏi một phản hồi streamed

Giả sử mô hình có thể hiện một email khách hàng từ context RAG, và app của bạn stream. mask output không redact trong stream hôm nay (masking output trong-stream nằm trong lộ trình) — nên để giữ PII khỏi một phản hồi streamed, soạn quy tắc output thành block: scanner giết stream ngay khi một match xuất hiện. (mask output có redact trên một phản hồi non-streaming.) Chỉnh sửa chính sách là một hành động quản lý trên phiên console của bạn (gate cho Developer+); relay key sk-orca-... chỉ gửi traffic /v1/* và không bao giờ chỉnh sửa chính sách.
  • Mở /console/guardrails, New guardrail, đặt tên nó stream-pii-out.
  • Thêm một quy tắc:
    • Type: PII detection
    • Stage: output
    • Action: block ← cắt stream khi match; trên một stream mask chỉ phát hiện (nó redact phản hồi non-streaming)
  • Lưu, rồi gắn nó trên /console/token qua dropdown Guardrail của key.
Giờ gọi gateway với stream: true, y như trước:
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": "Email the customer from the record above"}
    ]
  }'
Nếu một delta match, scanner cắt stream, phát một thông báo thay thế, và đóng kênh — client không bao giờ nhận phần còn lại. Nếu phản hồi sạch, mọi delta stream qua không bị động đến.
Một block streaming chặn mọi thứ sau match, nhưng nó không thể un-gửi các byte đã tuôn ra trước khi match đáp xuống. Nếu chính sách của bạn đòi rằng không một byte vi phạm nào từng đến client, sàng lọc request non-streaming, nơi toàn bộ completion được giữ cho đến khi chính sách thông qua nó.

4. PII Shield trên ma trận

Preset PII Shield là một quy tắc pii duy nhất, hành động mask, giai đoạn both. Ánh xạ nó lên ma trận và phạm vi chính xác như bạn kỳ vọng từ §2:
  • Giai đoạn input — hoàn toàn trực tiếp, dù streaming hay không. Request được che trước khi mô hình thấy nó (giá trị tiêu đề của masking input).
  • Giai đoạn output, non-streaming — completion được che trước khi nó trả về.
  • Giai đoạn output, streaming — stream scanner phát hiện match nhưng không viết lại delta hôm nay, nên dạng đã che không đến một client streamed (masking output trong-stream nằm trong lộ trình).
Nên preset mask không bao quát PII ra khỏi một phản hồi streamed tự nó. Để giữ PII khỏi một phản hồi streamed, soạn quy tắc đó thành block (hoặc gọi non-streaming) để stream bị cắt khi match. Xem PII Shieldđịnh dạng masking.

5. Một block streaming tốn gì

Một block streaming mang cùng kế toán như bất kỳ block output nào — mô hình đã chạy, nên gateway xử lý hoàn lại cho bạn:
  • Trên một phản hồi non-streaming, cuộc gọi trả về HTTP 400 guardrail_blocked nêu tên guardrail và quy tắc đã kích hoạt. Trên một phản hồi streaming, các header SSE 200 đã trên dây, nên block đến như một delta thay thế trong luồng cuối và một lần đóng kênh sạch sẽ thay vì một 400.
  • Không tính quota. Một block input kích hoạt trước khi đo lường; một block output (streaming hay không) hoàn lại quota đã tiêu trước khi phản hồi bị từ chối. Dù cách nào, người gọi không trả gì.
  • Request được đánh dấu skip-retry — chạy lại cùng prompt sẽ chỉ block lại, nên gateway sẽ không đốt một retry trên một channel khác.
Mỗi quy tắc output kích hoạt cũng ghi lại một match trong feed Matches của workspace (GET /api/guardrail/match, mở cho bất kỳ Member nào); chuỗi con đã match chỉ được bắt khi công tắc Log raw content của guardrail được bật (mặc định tắt). Chi tiết đầy đủ nằm trong lỗi guardrail_blockedmatches feed.

6. Chứng minh tổ hợp giai đoạn/hành động của bạn trước khi phát hành

Đừng đoán ô nào của ma trận áp dụng cho chính sách của bạn — xác minh nó. Cả hai công cụ chạy trên phiên console của bạn qua management API:

Tab Test

Mỗi editor guardrail có một tab Test: dán một mẫu, chọn giai đoạn, và chạy chính sách hiện tại không có cuộc gọi thượng nguồn và không quota. Xem verdict và, với quy tắc mask, văn bản đã render. Sandbox Test được gate cho Developer+ (nó có thể kích hoạt các cuộc gọi judge/grounding trả phí và các request tích hợp đi ra ngoài).

Tab Eval

Tab Eval chấm một guardrail đối với các corpus JSONL đi kèm hoặc tùy chỉnh — hữu ích để xác nhận một quy tắc block bắt một rò rỉ đã biết trước khi bạn gắn một key. Chạy một eval chỉ cần quyền đọc (viewer+).
Xem testing & evaltinh chỉnh dương tính giả về chiều sâu.

7. Đi đâu tiếp theo

Quy tắc an toàn-stream

Cách scanner cắt một SSE stream giữa chừng, và cách soạn một chính sách giữ vững trên traffic streaming.

Giai đoạn output

Sàng lọc phản hồi của mô hình — block so với mask, hoàn lại quota, và grounding.

Giai đoạn input

Sàng lọc request trước mô hình — gồm cả masking, dù streaming hay không.

Hành động

block, mask, flag, annotate, và spotlight chuyên sâu — khi nào mỗi cái là lựa chọn đúng.
Guardrails — mọi loại quy tắc, trường, và route, bao gồm grounding và LLM judge.