fix: formatting and utils

This commit is contained in:
Gabriel Almeida 2023-03-31 14:07:58 -03:00
commit 92c3bb19b0
7 changed files with 75 additions and 25 deletions

View file

@ -0,0 +1,26 @@
import base64
import json
from typing import Dict
import yaml
def load_dict(file_name, file_content, accepted_types) -> Dict:
"""Load a file from a string."""
# Check if the file is accepted
if not any(file_name.endswith(suffix) for suffix in accepted_types):
raise ValueError(f"File {file_name} is not accepted")
# Get the suffix
suffix = file_name.split(".")[-1]
# file_content == 'data:application/x-yaml;base64,b3BlbmFwaTogIjMuMC4wIg...'
data = file_content.split(",")[1]
decoded_bytes = base64.b64decode(data)
# Convert the bytes object to a string
decoded_string = decoded_bytes.decode("utf-8")
if suffix == "json":
# Return the json content
return json.loads(decoded_string)
elif suffix in ["yaml", "yml"]:
# Return the yaml content
return yaml.safe_load(decoded_string)

View file

@ -1,10 +1,12 @@
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 typing import Dict, List
from langflow.interface.agents.custom import JsonAgent
from langchain.agents import loading
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.utils.util import build_template_from_class
class AgentCreator(LangChainTypeCreator): class AgentCreator(LangChainTypeCreator):
@ -15,7 +17,8 @@ class AgentCreator(LangChainTypeCreator):
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 # Add JsonAgent to the list of agents
self.type_dict["JsonAgent"] = JsonAgent for name, agent in CUSTOM_AGENTS.items():
self.type_dict[name] = agent
return self.type_dict return self.type_dict
def get_signature(self, name: str) -> Dict | None: def get_signature(self, name: str) -> Dict | None:

View file

@ -5,6 +5,7 @@ from langflow.interface.memories.base import memory_creator
from langflow.interface.prompts.base import prompt_creator from langflow.interface.prompts.base import prompt_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_dict(): def get_type_dict():
@ -16,6 +17,7 @@ def get_type_dict():
"chains": chain_creator.to_list(), "chains": chain_creator.to_list(),
"memory": memory_creator.to_list(), "memory": memory_creator.to_list(),
"toolkits": toolkits_creator.to_list(), "toolkits": toolkits_creator.to_list(),
"wrappers": wrapper_creator.to_list(),
} }

View file

