feat: Support allOf in OpenAPI properties inside schema #22946 (#22975)

This commit is contained in:
Mike Zixuan HE
2025-07-28 11:03:19 +08:00
committed by GitHub
parent 7eb707f811
commit bd5b938571
2 changed files with 78 additions and 0 deletions

View File

@@ -105,6 +105,29 @@ class ApiBasedToolSchemaParser:
# overwrite the content
interface["operation"]["requestBody"]["content"][content_type]["schema"] = root
# handle allOf reference in schema properties
for prop_dict in root.get("properties", {}).values():
for item in prop_dict.get("allOf", []):
if "$ref" in item:
ref_schema = openapi
reference = item["$ref"].split("/")[1:]
for ref in reference:
ref_schema = ref_schema[ref]
else:
ref_schema = item
for key, value in ref_schema.items():
if isinstance(value, list):
if key not in prop_dict:
prop_dict[key] = []
# extends list field
if isinstance(prop_dict[key], list):
prop_dict[key].extend(value)
elif key not in prop_dict:
# add new field
prop_dict[key] = value
if "allOf" in prop_dict:
del prop_dict["allOf"]
# parse body parameters
if "schema" in interface["operation"]["requestBody"]["content"][content_type]:
body_schema = interface["operation"]["requestBody"]["content"][content_type]["schema"]

View File

@@ -54,3 +54,58 @@ def test_parse_openapi_to_tool_bundle_operation_id(app):
assert tool_bundles[0].operation_id == "<root>_get"
assert tool_bundles[1].operation_id == "apiresources_get"
assert tool_bundles[2].operation_id == "createResource"
def test_parse_openapi_to_tool_bundle_properties_all_of(app):
openapi = {
"openapi": "3.0.0",
"info": {"title": "Simple API", "version": "1.0.0"},
"servers": [{"url": "http://localhost:3000"}],
"paths": {
"/api/resource": {
"get": {
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request",
},
},
},
"required": True,
},
},
},
},
"components": {
"schemas": {
"Request": {
"type": "object",
"properties": {
"prop1": {
"enum": ["option1"],
"description": "desc prop1",
"allOf": [
{"$ref": "#/components/schemas/AllOfItem"},
{
"enum": ["option2"],
},
],
},
},
},
"AllOfItem": {
"type": "string",
"enum": ["option3"],
"description": "desc allOf item",
},
}
},
}
with app.test_request_context():
tool_bundles = ApiBasedToolSchemaParser.parse_openapi_to_tool_bundle(openapi)
assert tool_bundles[0].parameters[0].type == "string"
assert tool_bundles[0].parameters[0].llm_description == "desc prop1"
# TODO: support enum in OpenAPI
# assert set(tool_bundles[0].parameters[0].options) == {"option1", "option2", "option3"}