feat(schema): add removal of $comment and enumDescriptions in JSON schema processing

- Updated JSON schema handling to remove `$comment` and `enumDescriptions` fields during schema transformations.
- Adjusted test cases to validate the removal of these fields both at root and nested levels.
- Expanded unsupported schema keywords to include `$comment` and `enumDescriptions` for Gemini compatibility.

Closes: #3512
This commit is contained in:
Luis Pater
2026-06-20 00:22:08 +08:00
parent 34639c3cf9
commit c44d4fcc7c
3 changed files with 32 additions and 1 deletions
@@ -300,17 +300,20 @@ func buildRequestBodyFromPayload(t *testing.T, modelName string) map[string]any
"parametersJsonSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "root-schema",
"$comment": "root comment should be removed",
"type": "object",
"properties": {
"$id": {"type": "string"},
"arg": {
"type": "object",
"$comment": "nested comment should be removed",
"prefill": "hello",
"properties": {
"mode": {
"type": "string",
"deprecated": true,
"enum": ["a", "b"],
"enumDescriptions": ["Alpha", "Beta"],
"enumTitles": ["A", "B"]
}
}
@@ -389,6 +392,9 @@ func assertSchemaSanitizedAndPropertyPreserved(t *testing.T, params map[string]a
if _, ok := params["$id"]; ok {
t.Fatalf("root $id should be removed from schema")
}
if _, ok := params["$comment"]; ok {
t.Fatalf("root $comment should be removed from schema")
}
if _, ok := params["patternProperties"]; ok {
t.Fatalf("patternProperties should be removed from schema")
}
@@ -408,6 +414,9 @@ func assertSchemaSanitizedAndPropertyPreserved(t *testing.T, params map[string]a
if _, ok := arg["prefill"]; ok {
t.Fatalf("prefill should be removed from nested schema")
}
if _, ok := arg["$comment"]; ok {
t.Fatalf("nested $comment should be removed from schema")
}
argProps, ok := arg["properties"].(map[string]any)
if !ok {
@@ -420,6 +429,9 @@ func assertSchemaSanitizedAndPropertyPreserved(t *testing.T, params map[string]a
if _, ok := mode["enumTitles"]; ok {
t.Fatalf("enumTitles should be removed from nested schema")
}
if _, ok := mode["enumDescriptions"]; ok {
t.Fatalf("enumDescriptions should be removed from nested schema")
}
if _, ok := mode["deprecated"]; ok {
t.Fatalf("deprecated should be removed from nested schema")
}
+1 -1
View File
@@ -440,7 +440,7 @@ func removeUnsupportedKeywords(jsonStr string) string {
keywords := append(unsupportedConstraints,
"$schema", "$defs", "definitions", "const", "$ref", "$id", "additionalProperties",
"propertyNames", "patternProperties", // Gemini doesn't support these schema keywords
"enumTitles", "prefill", "deprecated", // Schema metadata fields unsupported by Gemini
"$comment", "enumDescriptions", "enumTitles", "prefill", "deprecated", // Schema metadata fields unsupported by Gemini
)
deletePaths := make([]string, 0)
+19
View File
@@ -874,15 +874,18 @@ func TestCleanJSONSchemaForGemini_RemovesGeminiUnsupportedMetadataFields(t *test
input := `{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "root-schema",
"$comment": "root comment should be removed",
"type": "object",
"properties": {
"payload": {
"type": "object",
"$comment": "nested comment should be removed",
"prefill": "hello",
"properties": {
"mode": {
"type": "string",
"enum": ["a", "b"],
"enumDescriptions": ["Alpha", "Beta"],
"enumTitles": ["A", "B"]
}
},
@@ -893,6 +896,14 @@ func TestCleanJSONSchemaForGemini_RemovesGeminiUnsupportedMetadataFields(t *test
"$id": {
"type": "string",
"description": "property name should not be removed"
},
"$comment": {
"type": "string",
"description": "property name should not be removed"
},
"enumDescriptions": {
"type": "array",
"description": "property name should not be removed"
}
}
}`
@@ -913,6 +924,14 @@ func TestCleanJSONSchemaForGemini_RemovesGeminiUnsupportedMetadataFields(t *test
"$id": {
"type": "string",
"description": "property name should not be removed"
},
"$comment": {
"type": "string",
"description": "property name should not be removed"
},
"enumDescriptions": {
"type": "array",
"description": "property name should not be removed"
}
}
}`