fix: Enforce strict JSON Schema compliance to prevent OpenAI 400 Bad Request errors#1266
Open
svetanis wants to merge 1 commit into
Open
fix: Enforce strict JSON Schema compliance to prevent OpenAI 400 Bad Request errors#1266svetanis wants to merge 1 commit into
svetanis wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Enforce strict JSON Schema compliance to prevent OpenAI 400 Bad Request errors
Please ensure you have read the contribution guide before creating a pull request.
Link to Issue or Description of Change
1. Link to an existing issue (if applicable):
2. Or, if no issue exists, describe the change:
Problem:
When using strict OpenAI-compatible providers like Groq, empty function arguments or responses are serialized as
nullor omitted byChatCompletionsRequest. Furthermore, zero-argument tools fail to declare aparametersschema object. This breaks strict JSON schema parsers, causing them to drop conversation history, which leads to400 Bad Requestexceptions due to models hallucinating raw XML<function>tags. JSON Schema enum types are also improperly serialized in uppercase.Solution:
schemaNormalizerModuleto theObjectMapperinChatCompletionsRequest.javato forceTypeenums to serialize in lowercase (e.g.,"string").enforceJsonObjecttoChatCompletionsCommon.javato guarantee that emptyargumentsand functionresponsepayloads fallback to"{}"instead ofnullor raw strings.ChatCompletionsRequest.javato explicitly inject a{"type":"object", "properties":{}}parameters schema for zero-argument functions instead of omitting it.Testing Plan
Unit Tests:
Passed:
mvn testAdded
testFromLlmRequest_withEmptyFunctionArgumentstoChatCompletionsRequestTest.javato explicitly test"{}"serialization for zero-argument tools. UpdatedtestFromLlmRequest_withFunctionResponseexpectations.Manual End-to-End (E2E) Tests:
Wired the Google native chat completion client into the external
model-prismproject (PR #1199). Ran the integration through all the demo tests covering all main ADK features. The applications successfully execute multi-turn multi-tool conversations using strict JSON schema endpoints without throwing400 Bad Requestdue to context loss.Checklist
Additional context
This change unlocks robust support for the rapidly growing ecosystem of OpenAI-compatible endpoints that enforce strict JSON Schema validation.