From 230a01973e8ca70b91907dd44dcd592f0e952af3 Mon Sep 17 00:00:00 2001 From: Edwin Jose Date: Fri, 22 Nov 2024 13:56:31 -0500 Subject: [PATCH] fix: validation for tool name (#4790) validation for tool name Tool name validation based on open ai Schema for tool names --- src/backend/base/langflow/base/agents/agent.py | 14 ++++++++++++++ .../components/langchain_utilities/tool_calling.py | 1 + 2 files changed, 15 insertions(+) diff --git a/src/backend/base/langflow/base/agents/agent.py b/src/backend/base/langflow/base/agents/agent.py index ee174c959..8c3c7593b 100644 --- a/src/backend/base/langflow/base/agents/agent.py +++ b/src/backend/base/langflow/base/agents/agent.py @@ -1,4 +1,5 @@ import asyncio +import re from abc import abstractmethod from typing import TYPE_CHECKING, cast @@ -178,6 +179,18 @@ class LCAgentComponent(Component): def create_agent_runnable(self) -> Runnable: """Create the agent.""" + def validate_tool_names(self) -> None: + """Validate tool names to ensure they match the required pattern.""" + pattern = re.compile(r"^[a-zA-Z0-9_-]+$") + if hasattr(self, "tools") and self.tools: + for tool in self.tools: + if not pattern.match(tool.name): + msg = ( + f"Invalid tool name '{tool.name}': must only contain letters, numbers, underscores, dashes," + " and cannot contain spaces." + ) + raise ValueError(msg) + class LCToolsAgentComponent(LCAgentComponent): _base_inputs = [ @@ -193,6 +206,7 @@ class LCToolsAgentComponent(LCAgentComponent): ] def build_agent(self) -> AgentExecutor: + self.validate_tool_names() agent = self.create_agent_runnable() return AgentExecutor.from_agent_and_tools( agent=RunnableAgent(runnable=agent, input_keys_arg=["input"], return_keys_arg=["output"]), diff --git a/src/backend/base/langflow/components/langchain_utilities/tool_calling.py b/src/backend/base/langflow/components/langchain_utilities/tool_calling.py index 1f16bbaad..dc00fed2e 100644 --- a/src/backend/base/langflow/components/langchain_utilities/tool_calling.py +++ b/src/backend/base/langflow/components/langchain_utilities/tool_calling.py @@ -48,6 +48,7 @@ class ToolCallingAgentComponent(LCToolsAgentComponent): ("placeholder", "{agent_scratchpad}"), ] prompt = ChatPromptTemplate.from_messages(messages) + self.validate_tool_names() try: return create_tool_calling_agent(self.llm, self.tools or [], prompt) except NotImplementedError as e: