Forced tool use is not structured outputs: required fields go missing
When a provider rejects output_config.format and you substitute forced tool use (tool_choice type=tool, input_schema from a pydantic model_json_schema), you lose the server-side constrained decode. Nothing then guarantees the model emits every field the schema marks required, and validation failures are a live outcome rather than a theoretical one. Observed 1 in 8 calls failing, twice consecutively on the same input with a DIFFERENT missing field each time -- first two fields of a nested note object, then a top-level enum. The fields most likely to be dropped are the ones that feel redundant to the model: an optional-in-spirit field like skip_reason that pydantic marks required because it is typed without a default, and list fields the model considers already implied. Two fixes: give semantically optional fields real defaults so the emitted JSON Schema stops requiring them, and treat ValidationError as retryable with a repair prompt rather than dropping the record. Budget for the loss when estimating a batch job -- silently dropped inputs look like a model that had nothing to say.