core[patch]: Fix utils.json_schema.dereference_refs (#24335 KeyError: 400 in JSON schema processing) (#24337)

Description:
This PR fixes a KeyError: 400 that occurs in the JSON schema processing
within the reduce_openapi_spec function. The _retrieve_ref function in
json_schema.py was modified to handle missing components gracefully by
continuing to the next component if the current one is not found. This
ensures that the OpenAPI specification is fully interpreted and the
agent executes without errors.

Issue:
Fixes issue #24335

Dependencies:
No additional dependencies are required for this change.

Twitter handle:
@lunara_x
This commit is contained in:
Eun Hye Kim 2024-07-20 02:31:00 +09:00 committed by GitHub
parent 06f47678ae
commit 9aae8ef416
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 2 deletions

View File

@ -13,10 +13,12 @@ def _retrieve_ref(path: str, schema: dict) -> dict:
) )
out = schema out = schema
for component in components[1:]: for component in components[1:]:
if component.isdigit(): if component in out:
out = out[component]
elif component.isdigit() and int(component) in out:
out = out[int(component)] out = out[int(component)]
else: else:
out = out[component] raise KeyError(f"Reference '{path}' not found.")
return deepcopy(out) return deepcopy(out)

View File

@ -183,6 +183,38 @@ def test_dereference_refs_integer_ref() -> None:
assert actual == expected assert actual == expected
def test_dereference_refs_string_ref() -> None:
schema = {
"type": "object",
"properties": {
"error_400": {"$ref": "#/$defs/400"},
},
"$defs": {
"400": {
"type": "object",
"properties": {"description": "Bad Request"},
},
},
}
expected = {
"type": "object",
"properties": {
"error_400": {
"type": "object",
"properties": {"description": "Bad Request"},
},
},
"$defs": {
"400": {
"type": "object",
"properties": {"description": "Bad Request"},
},
},
}
actual = dereference_refs(schema)
assert actual == expected
def test_dereference_refs_cyclical_refs() -> None: def test_dereference_refs_cyclical_refs() -> None:
schema = { schema = {
"type": "object", "type": "object",