llm
structured_output
ai_generated
partial
LLM returns values not in the specified enum when generating structured JSON output
ID: llm/structured-output-hallucinated-enum
72%Fix Rate
80%Confidence
3Evidence
2023-01-01First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| any | active | — | — | — |
Root Cause
Even with JSON mode or function calling, LLMs can hallucinate enum values not in the schema. The model 'understands' the schema but doesn't guarantee constraint satisfaction. Only json_schema response_format with strict:true in OpenAI actually enforces enums.
genericWorkarounds
-
95% success Use strict: true with json_schema response_format (OpenAI)
response_format={'type': 'json_schema', 'json_schema': {'name': 'output', 'strict': True, 'schema': {...}}} -
88% success Validate LLM output against schema and retry on violation
for attempt in range(3): output = llm_call(); if validate(output, schema): return output # retry loop
-
78% success Post-process enum fields with fuzzy matching to nearest valid value
from difflib import get_close_matches; valid = get_close_matches(output_val, enum_values, n=1)
Dead Ends
Common approaches that don't work:
-
Define enum in function schema and trust the model to respect it
82% fail
Function calling schemas are treated as suggestions, not constraints. The model can return any string for an enum field.
-
Use JSON mode (response_format: json_object) and assume schema compliance
88% fail
JSON mode only guarantees valid JSON syntax, NOT schema compliance. Fields can be missing, wrong type, or have invalid enum values.