From 360daf74e922d7a67364a66c94f94fe116f792e7 Mon Sep 17 00:00:00 2001 From: Shengbo Ma Date: Tue, 22 Apr 2025 15:27:01 -0700 Subject: [PATCH] add test --- .../langchain_core/utils/function_calling.py | 2 +- .../unit_tests/utils/test_function_calling.py | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/libs/core/langchain_core/utils/function_calling.py b/libs/core/langchain_core/utils/function_calling.py index 5dea302659d..ba4b8edf28b 100644 --- a/libs/core/langchain_core/utils/function_calling.py +++ b/libs/core/langchain_core/utils/function_calling.py @@ -788,7 +788,7 @@ def _recursive_set_additional_properties_false( schema["additionalProperties"] = False # Recursively check 'properties' and 'items' if they exist - if 'anyOf' in schema: + if "anyOf" in schema: for sub_schema in schema["anyOf"]: _recursive_set_additional_properties_false(sub_schema) if "properties" in schema: diff --git a/libs/core/tests/unit_tests/utils/test_function_calling.py b/libs/core/tests/unit_tests/utils/test_function_calling.py index 126c1753f4e..257b8b50578 100644 --- a/libs/core/tests/unit_tests/utils/test_function_calling.py +++ b/libs/core/tests/unit_tests/utils/test_function_calling.py @@ -497,6 +497,61 @@ def test_convert_to_openai_function_nested_strict() -> None: assert actual == expected +def test_convert_to_openai_function_strict_union_type() -> None: + class NestedA(BaseModel): + foo: str + + class NestedB(BaseModel): + bar: int + + class NestedC(BaseModel): + baz: bool + + def my_function(my_arg: Union[NestedA, NestedB, NestedC]) -> None: + """Dummy function.""" + + expected = { + "name": "my_function", + "description": "Dummy function.", + "parameters": { + "properties": { + "my_arg": { + "anyOf": [ + { + "properties": {"foo": {"title": "Foo", "type": "string"}}, + "required": ["foo"], + "title": "NestedA", + "type": "object", + "additionalProperties": False, + }, + { + "properties": {"bar": {"title": "Bar", "type": "integer"}}, + "required": ["bar"], + "title": "NestedB", + "type": "object", + "additionalProperties": False, + }, + { + "properties": {"baz": {"title": "Baz", "type": "boolean"}}, + "required": ["baz"], + "title": "NestedC", + "type": "object", + "additionalProperties": False, + }, + ] + } + }, + "required": ["my_arg"], + "type": "object", + "additionalProperties": False, + }, + "strict": True, + } + + actual = convert_to_openai_function(my_function, strict=True) + assert actual == expected, str(actual) + + json_schema_no_description_no_params = { "title": "dummy_function", }