@@ -119,3 +119,93 @@ def test_from_params_accepts_nested_structured_generation(self) -> None:
119119 assert params .generation .structured_generation .enabled is True
120120 assert params .generation .structured_generation .schema_method == "json_schema"
121121 assert params .generation .structured_generation .backend == "outlines"
122+
123+
124+ @pytest .mark .unit
125+ class TestMixedInputMigration :
126+ """Regression coverage for mixed-input: legacy flat keys coexist with nested structured_generation dict.
127+
128+ The migration contract: when both forms are present, legacy flat keys win as explicit overrides.
129+ Un-overridden nested dict fields are preserved.
130+ """
131+
132+ def test_legacy_backend_overrides_nested_dict_backend (self ) -> None :
133+ """A legacy flat backend key beats the nested dict backend when both are supplied."""
134+ params = GenerateParameters .model_validate (
135+ {
136+ "structured_generation" : {"enabled" : True , "backend" : "outlines" },
137+ "structured_generation_backend" : "xgrammar" ,
138+ }
139+ )
140+ assert params .structured_generation .backend == "xgrammar"
141+ assert params .structured_generation .enabled is True # nested value preserved
142+
143+ def test_legacy_enabled_overrides_nested_dict_enabled (self ) -> None :
144+ """A legacy use_structured_generation key beats the nested dict enabled field."""
145+ params = GenerateParameters .model_validate (
146+ {
147+ "use_structured_generation" : True ,
148+ "structured_generation" : {"enabled" : False , "schema_method" : "json_schema" },
149+ }
150+ )
151+ assert params .structured_generation .enabled is True
152+ assert params .structured_generation .schema_method == "json_schema" # preserved
153+
154+ def test_legacy_schema_method_overrides_nested_dict_schema_method (self ) -> None :
155+ """A legacy schema_method key beats the nested dict schema_method field."""
156+ params = GenerateParameters .model_validate (
157+ {
158+ "structured_generation_schema_method" : "regex" ,
159+ "structured_generation" : {"enabled" : True , "schema_method" : "json_schema" },
160+ }
161+ )
162+ assert params .structured_generation .schema_method == "regex"
163+ assert params .structured_generation .enabled is True # preserved
164+
165+ def test_from_params_legacy_backend_overrides_generation_section_backend (self ) -> None :
166+ """from_params: a top-level legacy backend key overrides the backend inside generation={}."""
167+ params = SafeSynthesizerParameters .from_params (
168+ generation = {"structured_generation" : {"enabled" : True , "backend" : "outlines" }},
169+ structured_generation_backend = "xgrammar" ,
170+ )
171+ assert params .generation .structured_generation .backend == "xgrammar"
172+ assert params .generation .structured_generation .enabled is True # preserved
173+
174+ def test_from_params_legacy_enabled_overrides_structured_generation_kwarg (self ) -> None :
175+ """from_params: a top-level legacy use_structured_generation overrides structured_generation kwarg."""
176+ params = SafeSynthesizerParameters .from_params (
177+ structured_generation = {"enabled" : False , "schema_method" : "json_schema" },
178+ use_structured_generation = True ,
179+ )
180+ assert params .generation .structured_generation .enabled is True
181+ assert params .generation .structured_generation .schema_method == "json_schema" # preserved
182+
183+ def test_nested_dict_with_no_legacy_keys_uses_dict_values (self ) -> None :
184+ """When no legacy flat keys are present, nested dict values are used as-is."""
185+ params = GenerateParameters .model_validate (
186+ {
187+ "structured_generation" : {
188+ "enabled" : True ,
189+ "backend" : "outlines" ,
190+ "schema_method" : "json_schema" ,
191+ }
192+ }
193+ )
194+ assert params .structured_generation .enabled is True
195+ assert params .structured_generation .backend == "outlines"
196+ assert params .structured_generation .schema_method == "json_schema"
197+
198+ def test_legacy_keys_with_no_nested_dict_are_migrated (self ) -> None :
199+ """When only legacy flat keys are present, migration produces the correct nested values."""
200+ params = GenerateParameters .model_validate (
201+ {
202+ "use_structured_generation" : True ,
203+ "structured_generation_backend" : "xgrammar" ,
204+ "structured_generation_schema_method" : "structural_tag" ,
205+ "structured_generation_use_single_sequence" : True ,
206+ }
207+ )
208+ assert params .structured_generation .enabled is True
209+ assert params .structured_generation .backend == "xgrammar"
210+ assert params .structured_generation .schema_method == "structural_tag"
211+ assert params .structured_generation .use_single_sequence is True
0 commit comments