Skip to content

Commit df46c82

Browse files
authored
feat(core): automatic set required to include all properties in strict mode (#32930)
1 parent f8adbbc commit df46c82

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

libs/core/langchain_core/utils/function_calling.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,10 @@ def convert_to_openai_function(
425425
oai_function["parameters"] = _recursive_set_additional_properties_false(
426426
oai_function["parameters"]
427427
)
428+
# All fields must be `required`
429+
fields = oai_function["parameters"].get("properties", {})
430+
if isinstance(fields, dict) and fields:
431+
oai_function["parameters"]["required"] = list(fields.keys())
428432
return oai_function
429433

430434

libs/core/tests/unit_tests/utils/test_function_calling.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,3 +1155,16 @@ def my_function(arg1: dict, arg2: dict | None) -> None:
11551155

11561156
actual = convert_to_openai_function(my_function, strict=True)
11571157
assert actual == expected
1158+
1159+
1160+
def test_convert_to_openai_function_strict_required() -> None:
1161+
class MyModel(BaseModel):
1162+
"""Dummy schema."""
1163+
1164+
arg1: int = Field(..., description="foo")
1165+
arg2: str | None = Field(None, description="bar")
1166+
1167+
expected = ["arg1", "arg2"]
1168+
func = convert_to_openai_function(MyModel, strict=True)
1169+
actual = func["parameters"]["required"]
1170+
assert actual == expected

0 commit comments

Comments
 (0)