Moderation Endpoint Schema Mismatch for illicit and illicit_violent fields
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 31.6k
- Forks
- 5.7k
- Avg merge
- 1d 6h
- Merged PRs (30d)
- 96
Description
Confirm this is an issue with the Python library and not an underlying OpenAI API
- This is an issue with the Python library
Describe the bug
Description:
The results returned by the moderation endpoint do not align with the expected schema.
Details:
- In the
Moderation.categoriesfield (of typeCategories), all fields are annotated asbool. However, when the moderation endpoint is called, the fieldsillicitandillicit_violentreturnNonevalues instead ofTrueorFalse. - The same issue occurs with the
category_scoresfield (of typeCategoryScores), where all fields are expected to befloat. Yet,illicitandillicit_violentare also returned asNone.
Expected Behavior:
- If the
Nonevalues forillicitandillicit_violentare expected behavior, these fields should be annotated as optional in the schema. - If this is not expected behavior, the API should be corrected to ensure that these fields return appropriate boolean or float values.
Additional Notes:
It is surprising that Pydantic does not throw an error for these mismatches and allows None values to be returned. I could not manually create a Categories object with any None value in it.
To Reproduce
Run the moderation endpoint and check response.results[0] categories and category_scores -> illicit field.
Result I'm getting:
response.results: [
Moderation(
categories=Categories(
harassment=False,
harassment_threatening=False,
hate=False,
hate_threatening=False,
illicit=None,
illicit_violent=None,
self_harm=False,
self_harm_instructions=False,
self_harm_intent=False,
sexual=False,
sexual_minors=False,
violence=False,
violence_graphic=False,
self-harm=False,
sexual/minors=False,
hate/threatening=False,
violence/graphic=False,
self-harm/intent=False,
self-harm/instructions=False,
harassment/threatening=False,
),
category_applied_input_types=None,
category_scores=CategoryScores(
harassment=0.000255020015174523,
harassment_threatening=1.3588138244813308e-05,
hate=2.8068381652701646e-05,
hate_threatening=1.0663524108167621e-06,
illicit=None,
illicit_violent=None,
self_harm=9.841909195529297e-05,
self_harm_instructions=7.693658517382573e-06,
self_harm_intent=7.031533459667116e-05,
sexual=0.013590452261269093,
sexual_minors=0.0031673426274210215,
violence=0.00022930897830519825,
violence_graphic=4.927426198264584e-05,
self-harm=9.841909195529297e-05,
sexual/minors=0.0031673426274210215,
hate/threatening=1.0663524108167621e-06,
violence/graphic=4.927426198264584e-05,
self-harm/intent=7.031533459667116e-05,
self-harm/instructions=7.693658517382573e-06,
harassment/threatening=1.3588138244813308e-05,
),
flagged=False,
),
]
Code snippets
import openai
client = openai.OpenAI()
response = client.moderations.create(input="text")
print(response.results[0])
OS
macOS
Python version
Python 3.12.4
Library version
openai 1.51.2
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the Moderation response and the Categories and CategoryScores definitions, then reproduce the moderation request shown in the issue. Confirm whether illicit and illicit_violent are returned as null by the API; done means the Python schema matches the observed API contract and the response can be validated consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100