feat: implement requests wrapper

This commit is contained in:
Gabriel Almeida 2023-03-30 21:15:38 -03:00
commit fdb058978e
9 changed files with 48 additions and 3 deletions

View file

@ -6,6 +6,7 @@ chains:
agents: agents:
- ZeroShotAgent - ZeroShotAgent
- JsonAgent
prompts: prompts:
- PromptTemplate - PromptTemplate
@ -24,4 +25,7 @@ tools:
- PythonFunction - PythonFunction
- JsonSpec - JsonSpec
wrappers:
- RequestsWrapper
dev: false dev: false

View file

@ -1,8 +1,10 @@
from langchain.agents import loading from langchain.agents import loading
from langflow.custom.customs import get_custom_nodes
from langflow.interface.base import LangChainTypeCreator from langflow.interface.base import LangChainTypeCreator
from langflow.utils.util import build_template_from_class from langflow.utils.util import build_template_from_class
from langflow.settings import settings from langflow.settings import settings
from typing import Dict, List from typing import Dict, List
from langflow.interface.agents.custom import JsonAgent
class AgentCreator(LangChainTypeCreator): class AgentCreator(LangChainTypeCreator):
@ -12,10 +14,14 @@ class AgentCreator(LangChainTypeCreator):
def type_to_loader_dict(self) -> Dict: def type_to_loader_dict(self) -> Dict:
if self.type_dict is None: if self.type_dict is None:
self.type_dict = loading.AGENT_TO_CLASS self.type_dict = loading.AGENT_TO_CLASS
# Add JsonAgent to the list of agents
self.type_dict["JsonAgent"] = JsonAgent
return self.type_dict return self.type_dict
def get_signature(self, name: str) -> Dict | None: def get_signature(self, name: str) -> Dict | None:
try: try:
if name in get_custom_nodes(self.type_name).keys():
return get_custom_nodes(self.type_name)[name]
return build_template_from_class( return build_template_from_class(
name, self.type_to_loader_dict, add_function=True name, self.type_to_loader_dict, add_function=True
) )

View file

@ -17,8 +17,8 @@ class PromptCreator(LangChainTypeCreator):
def get_signature(self, name: str) -> Dict | None: def get_signature(self, name: str) -> Dict | None:
try: try:
if name in get_custom_nodes("prompts").keys(): if name in get_custom_nodes(self.type_name).keys():
return get_custom_nodes("prompts")[name] return get_custom_nodes(self.type_name)[name]
return build_template_from_function(name, self.type_to_loader_dict) return build_template_from_function(name, self.type_to_loader_dict)
except ValueError as exc: except ValueError as exc:
raise ValueError("Prompt not found") from exc raise ValueError("Prompt not found") from exc

View file

@ -5,6 +5,7 @@ from langflow.interface.prompts.base import prompt_creator
from langflow.interface.chains.base import chain_creator from langflow.interface.chains.base import chain_creator
from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.toolkits.base import toolkits_creator
from langflow.interface.tools.base import tool_creator from langflow.interface.tools.base import tool_creator
from langflow.interface.wrappers.base import wrapper_creator
def get_type_list(): def get_type_list():
@ -32,6 +33,7 @@ def build_langchain_types_dict():
memory_creator, memory_creator,
tool_creator, tool_creator,
toolkits_creator, toolkits_creator,
wrapper_creator,
] ]
all_types = {} all_types = {}

View file

@ -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()

View file

@ -12,6 +12,7 @@ class Settings(BaseSettings):
llms: List[str] = [] llms: List[str] = []
tools: List[str] = [] tools: List[str] = []
memories: List[str] = [] memories: List[str] = []
wrappers: List[str] = []
dev: bool = False dev: bool = False
class Config: class Config:
@ -33,6 +34,7 @@ class Settings(BaseSettings):
self.llms = new_settings.llms or [] self.llms = new_settings.llms or []
self.tools = new_settings.tools or [] self.tools = new_settings.tools or []
self.memories = new_settings.memories or [] self.memories = new_settings.memories or []
self.wrappers = new_settings.wrappers or []
self.dev = new_settings.dev or False self.dev = new_settings.dev or False

View file

@ -140,7 +140,7 @@ class JsonAgentNode(FrontendNode):
], ],
) )
description: str = """Construct a json agent from an LLM and tools.""" 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): def to_dict(self):
return super().to_dict() return super().to_dict()

View file

@ -13,6 +13,7 @@ class Field(BaseModel):
suffixes: list[str] = [] suffixes: list[str] = []
file_types: list[str] = [] file_types: list[str] = []
content: Union[str, None] = None content: Union[str, None] = None
password: bool = False
# _name will be used to store the name of the field # _name will be used to store the name of the field
# in the template # in the template
name: str = "" name: str = ""