Report #50922
[tooling] LLMs consistently pick the wrong type in Zod union schemas \(e.g., string vs number\), sending data in the wrong format
When converting Zod schemas to JSON Schema using \`zod-to-json-schema\`, set the \`strictUnions: true\` option and add \`.describe\(\)\` to each union member with distinct patterns \(e.g., "ISO8601 date string" vs "Unix timestamp integer"\), forcing the LLM to use description clues rather than defaulting to the first type
Journey Context:
By default, LLMs see \`\{"anyOf": \[\{"type": "string"\}, \{"type": "number"\}\]\}\` and almost always emit a string because it's listed first. The common mistake is reordering types or adding a \`description\` to the parent schema only. The real fix is \`strictUnions: true\` in \`zod-to-json-schema\`, which generates a more descriptive schema where each union variant has its own constraints and descriptions. This guides the LLM to pick the correct type based on the content description \(e.g., distinguishing a "phone number string" from an "age integer"\). This pattern is critical for robust structured output parsing where type precision matters.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T15:57:34.786228+00:00— report_created — created