@@ -839,3 +839,48 @@ def func_returning_namedtuple() -> Point:
839
839
func_metadata (func_returning_namedtuple , structured_output = True )
840
840
assert "is not serializable for structured output" in str (exc_info .value )
841
841
assert "Point" in str (exc_info .value )
842
+
843
+
844
+ def test_structured_output_aliases ():
845
+ """Test that field aliases are consistent between schema and output"""
846
+
847
+ class ModelWithAliases (BaseModel ):
848
+ field_first : str | None = Field (default = None , alias = "first" , description = "The first field." )
849
+ field_second : str | None = Field (default = None , alias = "second" , description = "The second field." )
850
+
851
+ def func_with_aliases () -> ModelWithAliases :
852
+ # When aliases are defined, we must use the aliased names to set values
853
+ return ModelWithAliases (** {"first" : "hello" , "second" : "world" })
854
+
855
+ meta = func_metadata (func_with_aliases )
856
+
857
+ # Check that schema uses aliases
858
+ assert meta .output_schema is not None
859
+ assert "first" in meta .output_schema ["properties" ]
860
+ assert "second" in meta .output_schema ["properties" ]
861
+ assert "field_first" not in meta .output_schema ["properties" ]
862
+ assert "field_second" not in meta .output_schema ["properties" ]
863
+
864
+ # Check that the actual output uses aliases too
865
+ result = ModelWithAliases (** {"first" : "hello" , "second" : "world" })
866
+ unstructured_content , structured_content = meta .convert_result (result )
867
+
868
+ # The structured content should use aliases to match the schema
869
+ assert "first" in structured_content
870
+ assert "second" in structured_content
871
+ assert "field_first" not in structured_content
872
+ assert "field_second" not in structured_content
873
+ assert structured_content ["first" ] == "hello"
874
+ assert structured_content ["second" ] == "world"
875
+
876
+ # Also test the case where we have a model with defaults to ensure aliases work in all cases
877
+ result_with_defaults = ModelWithAliases () # Uses default None values
878
+ unstructured_content_defaults , structured_content_defaults = meta .convert_result (result_with_defaults )
879
+
880
+ # Even with defaults, should use aliases in output
881
+ assert "first" in structured_content_defaults
882
+ assert "second" in structured_content_defaults
883
+ assert "field_first" not in structured_content_defaults
884
+ assert "field_second" not in structured_content_defaults
885
+ assert structured_content_defaults ["first" ] is None
886
+ assert structured_content_defaults ["second" ] is None
0 commit comments