@@ -73,6 +73,33 @@ def _strip_remote_refs(obj: Any) -> Any:
7373 return obj
7474
7575
76+ def _strip_discriminator (obj : Any ) -> Any :
77+ """Recursively remove OpenAPI ``discriminator`` keys from a schema.
78+
79+ Pydantic emits ``discriminator.mapping`` with values like
80+ ``#/$defs/ClassName``. After ``$defs`` are inlined and removed by
81+ ``dereference_refs``, those mapping entries dangle. The keyword is an
82+ OpenAPI extension — the ``anyOf`` variants already carry ``const`` on
83+ the discriminant field, so the mapping is redundant.
84+
85+ Only strips ``discriminator`` when it appears alongside ``anyOf`` or
86+ ``oneOf``, which is where the OpenAPI keyword lives. A property
87+ *named* ``discriminator`` (inside ``properties``) is left alone.
88+ """
89+ if isinstance (obj , dict ):
90+ skip = "discriminator" in obj and ("anyOf" in obj or "oneOf" in obj )
91+ # Keys that hold instance data, not sub-schemas — don't recurse.
92+ _DATA_KEYS = {"default" , "const" , "examples" , "enum" }
93+ return {
94+ k : (v if k in _DATA_KEYS else _strip_discriminator (v ))
95+ for k , v in obj .items ()
96+ if not (k == "discriminator" and skip )
97+ }
98+ if isinstance (obj , list ):
99+ return [_strip_discriminator (item ) for item in obj ]
100+ return obj
101+
102+
76103def dereference_refs (schema : dict [str , Any ]) -> dict [str , Any ]:
77104 """Resolve all $ref references in a JSON schema by inlining definitions.
78105
@@ -135,6 +162,13 @@ def dereference_refs(schema: dict[str, Any]) -> dict[str, Any]:
135162 if "$defs" in dereferenced :
136163 dereferenced = {k : v for k , v in dereferenced .items () if k != "$defs" }
137164
165+ # Strip `discriminator` keys — they contain `mapping` values that
166+ # point at `#/$defs/...` entries we just removed. `discriminator`
167+ # is an OpenAPI extension; after inlining, the `anyOf` variants
168+ # already carry `const` on the discriminant field, making the
169+ # mapping redundant.
170+ dereferenced = _strip_discriminator (dereferenced )
171+
138172 return dereferenced
139173
140174 except JsonRefError :
0 commit comments