diff --git a/libs/core/langchain_core/messages/tool.py b/libs/core/langchain_core/messages/tool.py index 873f872cef268..25e6d368d8bd8 100644 --- a/libs/core/langchain_core/messages/tool.py +++ b/libs/core/langchain_core/messages/tool.py @@ -7,6 +7,7 @@ from langchain_core.messages.base import BaseMessage, BaseMessageChunk, merge_content from langchain_core.utils._merge import merge_dicts, merge_obj +import re class ToolOutputMixin: @@ -209,6 +210,16 @@ class ToolCall(TypedDict): def tool_call(*, name: str, args: dict[str, Any], id: Optional[str]) -> ToolCall: + if isinstance(args, str): + try: + # Extract JSON-like dictionary from string using regex + match = re.search(r'\{.*\}', args) + if match: + args = json.loads(match.group()) + else: + raise ValueError("No valid JSON object found in args string") + except json.JSONDecodeError: + raise ValueError("Invalid JSON string for args") return ToolCall(name=name, args=args, id=id, type="tool_call")