From 9094876ed3279a9759815cf03e1951ac163b1ed7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 6 Jul 2023 17:09:18 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(agents/base.py):=20add=20suppo?= =?UTF-8?q?rt=20for=20creating=20frontend=20nodes=20for=20agents=20?= =?UTF-8?q?=F0=9F=94=A7=20fix(agents/base.py):=20import=20missing=20AgentF?= =?UTF-8?q?rontendNode=20class=20from=20langflow.template.frontend=5Fnode.?= =?UTF-8?q?agents=20=F0=9F=94=A7=20fix(initialize/loading.py):=20pass=20no?= =?UTF-8?q?de=5Ftype=20to=20instantiate=5Fagent=20function=20to=20handle?= =?UTF-8?q?=20creation=20of=20frontend=20nodes=20for=20agents=20?= =?UTF-8?q?=F0=9F=94=A7=20fix(template/frontend=5Fnode/agents.py):=20add?= =?UTF-8?q?=20format=5Ffield=20method=20to=20AgentFrontendNode=20class=20t?= =?UTF-8?q?o=20customize=20field=20behavior=20The=20missing=20import=20sta?= =?UTF-8?q?tement=20for=20the=20AgentFrontendNode=20class=20from=20langflo?= =?UTF-8?q?w.template.frontend=5Fnode.agents=20has=20been=20added=20to=20t?= =?UTF-8?q?he=20base.py=20file.=20Support=20for=20creating=20frontend=20no?= =?UTF-8?q?des=20for=20agents=20has=20been=20added=20to=20the=20AgentCreat?= =?UTF-8?q?or=20class=20in=20the=20base.py=20file.=20The=20instantiate=5Fa?= =?UTF-8?q?gent=20function=20in=20the=20loading.py=20file=20now=20receives?= =?UTF-8?q?=20the=20node=5Ftype=20parameter=20to=20handle=20the=20creation?= =?UTF-8?q?=20of=20frontend=20nodes=20for=20agents.=20The=20AgentFrontendN?= =?UTF-8?q?ode=20class=20in=20the=20agents.py=20file=20now=20includes=20a?= =?UTF-8?q?=20format=5Ffield=20method=20to=20customize=20the=20behavior=20?= =?UTF-8?q?of=20certain=20fields.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/agents/base.py | 16 +++++++++++++++- .../langflow/interface/initialize/loading.py | 14 ++++++++++++-- .../langflow/template/frontend_node/agents.py | 11 +++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/langflow/interface/agents/base.py index d404f845d..b272144bc 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/langflow/interface/agents/base.py @@ -6,13 +6,20 @@ from langflow.custom.customs import get_custom_nodes from langflow.interface.agents.custom import CUSTOM_AGENTS from langflow.interface.base import LangChainTypeCreator from langflow.settings import settings +from langflow.template.frontend_node.agents import AgentFrontendNode from langflow.utils.logger import logger -from langflow.utils.util import build_template_from_class +from langflow.utils.util import build_template_from_class, build_template_from_method class AgentCreator(LangChainTypeCreator): type_name: str = "agents" + from_method_nodes = {"ZeroShotAgent": "from_llm_and_tools"} + + @property + def frontend_node_class(self) -> type[AgentFrontendNode]: + return AgentFrontendNode + @property def type_to_loader_dict(self) -> Dict: if self.type_dict is None: @@ -27,6 +34,13 @@ class AgentCreator(LangChainTypeCreator): try: if name in get_custom_nodes(self.type_name).keys(): return get_custom_nodes(self.type_name)[name] + elif name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=self.type_to_loader_dict, + add_function=True, + method_name=self.from_method_nodes[name], + ) return build_template_from_class( name, self.type_to_loader_dict, add_function=True ) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index cd5585656..3c3616dd8 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -15,6 +15,7 @@ from pydantic import ValidationError from langflow.interface.custom_lists import CUSTOM_NODES from langflow.interface.importing.utils import get_function, import_by_type +from langflow.interface.agents.base import agent_creator from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator from langflow.interface.output_parsers.base import output_parser_creator @@ -61,7 +62,7 @@ def convert_kwargs(params): def instantiate_based_on_type(class_object, base_type, node_type, params): if base_type == "agents": - return instantiate_agent(class_object, params) + return instantiate_agent(node_type, class_object, params) elif base_type == "prompts": return instantiate_prompt(node_type, class_object, params) elif base_type == "tools": @@ -159,7 +160,16 @@ def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): return class_object(**params) -def instantiate_agent(class_object: Type[agent_module.Agent], params: Dict): +def instantiate_agent(node_type, class_object: Type[agent_module.Agent], params: Dict): + if node_type in agent_creator.from_method_nodes: + method = agent_creator.from_method_nodes[node_type] + if class_method := getattr(class_object, method, None): + agent = class_method(**params) + tools = params.get("tools", []) + return AgentExecutor.from_agent_and_tools( + agent=agent, + tools=tools, + ) return load_agent_executor(class_object, params) diff --git a/src/backend/langflow/template/frontend_node/agents.py b/src/backend/langflow/template/frontend_node/agents.py index f692a7d6c..b988cbe20 100644 --- a/src/backend/langflow/template/frontend_node/agents.py +++ b/src/backend/langflow/template/frontend_node/agents.py @@ -13,6 +13,17 @@ NON_CHAT_AGENTS = { } +class AgentFrontendNode(FrontendNode): + @staticmethod + def format_field(field: TemplateField, name: str | None = None) -> None: + if field.name in ["suffix", "prefix"]: + field.show = True + if field.name == "Tools" and name == "ZeroShotAgent": + # field. + field.type_name = "BaseTool" + field.is_list = True + + class SQLAgentNode(FrontendNode): name: str = "SQLAgent" template: Template = Template(