Nutze die Moderationsmodelle von OpenAI, um schädliche Inhalte in Texten und Bildern zu erkennen. Du kannst eigenständige Eingaben mit dem Moderationsendpunkt klassifizieren oder Moderationsscores zusammen mit einer generierten Antwort anfordern. Nutze die Ergebnisse, um die Richtlinien deiner Anwendung durchzusetzen, etwa indem du Inhalte filterst, Anfragen zur Überprüfung weiterleitest oder Maßnahmen gegen Konten ergreifst, die markierte Inhalte einreichen.
Das Modell omni-moderation-latest akzeptiert Text- und Bildeingaben. Audio klassifiziert es nicht. Der Moderationsendpunkt ist kostenlos nutzbar. Bilddateien dürfen bis zu 20 MB groß sein.
Kinderschutz: Sende keine bekannten oder mutmaßlichen Darstellungen sexuellen Kindesmissbrauchs (CSAM) an die Moderation API. Die API ist weder für die Erkennung noch für den Umgang mit CSAM ausgelegt und ersetzt keine speziellen Schutzmaßnahmen für Kinder. Unsere Hinweise zu CSAM erläutern, wie du CSAM vorbeugen, entsprechendes Material erkennen, darauf reagieren und es melden kannst.
Deine Anwendung muss wissen, welche Kategorien schädlicher Inhalte für Texte, Bilder oder beides gelten.
Generierte Inhalte moderieren
Wenn deine Anwendung generierten Text und Moderationsscores zusammen benötigt, übergib in der Generierungsanfrage ein moderation-Objekt auf oberster Ebene. Die API gibt Moderationsscores für die Modelleingabe und die generierte Ausgabe zurück, ohne dass eine separate Moderationsanfrage nötig ist.
Das Modell generiert weiterhin wie gewohnt. Prüfe die Moderationsergebnisse, bevor du die Ausgabe einer Person anzeigst oder nachgelagerte Aktionen ausführst.
Lege moderation.model fest, wenn du eine Antwort erstellst:
Eine Antwort mit Moderationsscores generieren
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import OpenAI from "openai";const client = new OpenAI();const response = await client.responses.create({ model: "gpt-6-astra", input: [ { role: "user", content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", }, ], moderation: { model: "omni-moderation-latest" },});const inputModeration = response.moderation.input;const outputModeration = response.moderation.output;if (inputModeration.type === "error") { throw new Error(inputModeration.message);}if (outputModeration.type === "error") { throw new Error(outputModeration.message);}console.log(inputModeration.flagged);console.log(outputModeration.flagged);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27from openai import OpenAIclient = OpenAI()response = client.responses.create(model="gpt-6-astra",input=[ {"role": "user","content": ("A user asks for instructions to make a harmful weapon. ""Draft a brief refusal and offer a safer alternative." ), } ],moderation={"model": "omni-moderation-latest"},)input_moderation = response.moderation.inputoutput_moderation = response.moderation.outputif input_moderation.type =="error":raiseRuntimeError(input_moderation.message)if output_moderation.type =="error":raiseRuntimeError(output_moderation.message)print(input_moderation.flagged)print(output_moderation.flagged)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.JsonValue;import com.openai.models.responses.ResponseCreateParams;import java.util.ArrayList;import java.util.List;import java.util.Map;ResponseCreateParams params = ResponseCreateParams.builder() .model("gpt-6-astra") .input( "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.") .putAdditionalBodyProperty( "moderation", JsonValue.from(Map.of("model", "omni-moderation-latest"))) .build();var response = client.responses().create(params);var moderation = response .moderation() .orElseThrow( () -> new IllegalStateException("The response did not include moderation results"));List<Boolean> flags = new ArrayList<>();var input = moderation.input();if (input.isError()) { throw new IllegalStateException(input.asError().message());}if (!input.isModerationResult()) { throw new IllegalStateException("Missing input moderation flag");}flags.add(input.asModerationResult().flagged());var output = moderation.output();if (output.isError()) { throw new IllegalStateException(output.asError().message());}if (!output.isModerationResult()) { throw new IllegalStateException("Missing output moderation flag");}flags.add(output.asModerationResult().flagged());flags.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", moderation: { model: "omni-moderation-latest" })puts(response.moderation)
Die Responses API gibt unter response.moderation.input ein moderation_result-Objekt für die Eingabe und unter response.moderation.output ein moderation_result-Objekt für die Ausgabe zurück.
Lege moderation.model fest, wenn du eine Chat Completion erstellst:
Eine Chat Completion mit Moderationsscores generieren
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import OpenAI from "openai";const client = new OpenAI();const completion = await client.chat.completions.create({ model: "gpt-6-astra", messages: [ { role: "user", content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", }, ], moderation: { model: "omni-moderation-latest" },});const inputResult = completion.moderation.input;const outputResult = completion.moderation.output;if (inputResult.type === "error") throw new Error(inputResult.message);if (outputResult.type === "error") throw new Error(outputResult.message);const inputModeration = inputResult.results[0];const outputModeration = outputResult.results[0];console.log(inputModeration.flagged);console.log(outputModeration.flagged);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30from openai import OpenAIclient = OpenAI()completion = client.chat.completions.create(model="gpt-6-astra",messages=[ {"role": "user","content": ("A user asks for instructions to make a harmful weapon. ""Draft a brief refusal and offer a safer alternative." ), } ],moderation={"model": "omni-moderation-latest"},)input_result = completion.moderation.inputoutput_result = completion.moderation.outputif input_result.type =="error":raiseRuntimeError(input_result.message)if output_result.type =="error":raiseRuntimeError(output_result.message)input_moderation = input_result.results[0]output_moderation = output_result.results[0]print(input_moderation.flagged)print(output_moderation.flagged)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.JsonValue;import com.openai.models.chat.completions.ChatCompletionCreateParams;import java.util.ArrayList;import java.util.List;import java.util.Map;ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() .model("gpt-6-astra") .addUserMessage( "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.") .putAdditionalBodyProperty( "moderation", JsonValue.from(Map.of("model", "omni-moderation-latest"))) .build();var completion = client.chat().completions().create(params);var moderation = completion .moderation() .orElseThrow( () -> new IllegalStateException("The completion did not include moderation results"));List<Boolean> flags = new ArrayList<>();var input = moderation.input();if (input.isError()) { throw new IllegalStateException(input.asError().message());}if (!input.isModerationResults() || input.asModerationResults().results().isEmpty()) { throw new IllegalStateException("Missing input moderation flag");}flags.add(input.asModerationResults().results().get(0).flagged());var output = moderation.output();if (output.isError()) { throw new IllegalStateException(output.asError().message());}if (!output.isModerationResults() || output.asModerationResults().results().isEmpty()) { throw new IllegalStateException("Missing output moderation flag");}flags.add(output.asModerationResults().results().get(0).flagged());flags.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16require "openai"client = OpenAI::Client.newcompletion = client.chat.completions.create( model: "gpt-6-astra", messages: [ { role: :user, content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative." } ], moderation: { model: "omni-moderation-latest" })puts(completion.moderation)
Chat Completions gibt unter completion.moderation.input und completion.moderation.output Container mit Moderationsergebnissen zurück. Bei einer Anfrage mit einer einzigen generierten Antwortvariante liest du das jeweils erste Ergebnis für Eingabe und Ausgabe unter results[0] aus. Wenn du mehrere Antwortvarianten anforderst, entspricht completion.moderation.output.results[i] der Variante completion.choices[i].
Inline-Moderationsergebnisse verwenden dieselben Kategoriefelder wie ein eigenständiges Moderationsergebnis. Nutze zunächst flagged für eine erste Entscheidung. Prüfe anschließend categories und category_scores, etwa für die Protokollierung, die Weiterleitung, Audit-Trails oder Warteschlangen für die menschliche Überprüfung. Auch eine Ablehnung oder eine andere sicherheitsbewusste Antwort kann eine Markierung auslösen, wenn sie schädliche Inhalte thematisiert. Betrachte Moderationsscores als Signale zur Anwendung deiner Richtlinien, nicht als automatische Entscheidung zum Blockieren.
Prüfe den Typ des Moderationsergebnisses, bevor du Scores ausliest, wenn deine Anwendung Moderationsfehler behandeln muss. Kann ein Moderationsschritt nicht abgeschlossen werden, kann das entsprechende Moderationsfeld für die Eingabe oder Ausgabe einen Fehler anstelle von Moderationsscores enthalten.
Bei Anfragen mit Tool-Aufrufen umfasst die Moderation die Argumente der Tool-Aufrufe und die Tool-Ausgaben, sofern sie im Gesprächsinhalt vorkommen. Tool-Namen, Tool-Beschreibungen, Tool-Schemas und Schemas für das Antwortformat werden nicht erfasst.
Wenn du eine generierte Antwort streamst, treffen die Moderationsscores erst ein, wenn die vollständige generierte Ausgabe vorliegt. In den Deltas der Teilausgaben sind sie nicht enthalten.
Hier siehst du eine vollständige Beispielausgabe für ein Einzelbild aus einem Kriegsfilm. Das Modell erkennt Anzeichen von Gewalt im Bild und vergibt für die Kategorie violence einen Score von über 0,8.
Die JSON-Antwort enthält Felder, die angeben, welche Kategorien in der Eingabe vorkommen und wie sicher sich das Modell bei der jeweiligen Zuordnung ist.
Ausgabekategorie
Beschreibung
flagged
Wird auf true gesetzt, wenn das Modell den Inhalt als potenziell schädlich einstuft,
andernfalls auf false.
categories
Enthält ein Dictionary mit Markierungen für Verstöße je Kategorie.
Für jede Kategorie ist der Wert true, wenn das Modell einen Verstoß
in der entsprechenden Kategorie markiert, andernfalls false.
category_scores
Enthält ein Dictionary mit Scores je Kategorie. Jeder Score gibt an, wie sicher sich das Modell ist, dass die Eingabe Inhalte der jeweiligen Kategorie enthält. Der Wert liegt zwischen 0 und 1. Höhere Werte bedeuten eine höhere Konfidenz.
category_applied_input_types
Enthält die Eingabetypen, für die der Kategoriescore gilt.
Gilt beispielsweise die Kategorie violence/graphic sowohl für Bild- als auch für Texteingaben,
wird die Eigenschaft violence/graphic auf ["image", "text"] gesetzt.
Wir planen, das zugrunde liegende Modell des Moderationsendpunkts kontinuierlich zu verbessern.
Deshalb müssen benutzerdefinierte Richtlinien, die auf category_scores basieren,
im Laufe der Zeit möglicherweise neu kalibriert werden.
Unterstützte Kategorien ansehen
Die folgende Tabelle beschreibt die Inhaltskategorien, die der Moderationsendpunkt erkennen kann, und die Eingabetypen, die jede Kategorie unterstützt.
Kategorien mit der Kennzeichnung „Nur Text“ unterstützen keine Bildeingaben. Wenn du ausschließlich
Bilder ohne begleitenden Text an das Modell omni-moderation-latest sendest,
gibt es für diese nicht unterstützten Kategorien einen Score von 0 zurück. Bilddateien dürfen
höchstens 20 MB groß sein.
Kategorie
Beschreibung
Eingaben
harassment
Inhalte, die belästigende Äußerungen enthalten, dazu anstiften oder sie fördern, unabhängig davon, gegen wen sie sich richten.
Nur Text
harassment/threatening
Belästigende Inhalte, die auch Gewalt oder schwere Schädigungen umfassen, unabhängig davon, gegen wen sie sich richten.
Nur Text
hate
Inhalte, die Hass aufgrund von Rasse, Geschlecht, ethnischer Herkunft, Religion, Nationalität, sexueller Orientierung, Behinderung oder Kastenzugehörigkeit ausdrücken, dazu anstiften oder ihn fördern. Hasserfüllte Inhalte, die sich gegen nicht geschützte Gruppen richten (z. B. Schachspielende), gelten als Belästigung.
Nur Text
hate/threatening
Hasserfüllte Inhalte, die auch Gewalt oder schwere Schädigungen gegen die betroffene Gruppe aufgrund von Rasse, Geschlecht, ethnischer Herkunft, Religion, Nationalität, sexueller Orientierung, Behinderung oder Kastenzugehörigkeit umfassen.
Nur Text
illicit
Inhalte, die Ratschläge oder Anleitungen für rechtswidrige Handlungen geben. Eine Formulierung wie „Wie begeht man Ladendiebstahl?“ würde in diese Kategorie fallen.
Nur Text
illicit/violent
Dieselben Arten von Inhalten, die von der Kategorie illicit gekennzeichnet werden,
jedoch mit zusätzlichen Bezügen zu Gewalt oder zur Beschaffung einer Waffe.
Nur Text
self-harm
Inhalte, die selbstschädigendes Verhalten wie Suizid, Ritzen und Essstörungen befürworten, dazu ermutigen oder es darstellen.
Text und Bilder
self-harm/intent
Inhalte, in denen eine Person angibt, sich selbst zu schädigen oder dies zu beabsichtigen, etwa durch Suizid, Ritzen oder Essstörungen.
Text und Bilder
self-harm/instructions
Inhalte, die zu selbstschädigendem Verhalten wie Suizid, Ritzen und Essstörungen ermutigen oder Anleitungen oder Ratschläge dazu geben.
Text und Bilder
sexual
Inhalte, die sexuell erregen sollen, etwa Beschreibungen sexueller Handlungen, oder die sexuelle Dienstleistungen bewerben (ausgenommen sexuelle Aufklärung und sexuelles Wohlbefinden).
Text und Bilder
sexual/minors
Sexuelle Inhalte, in denen eine Person unter 18 Jahren vorkommt.
Nur Text
violence
Inhalte, die Tod, Gewalt oder körperliche Verletzungen darstellen.
Text und Bilder
violence/graphic
Inhalte, die Tod, Gewalt oder körperliche Verletzungen drastisch und detailliert darstellen.