Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions tests/config/test_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,93 @@ def test_from_params_accepts_nested_structured_generation(self) -> None:
assert params.generation.structured_generation.enabled is True
assert params.generation.structured_generation.schema_method == "json_schema"
assert params.generation.structured_generation.backend == "outlines"


@pytest.mark.unit
class TestMixedInputMigration:
"""Regression coverage for mixed-input: legacy flat keys coexist with nested structured_generation dict.

The migration contract: when both forms are present, legacy flat keys win as explicit overrides.
Un-overridden nested dict fields are preserved.
"""

def test_legacy_backend_overrides_nested_dict_backend(self) -> None:
"""A legacy flat backend key beats the nested dict backend when both are supplied."""
params = GenerateParameters.model_validate(
{
"structured_generation": {"enabled": True, "backend": "outlines"},
"structured_generation_backend": "xgrammar",
}
)
assert params.structured_generation.backend == "xgrammar"
assert params.structured_generation.enabled is True # nested value preserved

def test_legacy_enabled_overrides_nested_dict_enabled(self) -> None:
"""A legacy use_structured_generation key beats the nested dict enabled field."""
params = GenerateParameters.model_validate(
{
"use_structured_generation": True,
"structured_generation": {"enabled": False, "schema_method": "json_schema"},
}
)
assert params.structured_generation.enabled is True
assert params.structured_generation.schema_method == "json_schema" # preserved

def test_legacy_schema_method_overrides_nested_dict_schema_method(self) -> None:
"""A legacy schema_method key beats the nested dict schema_method field."""
params = GenerateParameters.model_validate(
{
"structured_generation_schema_method": "regex",
"structured_generation": {"enabled": True, "schema_method": "json_schema"},
}
)
assert params.structured_generation.schema_method == "regex"
assert params.structured_generation.enabled is True # preserved

def test_from_params_legacy_backend_overrides_generation_section_backend(self) -> None:
"""from_params: a top-level legacy backend key overrides the backend inside generation={}."""
params = SafeSynthesizerParameters.from_params(
generation={"structured_generation": {"enabled": True, "backend": "outlines"}},
structured_generation_backend="xgrammar",
)
assert params.generation.structured_generation.backend == "xgrammar"
assert params.generation.structured_generation.enabled is True # preserved

def test_from_params_legacy_enabled_overrides_structured_generation_kwarg(self) -> None:
"""from_params: a top-level legacy use_structured_generation overrides structured_generation kwarg."""
params = SafeSynthesizerParameters.from_params(
structured_generation={"enabled": False, "schema_method": "json_schema"},
use_structured_generation=True,
)
assert params.generation.structured_generation.enabled is True
assert params.generation.structured_generation.schema_method == "json_schema" # preserved
Comment on lines +124 to +181

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 No test for a mixed-input combination that produces an invalid merged config

Every mixed-input test here asserts a valid final state. The migration contract is that legacy keys act as overrides, so a caller who passes structured_generation={"schema_method": "structural_tag", "backend": "xgrammar"} alongside a legacy structured_generation_backend="outlines" override would end up with schema_method="structural_tag" + backend="outlines" — an incompatible pair that the _validate_structural_tag_backend validator must reject. Without a pytest.raises test for this path there is no regression coverage for the case where the merged result is invalid, and a future change to the merge order or validator could silently break it.


def test_nested_dict_with_no_legacy_keys_uses_dict_values(self) -> None:
"""When no legacy flat keys are present, nested dict values are used as-is."""
params = GenerateParameters.model_validate(
{
"structured_generation": {
"enabled": True,
"backend": "outlines",
"schema_method": "json_schema",
}
}
)
assert params.structured_generation.enabled is True
assert params.structured_generation.backend == "outlines"
assert params.structured_generation.schema_method == "json_schema"

def test_legacy_keys_with_no_nested_dict_are_migrated(self) -> None:
"""When only legacy flat keys are present, migration produces the correct nested values."""
params = GenerateParameters.model_validate(
{
"use_structured_generation": True,
"structured_generation_backend": "xgrammar",
"structured_generation_schema_method": "structural_tag",
"structured_generation_use_single_sequence": True,
}
)
assert params.structured_generation.enabled is True
assert params.structured_generation.backend == "xgrammar"
assert params.structured_generation.schema_method == "structural_tag"
assert params.structured_generation.use_single_sequence is True
Loading