Fix #985: Handle PydanticInvalidForJsonSchema for unserializable BaseModel - #1032
Fix #985: Handle PydanticInvalidForJsonSchema for unserializable BaseModel#1032hulincup wants to merge 3 commits into
Conversation
… schemas When a BaseModel contains fields that cannot be converted to JSON schema (e.g., Callable fields), connections now gracefully fall back to prompt engineering instead of raising PydanticInvalidForJsonSchema. Changes: - OpenAI: Add exception handling in _native_response_format() - Azure: Add exception handling in _native_response_format() - Anthropic: Add exception handling in _native_output_config() - Add warning logs when falling back to prompt engineering - Update Anthropic docstring to document the fallback behavior - Add comprehensive test coverage for all three connections Fixes apache#985
|
Thanks for working on this. We have decided on option 2 in #985: an unrenderable schema should raise a clear error, because the prompt fallback also needs to render the schema and therefore cannot handle this case. #1046 implements that approach across the relevant call paths. To avoid duplicate and conflicting fixes, could we close this PR in favor of #1046? |
|
Hi @wenjin272, thanks for the heads up. You're right — #1046 implements option 2 as decided on #985, which is the correct direction. My PR took the fallback approach (option 1), which the discussion on the issue explicitly moved away from on 2026-08-17, so it shouldn't land. I also missed @weiqingy's "I will open a PR" note when I opened this, so the overlap is on me. Closing #1032 in favor of #1046. Thanks @weiqingy for the thorough implementation across the Python and Java paths. |
Description
Fixes #985
When a BaseModel contains fields that cannot be serialized to JSON schema (e.g.,
Callablefields), theto_strict_json_schema()function raisesPydanticInvalidForJsonSchema. Currently, this exception propagates up and breaks the chat call.The issue description notes that
RowTypeInfoschemas gracefully fall back to prompt engineering when the connection can't translate them natively, butBaseModelschemas that can't be serialized raise an exception instead. This inconsistency should be fixed.Changes
This PR catches
PydanticInvalidForJsonSchemain the three connection types that useto_strict_json_schema()ortransform_schema():OpenAI (
openai_chat_model.py):_native_response_format()None)loggerimportAzure OpenAI (
azure_openai_chat_model.py):_native_response_format()None)Anthropic (
anthropic_chat_model.py):_native_output_config()None)Testing
Added comprehensive test file
test_unserializable_output_schema.pywith three test cases:test_openai_handles_unserializable_schema(): Verifies OpenAI falls back to prompt when schema cannot be serializedtest_azure_handles_unserializable_schema(): Verifies Azure falls back to prompt when schema cannot be serializedtest_anthropic_handles_unserializable_schema(): Verifies Anthropic falls back to prompt when schema cannot be serializedEach test uses a
BadModelwith aCallablefield that cannot be converted to JSON schema, and verifies that:Verification
The fix ensures that:
BaseModelschemas gracefullyRowTypeInfofallbackRelated Issues