Commit a10655ad

Stainless Bot <107565488+stainless-bot@users.noreply.github.com>
2023-11-11 00:07:32
fix(client): serialise pydantic v1 default fields correctly in params (#776)
1 parent c5975bd
Changed files (2)
src
openai
tests
src/openai/_utils/_transform.py
@@ -168,7 +168,7 @@ def _transform_recursive(
         return data
 
     if isinstance(data, pydantic.BaseModel):
-        return model_dump(data, exclude_unset=True, exclude_defaults=True)
+        return model_dump(data, exclude_unset=True)
 
     return _transform_value(data, annotation)
 
tests/test_transform.py
@@ -237,3 +237,29 @@ def test_pydantic_nested_objects() -> None:
     model = ModelNestedObjects.construct(nested={"foo": "stainless"})
     assert isinstance(model.nested, MyModel)
     assert transform(model, Any) == {"nested": {"foo": "stainless"}}
+
+
+class ModelWithDefaultField(BaseModel):
+    foo: str
+    with_none_default: Union[str, None] = None
+    with_str_default: str = "foo"
+
+
+def test_pydantic_default_field() -> None:
+    # should be excluded when defaults are used
+    model = ModelWithDefaultField.construct()
+    assert model.with_none_default is None
+    assert model.with_str_default == "foo"
+    assert transform(model, Any) == {}
+
+    # should be included when the default value is explicitly given
+    model = ModelWithDefaultField.construct(with_none_default=None, with_str_default="foo")
+    assert model.with_none_default is None
+    assert model.with_str_default == "foo"
+    assert transform(model, Any) == {"with_none_default": None, "with_str_default": "foo"}
+
+    # should be included when a non-default value is explicitly given
+    model = ModelWithDefaultField.construct(with_none_default="bar", with_str_default="baz")
+    assert model.with_none_default == "bar"
+    assert model.with_str_default == "baz"
+    assert transform(model, Any) == {"with_none_default": "bar", "with_str_default": "baz"}