@@ -48,6 +48,43 @@ def resolve_schema(
4848 return schema
4949
5050
51+ def _deep_resolve_refs (
52+ schema : dict [str , Any ],
53+ openapi_doc : dict [str , Any ],
54+ _depth : int = 0 ,
55+ ) -> dict [str , Any ]:
56+ """Recursively resolve all ``$ref`` pointers in a schema.
57+
58+ Handles nested ``$ref``, ``allOf``, ``anyOf``, ``oneOf``, and ``items``.
59+ Depth-limited to 16 levels to prevent infinite recursion.
60+ """
61+ if _depth > 16 :
62+ return schema
63+
64+ if "$ref" in schema :
65+ resolved = resolve_ref (schema ["$ref" ], openapi_doc )
66+ return _deep_resolve_refs (resolved , openapi_doc , _depth + 1 )
67+
68+ result = dict (schema )
69+
70+ # Resolve inside allOf/anyOf/oneOf
71+ for key in ("allOf" , "anyOf" , "oneOf" ):
72+ if key in result and isinstance (result [key ], list ):
73+ result [key ] = [_deep_resolve_refs (item , openapi_doc , _depth + 1 ) for item in result [key ]]
74+
75+ # Resolve array items
76+ if "items" in result and isinstance (result ["items" ], dict ):
77+ result ["items" ] = _deep_resolve_refs (result ["items" ], openapi_doc , _depth + 1 )
78+
79+ # Resolve nested properties
80+ if "properties" in result and isinstance (result ["properties" ], dict ):
81+ result ["properties" ] = {
82+ k : _deep_resolve_refs (v , openapi_doc , _depth + 1 ) for k , v in result ["properties" ].items ()
83+ }
84+
85+ return result
86+
87+
5188def extract_input_schema (
5289 operation : dict [str , Any ],
5390 openapi_doc : dict [str , Any ] | None = None ,
@@ -90,6 +127,11 @@ def extract_input_schema(
90127 schema ["properties" ].update (body_schema .get ("properties" , {}))
91128 schema ["required" ].extend (body_schema .get ("required" , []))
92129
130+ # Recursively resolve $ref inside individual properties
131+ if openapi_doc :
132+ for prop_name , prop_schema in list (schema ["properties" ].items ()):
133+ schema ["properties" ][prop_name ] = _deep_resolve_refs (prop_schema , openapi_doc )
134+
93135 return schema
94136
95137
@@ -114,9 +156,9 @@ def extract_output_schema(
114156 if "schema" in json_content :
115157 schema : dict [str , Any ] = json_content ["schema" ]
116158 schema = resolve_schema (schema , openapi_doc )
117- # Handle array with $ref items
118- if schema . get ( "type" ) == "array" and "$ref" in schema . get ( "items" , {}) :
119- schema [ "items" ] = resolve_schema (schema [ "items" ] , openapi_doc )
159+ # Recursively resolve all nested $ref pointers
160+ if openapi_doc :
161+ schema = _deep_resolve_refs (schema , openapi_doc )
120162 return schema
121163
122164 return {"type" : "object" , "properties" : {}}
0 commit comments