From b1497bcea116f3292229e0d622a442b7881a267b Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Fri, 12 Sep 2025 12:50:54 -0400 Subject: [PATCH] chore(core): test that default values in tool calls are preserved in json schema representation (#32921) Add unit test coverage for this issue: https://github.com/langchain-ai/langchain/issues/32232 --- .../unit_tests/utils/test_json_schema.py | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/libs/core/tests/unit_tests/utils/test_json_schema.py b/libs/core/tests/unit_tests/utils/test_json_schema.py index b618e0d4b52..68a711f42d6 100644 --- a/libs/core/tests/unit_tests/utils/test_json_schema.py +++ b/libs/core/tests/unit_tests/utils/test_json_schema.py @@ -1,5 +1,11 @@ -import pytest +from enum import Enum +import pydantic +import pytest +from packaging.version import Version + +from langchain_core.tools import tool +from langchain_core.utils.function_calling import convert_to_openai_tool from langchain_core.utils.json_schema import dereference_refs @@ -779,3 +785,44 @@ def test_dereference_refs_non_dict_ref_target() -> None: actual = dereference_refs(schema) assert actual == expected + + +def test_convert_to_openai_tool_preserves_enum_defaults() -> None: + """Test that we preserve default values from enum parameters.""" + + class Status(Enum): + PENDING = "pending" + COMPLETED = "completed" + ERROR = "error" + + @tool(description="tool description") + def a_test_tool(status: Status = Status.PENDING) -> str: + return f"Status is: {status.value}" + + result = convert_to_openai_tool(a_test_tool) + + if Version(pydantic.__version__) >= Version("2.9.0"): + assert result == { + "function": { + "description": "tool description", + "name": "a_test_tool", + "parameters": { + "properties": { + "status": { + "default": "pending", + "enum": ["pending", "completed", "error"], + "type": "string", + } + }, + "type": "object", + }, + }, + "type": "function", + } + else: + # Just check the default value for older pydantic versions. + # Older versions had more variation in the JSON schema output. + assert ( + result["function"]["parameters"]["properties"]["status"]["default"] + == "pending" + )