@ -1,19 +1,16 @@
import json import json
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
from langchain.agents import ZeroShotAgent
from langchain.agents import agent as agent_module
from langchain.agents.agent import AgentExecutor from langchain.agents.agent import AgentExecutor
from langchain.agents.agent_toolkits.base import BaseToolkit
from langchain.agents.load_tools import ( from langchain.agents.load_tools import (
_BASE_TOOLS, _BASE_TOOLS,
_EXTRA_LLM_TOOLS, _EXTRA_LLM_TOOLS,
_EXTRA_OPTIONAL_TOOLS, _EXTRA_OPTIONAL_TOOLS,
_LLM_TOOLS, _LLM_TOOLS,
) )
from langchain.agents import agent as agent_module
from langflow.interface.importing.utils import import_by_type
from langchain.agents import ZeroShotAgent
from langchain.agents.loading import load_agent_from_config from langchain.agents.loading import load_agent_from_config
from langchain.agents.tools import Tool from langchain.agents.tools import Tool
from langchain.callbacks.base import BaseCallbackManager from langchain.callbacks.base import BaseCallbackManager
@ -21,20 +18,29 @@ from langchain.chains.loading import load_chain_from_config
from langchain.llms.base import BaseLLM from langchain.llms.base import BaseLLM
from langchain.llms.loading import load_llm_from_config from langchain.llms.loading import load_llm_from_config
from langflow.interface.agents.custom import CUSTOM_AGENTS
from langflow.interface.importing.utils import import_by_type
from langflow.interface.toolkits.base import toolkits_creator
from langflow.interface.types import get_type_list from langflow.interface.types import get_type_list
from langflow.utils import payload, util, validate from langflow.utils import payload, util, validate
def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any: def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any:
"""Instantiate class from module type and key, and params""" """Instantiate class from module type and key, and params"""
if node_type in CUSTOM_AGENTS:
if custom_agent := CUSTOM_AGENTS.get(node_type):
return custom_agent.initialize(**params)
class_object = import_by_type(_type=base_type, name=node_type) class_object = import_by_type(_type=base_type, name=node_type)
if base_type == "agents": if base_type == "agents":
# We need to initialize it differently # We need to initialize it differently
allowed_tools = params["allowed_tools"] return load_agent_executor(class_object, params)
llm_chain = params["llm_chain"] elif node_type == "ZeroShotPrompt":
return load_agent_executor(class_object, allowed_tools, llm_chain) if "tools" not in params:
elif base_type == "tools" or node_type != "ZeroShotPrompt": params["tools"] = []
return class_object(**params) return ZeroShotAgent.create_prompt(**params)
elif node_type == "PythonFunction": elif node_type == "PythonFunction":
# If the node_type is "PythonFunction" # If the node_type is "PythonFunction"
# we need to get the function from the params # we need to get the function from the params
@ -45,10 +51,14 @@ def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any:
if isinstance(function_string, str): if isinstance(function_string, str):
return validate.eval_function(function_string) return validate.eval_function(function_string)
raise ValueError("Function should be a string") raise ValueError("Function should be a string")
elif base_type == "toolkits":
loaded_toolkit = class_object(**params)
# Check if node_type has a loader
if toolkits_creator.has_create_function(node_type):
return load_toolkits_executor(node_type, loaded_toolkit, params)
return loaded_toolkit
else: else:
if "tools" not in params: return class_object(**params)
params["tools"] = []
return ZeroShotAgent.create_prompt(**params)
def load_flow_from_json(path: str): def load_flow_from_json(path: str):
@ -122,10 +132,10 @@ def load_agent_executor_from_config(
) )
def load_agent_executor( def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs):
agent_class: type[agent_module.Agent], allowed_tools, llm_chain, **kwargs
):
"""Load agent executor from agent class, tools and chain""" """Load agent executor from agent class, tools and chain"""
allowed_tools = params["allowed_tools"]
llm_chain = params["llm_chain"]
tool_names = [tool.name for tool in allowed_tools] tool_names = [tool.name for tool in allowed_tools]
agent = agent_class(allowed_tools=tool_names, llm_chain=llm_chain) agent = agent_class(allowed_tools=tool_names, llm_chain=llm_chain)
return AgentExecutor.from_agent_and_tools( return AgentExecutor.from_agent_and_tools(
@ -135,6 +145,14 @@ def load_agent_executor(
) )
def load_toolkits_executor(node_type: str, toolkit: BaseToolkit, params: dict):
create_function = toolkits_creator.get_create_function(node_type)
llm = params.get("llm", None)
if llm:
return create_function(llm=llm, toolkit=toolkit)
return
def load_tools_from_config(tool_list: list[dict]) -> list: def load_tools_from_config(tool_list: list[dict]) -> list:
"""Load tools based on a config list. """Load tools based on a config list.

View file

@ -1,8 +1,8 @@
from langflow.interface.agents.base import agent_creator from langflow.interface.agents.base import agent_creator
from langflow.interface.chains.base import chain_creator
from langflow.interface.llms.base import llm_creator from langflow.interface.llms.base import llm_creator
from langflow.interface.memories.base import memory_creator from langflow.interface.memories.base import memory_creator
from langflow.interface.prompts.base import prompt_creator 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.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 from langflow.interface.wrappers.base import wrapper_creator

View file

View file

@ -1,4 +1,5 @@
from pathlib import Path from pathlib import Path
import pytest import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient