Entwickeln / Anleitungen
Shield konfigurieren & nutzen
Wie Sie Noirdoc Shield im Portal einrichten, pro Anfrage, API-Schlüssel oder Tag steuern, Texte über /v1/shield/inspect vorab prüfen und von der klassischen Maskierung umsteigen.
Noirdoc Shield prüft eingehende Prompts zustandslos auf den Endpunkten /v1/chat/completions, /v1/responses, /v1/messages, /v1/embeddings und /v1/rerank sowie eigenständig über POST /v1/shield/inspect (+0,40 € je 1 Mio. geprüfter Eingabe-Tokens). Wie die fünf Schutzfilter und die Vorrangfolge im Detail arbeiten, erklärt Noirdoc Shield.
-
Standard-Einstellung und Schutzfilter im Portal einrichten
Admins Ihrer Organisation verwalten Noirdoc Shield unter Models → Shield. Wählen Sie dort zunächst die Standard-Einstellung (
mode):Im Portal API-Wert Wirkung ohne Schlüssel-, Tag- oder Header-Vorgabe Auf Abruf default_offShield ist aus (Standard für neue Organisationen) Standardmäßig aktiv default_onShield prüft jede unterstützte Anfrage Erzwungen enforcedShield ist immer aktiv und nicht abschaltbar Passen Sie darunter die fünf Schutzfilter an:
- Geheimnisse & API-Schlüssel (
secrets, Standard:block, Platzhalter[SECRET]) - Finanz- & Kontaktdaten (
pii, Standard:redact, Platzhalter wie[IBAN],[EMAIL],[PHONE]) - Personennamen & Adressen (
ner, Standard:redact, Platzhalter[PERSON],[ADDRESS]) - Prompt-Injection (
injection, nuroffoderblock, Standard:block, prüftuser- undtool-Segmente) - Eigene Sperrbegriffe (
custom, Standard:redact, Platzhalter[CUSTOM]): bis zu 100 Einträge mit je 2 bis 256 Zeichen. Einfache Zeichenfolgen wie"Projekt Helios"greifen unabhängig von Groß- und Kleinschreibung als Teilstring; Einträge mit dem Präfixre:wie"re:AZ-[0-9]{4}-[0-9]{5}"werden als reguläre Ausdrücke mit linearer Laufzeit ausgewertet (ohne Lookaround oder Rückreferenzen, kein leerer Treffer).
Ergebnis: Ihre Organisation hat eine feste Grundrichtlinie und aktive Schutzfilter. Alternativ verwalten Sie die Richtlinie per API über
/v1/shield/policy(setzt am Schlüssel Shield-Richtlinie per API verwalten voraus, siehe Shield (/v1/shield)). - Geheimnisse & API-Schlüssel (
-
Shield pro Anfrage mit X-Noirdoc-Shield steuern
Übergeben Sie
X-Noirdoc-Shield: onoderoff(Groß- und Kleinschreibung spielt keine Rolle), um Shield für eine einzelne Anfrage ein- oder auszuschalten, sofern die Organisation nicht aufenforcedsteht. Vor der Weiterleitung an den Anbieter entfernt das Gateway den Header.Auf Organisationen mit Noirdoc Shield funktioniert
X-Noirdoc-Maskweiterhin als kompatibler Alias. Auf Bestandsorganisationen im Übergangsbetrieb wähltX-Noirdoc-Shield: ongezielt Noirdoc Shield aus, währendX-Noirdoc-Maskdie klassische Maskierung steuert.Ergebnis: Das Modell erhält geschwärzte Platzhalter wie
[PERSON]oder[IBAN], und die Antwort fließt ohne Verzögerung direkt zurück. In den Antwort-Headern bestätigtX-Noirdoc-Shield: redacted=<n>die Anzahl der Schwärzungen nebenX-Noirdoc-Masked: true.curl -si https://api.noirdoc.de/v1/chat/completions \ -H "Authorization: Bearer $NOIRDOC_API_KEY" \ -H "Content-Type: application/json" \ -H "X-Noirdoc-Shield: on" \ -d '{ "model": "qwen3.8-27b", "messages": [{ "role": "user", "content": "Anna Schmidt, DE89 3704 0044 0532 0130 00" }] }'import os from openai import OpenAI client = OpenAI( base_url="https://api.noirdoc.de/v1", api_key=os.environ["NOIRDOC_API_KEY"], ) prompt = "Anna Schmidt, DE89 3704 0044 0532 0130 00" raw = client.chat.completions.with_raw_response.create( model="qwen3.8-27b", messages=[{"role": "user", "content": prompt}], extra_headers={"X-Noirdoc-Shield": "on"}, ) print(raw.headers.get("x-noirdoc-shield")) # "redacted=2" completion = raw.parse()import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.noirdoc.de/v1", apiKey: process.env.NOIRDOC_API_KEY, }); const prompt = "Anna Schmidt, DE89 3704 0044 0532 0130 00"; const { data, response } = await client.chat.completions .create( { model: "qwen3.8-27b", messages: [{ role: "user", content: prompt }], }, { headers: { "X-Noirdoc-Shield": "on" } }, ) .withResponse(); console.log(response.headers.get("x-noirdoc-shield")); -
Shield je API-Schlüssel, Request-Tag oder SDK-Client festlegen
Statt den Header bei jedem Aufruf mitzusenden, können Sie Shield dauerhaft für eine Anwendung oder einen Mandanten hinterlegen:
- Pro API-Schlüssel: Stellen Sie unter Models → API-Schlüssel das Feld Noirdoc Shield (
shield_mode) auf Aktiv (on) oder Aus (off). Standard (inherit) überlässt die Entscheidung Tags, Header und Organisationsstandard. - Pro Request-Tag: Hinterlegen Sie unter Models → Tags oder über
/v1/tagseinshield_modeje Tag (siehe Request-Tags (Preview)). Bei mehreren Tags inX-Noirdoc-Tagsgewinntonvoroff. - Am SDK-Client: Übergeben Sie
default_headers(Python) bzw.defaultHeaders(TypeScript) beim Erstellen des Clients. Da Shield neben/v1/chat/completions,/v1/responsesund/v1/messagesauch/v1/embeddingsund/v1/rerankprüft, können Sie denselben Client für Chat und Retrieval verwenden. Für Bildgenerierung (/v1/images/generations) nutzen Sie einen eigenen Client ohne diesen Header (dort antwortetX-Noirdoc-Shield: onmit 403masking_not_supported_for_endpoint); Audio und/v1/filesprüft Shield nicht.
Ergebnis: Alle unterstützten Aufrufe des Schlüssels, Tags oder Clients werden einheitlich durch Shield geprüft.
shield_client = OpenAI( base_url="https://api.noirdoc.de/v1", api_key=os.environ["NOIRDOC_API_KEY"], default_headers={"X-Noirdoc-Shield": "on"}, ) # Gilt für Chat, Responses, Messages, Embeddings und Rerank emb = shield_client.embeddings.create( model="text-embedding-3-small", input="Notiz zu Anna Schmidt, Akte AZ-2026-00142", )const shieldClient = new OpenAI({ baseURL: "https://api.noirdoc.de/v1", apiKey: process.env.NOIRDOC_API_KEY, defaultHeaders: { "X-Noirdoc-Shield": "on" }, }); // Gilt für Chat, Responses, Messages, Embeddings und Rerank const emb = await shieldClient.embeddings.create({ model: "text-embedding-3-small", input: "Notiz zu Anna Schmidt, Akte AZ-2026-00142", }); - Pro API-Schlüssel: Stellen Sie unter Models → API-Schlüssel das Feld Noirdoc Shield (
-
Texte eigenständig über POST /v1/shield/inspect prüfen
Bevor Ihre Anwendung Freitext in einer eigenen Vektordatenbank speichert, in Suchindizes übernimmt oder an externe Werkzeuge übergibt, können Sie ihn ohne Modellaufruf über
POST /v1/shield/inspectprüfen (1 bis 64 nicht leere Strings, zusammen höchstens 256 KB UTF-8, berechnet mit 0,40 € je 1 Mio. Eingabe-Tokens).Der Endpunkt antwortet auch bei einem Block-Treffer mit
200 OKund liefertaction("pass","redact"oder"block"), den geschwärzten Text inoutputsowie alle Einzelfunde infindings. Überpolicykönnen Sie für diesen Aufruf eigene Regeln undcustom_patternsübergeben – etwa literale Projektnamen undre:-Muster –, solange eineenforced-Richtlinie der Organisation dadurch nicht abgeschwächt wird (403 shield_policy_enforced).Ergebnis: Sie erhalten den bereinigten Text und die erkannten Kategorien vor jeder Weiterverarbeitung.
curl https://api.noirdoc.de/v1/shield/inspect \ -H "Authorization: Bearer $NOIRDOC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": "Projekt Helios (AZ-2026-00418), Anna Schmidt", "role": "user", "policy": { "rules": { "custom": "redact" }, "custom_patterns": [ "Projekt Helios", "re:AZ-[0-9]{4}-[0-9]{5}" ] } }'import os import httpx key = os.environ["NOIRDOC_API_KEY"] patterns = ["Projekt Helios", "re:AZ-[0-9]{4}-[0-9]{5}"] resp = httpx.post( "https://api.noirdoc.de/v1/shield/inspect", headers={"Authorization": f"Bearer {key}"}, json={ "input": "Projekt Helios (AZ-2026-00418), Anna Schmidt", "role": "user", "policy": { "rules": {"custom": "redact"}, "custom_patterns": patterns, }, }, ) resp.raise_for_status() data = resp.json() if data["action"] == "block": raise RuntimeError("Eingabe durch Shield blockiert") clean_text = data["output"]const url = "https://api.noirdoc.de/v1/shield/inspect"; const patterns = ["Projekt Helios", "re:AZ-[0-9]{4}-[0-9]{5}"]; const resp = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${process.env.NOIRDOC_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ input: "Projekt Helios (AZ-2026-00418), Anna Schmidt", role: "user", policy: { rules: { custom: "redact" }, custom_patterns: patterns, }, }), }); const data = await resp.json(); if (data.action === "block") { throw new Error("Eingabe durch Shield blockiert"); } const cleanText: string = data.output; -
Blockierungen und nicht prüfbare Anhänge im Code behandeln
Auf Modell-Endpunkten meldet Noirdoc Shield zwei spezifische Ablehnungen vor der Weiterleitung:
403 shield_violation: Ein Schutzfilter mit der Aktionblock(standardmäßigsecretsoderinjection) hat angeschlagen;error.messagenennt die ausgelöste Regel. Wiederholen Sie die Anfrage nicht unverändert, sondern weisen Sie die Person in Ihrer Oberfläche darauf hin oder bereinigen Sie die Eingabe.422 shield_uninspectable_content: Die Organisation steht aufenforced, und die Anfrage enthält Inhalte, die Shield nicht als Text lesen kann – etwa PDF-, DOCX- oder XLSX-Dateien, Bilder, Audio, Verweise perfile_id/URL oder eingebettete Textdateien ab 4 MiB. Extrahieren Sie den Text aus Binärdokumenten vorab clientseitig und senden Sie ihn als Nachrichtentext oder als eingebettete UTF-8-Textdatei unter 4 MiB (Details unter Dateien).
Unter
default_onoder einzelner Aktivierung ohneenforcedlässt das Gateway nicht prüfbare Anhänge passieren, prüft alle Textfelder der Anfrage und kennzeichnet die Antwort mitX-Noirdoc-Shield: partial; redacted=<n>undX-Noirdoc-Masked: false.Ergebnis: Ihre Anwendung unterscheidet sauber zwischen blockierten Inhalten und nicht prüfbaren Dateiformaten.
from openai import ( PermissionDeniedError, UnprocessableEntityError, ) try: response = client.chat.completions.create( model="qwen3.8-27b", messages=[{"role": "user", "content": user_prompt}], extra_headers={"X-Noirdoc-Shield": "on"}, ) except PermissionDeniedError as err: if getattr(err, "code", None) == "shield_violation": # Ausgelöste Regel steht in err.message handle_blocked_prompt(err.message) else: raise except UnprocessableEntityError as err: code = getattr(err, "code", None) if code == "shield_uninspectable_content": # Unter enforced: Text vorab aus PDF/Office lesen handle_uninspectable_attachment() else: raiseimport OpenAI from "openai"; try { const response = await client.chat.completions.create( { model: "qwen3.8-27b", messages: [{ role: "user", content: userPrompt }], }, { headers: { "X-Noirdoc-Shield": "on" } }, ); } catch (err) { const code = err instanceof OpenAI.APIError ? err.code : null; if (code === "shield_violation") { handleBlockedPrompt((err as Error).message); } else if (code === "shield_uninspectable_content") { handleUninspectableAttachment(); } else { throw err; } }
Umstieg von der klassischen Maskierung
Bestandsorganisationen mit klassischer Maskierung können diese noch während der Übergangsfrist bis zum 30. November 2026 (2026-11-30T23:59:59Z) nutzen. Bis dahin trägt jede klassisch maskierte Antwort die RFC-8594-Header Deprecation: true und Sunset: Mon, 30 Nov 2026 23:59:59 GMT.
Prüfen Sie vor der Umstellung vier Punkte in Ihrer Integration:
- Einweg-Platzhalter statt Rückübersetzung: Noirdoc Shield ersetzt erkannte Werte dauerhaft durch
[PERSON],[IBAN]oder[CUSTOM]statt<<PERSON_1>>und übersetzt Antworten oder Tool-Aufrufe nicht zurück. Benötigen lokale Tools echte Datensatz-Bezüge, übergeben Sie interne Datenbank-IDs statt Klartextnamen an das Modell. - Direktes Streaming: Da keine Rückübersetzung mehr stattfindet, entfällt der Satzpuffer beim Streaming vollständig.
- Dateien in Anfragen: Shield prüft eingebettete UTF-8-Textdateien unter 4 MiB direkt. Wenn Sie bisher PDF-, DOCX- oder XLSX-Dateien als Base64 über die klassische Dateianalyse geschickt haben, extrahieren Sie deren Text vorab clientseitig – insbesondere bevor Sie
enforcedeinschalten (422 shield_uninspectable_content). - Erweiterte Endpunkte & Abrechnung: Shield schützt zusätzlich
/v1/embeddingsund/v1/rerankund berechnet +0,40 € je 1 Mio. geprüfter Eingabe-Tokens (auch bei BYOK und bei403 shield_violation).
Zum parallelen Testen im laufenden Betrieb senden Sie auf einzelnen Anfragen X-Noirdoc-Shield: on, setzen shield_mode: "on" auf einem Test-Schlüssel bzw. Test-Tag oder rufen POST /v1/shield/inspect auf, während X-Noirdoc-Mask für den übrigen Verkehr weiterhin die klassische Maskierung steuert.
Sind Ihre Tests abgeschlossen, stellen Admins die Organisation unter Models → Shield per Klick auf Jetzt auf Noirdoc Shield umstellen oder per PUT / PATCH /v1/shield/policy dauerhaft um (legacy_mask_active: false). Nach dem 2026-11-30T23:59:59Z laufen alle verbleibenden Organisationen automatisch auf Noirdoc Shield.
# Gezielt Noirdoc Shield für eine einzelne Anfrage testen
curl https://api.noirdoc.de/v1/chat/completions \
-H "Authorization: Bearer $NOIRDOC_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Noirdoc-Shield: on" \
-d '{
"model": "qwen3.8-27b",
"messages": [{
"role": "user",
"content": "Rückruf an Anna Schmidt: +49 30 1234567"
}]
}'Fehler
| Status | Code | Bedeutung |
|---|---|---|
| 403 | shield_violation | Noirdoc Shield hat die Anfrage vor der Weiterleitung an den Anbieter blockiert, weil ein aktiver Schutzfilter mit der Aktion block angeschlagen hat; message nennt die ausgelöste Regel (secrets, pii, ner, injection oder custom). |
| 403 | shield_policy_enforced | Die Shield-Richtlinie der Organisation steht auf enforced, und die Anfrage auf /v1/shield/inspect versucht über policy eine aktive Regel abzuschwächen oder eigene Sperrbegriffe wegzulassen. |
| 403 | masking_not_supported_for_endpoint | Der Endpunkt unterstützt weder Noirdoc Shield noch die klassische Maskierung, aber die Richtlinie steht auf enforced oder die Anfrage sendet X-Noirdoc-Mask: on (auf /v1/images/generations auch X-Noirdoc-Shield: on). Während der Übergangsfrist der klassischen Maskierung bis zum 30.11.2026 betrifft das auf Bestandsorganisationen ohne Shield auch /v1/embeddings und /v1/rerank. |
| 403 | insufficient_key_permissions | Dem API-Schlüssel fehlt die Berechtigung für /v1/tags (can_manage_tags) oder /v1/shield/policy (can_manage_shield), ein Schlüssel mit fest aktiviertem Shield (shield_mode: on) versucht die Shield-Richtlinie oder shield_mode eines Tags abzuschwächen, oder das Tag soll weiter reichende Modelle, Anbieter oder Compliance-Regeln erhalten als der aufrufende Schlüssel selbst besitzt. |
| 413 | shield_input_too_large | Der zu prüfende Text der Anfrage überschreitet das Limit des Shield-Dienstes von 4 MiB kodiertem Text in einem Aufruf. |
| 422 | shield_uninspectable_content | Die Shield-Richtlinie steht auf enforced, und die Anfrage enthält Inhalte, die Shield nicht als Text prüfen kann (binary_document wie PDF oder Office, media_not_inspectable wie Bilder, Audio oder Video, file_reference per ID oder URL, file_too_large ab 4 MiB, file_not_decodable oder unrecognised_content). Das Gateway hat die Anfrage nicht weitergeleitet. |
| 503 | shield_unavailable | Der Noirdoc-Shield-Prüfdienst ist vorübergehend nicht erreichbar; das Gateway leitet eine zu prüfende Anfrage niemals ungeprüft weiter (Fail-closed). Die Antwort enthält Retry-After mit 5 Sekunden. |