diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 8a7d6c00b..b8c2be6da 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -6,6 +6,7 @@ chains: agents: - ZeroShotAgent + - JsonAgent prompts: - PromptTemplate @@ -24,4 +25,7 @@ tools: - PythonFunction - JsonSpec +wrappers: + - RequestsWrapper + dev: false diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/langflow/interface/agents/base.py index 847336a24..e474ba1a6 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/langflow/interface/agents/base.py @@ -1,8 +1,10 @@ from langchain.agents import loading +from langflow.custom.customs import get_custom_nodes from langflow.interface.base import LangChainTypeCreator from langflow.utils.util import build_template_from_class from langflow.settings import settings from typing import Dict, List +from langflow.interface.agents.custom import JsonAgent class AgentCreator(LangChainTypeCreator): @@ -12,10 +14,14 @@ class AgentCreator(LangChainTypeCreator): def type_to_loader_dict(self) -> Dict: if self.type_dict is None: self.type_dict = loading.AGENT_TO_CLASS + # Add JsonAgent to the list of agents + self.type_dict["JsonAgent"] = JsonAgent return self.type_dict def get_signature(self, name: str) -> Dict | None: try: + if name in get_custom_nodes(self.type_name).keys(): + return get_custom_nodes(self.type_name)[name] return build_template_from_class( name, self.type_to_loader_dict, add_function=True ) diff --git a/src/backend/langflow/interface/prompts/base.py b/src/backend/langflow/interface/prompts/base.py index de77101f7..cf24ed9cf 100644 --- a/src/backend/langflow/interface/prompts/base.py +++ b/src/backend/langflow/interface/prompts/base.py @@ -17,8 +17,8 @@ class PromptCreator(LangChainTypeCreator): def get_signature(self, name: str) -> Dict | None: try: - if name in get_custom_nodes("prompts").keys(): - return get_custom_nodes("prompts")[name] + if name in get_custom_nodes(self.type_name).keys(): + return get_custom_nodes(self.type_name)[name] return build_template_from_function(name, self.type_to_loader_dict) except ValueError as exc: raise ValueError("Prompt not found") from exc diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 0d0d5d595..69d259a59 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -5,6 +5,7 @@ from langflow.interface.prompts.base import prompt_creator from langflow.interface.chains.base import chain_creator from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator +from langflow.interface.wrappers.base import wrapper_creator def get_type_list(): @@ -32,6 +33,7 @@ def build_langchain_types_dict(): memory_creator, tool_creator, toolkits_creator, + wrapper_creator, ] all_types = {} diff --git a/src/backend/langflow/interface/wrappers/__init__.py b/src/backend/langflow/interface/wrappers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/langflow/interface/wrappers/base.py new file mode 100644 index 000000000..81d8482b7 --- /dev/null +++ b/src/backend/langflow/interface/wrappers/base.py @@ -0,0 +1,30 @@ +from langchain import requests +from langflow.interface.base import LangChainTypeCreator +from langflow.utils.util import build_template_from_class +from langflow.settings import settings +from langflow.custom.customs import get_custom_nodes +from typing import Dict, List + + +class WrapperCreator(LangChainTypeCreator): + type_name: str = "wrappers" + + @property + def type_to_loader_dict(self) -> Dict: + if self.type_dict is None: + self.type_dict = { + wrapper.__name__: wrapper for wrapper in [requests.RequestsWrapper] + } + return self.type_dict + + def get_signature(self, name: str) -> Dict | None: + try: + return build_template_from_class(name, self.type_to_loader_dict) + except ValueError as exc: + raise ValueError("Wrapper not found") from exc + + def to_list(self) -> List[str]: + return list(self.type_to_loader_dict.keys()) + + +wrapper_creator = WrapperCreator() diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index 13ce50b2a..092bea040 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -12,6 +12,7 @@ class Settings(BaseSettings): llms: List[str] = [] tools: List[str] = [] memories: List[str] = [] + wrappers: List[str] = [] dev: bool = False class Config: @@ -33,6 +34,7 @@ class Settings(BaseSettings): self.llms = new_settings.llms or [] self.tools = new_settings.tools or [] self.memories = new_settings.memories or [] + self.wrappers = new_settings.wrappers or [] self.dev = new_settings.dev or False diff --git a/src/backend/langflow/template/nodes.py b/src/backend/langflow/template/nodes.py index f9826d89f..ef5f71441 100644 --- a/src/backend/langflow/template/nodes.py +++ b/src/backend/langflow/template/nodes.py @@ -140,7 +140,7 @@ class JsonAgentNode(FrontendNode): ], ) description: str = """Construct a json agent from an LLM and tools.""" - base_classes: list[str] = ["BaseAgent"] + base_classes: list[str] = ["AgentExecutor"] def to_dict(self): return super().to_dict() diff --git a/src/backend/langflow/template/template.py b/src/backend/langflow/template/template.py index ee498ef21..b968cc36d 100644 --- a/src/backend/langflow/template/template.py +++ b/src/backend/langflow/template/template.py @@ -13,6 +13,7 @@ class Field(BaseModel): suffixes: list[str] = [] file_types: list[str] = [] content: Union[str, None] = None + password: bool = False # _name will be used to store the name of the field # in the template name: str = ""