fix: Update templates and include global variables (#3755)

* update templates

* update to include global variables

* Refactor code to include global variables

* update PythonREPLTool.py

* [autofix.ci] apply automated fixes

* update pythonREPL and example

* Refactor code to handle decoding chat messages and handle decoding errors

*  (Simple Agent.spec.ts): Add test case to fill textarea with specific text for testing purposes
📝 (Simple Agent.spec.ts): Update test case descriptions for better clarity and accuracy
 (Simple Agent.spec.ts): Update test assertions to match the expected behavior of the test case

* [autofix.ci] apply automated fixes

* 🐛 (Dynamic Agent.spec.ts): fix environment variable name from BRAVE_SEARCH_API_KEY to SEARCH_API_KEY for consistency and clarity
💡 (Dynamic Agent.spec.ts): add additional test cases to improve test coverage and ensure specific text is not present in the chat output

* 🔧 (.github/workflows/typescript_test.yml): update environment variable name from BRAVE_SEARCH_API_KEY to SEARCH_API_KEY for consistency
🐛 (Travel Planning Agent.spec.ts): fix test to skip if SEARCH_API_KEY is not available in the environment variables

*  (Simple Agent.spec.ts): update expected count of python words to 3 for accurate test validation

* updating search tools

* [autofix.ci] apply automated fixes

* change examples

* update travel planning to include global variable

* Refactor search API component to include result limiting

* 📝 (Travel Planning Agent.spec.ts): remove unnecessary empty line to improve code readability and consistency

* test: adjusts asserts to make the test pass successfully

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
Co-authored-by: italojohnny <italojohnnydosanjos@gmail.com>
This commit is contained in:
anovazzi1 2024-09-11 11:47:42 -03:00 committed by GitHub
commit 810cf72487
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 953 additions and 823 deletions

View file

@ -45,7 +45,7 @@ jobs:
env:
OPENAI_API_KEY: ${{ inputs.openai_api_key || secrets.OPENAI_API_KEY }}
STORE_API_KEY: ${{ inputs.store_api_key || secrets.STORE_API_KEY }}
BRAVE_SEARCH_API_KEY: "${{ secrets.BRAVE_SEARCH_API_KEY }}"
SEARCH_API_KEY: "${{ secrets.SEARCH_API_KEY }}"
ASTRA_DB_APPLICATION_TOKEN: "${{ secrets.ASTRA_DB_APPLICATION_TOKEN }}"
ASTRA_DB_API_ENDPOINT: "${{ secrets.ASTRA_DB_API_ENDPOINT }}"
outputs:

View file

@ -1,13 +1,12 @@
import importlib
from typing import cast
from langchain_experimental.utilities import PythonREPL
from typing import List, Union
from pydantic import BaseModel, Field
from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.inputs import StrInput
from langflow.schema import Data
from langflow.field_typing import Tool
from langflow.io import MessageTextInput, MultiselectInput
from langflow.schema.data import Data
from langflow.template.field.base import Output
from langchain.tools import StructuredTool
from langchain_experimental.utilities import PythonREPL
class PythonREPLToolComponent(LCToolComponent):
@ -16,40 +15,45 @@ class PythonREPLToolComponent(LCToolComponent):
name = "PythonREPLTool"
inputs = [
MessageTextInput(name="input_value", display_name="Input", value=""),
MessageTextInput(name="name", display_name="Name", value="python_repl"),
MessageTextInput(
StrInput(
name="name",
display_name="Tool Name",
info="The name of the tool.",
value="python_repl",
),
StrInput(
name="description",
display_name="Description",
display_name="Tool Description",
info="A description of the tool.",
value="A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with `print(...)`.",
),
MultiselectInput(
StrInput(
name="global_imports",
display_name="Global Imports",
info="A list of modules to import globally, e.g. ['math', 'numpy'].",
value=["math"],
combobox=True,
info="A comma-separated list of modules to import globally, e.g. 'math,numpy'.",
value="math",
),
StrInput(
name="code",
display_name="Python Code",
info="The Python code to execute.",
value="print('Hello, World!')",
),
]
outputs = [
Output(name="api_run_model", display_name="Data", method="run_model"),
# Keep this for backwards compatibility
Output(name="tool", display_name="Tool", method="build_tool"),
]
class PythonREPLSchema(BaseModel):
code: str = Field(..., description="The Python code to execute.")
def get_globals(self, globals: list[str]) -> dict:
"""
Retrieves the global variables from the specified modules.
Args:
globals (list[str]): A list of module names.
Returns:
dict: A dictionary containing the global variables from the specified modules.
"""
def get_globals(self, global_imports: Union[str, List[str]]) -> dict:
global_dict = {}
for module in globals:
if isinstance(global_imports, str):
modules = [module.strip() for module in global_imports.split(",")]
elif isinstance(global_imports, list):
modules = global_imports
else:
raise ValueError("global_imports must be either a string or a list")
for module in modules:
try:
imported_module = importlib.import_module(module)
global_dict[imported_module.__name__] = imported_module
@ -58,24 +62,26 @@ class PythonREPLToolComponent(LCToolComponent):
return global_dict
def build_tool(self) -> Tool:
"""
Builds a Python REPL tool.
Returns:
Tool: The built Python REPL tool.
"""
_globals = self.get_globals(self.global_imports)
python_repl = PythonREPL(_globals=_globals)
return cast(
Tool,
Tool(
name=self.name,
description=self.description,
func=python_repl.run,
),
def run_python_code(code: str) -> str:
try:
return python_repl.run(code)
except Exception as e:
return f"Error: {str(e)}"
tool = StructuredTool.from_function(
name=self.name,
description=self.description,
func=run_python_code,
args_schema=self.PythonREPLSchema,
)
def run_model(self) -> Data:
self.status = f"Python REPL Tool created with global imports: {self.global_imports}"
return tool
def run_model(self) -> List[Data]:
tool = self.build_tool()
result = tool.invoke(self.input_value)
return Data(text=result)
result = tool.run(self.code)
return [Data(data={"result": result})]

View file

@ -1,16 +1,16 @@
from typing import Union
from typing import Dict, Any, Optional, List
from pydantic import BaseModel, Field
from langchain_community.utilities.searchapi import SearchApiAPIWrapper
from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput
from langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput, IntInput
from langflow.schema import Data
from langflow.field_typing import Tool
from langchain.tools import StructuredTool
class SearchAPIComponent(LCToolComponent):
display_name: str = "Search API"
description: str = "Call the searchapi.io API"
description: str = "Call the searchapi.io API with result limiting"
name = "SearchAPI"
documentation: str = "https://www.searchapi.io/docs/google"
@ -22,23 +22,62 @@ class SearchAPIComponent(LCToolComponent):
display_name="Input",
),
DictInput(name="search_params", display_name="Search parameters", advanced=True, is_list=True),
IntInput(name="max_results", display_name="Max Results", value=5, advanced=True),
IntInput(name="max_snippet_length", display_name="Max Snippet Length", value=100, advanced=True),
]
def run_model(self) -> Union[Data, list[Data]]:
wrapper = self._build_wrapper()
results = wrapper.results(query=self.input_value, **(self.search_params or {}))
list_results = results.get("organic_results", [])
data = [Data(data=result, text=result["snippet"]) for result in list_results]
self.status = data
return data
def build_tool(self) -> Tool:
wrapper = self._build_wrapper()
return Tool(
name="search_api",
description="Search for recent results.",
func=lambda x: wrapper.run(query=x, **(self.search_params or {})),
)
class SearchAPISchema(BaseModel):
query: str = Field(..., description="The search query")
params: Optional[Dict[str, Any]] = Field(default_factory=dict, description="Additional search parameters")
max_results: int = Field(5, description="Maximum number of results to return")
max_snippet_length: int = Field(100, description="Maximum length of each result snippet")
def _build_wrapper(self):
return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)
def build_tool(self) -> Tool:
wrapper = self._build_wrapper()
def search_func(
query: str, params: Optional[Dict[str, Any]] = None, max_results: int = 5, max_snippet_length: int = 100
) -> List[Dict[str, Any]]:
params = params or {}
full_results = wrapper.results(query=query, **params)
organic_results = full_results.get("organic_results", [])[:max_results]
limited_results = []
for result in organic_results:
limited_result = {
"title": result.get("title", "")[:max_snippet_length],
"link": result.get("link", ""),
"snippet": result.get("snippet", "")[:max_snippet_length],
}
limited_results.append(limited_result)
return limited_results
tool = StructuredTool.from_function(
name="search_api",
description="Search for recent results using searchapi.io with result limiting",
func=search_func,
args_schema=self.SearchAPISchema,
)
self.status = f"Search API Tool created with engine: {self.engine}"
return tool
def run_model(self) -> List[Data]:
tool = self.build_tool()
results = tool.run(
{
"query": self.input_value,
"params": self.search_params or {},
"max_results": self.max_results,
"max_snippet_length": self.max_snippet_length,
}
)
data_list = [Data(data=result, text=result.get("snippet", "")) for result in results]
self.status = data_list
return data_list

View file

@ -1,14 +1,16 @@
from typing import Dict, Any, Optional, List
from pydantic import BaseModel, Field
from langchain_community.utilities.serpapi import SerpAPIWrapper
from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.inputs import SecretStrInput, DictInput, MultilineInput
from langflow.inputs import SecretStrInput, DictInput, MultilineInput, IntInput
from langflow.schema import Data
from langflow.field_typing import Tool
from langchain.tools import StructuredTool
class SerpAPIComponent(LCToolComponent):
display_name = "Serp Search API"
description = "Call Serp Search API"
description = "Call Serp Search API with result limiting"
name = "SerpAPI"
inputs = [
@ -18,26 +20,71 @@ class SerpAPIComponent(LCToolComponent):
display_name="Input",
),
DictInput(name="search_params", display_name="Parameters", advanced=True, is_list=True),
IntInput(name="max_results", display_name="Max Results", value=5, advanced=True),
IntInput(name="max_snippet_length", display_name="Max Snippet Length", value=100, advanced=True),
]
def run_model(self) -> list[Data]:
wrapper = self._build_wrapper()
results = wrapper.results(self.input_value)
list_results = results.get("organic_results", [])
data = [Data(data=result, text=result["snippet"]) for result in list_results]
self.status = data
return data
def build_tool(self) -> Tool:
wrapper = self._build_wrapper()
return Tool(name="search_api", description="Search for recent results.", func=wrapper.run)
class SerpAPISchema(BaseModel):
query: str = Field(..., description="The search query")
params: Optional[Dict[str, Any]] = Field(default_factory=dict, description="Additional search parameters")
max_results: int = Field(5, description="Maximum number of results to return")
max_snippet_length: int = Field(100, description="Maximum length of each result snippet")
def _build_wrapper(self) -> SerpAPIWrapper:
if self.search_params:
return SerpAPIWrapper( # type: ignore
return SerpAPIWrapper(
serpapi_api_key=self.serpapi_api_key,
params=self.search_params,
)
return SerpAPIWrapper( # type: ignore
serpapi_api_key=self.serpapi_api_key
return SerpAPIWrapper(serpapi_api_key=self.serpapi_api_key)
def build_tool(self) -> Tool:
wrapper = self._build_wrapper()
def search_func(
query: str, params: Optional[Dict[str, Any]] = None, max_results: int = 5, max_snippet_length: int = 100
) -> List[Dict[str, Any]]:
params = params or {}
full_results = wrapper.results(query, **params)
organic_results = full_results.get("organic_results", [])[:max_results]
limited_results = []
for result in organic_results:
limited_result = {
"title": result.get("title", "")[:max_snippet_length],
"link": result.get("link", ""),
"snippet": result.get("snippet", "")[:max_snippet_length],
}
limited_results.append(limited_result)
return limited_results
tool = StructuredTool.from_function(
name="serp_search_api",
description="Search for recent results using SerpAPI with result limiting",
func=search_func,
args_schema=self.SerpAPISchema,
)
self.status = "SerpAPI Tool created"
return tool
def run_model(self) -> List[Data]:
tool = self.build_tool()
try:
results = tool.run(
{
"query": self.input_value,
"params": self.search_params or {},
"max_results": self.max_results,
"max_snippet_length": self.max_snippet_length,
}
)
data_list = [Data(data=result, text=result.get("snippet", "")) for result in results]
self.status = data_list
return data_list
except Exception as e:
self.status = f"Error: {str(e)}"
return [Data(data={"error": str(e)}, text=str(e))]

View file

@ -6,7 +6,7 @@
"data": {
"sourceHandle": {
"dataType": "ToolCallingAgent",
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"name": "response",
"output_types": [
"Message"
@ -14,25 +14,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-INBLf",
"id": "ChatOutput-Ag9YG",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ToolCallingAgent-hz7Eb{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-hz7Ebœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-INBLf{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-INBLfœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-hz7Eb",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-hz7Ebœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-INBLf",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-INBLfœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ToolCallingAgent-mf0BN{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-mf0BNœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-Ag9YG{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-Ag9YGœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-mf0BN",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-mf0BNœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-Ag9YG",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-Ag9YGœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-JusJ7",
"id": "OpenAIModel-1ioeW",
"name": "model_output",
"output_types": [
"LanguageModel"
@ -40,25 +40,25 @@
},
"targetHandle": {
"fieldName": "llm",
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"inputTypes": [
"LanguageModel"
],
"type": "other"
}
},
"id": "reactflow__edge-OpenAIModel-JusJ7{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-JusJ7œ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-hz7Eb{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-hz7Ebœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-JusJ7",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-JusJ7œ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-hz7Eb",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-hz7Ebœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIModel-1ioeW{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-1ioeWœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-mf0BN{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-mf0BNœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-1ioeW",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-1ioeWœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-mf0BN",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-mf0BNœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "CalculatorTool",
"id": "CalculatorTool-CN8yi",
"id": "CalculatorTool-Nb4P5",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -66,7 +66,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"inputTypes": [
"Tool",
"BaseTool"
@ -74,18 +74,18 @@
"type": "other"
}
},
"id": "reactflow__edge-CalculatorTool-CN8yi{œdataTypeœ:œCalculatorToolœ,œidœ:œCalculatorTool-CN8yiœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-hz7Eb{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-hz7Ebœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "CalculatorTool-CN8yi",
"sourceHandle": "{œdataTypeœ: œCalculatorToolœ, œidœ: œCalculatorTool-CN8yiœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-hz7Eb",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-hz7Ebœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-CalculatorTool-Nb4P5{œdataTypeœ:œCalculatorToolœ,œidœ:œCalculatorTool-Nb4P5œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-mf0BN{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-mf0BNœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "CalculatorTool-Nb4P5",
"sourceHandle": "{œdataTypeœ: œCalculatorToolœ, œidœ: œCalculatorTool-Nb4P5œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-mf0BN",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-mf0BNœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
"id": "ChatInput-oZ2ae",
"id": "ChatInput-X3ARP",
"name": "message",
"output_types": [
"Message"
@ -93,33 +93,32 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ChatInput-oZ2ae{œdataTypeœ:œChatInputœ,œidœ:œChatInput-oZ2aeœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-hz7Eb{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-hz7Ebœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-oZ2ae",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-oZ2aeœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-hz7Eb",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-hz7Ebœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ChatInput-X3ARP{œdataTypeœ:œChatInputœ,œidœ:œChatInput-X3ARPœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-mf0BN{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-mf0BNœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-X3ARP",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-X3ARPœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-mf0BN",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-mf0BNœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "PythonREPLTool",
"id": "PythonREPLTool-Lq9f4",
"name": "tool",
"id": "PythonREPLTool-i922a",
"name": "api_build_tool",
"output_types": [
"Tool"
]
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"inputTypes": [
"Tool",
"BaseTool"
@ -127,17 +126,17 @@
"type": "other"
}
},
"id": "reactflow__edge-PythonREPLTool-Lq9f4{œdataTypeœ:œPythonREPLToolœ,œidœ:œPythonREPLTool-Lq9f4œ,œnameœ:œtoolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-hz7Eb{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-hz7Ebœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "PythonREPLTool-Lq9f4",
"sourceHandle": "{œdataTypeœ: œPythonREPLToolœ, œidœ: œPythonREPLTool-Lq9f4œ, œnameœ: œtoolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-hz7Eb",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-hz7Ebœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-PythonREPLTool-i922a{œdataTypeœ:œPythonREPLToolœ,œidœ:œPythonREPLTool-i922aœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-mf0BN{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-mf0BNœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "PythonREPLTool-i922a",
"sourceHandle": "{œdataTypeœ: œPythonREPLToolœ, œidœ: œPythonREPLTool-i922aœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-mf0BN",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-mf0BNœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
}
],
"nodes": [
{
"data": {
"id": "ChatInput-oZ2ae",
"id": "ChatInput-X3ARP",
"node": {
"base_classes": [
"Message"
@ -342,8 +341,8 @@
"type": "ChatInput"
},
"dragging": false,
"height": 298,
"id": "ChatInput-oZ2ae",
"height": 302,
"id": "ChatInput-X3ARP",
"position": {
"x": 1760.192972923414,
"y": -191.51901724049213
@ -358,7 +357,7 @@
},
{
"data": {
"id": "ChatOutput-INBLf",
"id": "ChatOutput-Ag9YG",
"node": {
"base_classes": [
"Message"
@ -541,8 +540,8 @@
"type": "ChatOutput"
},
"dragging": false,
"height": 298,
"id": "ChatOutput-INBLf",
"height": 302,
"id": "ChatOutput-Ag9YG",
"position": {
"x": 3968.8870036313238,
"y": 627.770746142633
@ -559,7 +558,7 @@
"data": {
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"id": "OpenAIModel-JusJ7",
"id": "OpenAIModel-1ioeW",
"node": {
"base_classes": [
"LanguageModel",
@ -634,7 +633,7 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "OPENAI_API_KEY"
},
"code": {
"advanced": true,
@ -862,8 +861,8 @@
"type": "OpenAIModel"
},
"dragging": false,
"height": 601,
"id": "OpenAIModel-JusJ7",
"height": 605,
"id": "OpenAIModel-1ioeW",
"position": {
"x": 2538.9919009235173,
"y": 1206.8619086167491
@ -878,7 +877,7 @@
},
{
"data": {
"id": "ToolCallingAgent-hz7Eb",
"id": "ToolCallingAgent-mf0BN",
"node": {
"base_classes": [
"AgentExecutor",
@ -1130,8 +1129,8 @@
"type": "ToolCallingAgent"
},
"dragging": false,
"height": 594,
"id": "ToolCallingAgent-hz7Eb",
"height": 598,
"id": "ToolCallingAgent-mf0BN",
"position": {
"x": 3276.3854573966964,
"y": 516.3304705434241
@ -1146,7 +1145,7 @@
},
{
"data": {
"id": "CalculatorTool-CN8yi",
"id": "CalculatorTool-Nb4P5",
"node": {
"base_classes": [
"Data",
@ -1242,8 +1241,8 @@
"type": "CalculatorTool"
},
"dragging": false,
"height": 371,
"id": "CalculatorTool-CN8yi",
"height": 375,
"id": "CalculatorTool-Nb4P5",
"position": {
"x": 2330.062076024461,
"y": 429.6717346334192
@ -1258,31 +1257,28 @@
},
{
"data": {
"id": "PythonREPLTool-Lq9f4",
"description": "A tool for running Python code in a REPL environment.",
"display_name": "Python REPL Tool",
"id": "PythonREPLTool-i922a",
"node": {
"base_classes": [
"BaseTool",
"Generic",
"object",
"Runnable",
"RunnableSerializable",
"Serializable",
"Data",
"Tool"
],
"beta": false,
"conditional_paths": [],
"custom_fields": {
"description": null,
"global_imports": null,
"name": null
},
"custom_fields": {},
"description": "A tool for running Python code in a REPL environment.",
"display_name": "Python REPL Tool",
"documentation": "",
"edited": false,
"field_order": [],
"field_order": [
"name",
"description",
"global_imports",
"code"
],
"frozen": false,
"lf_version": "1.0.16",
"output_types": [],
"outputs": [
{
@ -1300,7 +1296,7 @@
"cache": true,
"display_name": "Tool",
"method": "build_tool",
"name": "tool",
"name": "api_build_tool",
"selected": "Tool",
"types": [
"Tool"
@ -1327,17 +1323,14 @@
"show": true,
"title_case": false,
"type": "code",
"value": "import importlib\nfrom typing import cast\n\nfrom langchain_experimental.utilities import PythonREPL\n\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.field_typing import Tool\nfrom langflow.io import MessageTextInput, MultiselectInput\nfrom langflow.schema.data import Data\nfrom langflow.template.field.base import Output\n\n\nclass PythonREPLToolComponent(LCToolComponent):\n display_name = \"Python REPL Tool\"\n description = \"A tool for running Python code in a REPL environment.\"\n name = \"PythonREPLTool\"\n\n inputs = [\n MessageTextInput(name=\"input_value\", display_name=\"Input\", value=\"\"),\n MessageTextInput(name=\"name\", display_name=\"Name\", value=\"python_repl\"),\n MessageTextInput(\n name=\"description\",\n display_name=\"Description\",\n value=\"A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with `print(...)`.\",\n ),\n MultiselectInput(\n name=\"global_imports\",\n display_name=\"Global Imports\",\n info=\"A list of modules to import globally, e.g. ['math', 'numpy'].\",\n value=[\"math\"],\n combobox=True,\n ),\n ]\n\n outputs = [\n Output(name=\"api_run_model\", display_name=\"Data\", method=\"run_model\"),\n # Keep this for backwards compatibility\n Output(name=\"tool\", display_name=\"Tool\", method=\"build_tool\"),\n ]\n\n def get_globals(self, globals: list[str]) -> dict:\n \"\"\"\n Retrieves the global variables from the specified modules.\n\n Args:\n globals (list[str]): A list of module names.\n\n Returns:\n dict: A dictionary containing the global variables from the specified modules.\n \"\"\"\n global_dict = {}\n for module in globals:\n try:\n imported_module = importlib.import_module(module)\n global_dict[imported_module.__name__] = imported_module\n except ImportError:\n raise ImportError(f\"Could not import module {module}\")\n return global_dict\n\n def build_tool(self) -> Tool:\n \"\"\"\n Builds a Python REPL tool.\n\n Returns:\n Tool: The built Python REPL tool.\n \"\"\"\n _globals = self.get_globals(self.global_imports)\n python_repl = PythonREPL(_globals=_globals)\n return cast(\n Tool,\n Tool(\n name=self.name,\n description=self.description,\n func=python_repl.run,\n ),\n )\n\n def run_model(self) -> Data:\n tool = self.build_tool()\n result = tool.invoke(self.input_value)\n return Data(text=result)\n"
"value": "import importlib\nfrom typing import List, Union\nfrom pydantic import BaseModel, Field\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.inputs import StrInput\nfrom langflow.schema import Data\nfrom langflow.field_typing import Tool\nfrom langchain.tools import StructuredTool\nfrom langchain_experimental.utilities import PythonREPL\n\n\nclass PythonREPLToolComponent(LCToolComponent):\n display_name = \"Python REPL Tool\"\n description = \"A tool for running Python code in a REPL environment.\"\n name = \"PythonREPLTool\"\n\n inputs = [\n StrInput(\n name=\"name\",\n display_name=\"Tool Name\",\n info=\"The name of the tool.\",\n value=\"python_repl\",\n ),\n StrInput(\n name=\"description\",\n display_name=\"Tool Description\",\n info=\"A description of the tool.\",\n value=\"A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with `print(...)`.\",\n ),\n StrInput(\n name=\"global_imports\",\n display_name=\"Global Imports\",\n info=\"A comma-separated list of modules to import globally, e.g. 'math,numpy'.\",\n value=\"math\",\n ),\n StrInput(\n name=\"code\",\n display_name=\"Python Code\",\n info=\"The Python code to execute.\",\n value=\"print('Hello, World!')\",\n ),\n ]\n\n class PythonREPLSchema(BaseModel):\n code: str = Field(..., description=\"The Python code to execute.\")\n\n def get_globals(self, global_imports: Union[str, List[str]]) -> dict:\n global_dict = {}\n if isinstance(global_imports, str):\n modules = [module.strip() for module in global_imports.split(\",\")]\n elif isinstance(global_imports, list):\n modules = global_imports\n else:\n raise ValueError(\"global_imports must be either a string or a list\")\n\n for module in modules:\n try:\n imported_module = importlib.import_module(module)\n global_dict[imported_module.__name__] = imported_module\n except ImportError:\n raise ImportError(f\"Could not import module {module}\")\n return global_dict\n\n def build_tool(self) -> Tool:\n _globals = self.get_globals(self.global_imports)\n python_repl = PythonREPL(_globals=_globals)\n\n def run_python_code(code: str) -> str:\n try:\n return python_repl.run(code)\n except Exception as e:\n return f\"Error: {str(e)}\"\n\n tool = StructuredTool.from_function(\n name=self.name,\n description=self.description,\n func=run_python_code,\n args_schema=self.PythonREPLSchema,\n )\n\n self.status = f\"Python REPL Tool created with global imports: {self.global_imports}\"\n return tool\n\n def run_model(self) -> List[Data]:\n tool = self.build_tool()\n result = tool.run(self.code)\n return [Data(data={\"result\": result})]\n"
},
"description": {
"_input_type": "MessageTextInput",
"_input_type": "StrInput",
"advanced": false,
"display_name": "Description",
"display_name": "Tool Description",
"dynamic": false,
"info": "",
"input_types": [
"Message"
],
"info": "A description of the tool.",
"list": false,
"load_from_db": false,
"name": "description",
@ -1345,61 +1338,33 @@
"required": false,
"show": true,
"title_case": false,
"trace_as_input": true,
"trace_as_metadata": true,
"type": "str",
"value": "A Python shell. Use this to execute python commands. Input should be a valid python command. If you want to see the output of a value, you should print it out with `print(...)`."
},
"global_imports": {
"_input_type": "MultiselectInput",
"_input_type": "StrInput",
"advanced": false,
"combobox": true,
"display_name": "Global Imports",
"dynamic": false,
"info": "A list of modules to import globally, e.g. ['math', 'numpy'].",
"list": true,
"name": "global_imports",
"options": [],
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_metadata": true,
"type": "str",
"value": [
"math"
]
},
"input_value": {
"_input_type": "MessageTextInput",
"advanced": false,
"display_name": "Input",
"dynamic": false,
"info": "",
"input_types": [
"Message"
],
"info": "A comma-separated list of modules to import globally, e.g. 'math,numpy'.",
"list": false,
"load_from_db": false,
"name": "input_value",
"name": "global_imports",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_input": true,
"trace_as_metadata": true,
"type": "str",
"value": ""
"value": "math"
},
"name": {
"_input_type": "MessageTextInput",
"_input_type": "StrInput",
"advanced": false,
"display_name": "Name",
"display_name": "Tool Name",
"dynamic": false,
"info": "",
"input_types": [
"Message"
],
"info": "The name of the tool.",
"list": false,
"load_from_db": false,
"name": "name",
@ -1407,7 +1372,6 @@
"required": false,
"show": true,
"title_case": false,
"trace_as_input": true,
"trace_as_metadata": true,
"type": "str",
"value": "python_repl"
@ -1417,30 +1381,30 @@
"type": "PythonREPLTool"
},
"dragging": false,
"height": 498,
"id": "PythonREPLTool-Lq9f4",
"height": 547,
"id": "PythonREPLTool-i922a",
"position": {
"x": 1913.7230985868182,
"y": 692.706669085293
"x": 1763.1630547496572,
"y": 791.8164465037205
},
"positionAbsolute": {
"x": 1913.7230985868182,
"y": 692.706669085293
"x": 1763.1630547496572,
"y": 791.8164465037205
},
"selected": false,
"selected": true,
"type": "genericNode",
"width": 384
}
],
"viewport": {
"x": -754.0306037880273,
"y": 162.78671921468404,
"zoom": 0.4165803465525388
"x": -796.2952218140445,
"y": 174.7919632061971,
"zoom": 0.6144692758797546
}
},
"description": "Single Agent Flow to get you started. This flow contains a calculator and a Python REPL tool, that could be used by our tool calling agent.",
"endpoint_name": null,
"id": "b4267655-485a-44eb-9232-0bc120086418",
"id": "beda74a3-7e03-4c14-a148-a7740e810dbf",
"is_component": false,
"last_tested_version": "1.0.17",
"name": "Simple Agent"

View file

@ -6,7 +6,7 @@
"data": {
"sourceHandle": {
"dataType": "URL",
"id": "URL-76lwY",
"id": "URL-46k0m",
"name": "data",
"output_types": [
"Data"
@ -14,25 +14,25 @@
},
"targetHandle": {
"fieldName": "data",
"id": "ParseData-jYhXf",
"id": "ParseData-jUQRS",
"inputTypes": [
"Data"
],
"type": "other"
}
},
"id": "reactflow__edge-URL-76lwY{œdataTypeœ:œURLœ,œidœ:œURL-76lwYœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-jYhXf{œfieldNameœ:œdataœ,œidœ:œParseData-jYhXfœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "URL-76lwY",
"sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-76lwYœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
"target": "ParseData-jYhXf",
"targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-jYhXfœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-URL-46k0m{œdataTypeœ:œURLœ,œidœ:œURL-46k0mœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-jUQRS{œfieldNameœ:œdataœ,œidœ:œParseData-jUQRSœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "URL-46k0m",
"sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-46k0mœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
"target": "ParseData-jUQRS",
"targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-jUQRSœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ParseData",
"id": "ParseData-jYhXf",
"id": "ParseData-jUQRS",
"name": "text",
"output_types": [
"Message"
@ -40,7 +40,7 @@
},
"targetHandle": {
"fieldName": "references",
"id": "Prompt-ABI8S",
"id": "Prompt-Pf4QQ",
"inputTypes": [
"Message",
"Text"
@ -48,18 +48,18 @@
"type": "str"
}
},
"id": "reactflow__edge-ParseData-jYhXf{œdataTypeœ:œParseDataœ,œidœ:œParseData-jYhXfœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-ABI8S{œfieldNameœ:œreferencesœ,œidœ:œPrompt-ABI8Sœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ParseData-jYhXf",
"sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-jYhXfœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-ABI8S",
"targetHandle": "{œfieldNameœ: œreferencesœ, œidœ: œPrompt-ABI8Sœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ParseData-jUQRS{œdataTypeœ:œParseDataœ,œidœ:œParseData-jUQRSœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Pf4QQ{œfieldNameœ:œreferencesœ,œidœ:œPrompt-Pf4QQœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ParseData-jUQRS",
"sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-jUQRSœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-Pf4QQ",
"targetHandle": "{œfieldNameœ: œreferencesœ, œidœ: œPrompt-Pf4QQœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "TextInput",
"id": "TextInput-jiXJB",
"id": "TextInput-slCbp",
"name": "text",
"output_types": [
"Message"
@ -67,7 +67,7 @@
},
"targetHandle": {
"fieldName": "instructions",
"id": "Prompt-ABI8S",
"id": "Prompt-Pf4QQ",
"inputTypes": [
"Message",
"Text"
@ -75,18 +75,18 @@
"type": "str"
}
},
"id": "reactflow__edge-TextInput-jiXJB{œdataTypeœ:œTextInputœ,œidœ:œTextInput-jiXJBœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-ABI8S{œfieldNameœ:œinstructionsœ,œidœ:œPrompt-ABI8Sœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "TextInput-jiXJB",
"sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-jiXJBœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-ABI8S",
"targetHandle": "{œfieldNameœ: œinstructionsœ, œidœ: œPrompt-ABI8Sœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-TextInput-slCbp{œdataTypeœ:œTextInputœ,œidœ:œTextInput-slCbpœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Pf4QQ{œfieldNameœ:œinstructionsœ,œidœ:œPrompt-Pf4QQœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "TextInput-slCbp",
"sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-slCbpœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-Pf4QQ",
"targetHandle": "{œfieldNameœ: œinstructionsœ, œidœ: œPrompt-Pf4QQœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
"id": "Prompt-ABI8S",
"id": "Prompt-Pf4QQ",
"name": "prompt",
"output_types": [
"Message"
@ -94,25 +94,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-JBO2p",
"id": "OpenAIModel-o0Gr0",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-Prompt-ABI8S{œdataTypeœ:œPromptœ,œidœ:œPrompt-ABI8Sœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-JBO2p{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-JBO2pœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "Prompt-ABI8S",
"sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-ABI8Sœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
"target": "OpenAIModel-JBO2p",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-JBO2pœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-Prompt-Pf4QQ{œdataTypeœ:œPromptœ,œidœ:œPrompt-Pf4QQœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-o0Gr0{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-o0Gr0œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "Prompt-Pf4QQ",
"sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-Pf4QQœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
"target": "OpenAIModel-o0Gr0",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-o0Gr0œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-JBO2p",
"id": "OpenAIModel-o0Gr0",
"name": "text_output",
"output_types": [
"Message"
@ -120,18 +120,18 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-uaX6T",
"id": "ChatOutput-eIVde",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-OpenAIModel-JBO2p{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-JBO2pœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-uaX6T{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-uaX6Tœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "OpenAIModel-JBO2p",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-JBO2pœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-uaX6T",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-uaX6Tœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-OpenAIModel-o0Gr0{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-o0Gr0œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-eIVde{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-eIVdeœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "OpenAIModel-o0Gr0",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-o0Gr0œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-eIVde",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-eIVdeœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
}
],
"nodes": [
@ -139,7 +139,7 @@
"data": {
"description": "Fetch content from one or more URLs.",
"display_name": "URL",
"id": "URL-76lwY",
"id": "URL-46k0m",
"node": {
"base_classes": [
"Data"
@ -230,8 +230,8 @@
"type": "URL"
},
"dragging": false,
"height": 359,
"id": "URL-76lwY",
"height": 397,
"id": "URL-46k0m",
"position": {
"x": 220.79156431407534,
"y": 498.8186168722667
@ -248,7 +248,7 @@
"data": {
"description": "Convert Data into plain text following a specified template.",
"display_name": "Parse Data",
"id": "ParseData-jYhXf",
"id": "ParseData-jUQRS",
"node": {
"base_classes": [
"Message"
@ -363,8 +363,8 @@
"type": "ParseData"
},
"dragging": false,
"height": 385,
"id": "ParseData-jYhXf",
"height": 378,
"id": "ParseData-jUQRS",
"position": {
"x": 754.3607306709101,
"y": 736.8516961537598
@ -381,7 +381,7 @@
"data": {
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
"id": "Prompt-ABI8S",
"id": "Prompt-Pf4QQ",
"node": {
"base_classes": [
"Message"
@ -507,8 +507,8 @@
"type": "Prompt"
},
"dragging": false,
"height": 517,
"id": "Prompt-ABI8S",
"height": 502,
"id": "Prompt-Pf4QQ",
"position": {
"x": 1368.0633591447076,
"y": 467.19448061224284
@ -525,7 +525,7 @@
"data": {
"description": "Get text inputs from the Playground.",
"display_name": "Instructions",
"id": "TextInput-jiXJB",
"id": "TextInput-slCbp",
"node": {
"base_classes": [
"Message"
@ -575,9 +575,10 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n return message\n"
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n return message\n"
},
"input_value": {
"_input_type": "MultilineInput",
"advanced": false,
"display_name": "Text",
"dynamic": false,
@ -587,6 +588,7 @@
],
"list": false,
"load_from_db": false,
"multiline": true,
"name": "input_value",
"placeholder": "",
"required": false,
@ -602,8 +604,8 @@
"type": "TextInput"
},
"dragging": false,
"height": 309,
"id": "TextInput-jiXJB",
"height": 302,
"id": "TextInput-slCbp",
"position": {
"x": 743.7338453293725,
"y": 301.58775454952183
@ -620,7 +622,7 @@
"data": {
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"id": "ChatOutput-uaX6T",
"id": "ChatOutput-eIVde",
"node": {
"base_classes": [
"Message"
@ -796,8 +798,8 @@
"type": "ChatOutput"
},
"dragging": false,
"height": 309,
"id": "ChatOutput-uaX6T",
"height": 302,
"id": "ChatOutput-eIVde",
"position": {
"x": 2449.3489426461606,
"y": 571.2449700910389
@ -814,7 +816,7 @@
"data": {
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"id": "OpenAIModel-JBO2p",
"id": "OpenAIModel-o0Gr0",
"node": {
"base_classes": [
"LanguageModel",
@ -1093,8 +1095,8 @@
"type": "OpenAIModel"
},
"dragging": false,
"height": 623,
"id": "OpenAIModel-JBO2p",
"height": 605,
"id": "OpenAIModel-o0Gr0",
"position": {
"x": 1950.3830456413473,
"y": 380.8161704718418
@ -1103,21 +1105,21 @@
"x": 1950.3830456413473,
"y": 380.8161704718418
},
"selected": false,
"selected": true,
"type": "genericNode",
"width": 384
}
],
"viewport": {
"x": -52.959712994147594,
"y": 41.95510708899229,
"zoom": 0.5873729194514925
"x": -314.93585938343927,
"y": 168.32720664181306,
"zoom": 0.5205627295612754
}
},
"description": "This flow can be used to create a blog post following instructions from the user, using two other blogs as reference.",
"endpoint_name": null,
"id": "6b576678-66cd-4d6e-ab40-af1104f02c37",
"id": "92d42e25-91d4-4108-8187-92fc53fc9778",
"is_component": false,
"last_tested_version": "1.0.9",
"last_tested_version": "1.0.17",
"name": "Blog Writer"
}

View file

@ -2595,7 +2595,7 @@
"beta": false,
"conditional_paths": [],
"custom_fields": {},
"description": "Call the searchapi.io API",
"description": "Call the searchapi.io API with result limiting",
"display_name": "Search API",
"documentation": "https://www.searchapi.io/docs/google",
"edited": false,
@ -2668,7 +2668,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from typing import Union\n\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\n\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput\nfrom langflow.schema import Data\nfrom langflow.field_typing import Tool\n\n\nclass SearchAPIComponent(LCToolComponent):\n display_name: str = \"Search API\"\n description: str = \"Call the searchapi.io API\"\n name = \"SearchAPI\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n\n inputs = [\n MessageTextInput(name=\"engine\", display_name=\"Engine\", value=\"google\"),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n ),\n DictInput(name=\"search_params\", display_name=\"Search parameters\", advanced=True, is_list=True),\n ]\n\n def run_model(self) -> Union[Data, list[Data]]:\n wrapper = self._build_wrapper()\n results = wrapper.results(query=self.input_value, **(self.search_params or {}))\n list_results = results.get(\"organic_results\", [])\n data = [Data(data=result, text=result[\"snippet\"]) for result in list_results]\n self.status = data\n return data\n\n def build_tool(self) -> Tool:\n wrapper = self._build_wrapper()\n return Tool(\n name=\"search_api\",\n description=\"Search for recent results.\",\n func=lambda x: wrapper.run(query=x, **(self.search_params or {})),\n )\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n"
"value": "from typing import Dict, Any, Optional, List\nfrom pydantic import BaseModel, Field\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput, IntInput\nfrom langflow.schema import Data\nfrom langflow.field_typing import Tool\nfrom langchain.tools import StructuredTool\n\n\nclass SearchAPIComponent(LCToolComponent):\n display_name: str = \"Search API\"\n description: str = \"Call the searchapi.io API with result limiting\"\n name = \"SearchAPI\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n\n inputs = [\n MessageTextInput(name=\"engine\", display_name=\"Engine\", value=\"google\"),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n ),\n DictInput(name=\"search_params\", display_name=\"Search parameters\", advanced=True, is_list=True),\n IntInput(name=\"max_results\", display_name=\"Max Results\", value=5, advanced=True),\n IntInput(name=\"max_snippet_length\", display_name=\"Max Snippet Length\", value=100, advanced=True),\n ]\n\n class SearchAPISchema(BaseModel):\n query: str = Field(..., description=\"The search query\")\n params: Optional[Dict[str, Any]] = Field(default_factory=dict, description=\"Additional search parameters\")\n max_results: int = Field(5, description=\"Maximum number of results to return\")\n max_snippet_length: int = Field(100, description=\"Maximum length of each result snippet\")\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n\n def build_tool(self) -> Tool:\n wrapper = self._build_wrapper()\n\n def search_func(\n query: str, params: Optional[Dict[str, Any]] = None, max_results: int = 5, max_snippet_length: int = 100\n ) -> List[Dict[str, Any]]:\n params = params or {}\n full_results = wrapper.results(query=query, **params)\n organic_results = full_results.get(\"organic_results\", [])[:max_results]\n\n limited_results = []\n for result in organic_results:\n limited_result = {\n \"title\": result.get(\"title\", \"\")[:max_snippet_length],\n \"link\": result.get(\"link\", \"\"),\n \"snippet\": result.get(\"snippet\", \"\")[:max_snippet_length],\n }\n limited_results.append(limited_result)\n\n return limited_results\n\n tool = StructuredTool.from_function(\n name=\"search_api\",\n description=\"Search for recent results using searchapi.io with result limiting\",\n func=search_func,\n args_schema=self.SearchAPISchema,\n )\n\n self.status = f\"Search API Tool created with engine: {self.engine}\"\n return tool\n\n def run_model(self) -> List[Data]:\n tool = self.build_tool()\n results = tool.run(\n {\n \"query\": self.input_value,\n \"params\": self.search_params or {},\n \"max_results\": self.max_results,\n \"max_snippet_length\": self.max_snippet_length,\n }\n )\n\n data_list = [Data(data=result, text=result.get(\"snippet\", \"\")) for result in results]\n\n self.status = data_list\n return data_list\n"
},
"engine": {
"advanced": false,
@ -2711,6 +2711,38 @@
"type": "str",
"value": ""
},
"max_results": {
"_input_type": "IntInput",
"advanced": true,
"display_name": "Max Results",
"dynamic": false,
"info": "",
"list": false,
"name": "max_results",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_metadata": true,
"type": "int",
"value": 5
},
"max_snippet_length": {
"_input_type": "IntInput",
"advanced": true,
"display_name": "Max Snippet Length",
"dynamic": false,
"info": "",
"list": false,
"name": "max_snippet_length",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_metadata": true,
"type": "int",
"value": 100
},
"search_params": {
"advanced": true,
"display_name": "Search parameters",

View file

@ -6,7 +6,7 @@
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-2o0gd",
"id": "OpenAIModel-gRakF",
"name": "model_output",
"output_types": [
"LanguageModel"
@ -14,25 +14,25 @@
},
"targetHandle": {
"fieldName": "llm",
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"inputTypes": [
"LanguageModel"
],
"type": "other"
}
},
"id": "reactflow__edge-OpenAIModel-2o0gd{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-2o0gdœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-vCq4v{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-vCq4vœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-2o0gd",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-2o0gdœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-vCq4v",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-vCq4vœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIModel-gRakF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-gRakFœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-0QzrL{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-0QzrLœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-gRakF",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-gRakFœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-0QzrL",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-0QzrLœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
"id": "ChatInput-z8SS4",
"id": "ChatInput-uYdzQ",
"name": "message",
"output_types": [
"Message"
@ -40,25 +40,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ChatInput-z8SS4{œdataTypeœ:œChatInputœ,œidœ:œChatInput-z8SS4œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-vCq4v{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-vCq4vœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-z8SS4",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-z8SS4œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-vCq4v",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-vCq4vœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ChatInput-uYdzQ{œdataTypeœ:œChatInputœ,œidœ:œChatInput-uYdzQœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-0QzrL{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-0QzrLœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-uYdzQ",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-uYdzQœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-0QzrL",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-0QzrLœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ToolCallingAgent",
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"name": "response",
"output_types": [
"Message"
@ -66,25 +66,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ToolCallingAgent-rT7Y8{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-rT7Y8œ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-Zo0ES{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-Zo0ESœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-rT7Y8",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-rT7Y8œ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-Zo0ES",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-Zo0ESœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ToolCallingAgent-KLe5u{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-KLe5uœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-VYDK9{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-VYDK9œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-KLe5u",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-KLe5uœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-VYDK9",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-VYDK9œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ToolCallingAgent",
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"name": "response",
"output_types": [
"Message"
@ -92,25 +92,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ToolCallingAgent-vCq4v{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-vCq4vœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-rT7Y8{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-rT7Y8œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-vCq4v",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-vCq4vœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-rT7Y8",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-rT7Y8œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ToolCallingAgent-0QzrL{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-0QzrLœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ToolCallingAgent-KLe5u{œfieldNameœ:œinput_valueœ,œidœ:œToolCallingAgent-KLe5uœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-0QzrL",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-0QzrLœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ToolCallingAgent-KLe5u",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œToolCallingAgent-KLe5uœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "SearchAPI",
"id": "SearchAPI-BaDvF",
"id": "SearchAPI-I4yU0",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -118,7 +118,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"inputTypes": [
"Tool",
"BaseTool"
@ -126,18 +126,18 @@
"type": "other"
}
},
"id": "reactflow__edge-SearchAPI-BaDvF{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-BaDvFœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-vCq4v{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-vCq4vœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-BaDvF",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-BaDvFœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-vCq4v",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-vCq4vœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-SearchAPI-I4yU0{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-I4yU0œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-0QzrL{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-0QzrLœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-I4yU0",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-I4yU0œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-0QzrL",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-0QzrLœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "url_content_fetcher",
"id": "url_content_fetcher-5EFR2",
"id": "url_content_fetcher-1FugB",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -145,7 +145,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"inputTypes": [
"Tool",
"BaseTool"
@ -153,18 +153,18 @@
"type": "other"
}
},
"id": "reactflow__edge-url_content_fetcher-5EFR2{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-5EFR2œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-vCq4v{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-vCq4vœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-5EFR2",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-5EFR2œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-vCq4v",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-vCq4vœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-url_content_fetcher-1FugB{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-1FugBœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-0QzrL{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-0QzrLœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-1FugB",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-1FugBœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-0QzrL",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-0QzrLœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "SearchAPI",
"id": "SearchAPI-BaDvF",
"id": "SearchAPI-I4yU0",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -172,7 +172,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"inputTypes": [
"Tool",
"BaseTool"
@ -180,18 +180,18 @@
"type": "other"
}
},
"id": "reactflow__edge-SearchAPI-BaDvF{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-BaDvFœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-rT7Y8{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-rT7Y8œ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-BaDvF",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-BaDvFœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-rT7Y8",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-rT7Y8œ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-SearchAPI-I4yU0{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-I4yU0œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-KLe5u{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-KLe5uœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-I4yU0",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-I4yU0œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-KLe5u",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-KLe5uœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "url_content_fetcher",
"id": "url_content_fetcher-5EFR2",
"id": "url_content_fetcher-1FugB",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -199,7 +199,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"inputTypes": [
"Tool",
"BaseTool"
@ -207,18 +207,18 @@
"type": "other"
}
},
"id": "reactflow__edge-url_content_fetcher-5EFR2{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-5EFR2œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-rT7Y8{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-rT7Y8œ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-5EFR2",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-5EFR2œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-rT7Y8",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-rT7Y8œ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-url_content_fetcher-1FugB{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-1FugBœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-KLe5u{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-KLe5uœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-1FugB",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-1FugBœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-KLe5u",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-KLe5uœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "url_content_fetcher",
"id": "url_content_fetcher-5EFR2",
"id": "url_content_fetcher-1FugB",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -226,7 +226,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"inputTypes": [
"Tool",
"BaseTool"
@ -234,18 +234,18 @@
"type": "other"
}
},
"id": "reactflow__edge-url_content_fetcher-5EFR2{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-5EFR2œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-Zo0ES{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-Zo0ESœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-5EFR2",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-5EFR2œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-Zo0ES",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-Zo0ESœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-url_content_fetcher-1FugB{œdataTypeœ:œurl_content_fetcherœ,œidœ:œurl_content_fetcher-1FugBœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-VYDK9{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-VYDK9œ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "url_content_fetcher-1FugB",
"sourceHandle": "{œdataTypeœ: œurl_content_fetcherœ, œidœ: œurl_content_fetcher-1FugBœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-VYDK9",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-VYDK9œ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "SearchAPI",
"id": "SearchAPI-BaDvF",
"id": "SearchAPI-I4yU0",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -253,7 +253,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"inputTypes": [
"Tool",
"BaseTool"
@ -261,18 +261,18 @@
"type": "other"
}
},
"id": "reactflow__edge-SearchAPI-BaDvF{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-BaDvFœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-Zo0ES{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-Zo0ESœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-BaDvF",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-BaDvFœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-Zo0ES",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-Zo0ESœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-SearchAPI-I4yU0{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-I4yU0œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-VYDK9{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-VYDK9œ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "SearchAPI-I4yU0",
"sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-I4yU0œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-VYDK9",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-VYDK9œ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ToolCallingAgent",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"name": "response",
"output_types": [
"Message"
@ -280,25 +280,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-zxRey",
"id": "ChatOutput-O63dG",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ToolCallingAgent-Zo0ES{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-Zo0ESœ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-zxRey{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-zxReyœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-Zo0ES",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-Zo0ESœ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-zxRey",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-zxReyœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ToolCallingAgent-VYDK9{œdataTypeœ:œToolCallingAgentœ,œidœ:œToolCallingAgent-VYDK9œ,œnameœ:œresponseœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-O63dG{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-O63dGœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ToolCallingAgent-VYDK9",
"sourceHandle": "{œdataTypeœ: œToolCallingAgentœ, œidœ: œToolCallingAgent-VYDK9œ, œnameœ: œresponseœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-O63dG",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-O63dGœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-2o0gd",
"id": "OpenAIModel-gRakF",
"name": "model_output",
"output_types": [
"LanguageModel"
@ -306,25 +306,25 @@
},
"targetHandle": {
"fieldName": "llm",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"inputTypes": [
"LanguageModel"
],
"type": "other"
}
},
"id": "reactflow__edge-OpenAIModel-2o0gd{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-2o0gdœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-Zo0ES{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-Zo0ESœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-2o0gd",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-2o0gdœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-Zo0ES",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-Zo0ESœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIModel-gRakF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-gRakFœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-VYDK9{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-VYDK9œ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-gRakF",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-gRakFœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-VYDK9",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-VYDK9œ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-2o0gd",
"id": "OpenAIModel-gRakF",
"name": "model_output",
"output_types": [
"LanguageModel"
@ -332,25 +332,25 @@
},
"targetHandle": {
"fieldName": "llm",
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"inputTypes": [
"LanguageModel"
],
"type": "other"
}
},
"id": "reactflow__edge-OpenAIModel-2o0gd{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-2o0gdœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-rT7Y8{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-rT7Y8œ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-2o0gd",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-2o0gdœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-rT7Y8",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-rT7Y8œ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIModel-gRakF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-gRakFœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-ToolCallingAgent-KLe5u{œfieldNameœ:œllmœ,œidœ:œToolCallingAgent-KLe5uœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}",
"source": "OpenAIModel-gRakF",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-gRakFœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}",
"target": "ToolCallingAgent-KLe5u",
"targetHandle": "{œfieldNameœ: œllmœ, œidœ: œToolCallingAgent-KLe5uœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "CalculatorTool",
"id": "CalculatorTool-CYR2I",
"id": "CalculatorTool-5S6u9",
"name": "api_build_tool",
"output_types": [
"Tool"
@ -358,7 +358,7 @@
},
"targetHandle": {
"fieldName": "tools",
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"inputTypes": [
"Tool",
"BaseTool"
@ -366,17 +366,17 @@
"type": "other"
}
},
"id": "reactflow__edge-CalculatorTool-CYR2I{œdataTypeœ:œCalculatorToolœ,œidœ:œCalculatorTool-CYR2Iœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-Zo0ES{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-Zo0ESœ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "CalculatorTool-CYR2I",
"sourceHandle": "{œdataTypeœ: œCalculatorToolœ, œidœ: œCalculatorTool-CYR2Iœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-Zo0ES",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-Zo0ESœ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-CalculatorTool-5S6u9{œdataTypeœ:œCalculatorToolœ,œidœ:œCalculatorTool-5S6u9œ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-ToolCallingAgent-VYDK9{œfieldNameœ:œtoolsœ,œidœ:œToolCallingAgent-VYDK9œ,œinputTypesœ:[œToolœ,œBaseToolœ],œtypeœ:œotherœ}",
"source": "CalculatorTool-5S6u9",
"sourceHandle": "{œdataTypeœ: œCalculatorToolœ, œidœ: œCalculatorTool-5S6u9œ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}",
"target": "ToolCallingAgent-VYDK9",
"targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œToolCallingAgent-VYDK9œ, œinputTypesœ: [œToolœ, œBaseToolœ], œtypeœ: œotherœ}"
}
],
"nodes": [
{
"data": {
"id": "ChatInput-z8SS4",
"id": "ChatInput-uYdzQ",
"node": {
"base_classes": [
"Message"
@ -581,8 +581,8 @@
"type": "ChatInput"
},
"dragging": false,
"height": 298,
"id": "ChatInput-z8SS4",
"height": 302,
"id": "ChatInput-uYdzQ",
"position": {
"x": 1702.183330569805,
"y": 313.3797217631409
@ -597,7 +597,7 @@
},
{
"data": {
"id": "ChatOutput-zxRey",
"id": "ChatOutput-O63dG",
"node": {
"base_classes": [
"Message"
@ -780,8 +780,8 @@
"type": "ChatOutput"
},
"dragging": false,
"height": 298,
"id": "ChatOutput-zxRey",
"height": 302,
"id": "ChatOutput-O63dG",
"position": {
"x": 3968.8870036313238,
"y": 627.770746142633
@ -798,7 +798,7 @@
"data": {
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"id": "OpenAIModel-2o0gd",
"id": "OpenAIModel-gRakF",
"node": {
"base_classes": [
"LanguageModel",
@ -872,7 +872,7 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "OPENAI_API_KEY"
},
"code": {
"advanced": true,
@ -1100,8 +1100,8 @@
"type": "OpenAIModel"
},
"dragging": false,
"height": 603,
"id": "OpenAIModel-2o0gd",
"height": 605,
"id": "OpenAIModel-gRakF",
"position": {
"x": 2141.564227810534,
"y": 492.8566267469695
@ -1116,7 +1116,7 @@
},
{
"data": {
"id": "ToolCallingAgent-vCq4v",
"id": "ToolCallingAgent-0QzrL",
"node": {
"base_classes": [
"AgentExecutor",
@ -1367,8 +1367,8 @@
"type": "ToolCallingAgent"
},
"dragging": false,
"height": 566,
"id": "ToolCallingAgent-vCq4v",
"height": 570,
"id": "ToolCallingAgent-0QzrL",
"position": {
"x": 2624.854312225424,
"y": 459.94036227507735
@ -1383,7 +1383,7 @@
},
{
"data": {
"id": "SearchAPI-BaDvF",
"id": "SearchAPI-I4yU0",
"node": {
"base_classes": [
"Data",
@ -1393,7 +1393,7 @@
"beta": false,
"conditional_paths": [],
"custom_fields": {},
"description": "Call the searchapi.io API",
"description": "Call the searchapi.io API with result limiting",
"display_name": "Search API",
"documentation": "https://www.searchapi.io/docs/google",
"edited": false,
@ -1469,7 +1469,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from typing import Union\n\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\n\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput\nfrom langflow.schema import Data\nfrom langflow.field_typing import Tool\n\n\nclass SearchAPIComponent(LCToolComponent):\n display_name: str = \"Search API\"\n description: str = \"Call the searchapi.io API\"\n name = \"SearchAPI\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n\n inputs = [\n MessageTextInput(name=\"engine\", display_name=\"Engine\", value=\"google\"),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n ),\n DictInput(name=\"search_params\", display_name=\"Search parameters\", advanced=True, is_list=True),\n ]\n\n def run_model(self) -> Union[Data, list[Data]]:\n wrapper = self._build_wrapper()\n results = wrapper.results(query=self.input_value, **(self.search_params or {}))\n list_results = results.get(\"organic_results\", [])\n data = [Data(data=result, text=result[\"snippet\"]) for result in list_results]\n self.status = data\n return data\n\n def build_tool(self) -> Tool:\n wrapper = self._build_wrapper()\n return Tool(\n name=\"search_api\",\n description=\"Search for recent results.\",\n func=lambda x: wrapper.run(query=x, **(self.search_params or {})),\n )\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n"
"value": "from typing import Dict, Any, Optional, List\nfrom pydantic import BaseModel, Field\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\nfrom langflow.base.langchain_utilities.model import LCToolComponent\nfrom langflow.inputs import SecretStrInput, MultilineInput, DictInput, MessageTextInput, IntInput\nfrom langflow.schema import Data\nfrom langflow.field_typing import Tool\nfrom langchain.tools import StructuredTool\n\n\nclass SearchAPIComponent(LCToolComponent):\n display_name: str = \"Search API\"\n description: str = \"Call the searchapi.io API with result limiting\"\n name = \"SearchAPI\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n\n inputs = [\n MessageTextInput(name=\"engine\", display_name=\"Engine\", value=\"google\"),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n ),\n DictInput(name=\"search_params\", display_name=\"Search parameters\", advanced=True, is_list=True),\n IntInput(name=\"max_results\", display_name=\"Max Results\", value=5, advanced=True),\n IntInput(name=\"max_snippet_length\", display_name=\"Max Snippet Length\", value=100, advanced=True),\n ]\n\n class SearchAPISchema(BaseModel):\n query: str = Field(..., description=\"The search query\")\n params: Optional[Dict[str, Any]] = Field(default_factory=dict, description=\"Additional search parameters\")\n max_results: int = Field(5, description=\"Maximum number of results to return\")\n max_snippet_length: int = Field(100, description=\"Maximum length of each result snippet\")\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n\n def build_tool(self) -> Tool:\n wrapper = self._build_wrapper()\n\n def search_func(\n query: str, params: Optional[Dict[str, Any]] = None, max_results: int = 5, max_snippet_length: int = 100\n ) -> List[Dict[str, Any]]:\n params = params or {}\n full_results = wrapper.results(query=query, **params)\n organic_results = full_results.get(\"organic_results\", [])[:max_results]\n\n limited_results = []\n for result in organic_results:\n limited_result = {\n \"title\": result.get(\"title\", \"\")[:max_snippet_length],\n \"link\": result.get(\"link\", \"\"),\n \"snippet\": result.get(\"snippet\", \"\")[:max_snippet_length],\n }\n limited_results.append(limited_result)\n\n return limited_results\n\n tool = StructuredTool.from_function(\n name=\"search_api\",\n description=\"Search for recent results using searchapi.io with result limiting\",\n func=search_func,\n args_schema=self.SearchAPISchema,\n )\n\n self.status = f\"Search API Tool created with engine: {self.engine}\"\n return tool\n\n def run_model(self) -> List[Data]:\n tool = self.build_tool()\n results = tool.run(\n {\n \"query\": self.input_value,\n \"params\": self.search_params or {},\n \"max_results\": self.max_results,\n \"max_snippet_length\": self.max_snippet_length,\n }\n )\n\n data_list = [Data(data=result, text=result.get(\"snippet\", \"\")) for result in results]\n\n self.status = data_list\n return data_list\n"
},
"engine": {
"_input_type": "MessageTextInput",
@ -1514,6 +1514,38 @@
"type": "str",
"value": "langflow docs"
},
"max_results": {
"_input_type": "IntInput",
"advanced": true,
"display_name": "Max Results",
"dynamic": false,
"info": "",
"list": false,
"name": "max_results",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_metadata": true,
"type": "int",
"value": 5
},
"max_snippet_length": {
"_input_type": "IntInput",
"advanced": true,
"display_name": "Max Snippet Length",
"dynamic": false,
"info": "",
"list": false,
"name": "max_snippet_length",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"trace_as_metadata": true,
"type": "int",
"value": 100
},
"search_params": {
"_input_type": "DictInput",
"advanced": true,
@ -1535,8 +1567,8 @@
"type": "SearchAPI"
},
"dragging": false,
"height": 515,
"id": "SearchAPI-BaDvF",
"height": 519,
"id": "SearchAPI-I4yU0",
"position": {
"x": 2147.8260389952898,
"y": -42.27285098321369
@ -1551,7 +1583,7 @@
},
{
"data": {
"id": "url_content_fetcher-5EFR2",
"id": "url_content_fetcher-1FugB",
"node": {
"base_classes": [
"Data",
@ -1662,8 +1694,8 @@
"type": "url_content_fetcher"
},
"dragging": false,
"height": 343,
"id": "url_content_fetcher-5EFR2",
"height": 347,
"id": "url_content_fetcher-1FugB",
"position": {
"x": 2629.911251521856,
"y": 77.86269189756271
@ -1678,7 +1710,7 @@
},
{
"data": {
"id": "ToolCallingAgent-rT7Y8",
"id": "ToolCallingAgent-KLe5u",
"node": {
"base_classes": [
"AgentExecutor",
@ -1929,8 +1961,8 @@
"type": "ToolCallingAgent"
},
"dragging": false,
"height": 566,
"id": "ToolCallingAgent-rT7Y8",
"height": 570,
"id": "ToolCallingAgent-KLe5u",
"position": {
"x": 3092.2977772950007,
"y": 456.1302150057377
@ -1945,7 +1977,7 @@
},
{
"data": {
"id": "ToolCallingAgent-Zo0ES",
"id": "ToolCallingAgent-VYDK9",
"node": {
"base_classes": [
"AgentExecutor",
@ -2196,8 +2228,8 @@
"type": "ToolCallingAgent"
},
"dragging": false,
"height": 566,
"id": "ToolCallingAgent-Zo0ES",
"height": 570,
"id": "ToolCallingAgent-VYDK9",
"position": {
"x": 3515.829696775688,
"y": 461.15233262803827
@ -2212,7 +2244,7 @@
},
{
"data": {
"id": "CalculatorTool-CYR2I",
"id": "CalculatorTool-5S6u9",
"node": {
"base_classes": [
"Data",
@ -2308,8 +2340,8 @@
"type": "CalculatorTool"
},
"dragging": false,
"height": 371,
"id": "CalculatorTool-CYR2I",
"height": 375,
"id": "CalculatorTool-5S6u9",
"position": {
"x": 3094.040233522674,
"y": 59.811211480422756
@ -2324,14 +2356,14 @@
}
],
"viewport": {
"x": -708.3644867946784,
"y": 248.9889129182872,
"zoom": 0.43911377041251404
"x": -805.3414274486533,
"y": 202.2051258636879,
"zoom": 0.5130713077517347
}
},
"description": "Multi Agent system to plan trips.",
"endpoint_name": null,
"id": "8971db1c-5a0e-4f07-9562-478f3170e845",
"id": "c15755c5-264b-4ca7-bed8-9bbf605307f1",
"is_component": false,
"last_tested_version": "1.0.17",
"name": "Travel Planning Agents"

View file

@ -6,7 +6,7 @@
"data": {
"sourceHandle": {
"dataType": "ChatInput",
"id": "ChatInput-1QVCE",
"id": "ChatInput-DFgo2",
"name": "message",
"output_types": [
"Message"
@ -14,25 +14,25 @@
},
"targetHandle": {
"fieldName": "search_input",
"id": "AstraVectorStoreComponent-vXWPf",
"id": "AstraVectorStoreComponent-XE3MH",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-ChatInput-1QVCE{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1QVCEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraVectorStoreComponent-vXWPf{œfieldNameœ:œsearch_inputœ,œidœ:œAstraVectorStoreComponent-vXWPfœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-1QVCE",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1QVCEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "AstraVectorStoreComponent-vXWPf",
"targetHandle": "{œfieldNameœ: œsearch_inputœ, œidœ: œAstraVectorStoreComponent-vXWPfœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ChatInput-DFgo2{œdataTypeœ:œChatInputœ,œidœ:œChatInput-DFgo2œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraVectorStoreComponent-XE3MH{œfieldNameœ:œsearch_inputœ,œidœ:œAstraVectorStoreComponent-XE3MHœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "ChatInput-DFgo2",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-DFgo2œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "AstraVectorStoreComponent-XE3MH",
"targetHandle": "{œfieldNameœ: œsearch_inputœ, œidœ: œAstraVectorStoreComponent-XE3MHœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ParseData",
"id": "ParseData-QVaZr",
"id": "ParseData-ILuxa",
"name": "text",
"output_types": [
"Message"
@ -40,7 +40,7 @@
},
"targetHandle": {
"fieldName": "context",
"id": "Prompt-eV1SH",
"id": "Prompt-Tfriy",
"inputTypes": [
"Message",
"Text"
@ -48,18 +48,18 @@
"type": "str"
}
},
"id": "reactflow__edge-ParseData-QVaZr{œdataTypeœ:œParseDataœ,œidœ:œParseData-QVaZrœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-eV1SH{œfieldNameœ:œcontextœ,œidœ:œPrompt-eV1SHœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ParseData-QVaZr",
"sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-QVaZrœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-eV1SH",
"targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-eV1SHœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ParseData-ILuxa{œdataTypeœ:œParseDataœ,œidœ:œParseData-ILuxaœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Tfriy{œfieldNameœ:œcontextœ,œidœ:œPrompt-Tfriyœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ParseData-ILuxa",
"sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-ILuxaœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-Tfriy",
"targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-Tfriyœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
"id": "ChatInput-1QVCE",
"id": "ChatInput-DFgo2",
"name": "message",
"output_types": [
"Message"
@ -67,7 +67,7 @@
},
"targetHandle": {
"fieldName": "question",
"id": "Prompt-eV1SH",
"id": "Prompt-Tfriy",
"inputTypes": [
"Message",
"Text"
@ -75,18 +75,18 @@
"type": "str"
}
},
"id": "reactflow__edge-ChatInput-1QVCE{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1QVCEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-eV1SH{œfieldNameœ:œquestionœ,œidœ:œPrompt-eV1SHœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ChatInput-1QVCE",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1QVCEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-eV1SH",
"targetHandle": "{œfieldNameœ: œquestionœ, œidœ: œPrompt-eV1SHœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-ChatInput-DFgo2{œdataTypeœ:œChatInputœ,œidœ:œChatInput-DFgo2œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-Tfriy{œfieldNameœ:œquestionœ,œidœ:œPrompt-Tfriyœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
"source": "ChatInput-DFgo2",
"sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-DFgo2œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
"target": "Prompt-Tfriy",
"targetHandle": "{œfieldNameœ: œquestionœ, œidœ: œPrompt-Tfriyœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "File",
"id": "File-RKdDQ",
"id": "File-TBV93",
"name": "data",
"output_types": [
"Data"
@ -94,25 +94,25 @@
},
"targetHandle": {
"fieldName": "data_inputs",
"id": "SplitText-74sLS",
"id": "SplitText-rAbUh",
"inputTypes": [
"Data"
],
"type": "other"
}
},
"id": "reactflow__edge-File-RKdDQ{œdataTypeœ:œFileœ,œidœ:œFile-RKdDQœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-SplitText-74sLS{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-74sLSœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "File-RKdDQ",
"sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-RKdDQœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
"target": "SplitText-74sLS",
"targetHandle": "{œfieldNameœ: œdata_inputsœ, œidœ: œSplitText-74sLSœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-File-TBV93{œdataTypeœ:œFileœ,œidœ:œFile-TBV93œ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-SplitText-rAbUh{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-rAbUhœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "File-TBV93",
"sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-TBV93œ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
"target": "SplitText-rAbUh",
"targetHandle": "{œfieldNameœ: œdata_inputsœ, œidœ: œSplitText-rAbUhœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "SplitText",
"id": "SplitText-74sLS",
"id": "SplitText-rAbUh",
"name": "chunks",
"output_types": [
"Data"
@ -120,25 +120,25 @@
},
"targetHandle": {
"fieldName": "ingest_data",
"id": "AstraVectorStoreComponent-wvuVK",
"id": "AstraVectorStoreComponent-6hNSy",
"inputTypes": [
"Data"
],
"type": "other"
}
},
"id": "reactflow__edge-SplitText-74sLS{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-74sLSœ,œnameœ:œchunksœ,œoutput_typesœ:[œDataœ]}-AstraVectorStoreComponent-wvuVK{œfieldNameœ:œingest_dataœ,œidœ:œAstraVectorStoreComponent-wvuVKœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "SplitText-74sLS",
"sourceHandle": "{œdataTypeœ: œSplitTextœ, œidœ: œSplitText-74sLSœ, œnameœ: œchunksœ, œoutput_typesœ: [œDataœ]}",
"target": "AstraVectorStoreComponent-wvuVK",
"targetHandle": "{œfieldNameœ: œingest_dataœ, œidœ: œAstraVectorStoreComponent-wvuVKœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-SplitText-rAbUh{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-rAbUhœ,œnameœ:œchunksœ,œoutput_typesœ:[œDataœ]}-AstraVectorStoreComponent-6hNSy{œfieldNameœ:œingest_dataœ,œidœ:œAstraVectorStoreComponent-6hNSyœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "SplitText-rAbUh",
"sourceHandle": "{œdataTypeœ: œSplitTextœ, œidœ: œSplitText-rAbUhœ, œnameœ: œchunksœ, œoutput_typesœ: [œDataœ]}",
"target": "AstraVectorStoreComponent-6hNSy",
"targetHandle": "{œfieldNameœ: œingest_dataœ, œidœ: œAstraVectorStoreComponent-6hNSyœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIEmbeddings",
"id": "OpenAIEmbeddings-rQV2h",
"id": "OpenAIEmbeddings-hLfqb",
"name": "embeddings",
"output_types": [
"Embeddings"
@ -146,7 +146,7 @@
},
"targetHandle": {
"fieldName": "embedding",
"id": "AstraVectorStoreComponent-wvuVK",
"id": "AstraVectorStoreComponent-6hNSy",
"inputTypes": [
"Embeddings",
"dict"
@ -154,18 +154,18 @@
"type": "other"
}
},
"id": "reactflow__edge-OpenAIEmbeddings-rQV2h{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-rQV2hœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraVectorStoreComponent-wvuVK{œfieldNameœ:œembeddingœ,œidœ:œAstraVectorStoreComponent-wvuVKœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
"source": "OpenAIEmbeddings-rQV2h",
"sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-rQV2hœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
"target": "AstraVectorStoreComponent-wvuVK",
"targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraVectorStoreComponent-wvuVKœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIEmbeddings-hLfqb{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-hLfqbœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraVectorStoreComponent-6hNSy{œfieldNameœ:œembeddingœ,œidœ:œAstraVectorStoreComponent-6hNSyœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
"source": "OpenAIEmbeddings-hLfqb",
"sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-hLfqbœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
"target": "AstraVectorStoreComponent-6hNSy",
"targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraVectorStoreComponent-6hNSyœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIEmbeddings",
"id": "OpenAIEmbeddings-EJT2O",
"id": "OpenAIEmbeddings-OhWJM",
"name": "embeddings",
"output_types": [
"Embeddings"
@ -173,7 +173,7 @@
},
"targetHandle": {
"fieldName": "embedding",
"id": "AstraVectorStoreComponent-vXWPf",
"id": "AstraVectorStoreComponent-XE3MH",
"inputTypes": [
"Embeddings",
"dict"
@ -181,18 +181,18 @@
"type": "other"
}
},
"id": "reactflow__edge-OpenAIEmbeddings-EJT2O{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-EJT2Oœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraVectorStoreComponent-vXWPf{œfieldNameœ:œembeddingœ,œidœ:œAstraVectorStoreComponent-vXWPfœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
"source": "OpenAIEmbeddings-EJT2O",
"sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-EJT2Oœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
"target": "AstraVectorStoreComponent-vXWPf",
"targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraVectorStoreComponent-vXWPfœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-OpenAIEmbeddings-OhWJM{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-OhWJMœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraVectorStoreComponent-XE3MH{œfieldNameœ:œembeddingœ,œidœ:œAstraVectorStoreComponent-XE3MHœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
"source": "OpenAIEmbeddings-OhWJM",
"sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-OhWJMœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
"target": "AstraVectorStoreComponent-XE3MH",
"targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraVectorStoreComponent-XE3MHœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
"id": "Prompt-eV1SH",
"id": "Prompt-Tfriy",
"name": "prompt",
"output_types": [
"Message"
@ -200,25 +200,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-DUuku",
"id": "OpenAIModel-ExXPZ",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-Prompt-eV1SH{œdataTypeœ:œPromptœ,œidœ:œPrompt-eV1SHœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-DUuku{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-DUukuœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "Prompt-eV1SH",
"sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-eV1SHœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
"target": "OpenAIModel-DUuku",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-DUukuœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-Prompt-Tfriy{œdataTypeœ:œPromptœ,œidœ:œPrompt-Tfriyœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-ExXPZ{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-ExXPZœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "Prompt-Tfriy",
"sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-Tfriyœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
"target": "OpenAIModel-ExXPZ",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-ExXPZœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
"id": "OpenAIModel-DUuku",
"id": "OpenAIModel-ExXPZ",
"name": "text_output",
"output_types": [
"Message"
@ -226,25 +226,25 @@
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-OrmMa",
"id": "ChatOutput-Mh7FA",
"inputTypes": [
"Message"
],
"type": "str"
}
},
"id": "reactflow__edge-OpenAIModel-DUuku{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-DUukuœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-OrmMa{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-OrmMaœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "OpenAIModel-DUuku",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-DUukuœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-OrmMa",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-OrmMaœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
"id": "reactflow__edge-OpenAIModel-ExXPZ{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-ExXPZœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-Mh7FA{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-Mh7FAœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
"source": "OpenAIModel-ExXPZ",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-ExXPZœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
"target": "ChatOutput-Mh7FA",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-Mh7FAœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
"className": "",
"data": {
"sourceHandle": {
"dataType": "AstraVectorStoreComponent",
"id": "AstraVectorStoreComponent-vXWPf",
"id": "AstraVectorStoreComponent-XE3MH",
"name": "search_results",
"output_types": [
"Data"
@ -252,18 +252,18 @@
},
"targetHandle": {
"fieldName": "data",
"id": "ParseData-QVaZr",
"id": "ParseData-ILuxa",
"inputTypes": [
"Data"
],
"type": "other"
}
},
"id": "reactflow__edge-AstraVectorStoreComponent-vXWPf{œdataTypeœ:œAstraVectorStoreComponentœ,œidœ:œAstraVectorStoreComponent-vXWPfœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-QVaZr{œfieldNameœ:œdataœ,œidœ:œParseData-QVaZrœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "AstraVectorStoreComponent-vXWPf",
"sourceHandle": "{œdataTypeœ: œAstraVectorStoreComponentœ, œidœ: œAstraVectorStoreComponent-vXWPfœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}",
"target": "ParseData-QVaZr",
"targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-QVaZrœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
"id": "reactflow__edge-AstraVectorStoreComponent-XE3MH{œdataTypeœ:œAstraVectorStoreComponentœ,œidœ:œAstraVectorStoreComponent-XE3MHœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-ILuxa{œfieldNameœ:œdataœ,œidœ:œParseData-ILuxaœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
"source": "AstraVectorStoreComponent-XE3MH",
"sourceHandle": "{œdataTypeœ: œAstraVectorStoreComponentœ, œidœ: œAstraVectorStoreComponent-XE3MHœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}",
"target": "ParseData-ILuxa",
"targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-ILuxaœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
}
],
"nodes": [
@ -271,7 +271,7 @@
"data": {
"description": "Get chat inputs from the Playground.",
"display_name": "Chat Input",
"id": "ChatInput-1QVCE",
"id": "ChatInput-DFgo2",
"node": {
"base_classes": [
"Message"
@ -468,8 +468,8 @@
"type": "ChatInput"
},
"dragging": false,
"height": 308,
"id": "ChatInput-1QVCE",
"height": 302,
"id": "ChatInput-DFgo2",
"position": {
"x": 642.3545710150049,
"y": 220.22556606238678
@ -487,7 +487,7 @@
"description": "Implementation of Vector Store using Astra DB with search capabilities",
"display_name": "Astra DB",
"edited": false,
"id": "AstraVectorStoreComponent-vXWPf",
"id": "AstraVectorStoreComponent-XE3MH",
"node": {
"base_classes": [
"Data",
@ -580,7 +580,7 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "ASTRA_DB_API_ENDPOINT"
},
"batch_size": {
"advanced": true,
@ -932,15 +932,15 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "ASTRA_DB_APPLICATION_TOKEN"
}
}
},
"type": "AstraVectorStoreComponent"
},
"dragging": false,
"height": 753,
"id": "AstraVectorStoreComponent-vXWPf",
"height": 774,
"id": "AstraVectorStoreComponent-XE3MH",
"position": {
"x": 1246.0381406498648,
"y": 333.25157075413966
@ -949,7 +949,7 @@
"x": 1246.0381406498648,
"y": 333.25157075413966
},
"selected": false,
"selected": true,
"type": "genericNode",
"width": 384
},
@ -957,7 +957,7 @@
"data": {
"description": "Convert Data into plain text following a specified template.",
"display_name": "Parse Data",
"id": "ParseData-QVaZr",
"id": "ParseData-ILuxa",
"node": {
"base_classes": [
"Message"
@ -1072,8 +1072,8 @@
"type": "ParseData"
},
"dragging": false,
"height": 384,
"id": "ParseData-QVaZr",
"height": 378,
"id": "ParseData-ILuxa",
"position": {
"x": 1854.1518317915907,
"y": 459.3386924128532
@ -1090,7 +1090,7 @@
"data": {
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
"id": "Prompt-eV1SH",
"id": "Prompt-Tfriy",
"node": {
"base_classes": [
"Message"
@ -1216,8 +1216,8 @@
"type": "Prompt"
},
"dragging": false,
"height": 515,
"id": "Prompt-eV1SH",
"height": 502,
"id": "Prompt-Tfriy",
"position": {
"x": 2486.0988668404975,
"y": 496.5120474157301
@ -1234,7 +1234,7 @@
"data": {
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"id": "ChatOutput-OrmMa",
"id": "ChatOutput-Mh7FA",
"node": {
"base_classes": [
"Message"
@ -1409,8 +1409,8 @@
"type": "ChatOutput"
},
"dragging": false,
"height": 308,
"id": "ChatOutput-OrmMa",
"height": 302,
"id": "ChatOutput-Mh7FA",
"position": {
"x": 3769.242086248817,
"y": 585.3403837062634
@ -1427,7 +1427,7 @@
"data": {
"description": "Split text into chunks based on specified criteria.",
"display_name": "Split Text",
"id": "SplitText-74sLS",
"id": "SplitText-rAbUh",
"node": {
"base_classes": [
"Data"
@ -1555,8 +1555,8 @@
"type": "SplitText"
},
"dragging": false,
"height": 527,
"id": "SplitText-74sLS",
"height": 550,
"id": "SplitText-rAbUh",
"position": {
"x": 2044.2799160989089,
"y": 1185.3130355818519
@ -1573,7 +1573,7 @@
"data": {
"description": "A generic file loader.",
"display_name": "File",
"id": "File-RKdDQ",
"id": "File-TBV93",
"node": {
"base_classes": [
"Data"
@ -1682,8 +1682,8 @@
"type": "File"
},
"dragging": false,
"height": 300,
"id": "File-RKdDQ",
"height": 302,
"id": "File-TBV93",
"position": {
"x": 1418.981990122179,
"y": 1539.3825691184466
@ -1701,7 +1701,7 @@
"description": "Implementation of Vector Store using Astra DB with search capabilities",
"display_name": "Astra DB",
"edited": false,
"id": "AstraVectorStoreComponent-wvuVK",
"id": "AstraVectorStoreComponent-6hNSy",
"node": {
"base_classes": [
"Data",
@ -1794,7 +1794,7 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "ASTRA_DB_API_ENDPOINT"
},
"batch_size": {
"advanced": true,
@ -2146,15 +2146,15 @@
"show": true,
"title_case": false,
"type": "str",
"value": ""
"value": "ASTRA_DB_APPLICATION_TOKEN"
}
}
},
"type": "AstraVectorStoreComponent"
},
"dragging": false,
"height": 753,
"id": "AstraVectorStoreComponent-wvuVK",
"height": 774,
"id": "AstraVectorStoreComponent-6hNSy",
"position": {
"x": 2678.506138892635,
"y": 1267.3353646037478
@ -2171,7 +2171,7 @@
"data": {
"description": "Generate embeddings using OpenAI models.",
"display_name": "OpenAI Embeddings",
"id": "OpenAIEmbeddings-rQV2h",
"id": "OpenAIEmbeddings-hLfqb",
"node": {
"base_classes": [
"Embeddings"
@ -2606,8 +2606,8 @@
"type": "OpenAIEmbeddings"
},
"dragging": false,
"height": 394,
"id": "OpenAIEmbeddings-rQV2h",
"height": 388,
"id": "OpenAIEmbeddings-hLfqb",
"position": {
"x": 2044.683126356786,
"y": 1785.2283494456522
@ -2616,7 +2616,7 @@
"x": 2044.683126356786,
"y": 1785.2283494456522
},
"selected": true,
"selected": false,
"type": "genericNode",
"width": 384
},
@ -2624,7 +2624,7 @@
"data": {
"description": "Generate embeddings using OpenAI models.",
"display_name": "OpenAI Embeddings",
"id": "OpenAIEmbeddings-EJT2O",
"id": "OpenAIEmbeddings-OhWJM",
"node": {
"base_classes": [
"Embeddings"
@ -3059,8 +3059,8 @@
"type": "OpenAIEmbeddings"
},
"dragging": false,
"height": 394,
"id": "OpenAIEmbeddings-EJT2O",
"height": 388,
"id": "OpenAIEmbeddings-OhWJM",
"position": {
"x": 628.9252513328779,
"y": 648.6750537749285
@ -3077,7 +3077,7 @@
"data": {
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"id": "OpenAIModel-DUuku",
"id": "OpenAIModel-ExXPZ",
"node": {
"base_classes": [
"LanguageModel",
@ -3360,8 +3360,8 @@
"type": "OpenAIModel"
},
"dragging": false,
"height": 621,
"id": "OpenAIModel-DUuku",
"height": 605,
"id": "OpenAIModel-ExXPZ",
"position": {
"x": 3138.7638747868177,
"y": 413.0859233500825
@ -3376,14 +3376,15 @@
}
],
"viewport": {
"x": -113.2164904186335,
"y": -51.497463142696176,
"zoom": 0.32587982414714645
"x": -439.4891000981311,
"y": -36.825136403696206,
"zoom": 0.7131428627969274
}
},
"description": "Visit https://docs.langflow.org/tutorials/rag-with-astradb for a detailed guide of this project.\nThis project give you both Ingestion and RAG in a single file. You'll need to visit https://astra.datastax.com/ to create an Astra DB instance, your Token and grab an API Endpoint.\nRunning this project requires you to add a file in the Files component, then define a Collection Name and click on the Play icon on the Astra DB component. \n\nAfter the ingestion ends you are ready to click on the Run button at the lower left corner and start asking questions about your data.",
"id": "74a6c5d0-9d9c-41c4-b6f1-92b20856d0de",
"endpoint_name": null,
"id": "11244a74-eba2-4b1f-b34a-2ce3ba421e2a",
"is_component": false,
"last_tested_version": "1.0.12",
"last_tested_version": "1.0.17",
"name": "Vector Store RAG"
}

View file

@ -17,12 +17,12 @@ def test_python_repl_tool_template():
assert "outputs" in frontend_node
output_names = [output["name"] for output in frontend_node["outputs"]]
assert "api_run_model" in output_names
assert "tool" in output_names
assert "api_build_tool" in output_names
assert all(output["types"] != [] for output in frontend_node["outputs"])
# Additional assertions specific to PythonREPLToolComponent
input_names = [input_["name"] for input_ in frontend_node["template"].values() if isinstance(input_, dict)]
assert "input_value" in input_names
# assert "input_value" in input_names
assert "name" in input_names
assert "description" in input_names
assert "global_imports" in input_names
@ -33,5 +33,5 @@ def test_python_repl_tool_template():
if isinstance(input_, dict) and input_["name"] == "global_imports"
)
assert global_imports_input["type"] == "str"
assert global_imports_input["combobox"] is True
assert global_imports_input["value"] == ["math"]
# assert global_imports_input["combobox"] is True
assert global_imports_input["value"] == "math"

View file

@ -126,7 +126,12 @@ export default function ChatMessage({
}
}, [lastMessage]);
const decodedMessage = decodeURIComponent(chatMessage ?? "");
let decodedMessage = chatMessage ?? "";
try {
decodedMessage = decodeURIComponent(chatMessage);
} catch (e) {
console.error(e);
}
const isEmpty = decodedMessage?.trim() === "";
return (

View file

@ -9,8 +9,8 @@ test("Dynamic Agent", async ({ page }) => {
);
test.skip(
!process?.env?.BRAVE_SEARCH_API_KEY,
"BRAVE_SEARCH_API_KEY required to run this test",
!process?.env?.SEARCH_API_KEY,
"SEARCH_API_KEY required to run this test",
);
if (!process.env.CI) {
@ -64,7 +64,7 @@ test("Dynamic Agent", async ({ page }) => {
await page
.getByTestId("popover-anchor-input-api_key")
.last()
.fill(process.env.BRAVE_SEARCH_API_KEY ?? "");
.fill(process.env.SEARCH_API_KEY ?? "");
await page.waitForTimeout(1000);
@ -82,6 +82,11 @@ test("Dynamic Agent", async ({ page }) => {
await page.waitForTimeout(1000);
}
await page
.getByTestId("textarea_str_input_value")
.first()
.fill("how much is an apple stock today");
await page.getByTestId("button_run_chat output").click();
await page.waitForSelector("text=built successfully", { timeout: 60000 * 3 });
@ -93,9 +98,7 @@ test("Dynamic Agent", async ({ page }) => {
await page.waitForTimeout(1000);
expect(
page.getByText("Could you search info about AAPL?", { exact: true }).last(),
).toBeVisible();
expect(page.getByText("apple").last()).toBeVisible();
const textContents = await page
.getByTestId("div-chat-message")
@ -103,6 +106,9 @@ test("Dynamic Agent", async ({ page }) => {
const concatAllText = textContents.join(" ");
expect(concatAllText.toLocaleLowerCase()).toContain("apple");
expect(concatAllText.toLocaleLowerCase()).not.toContain("error");
expect(concatAllText.toLocaleLowerCase()).not.toContain("apologize");
expect(concatAllText.toLocaleLowerCase()).not.toContain("unable");
const allTextLength = concatAllText.length;
expect(allTextLength).toBeGreaterThan(100);
});

View file

@ -65,6 +65,12 @@ test("Simple Agent", async ({ page }) => {
await page.waitForTimeout(1000);
await page
.getByTestId("textarea_str_input_value")
.fill(
"Use the Python REPL tool to create a python function that calculates 4 + 4 and stores it in a variable.",
);
await page.getByTestId("button_run_chat output").click();
await page.waitForSelector("text=built successfully", { timeout: 30000 });
@ -75,7 +81,7 @@ test("Simple Agent", async ({ page }) => {
await page.getByText("Playground", { exact: true }).click();
await page.waitForSelector(
"text=write short python scsript to say hello world",
"text=Use the Python REPL tool to create a python function that calculates 4 + 4 and stores it in a variable.",
{
timeout: 30000,
},
@ -83,19 +89,41 @@ test("Simple Agent", async ({ page }) => {
await page.waitForTimeout(1000);
expect(await page.getByText("User")).toBeVisible();
expect(page.getByText("User")).toBeVisible();
expect(await page.locator(".language-python")).toBeVisible();
expect(page.locator(".language-python")).toBeVisible();
let pythonWords = await page.getByText("Hello, World!").count();
let pythonWords = await page.getByText("4 + 4").count();
expect(pythonWords).toBe(2);
expect(pythonWords).toBe(3);
await page
.getByPlaceholder("Send a message...")
.fill("write short python scsript to say hello world");
await page.getByTestId("icon-LucideSend").last().click();
await page.waitForSelector(
"text=write short python scsript to say hello world",
{
timeout: 30000,
},
);
await page.waitForSelector('[data-testid="icon-Copy"]', {
timeout: 100000,
});
await page.waitForTimeout(1000);
await page.getByTestId("icon-Copy").last().click();
await page.waitForTimeout(500);
await page.getByPlaceholder("Send a message...").click();
await page.waitForTimeout(500);
await page.keyboard.press("Control+V");
await page.waitForTimeout(500);

View file

@ -8,6 +8,11 @@ test("Travel Planning Agent", async ({ page }) => {
"OPENAI_API_KEY required to run this test",
);
test.skip(
!process?.env?.SEARCH_API_KEY,
"SEARCH_API_KEY required to run this test",
);
if (!process.env.CI) {
dotenv.config({ path: path.resolve(__dirname, "../../.env") });
}
@ -56,65 +61,10 @@ test("Travel Planning Agent", async ({ page }) => {
outdatedComponents = await page.getByTestId("icon-AlertTriangle").count();
}
await page.getByTestId("extended-disclosure").click();
await page.getByPlaceholder("Search").click();
await page.getByPlaceholder("Search").fill("yahoo finance");
await page.waitForTimeout(1000);
await page.getByText("SearchAPI").last().click();
await page.waitForTimeout(1000);
await page.keyboard.press("Backspace");
await page.getByTitle("zoom out").click();
await page.getByTitle("zoom out").click();
await page
.locator('//*[@id="react-flow-id"]')
.hover()
.then(async () => {
await page.mouse.down();
await page.mouse.move(-100, 100);
});
await page.mouse.up();
await page
.getByTestId("toolsYahoo Finance News Tool")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.getByTitle("fit view").click();
await page.getByTitle("zoom out").click();
await page.getByTitle("zoom out").click();
//connection 1
const yahooElementOutput = await page
.getByTestId("handle-yfinancetool-shownode-tool-right")
.nth(0);
await yahooElementOutput.hover();
await page.mouse.down();
const agentOne = await page
.getByTestId("handle-toolcallingagent-shownode-tools-left")
.nth(0);
await agentOne.hover();
await page.mouse.up();
//connection 2
await yahooElementOutput.hover();
await page.mouse.down();
const agentTwo = await page
.getByTestId("handle-toolcallingagent-shownode-tools-left")
.nth(1);
await agentTwo.hover();
await page.mouse.up();
//connection 3
await yahooElementOutput.hover();
await page.mouse.down();
const agentThree = await page
.getByTestId("handle-toolcallingagent-shownode-tools-left")
.nth(2);
await agentThree.hover();
await page.mouse.up();
.getByTestId("popover-anchor-input-api_key")
.last()
.fill(process.env.SEARCH_API_KEY ?? "");
await page
.getByTestId("popover-anchor-input-api_key")
@ -132,7 +82,6 @@ test("Travel Planning Agent", async ({ page }) => {
await page.getByText("built successfully").last().click({
timeout: 15000,
});
await page.getByText("Playground", { exact: true }).click();
await page.waitForSelector("text=default session", {