fix: formatting and utils
This commit is contained in:
parent
ef4fe40ce4
commit
92c3bb19b0
7 changed files with 75 additions and 25 deletions
26
src/backend/langflow/graph/utils.py
Normal file
26
src/backend/langflow/graph/utils.py
Normal 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)
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
0
src/backend/langflow/template/fields.py
Normal file
0
src/backend/langflow/template/fields.py
Normal 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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue