diff --git a/.github/workflows/typescript_test.yml b/.github/workflows/typescript_test.yml index 04ae2d1be..025165491 100644 --- a/.github/workflows/typescript_test.yml +++ b/.github/workflows/typescript_test.yml @@ -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: diff --git a/src/backend/base/langflow/components/tools/PythonREPLTool.py b/src/backend/base/langflow/components/tools/PythonREPLTool.py index a1fae9bd4..8808ce692 100644 --- a/src/backend/base/langflow/components/tools/PythonREPLTool.py +++ b/src/backend/base/langflow/components/tools/PythonREPLTool.py @@ -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})] diff --git a/src/backend/base/langflow/components/tools/SearchAPI.py b/src/backend/base/langflow/components/tools/SearchAPI.py index fa85b7f1a..f28965537 100644 --- a/src/backend/base/langflow/components/tools/SearchAPI.py +++ b/src/backend/base/langflow/components/tools/SearchAPI.py @@ -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 diff --git a/src/backend/base/langflow/components/tools/SerpAPI.py b/src/backend/base/langflow/components/tools/SerpAPI.py index 5acb0d1f3..59d796662 100644 --- a/src/backend/base/langflow/components/tools/SerpAPI.py +++ b/src/backend/base/langflow/components/tools/SerpAPI.py @@ -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))] diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json b/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json index a79696f41..89144392a 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json @@ -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" diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json index 811d71a72..6546d7c15 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json @@ -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" } \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json index 17816fc57..0cfcefb66 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json @@ -6,7 +6,7 @@ "data": { "sourceHandle": { "dataType": "HierarchicalCrewComponent", - "id": "HierarchicalCrewComponent-EfNrX", + "id": "HierarchicalCrewComponent-3JGY1", "name": "output", "output_types": [ "Message" @@ -14,26 +14,26 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "ChatOutput-ZEUNq", + "id": "ChatOutput-8FKry", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-HierarchicalCrewComponent-EfNrX{œdataTypeœ:œHierarchicalCrewComponentœ,œidœ:œHierarchicalCrewComponent-EfNrXœ,œnameœ:œoutputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-ZEUNq{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-ZEUNqœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-HierarchicalCrewComponent-3JGY1{œdataTypeœ:œHierarchicalCrewComponentœ,œidœ:œHierarchicalCrewComponent-3JGY1œ,œnameœ:œoutputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-8FKry{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-8FKryœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "HierarchicalCrewComponent-EfNrX", - "sourceHandle": "{œdataTypeœ: œHierarchicalCrewComponentœ, œidœ: œHierarchicalCrewComponent-EfNrXœ, œnameœ: œoutputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-ZEUNq", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-ZEUNqœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "HierarchicalCrewComponent-3JGY1", + "sourceHandle": "{œdataTypeœ: œHierarchicalCrewComponentœ, œidœ: œHierarchicalCrewComponent-3JGY1œ, œnameœ: œoutputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-8FKry", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-8FKryœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "HierarchicalTaskComponent", - "id": "HierarchicalTaskComponent-yWaMT", + "id": "HierarchicalTaskComponent-GuXH7", "name": "task_output", "output_types": [ "HierarchicalTask" @@ -41,26 +41,26 @@ }, "targetHandle": { "fieldName": "tasks", - "id": "HierarchicalCrewComponent-EfNrX", + "id": "HierarchicalCrewComponent-3JGY1", "inputTypes": [ "HierarchicalTask" ], "type": "other" } }, - "id": "reactflow__edge-HierarchicalTaskComponent-yWaMT{œdataTypeœ:œHierarchicalTaskComponentœ,œidœ:œHierarchicalTaskComponent-yWaMTœ,œnameœ:œtask_outputœ,œoutput_typesœ:[œHierarchicalTaskœ]}-HierarchicalCrewComponent-EfNrX{œfieldNameœ:œtasksœ,œidœ:œHierarchicalCrewComponent-EfNrXœ,œinputTypesœ:[œHierarchicalTaskœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-HierarchicalTaskComponent-GuXH7{œdataTypeœ:œHierarchicalTaskComponentœ,œidœ:œHierarchicalTaskComponent-GuXH7œ,œnameœ:œtask_outputœ,œoutput_typesœ:[œHierarchicalTaskœ]}-HierarchicalCrewComponent-3JGY1{œfieldNameœ:œtasksœ,œidœ:œHierarchicalCrewComponent-3JGY1œ,œinputTypesœ:[œHierarchicalTaskœ],œtypeœ:œotherœ}", "selected": false, - "source": "HierarchicalTaskComponent-yWaMT", - "sourceHandle": "{œdataTypeœ: œHierarchicalTaskComponentœ, œidœ: œHierarchicalTaskComponent-yWaMTœ, œnameœ: œtask_outputœ, œoutput_typesœ: [œHierarchicalTaskœ]}", - "target": "HierarchicalCrewComponent-EfNrX", - "targetHandle": "{œfieldNameœ: œtasksœ, œidœ: œHierarchicalCrewComponent-EfNrXœ, œinputTypesœ: [œHierarchicalTaskœ], œtypeœ: œotherœ}" + "source": "HierarchicalTaskComponent-GuXH7", + "sourceHandle": "{œdataTypeœ: œHierarchicalTaskComponentœ, œidœ: œHierarchicalTaskComponent-GuXH7œ, œnameœ: œtask_outputœ, œoutput_typesœ: [œHierarchicalTaskœ]}", + "target": "HierarchicalCrewComponent-3JGY1", + "targetHandle": "{œfieldNameœ: œtasksœ, œidœ: œHierarchicalCrewComponent-3JGY1œ, œinputTypesœ: [œHierarchicalTaskœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "CrewAIAgentComponent", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "name": "output", "output_types": [ "Agent" @@ -68,26 +68,26 @@ }, "targetHandle": { "fieldName": "agents", - "id": "HierarchicalCrewComponent-EfNrX", + "id": "HierarchicalCrewComponent-3JGY1", "inputTypes": [ "Agent" ], "type": "other" } }, - "id": "reactflow__edge-CrewAIAgentComponent-Qm4en{œdataTypeœ:œCrewAIAgentComponentœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œnameœ:œoutputœ,œoutput_typesœ:[œAgentœ]}-HierarchicalCrewComponent-EfNrX{œfieldNameœ:œagentsœ,œidœ:œHierarchicalCrewComponent-EfNrXœ,œinputTypesœ:[œAgentœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-CrewAIAgentComponent-ViX9d{œdataTypeœ:œCrewAIAgentComponentœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œnameœ:œoutputœ,œoutput_typesœ:[œAgentœ]}-HierarchicalCrewComponent-3JGY1{œfieldNameœ:œagentsœ,œidœ:œHierarchicalCrewComponent-3JGY1œ,œinputTypesœ:[œAgentœ],œtypeœ:œotherœ}", "selected": false, - "source": "CrewAIAgentComponent-Qm4en", - "sourceHandle": "{œdataTypeœ: œCrewAIAgentComponentœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œnameœ: œoutputœ, œoutput_typesœ: [œAgentœ]}", - "target": "HierarchicalCrewComponent-EfNrX", - "targetHandle": "{œfieldNameœ: œagentsœ, œidœ: œHierarchicalCrewComponent-EfNrXœ, œinputTypesœ: [œAgentœ], œtypeœ: œotherœ}" + "source": "CrewAIAgentComponent-ViX9d", + "sourceHandle": "{œdataTypeœ: œCrewAIAgentComponentœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œnameœ: œoutputœ, œoutput_typesœ: [œAgentœ]}", + "target": "HierarchicalCrewComponent-3JGY1", + "targetHandle": "{œfieldNameœ: œagentsœ, œidœ: œHierarchicalCrewComponent-3JGY1œ, œinputTypesœ: [œAgentœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-S9ZnF", + "id": "OpenAIModel-ucjrK", "name": "model_output", "output_types": [ "LanguageModel" @@ -95,26 +95,26 @@ }, "targetHandle": { "fieldName": "llm", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "LanguageModel" ], "type": "other" } }, - "id": "reactflow__edge-OpenAIModel-S9ZnF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-S9ZnFœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œllmœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-OpenAIModel-ucjrK{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-ucjrKœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œllmœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}", "selected": false, - "source": "OpenAIModel-S9ZnF", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-S9ZnFœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œllmœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}" + "source": "OpenAIModel-ucjrK", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-ucjrKœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œllmœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "CrewAIAgentComponent", - "id": "CrewAIAgentComponent-Q2BtZ", + "id": "CrewAIAgentComponent-aCLi7", "name": "output", "output_types": [ "Agent" @@ -122,26 +122,26 @@ }, "targetHandle": { "fieldName": "manager_agent", - "id": "HierarchicalCrewComponent-EfNrX", + "id": "HierarchicalCrewComponent-3JGY1", "inputTypes": [ "Agent" ], "type": "other" } }, - "id": "reactflow__edge-CrewAIAgentComponent-Q2BtZ{œdataTypeœ:œCrewAIAgentComponentœ,œidœ:œCrewAIAgentComponent-Q2BtZœ,œnameœ:œoutputœ,œoutput_typesœ:[œAgentœ]}-HierarchicalCrewComponent-EfNrX{œfieldNameœ:œmanager_agentœ,œidœ:œHierarchicalCrewComponent-EfNrXœ,œinputTypesœ:[œAgentœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-CrewAIAgentComponent-aCLi7{œdataTypeœ:œCrewAIAgentComponentœ,œidœ:œCrewAIAgentComponent-aCLi7œ,œnameœ:œoutputœ,œoutput_typesœ:[œAgentœ]}-HierarchicalCrewComponent-3JGY1{œfieldNameœ:œmanager_agentœ,œidœ:œHierarchicalCrewComponent-3JGY1œ,œinputTypesœ:[œAgentœ],œtypeœ:œotherœ}", "selected": false, - "source": "CrewAIAgentComponent-Q2BtZ", - "sourceHandle": "{œdataTypeœ: œCrewAIAgentComponentœ, œidœ: œCrewAIAgentComponent-Q2BtZœ, œnameœ: œoutputœ, œoutput_typesœ: [œAgentœ]}", - "target": "HierarchicalCrewComponent-EfNrX", - "targetHandle": "{œfieldNameœ: œmanager_agentœ, œidœ: œHierarchicalCrewComponent-EfNrXœ, œinputTypesœ: [œAgentœ], œtypeœ: œotherœ}" + "source": "CrewAIAgentComponent-aCLi7", + "sourceHandle": "{œdataTypeœ: œCrewAIAgentComponentœ, œidœ: œCrewAIAgentComponent-aCLi7œ, œnameœ: œoutputœ, œoutput_typesœ: [œAgentœ]}", + "target": "HierarchicalCrewComponent-3JGY1", + "targetHandle": "{œfieldNameœ: œmanager_agentœ, œidœ: œHierarchicalCrewComponent-3JGY1œ, œinputTypesœ: [œAgentœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-2V6yS", + "id": "OpenAIModel-wMVJn", "name": "model_output", "output_types": [ "LanguageModel" @@ -149,26 +149,26 @@ }, "targetHandle": { "fieldName": "llm", - "id": "CrewAIAgentComponent-Q2BtZ", + "id": "CrewAIAgentComponent-aCLi7", "inputTypes": [ "LanguageModel" ], "type": "other" } }, - "id": "reactflow__edge-OpenAIModel-2V6yS{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-2V6ySœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-CrewAIAgentComponent-Q2BtZ{œfieldNameœ:œllmœ,œidœ:œCrewAIAgentComponent-Q2BtZœ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-OpenAIModel-wMVJn{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-wMVJnœ,œnameœ:œmodel_outputœ,œoutput_typesœ:[œLanguageModelœ]}-CrewAIAgentComponent-aCLi7{œfieldNameœ:œllmœ,œidœ:œCrewAIAgentComponent-aCLi7œ,œinputTypesœ:[œLanguageModelœ],œtypeœ:œotherœ}", "selected": false, - "source": "OpenAIModel-2V6yS", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-2V6ySœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}", - "target": "CrewAIAgentComponent-Q2BtZ", - "targetHandle": "{œfieldNameœ: œllmœ, œidœ: œCrewAIAgentComponent-Q2BtZœ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}" + "source": "OpenAIModel-wMVJn", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-wMVJnœ, œnameœ: œmodel_outputœ, œoutput_typesœ: [œLanguageModelœ]}", + "target": "CrewAIAgentComponent-aCLi7", + "targetHandle": "{œfieldNameœ: œllmœ, œidœ: œCrewAIAgentComponent-aCLi7œ, œinputTypesœ: [œLanguageModelœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-AVtIX", + "id": "Prompt-gbnQU", "name": "prompt", "output_types": [ "Message" @@ -176,26 +176,26 @@ }, "targetHandle": { "fieldName": "task_description", - "id": "HierarchicalTaskComponent-yWaMT", + "id": "HierarchicalTaskComponent-GuXH7", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-AVtIX{œdataTypeœ:œPromptœ,œidœ:œPrompt-AVtIXœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-HierarchicalTaskComponent-yWaMT{œfieldNameœ:œtask_descriptionœ,œidœ:œHierarchicalTaskComponent-yWaMTœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-gbnQU{œdataTypeœ:œPromptœ,œidœ:œPrompt-gbnQUœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-HierarchicalTaskComponent-GuXH7{œfieldNameœ:œtask_descriptionœ,œidœ:œHierarchicalTaskComponent-GuXH7œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-AVtIX", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-AVtIXœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "HierarchicalTaskComponent-yWaMT", - "targetHandle": "{œfieldNameœ: œtask_descriptionœ, œidœ: œHierarchicalTaskComponent-yWaMTœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-gbnQU", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-gbnQUœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "HierarchicalTaskComponent-GuXH7", + "targetHandle": "{œfieldNameœ: œtask_descriptionœ, œidœ: œHierarchicalTaskComponent-GuXH7œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-nPZcc", + "id": "ChatInput-1Gki8", "name": "message", "output_types": [ "Message" @@ -203,7 +203,7 @@ }, "targetHandle": { "fieldName": "query", - "id": "Prompt-AVtIX", + "id": "Prompt-gbnQU", "inputTypes": [ "Message", "Text" @@ -211,19 +211,19 @@ "type": "str" } }, - "id": "reactflow__edge-ChatInput-nPZcc{œdataTypeœ:œChatInputœ,œidœ:œChatInput-nPZccœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-AVtIX{œfieldNameœ:œqueryœ,œidœ:œPrompt-AVtIXœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-ChatInput-1Gki8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1Gki8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-gbnQU{œfieldNameœ:œqueryœ,œidœ:œPrompt-gbnQUœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-nPZcc", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-nPZccœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AVtIX", - "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-AVtIXœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "ChatInput-1Gki8", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1Gki8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-gbnQU", + "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-gbnQUœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "YFinanceTool", - "id": "YFinanceTool-tWOoS", + "id": "YFinanceTool-gzeyq", "name": "tool", "output_types": [ "Tool" @@ -231,26 +231,26 @@ }, "targetHandle": { "fieldName": "tools", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "Tool" ], "type": "other" } }, - "id": "reactflow__edge-YFinanceTool-tWOoS{œdataTypeœ:œYFinanceToolœ,œidœ:œYFinanceTool-tWOoSœ,œnameœ:œtoolœ,œoutput_typesœ:[œToolœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œtoolsœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œToolœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-YFinanceTool-gzeyq{œdataTypeœ:œYFinanceToolœ,œidœ:œYFinanceTool-gzeyqœ,œnameœ:œtoolœ,œoutput_typesœ:[œToolœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œtoolsœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œToolœ],œtypeœ:œotherœ}", "selected": false, - "source": "YFinanceTool-tWOoS", - "sourceHandle": "{œdataTypeœ: œYFinanceToolœ, œidœ: œYFinanceTool-tWOoSœ, œnameœ: œtoolœ, œoutput_typesœ: [œToolœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œToolœ], œtypeœ: œotherœ}" + "source": "YFinanceTool-gzeyq", + "sourceHandle": "{œdataTypeœ: œYFinanceToolœ, œidœ: œYFinanceTool-gzeyqœ, œnameœ: œtoolœ, œoutput_typesœ: [œToolœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œToolœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-kSwv4", + "id": "Prompt-qCC5T", "name": "prompt", "output_types": [ "Message" @@ -258,26 +258,26 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "OpenAIModel-bjGnq", + "id": "OpenAIModel-KnjCY", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-kSwv4{œdataTypeœ:œPromptœ,œidœ:œPrompt-kSwv4œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-bjGnq{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-bjGnqœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-qCC5T{œdataTypeœ:œPromptœ,œidœ:œPrompt-qCC5Tœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-KnjCY{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-KnjCYœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-kSwv4", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-kSwv4œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-bjGnq", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-bjGnqœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-qCC5T", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-qCC5Tœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "OpenAIModel-KnjCY", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-KnjCYœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-bjGnq", + "id": "OpenAIModel-KnjCY", "name": "text_output", "output_types": [ "Message" @@ -285,26 +285,26 @@ }, "targetHandle": { "fieldName": "role", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-bjGnq{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-bjGnqœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œroleœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-OpenAIModel-KnjCY{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-KnjCYœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œroleœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "OpenAIModel-bjGnq", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-bjGnqœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "OpenAIModel-KnjCY", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-KnjCYœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-nPZcc", + "id": "ChatInput-1Gki8", "name": "message", "output_types": [ "Message" @@ -312,7 +312,7 @@ }, "targetHandle": { "fieldName": "query", - "id": "Prompt-S0Qt3", + "id": "Prompt-5wrVb", "inputTypes": [ "Message", "Text" @@ -320,19 +320,19 @@ "type": "str" } }, - "id": "reactflow__edge-ChatInput-nPZcc{œdataTypeœ:œChatInputœ,œidœ:œChatInput-nPZccœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-S0Qt3{œfieldNameœ:œqueryœ,œidœ:œPrompt-S0Qt3œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-ChatInput-1Gki8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1Gki8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-5wrVb{œfieldNameœ:œqueryœ,œidœ:œPrompt-5wrVbœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-nPZcc", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-nPZccœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-S0Qt3", - "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-S0Qt3œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "ChatInput-1Gki8", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1Gki8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-5wrVb", + "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-5wrVbœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-nPZcc", + "id": "ChatInput-1Gki8", "name": "message", "output_types": [ "Message" @@ -340,7 +340,7 @@ }, "targetHandle": { "fieldName": "query", - "id": "Prompt-kSwv4", + "id": "Prompt-qCC5T", "inputTypes": [ "Message", "Text" @@ -348,19 +348,19 @@ "type": "str" } }, - "id": "reactflow__edge-ChatInput-nPZcc{œdataTypeœ:œChatInputœ,œidœ:œChatInput-nPZccœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-kSwv4{œfieldNameœ:œqueryœ,œidœ:œPrompt-kSwv4œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-ChatInput-1Gki8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1Gki8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-qCC5T{œfieldNameœ:œqueryœ,œidœ:œPrompt-qCC5Tœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-nPZcc", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-nPZccœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-kSwv4", - "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-kSwv4œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "ChatInput-1Gki8", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1Gki8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-qCC5T", + "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-qCC5Tœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-S0Qt3", + "id": "Prompt-5wrVb", "name": "prompt", "output_types": [ "Message" @@ -368,26 +368,26 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "OpenAIModel-GAfpF", + "id": "OpenAIModel-wOSDH", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-S0Qt3{œdataTypeœ:œPromptœ,œidœ:œPrompt-S0Qt3œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-GAfpF{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-GAfpFœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-5wrVb{œdataTypeœ:œPromptœ,œidœ:œPrompt-5wrVbœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-wOSDH{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-wOSDHœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-S0Qt3", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-S0Qt3œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-GAfpF", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-GAfpFœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-5wrVb", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-5wrVbœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "OpenAIModel-wOSDH", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-wOSDHœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-bjGnq", + "id": "OpenAIModel-KnjCY", "name": "text_output", "output_types": [ "Message" @@ -395,7 +395,7 @@ }, "targetHandle": { "fieldName": "role", - "id": "Prompt-S0Qt3", + "id": "Prompt-5wrVb", "inputTypes": [ "Message", "Text" @@ -403,19 +403,19 @@ "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-bjGnq{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-bjGnqœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-S0Qt3{œfieldNameœ:œroleœ,œidœ:œPrompt-S0Qt3œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-OpenAIModel-KnjCY{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-KnjCYœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-5wrVb{œfieldNameœ:œroleœ,œidœ:œPrompt-5wrVbœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "OpenAIModel-bjGnq", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-bjGnqœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-S0Qt3", - "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œPrompt-S0Qt3œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "OpenAIModel-KnjCY", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-KnjCYœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-5wrVb", + "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œPrompt-5wrVbœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-GAfpF", + "id": "OpenAIModel-wOSDH", "name": "text_output", "output_types": [ "Message" @@ -423,26 +423,26 @@ }, "targetHandle": { "fieldName": "goal", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-GAfpF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-GAfpFœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œgoalœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-OpenAIModel-wOSDH{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-wOSDHœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œgoalœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "OpenAIModel-GAfpF", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-GAfpFœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œgoalœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "OpenAIModel-wOSDH", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-wOSDHœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œgoalœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-a0x5s", + "id": "Prompt-g5dyc", "name": "prompt", "output_types": [ "Message" @@ -450,26 +450,26 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "OpenAIModel-EnsCt", + "id": "OpenAIModel-lajm6", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-a0x5s{œdataTypeœ:œPromptœ,œidœ:œPrompt-a0x5sœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-EnsCt{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-EnsCtœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-g5dyc{œdataTypeœ:œPromptœ,œidœ:œPrompt-g5dycœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-lajm6{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-lajm6œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-a0x5s", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-a0x5sœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-EnsCt", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-EnsCtœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-g5dyc", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-g5dycœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "OpenAIModel-lajm6", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-lajm6œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-GAfpF", + "id": "OpenAIModel-wOSDH", "name": "text_output", "output_types": [ "Message" @@ -477,7 +477,7 @@ }, "targetHandle": { "fieldName": "goal", - "id": "Prompt-a0x5s", + "id": "Prompt-g5dyc", "inputTypes": [ "Message", "Text" @@ -485,18 +485,18 @@ "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-GAfpF{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-GAfpFœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-a0x5s{œfieldNameœ:œgoalœ,œidœ:œPrompt-a0x5sœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "OpenAIModel-GAfpF", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-GAfpFœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-a0x5s", - "targetHandle": "{œfieldNameœ: œgoalœ, œidœ: œPrompt-a0x5sœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-OpenAIModel-wOSDH{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-wOSDHœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-g5dyc{œfieldNameœ:œgoalœ,œidœ:œPrompt-g5dycœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "source": "OpenAIModel-wOSDH", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-wOSDHœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-g5dyc", + "targetHandle": "{œfieldNameœ: œgoalœ, œidœ: œPrompt-g5dycœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-bjGnq", + "id": "OpenAIModel-KnjCY", "name": "text_output", "output_types": [ "Message" @@ -504,7 +504,7 @@ }, "targetHandle": { "fieldName": "role", - "id": "Prompt-a0x5s", + "id": "Prompt-g5dyc", "inputTypes": [ "Message", "Text" @@ -512,18 +512,18 @@ "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-bjGnq{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-bjGnqœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-a0x5s{œfieldNameœ:œroleœ,œidœ:œPrompt-a0x5sœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "OpenAIModel-bjGnq", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-bjGnqœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-a0x5s", - "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œPrompt-a0x5sœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-OpenAIModel-KnjCY{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-KnjCYœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-g5dyc{œfieldNameœ:œroleœ,œidœ:œPrompt-g5dycœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "source": "OpenAIModel-KnjCY", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-KnjCYœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-g5dyc", + "targetHandle": "{œfieldNameœ: œroleœ, œidœ: œPrompt-g5dycœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-nPZcc", + "id": "ChatInput-1Gki8", "name": "message", "output_types": [ "Message" @@ -531,7 +531,7 @@ }, "targetHandle": { "fieldName": "query", - "id": "Prompt-a0x5s", + "id": "Prompt-g5dyc", "inputTypes": [ "Message", "Text" @@ -539,18 +539,18 @@ "type": "str" } }, - "id": "reactflow__edge-ChatInput-nPZcc{œdataTypeœ:œChatInputœ,œidœ:œChatInput-nPZccœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-a0x5s{œfieldNameœ:œqueryœ,œidœ:œPrompt-a0x5sœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "ChatInput-nPZcc", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-nPZccœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-a0x5s", - "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-a0x5sœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-ChatInput-1Gki8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-1Gki8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-g5dyc{œfieldNameœ:œqueryœ,œidœ:œPrompt-g5dycœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "source": "ChatInput-1Gki8", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-1Gki8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-g5dyc", + "targetHandle": "{œfieldNameœ: œqueryœ, œidœ: œPrompt-g5dycœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-EnsCt", + "id": "OpenAIModel-lajm6", "name": "text_output", "output_types": [ "Message" @@ -558,25 +558,25 @@ }, "targetHandle": { "fieldName": "backstory", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-EnsCt{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-EnsCtœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œbackstoryœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "source": "OpenAIModel-EnsCt", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-EnsCtœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œbackstoryœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-OpenAIModel-lajm6{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-lajm6œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œbackstoryœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "source": "OpenAIModel-lajm6", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-lajm6œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œbackstoryœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "SearchAPI", - "id": "SearchAPI-nLBPg", + "id": "SearchAPI-1mPpu", "name": "api_build_tool", "output_types": [ "Tool" @@ -584,18 +584,18 @@ }, "targetHandle": { "fieldName": "tools", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "inputTypes": [ "Tool" ], "type": "other" } }, - "id": "reactflow__edge-SearchAPI-nLBPg{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-nLBPgœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-CrewAIAgentComponent-Qm4en{œfieldNameœ:œtoolsœ,œidœ:œCrewAIAgentComponent-Qm4enœ,œinputTypesœ:[œToolœ],œtypeœ:œotherœ}", - "source": "SearchAPI-nLBPg", - "sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-nLBPgœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}", - "target": "CrewAIAgentComponent-Qm4en", - "targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œCrewAIAgentComponent-Qm4enœ, œinputTypesœ: [œToolœ], œtypeœ: œotherœ}" + "id": "reactflow__edge-SearchAPI-1mPpu{œdataTypeœ:œSearchAPIœ,œidœ:œSearchAPI-1mPpuœ,œnameœ:œapi_build_toolœ,œoutput_typesœ:[œToolœ]}-CrewAIAgentComponent-ViX9d{œfieldNameœ:œtoolsœ,œidœ:œCrewAIAgentComponent-ViX9dœ,œinputTypesœ:[œToolœ],œtypeœ:œotherœ}", + "source": "SearchAPI-1mPpu", + "sourceHandle": "{œdataTypeœ: œSearchAPIœ, œidœ: œSearchAPI-1mPpuœ, œnameœ: œapi_build_toolœ, œoutput_typesœ: [œToolœ]}", + "target": "CrewAIAgentComponent-ViX9d", + "targetHandle": "{œfieldNameœ: œtoolsœ, œidœ: œCrewAIAgentComponent-ViX9dœ, œinputTypesœ: [œToolœ], œtypeœ: œotherœ}" } ], "nodes": [ @@ -603,7 +603,7 @@ "data": { "description": "Represents a group of agents, defining how they should collaborate and the tasks they should perform.", "display_name": "Hierarchical Crew", - "id": "HierarchicalCrewComponent-EfNrX", + "id": "HierarchicalCrewComponent-3JGY1", "node": { "base_classes": [ "Message" @@ -833,8 +833,8 @@ }, "type": "HierarchicalCrewComponent" }, - "height": 459, - "id": "HierarchicalCrewComponent-EfNrX", + "height": 460, + "id": "HierarchicalCrewComponent-3JGY1", "position": { "x": 2444.845721347115, "y": 1410.1850661630874 @@ -845,7 +845,7 @@ }, { "data": { - "id": "OpenAIModel-S9ZnF", + "id": "OpenAIModel-ucjrK", "node": { "base_classes": [ "LanguageModel", @@ -1124,8 +1124,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-S9ZnF", + "height": 605, + "id": "OpenAIModel-ucjrK", "position": { "x": 993.5222179419411, "y": 2121.1120144471624 @@ -1142,7 +1142,7 @@ "data": { "description": "Display a chat message in the Playground.", "display_name": "Chat Output", - "id": "ChatOutput-ZEUNq", + "id": "ChatOutput-8FKry", "node": { "base_classes": [ "Message" @@ -1316,8 +1316,8 @@ }, "type": "ChatOutput" }, - "height": 309, - "id": "ChatOutput-ZEUNq", + "height": 302, + "id": "ChatOutput-8FKry", "position": { "x": 2947.7605810360546, "y": 1557.6959660020289 @@ -1330,7 +1330,7 @@ "data": { "description": "Each task must have a description, an expected output and an agent responsible for execution.", "display_name": "Hierarchical Task", - "id": "HierarchicalTaskComponent-yWaMT", + "id": "HierarchicalTaskComponent-GuXH7", "node": { "base_classes": [ "HierarchicalTask" @@ -1448,8 +1448,8 @@ }, "type": "HierarchicalTaskComponent" }, - "height": 455, - "id": "HierarchicalTaskComponent-yWaMT", + "height": 440, + "id": "HierarchicalTaskComponent-GuXH7", "position": { "x": 1940.5188074417165, "y": 682.2998623189735 @@ -1462,7 +1462,7 @@ "data": { "description": "Represents an agent of CrewAI.", "display_name": "CrewAI Agent", - "id": "CrewAIAgentComponent-Qm4en", + "id": "CrewAIAgentComponent-ViX9d", "node": { "base_classes": [ "Agent" @@ -1702,8 +1702,8 @@ "type": "CrewAIAgentComponent" }, "dragging": false, - "height": 665, - "id": "CrewAIAgentComponent-Qm4en", + "height": 638, + "id": "CrewAIAgentComponent-ViX9d", "position": { "x": 1397.4912377259789, "y": 1242.739374306084 @@ -1716,7 +1716,7 @@ "data": { "description": "Represents an agent of CrewAI.", "display_name": "CrewAI Agent", - "id": "CrewAIAgentComponent-Q2BtZ", + "id": "CrewAIAgentComponent-aCLi7", "node": { "base_classes": [ "Agent" @@ -1956,8 +1956,8 @@ "type": "CrewAIAgentComponent" }, "dragging": false, - "height": 665, - "id": "CrewAIAgentComponent-Q2BtZ", + "height": 638, + "id": "CrewAIAgentComponent-aCLi7", "position": { "x": 1897.563645835175, "y": 2043.8342912334688 @@ -1972,7 +1972,7 @@ }, { "data": { - "id": "OpenAIModel-2V6yS", + "id": "OpenAIModel-wMVJn", "node": { "base_classes": [ "LanguageModel", @@ -2251,8 +2251,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-2V6yS", + "height": 605, + "id": "OpenAIModel-wMVJn", "position": { "x": 1689.7403176652529, "y": 2778.554803586579 @@ -2269,7 +2269,7 @@ "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", - "id": "Prompt-AVtIX", + "id": "Prompt-gbnQU", "node": { "base_classes": [ "Message" @@ -2375,8 +2375,8 @@ "type": "Prompt" }, "dragging": false, - "height": 423, - "id": "Prompt-AVtIX", + "height": 416, + "id": "Prompt-gbnQU", "position": { "x": 1314.943965489173, "y": 624.296875 @@ -2387,7 +2387,7 @@ }, { "data": { - "id": "ChatInput-nPZcc", + "id": "ChatInput-1Gki8", "node": { "base_classes": [ "Message" @@ -2584,8 +2584,8 @@ "type": "ChatInput" }, "dragging": false, - "height": 309, - "id": "ChatInput-nPZcc", + "height": 302, + "id": "ChatInput-1Gki8", "position": { "x": -812.219234501281, "y": 283.9527676042414 @@ -2602,7 +2602,7 @@ "data": { "description": "Tool for interacting with Yahoo Finance News.", "display_name": "Yahoo Finance News Tool", - "id": "YFinanceTool-tWOoS", + "id": "YFinanceTool-gzeyq", "node": { "base_classes": [ "Tool" @@ -2688,8 +2688,8 @@ "type": "YFinanceTool" }, "dragging": false, - "height": 219, - "id": "YFinanceTool-tWOoS", + "height": 347, + "id": "YFinanceTool-gzeyq", "position": { "x": 339.85802955438953, "y": 941.0061737791777 @@ -2704,7 +2704,7 @@ }, { "data": { - "id": "OpenAIModel-bjGnq", + "id": "OpenAIModel-KnjCY", "node": { "base_classes": [ "LanguageModel", @@ -2983,8 +2983,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-bjGnq", + "height": 605, + "id": "OpenAIModel-KnjCY", "position": { "x": -1421.3072930401338, "y": 944.2116827656167 @@ -3000,8 +3000,8 @@ { "data": { "description": "Create a prompt template with dynamic variables.", - "display_name": "Prompt", - "id": "Prompt-kSwv4", + "display_name": "Role Prompt", + "id": "Prompt-qCC5T", "node": { "base_classes": [ "Message" @@ -3017,23 +3017,16 @@ "display_name": "Role Prompt", "documentation": "", "edited": false, - "error": null, "field_order": [ "template" ], "frozen": false, - "full_path": null, "icon": "prompts", - "is_composition": null, - "is_input": null, - "is_output": null, - "name": "", "output_types": [], "outputs": [ { "cache": true, "display_name": "Prompt Message", - "hidden": null, "method": "build_prompt", "name": "prompt", "selected": "Message", @@ -3062,7 +3055,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n name = \"Prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n" + "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.inputs.inputs import DefaultPromptField\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n name = \"Prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def _update_template(self, frontend_node: dict):\n prompt_template = frontend_node[\"template\"][\"template\"][\"value\"]\n custom_fields = frontend_node[\"custom_fields\"]\n frontend_node_template = frontend_node[\"template\"]\n _ = process_prompt_template(\n template=prompt_template,\n name=\"template\",\n custom_fields=custom_fields,\n frontend_node_template=frontend_node_template,\n )\n return frontend_node\n\n def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n # Kept it duplicated for backwards compatibility\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n\n def _get_fallback_input(self, **kwargs):\n return DefaultPromptField(**kwargs)\n" }, "query": { "advanced": false, @@ -3080,7 +3073,6 @@ "load_from_db": false, "multiline": true, "name": "query", - "password": false, "placeholder": "", "required": false, "show": true, @@ -3089,11 +3081,13 @@ "value": "" }, "template": { + "_input_type": "PromptInput", "advanced": false, "display_name": "Template", "dynamic": false, "info": "", "list": false, + "load_from_db": false, "name": "template", "placeholder": "", "required": false, @@ -3108,8 +3102,8 @@ "type": "Prompt" }, "dragging": false, - "height": 423, - "id": "Prompt-kSwv4", + "height": 416, + "id": "Prompt-qCC5T", "position": { "x": -2011.857599027479, "y": 811.2903194233206 @@ -3124,7 +3118,7 @@ }, { "data": { - "id": "OpenAIModel-GAfpF", + "id": "OpenAIModel-wOSDH", "node": { "base_classes": [ "LanguageModel", @@ -3403,8 +3397,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-GAfpF", + "height": 605, + "id": "OpenAIModel-wOSDH", "position": { "x": -652.5526340446298, "y": 2170.3301251807097 @@ -3420,8 +3414,8 @@ { "data": { "description": "Create a prompt template with dynamic variables.", - "display_name": "Prompt", - "id": "Prompt-S0Qt3", + "display_name": "Goal Prompt", + "id": "Prompt-5wrVb", "node": { "base_classes": [ "Message" @@ -3438,23 +3432,16 @@ "display_name": "Goal Prompt", "documentation": "", "edited": false, - "error": null, "field_order": [ "template" ], "frozen": false, - "full_path": null, "icon": "prompts", - "is_composition": null, - "is_input": null, - "is_output": null, - "name": "", "output_types": [], "outputs": [ { "cache": true, "display_name": "Prompt Message", - "hidden": null, "method": "build_prompt", "name": "prompt", "selected": "Message", @@ -3483,7 +3470,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n name = \"Prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n" + "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.inputs.inputs import DefaultPromptField\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n name = \"Prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def _update_template(self, frontend_node: dict):\n prompt_template = frontend_node[\"template\"][\"template\"][\"value\"]\n custom_fields = frontend_node[\"custom_fields\"]\n frontend_node_template = frontend_node[\"template\"]\n _ = process_prompt_template(\n template=prompt_template,\n name=\"template\",\n custom_fields=custom_fields,\n frontend_node_template=frontend_node_template,\n )\n return frontend_node\n\n def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n # Kept it duplicated for backwards compatibility\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n\n def _get_fallback_input(self, **kwargs):\n return DefaultPromptField(**kwargs)\n" }, "query": { "advanced": false, @@ -3501,7 +3488,6 @@ "load_from_db": false, "multiline": true, "name": "query", - "password": false, "placeholder": "", "required": false, "show": true, @@ -3525,7 +3511,6 @@ "load_from_db": false, "multiline": true, "name": "role", - "password": false, "placeholder": "", "required": false, "show": true, @@ -3534,11 +3519,13 @@ "value": "" }, "template": { + "_input_type": "PromptInput", "advanced": false, "display_name": "Template", "dynamic": false, "info": "", "list": false, + "load_from_db": false, "name": "template", "placeholder": "", "required": false, @@ -3553,8 +3540,8 @@ "type": "Prompt" }, "dragging": false, - "height": 517, - "id": "Prompt-S0Qt3", + "height": 502, + "id": "Prompt-5wrVb", "position": { "x": -1127.1897676702288, "y": 1693.922415635935 @@ -3569,7 +3556,7 @@ }, { "data": { - "id": "OpenAIModel-EnsCt", + "id": "OpenAIModel-lajm6", "node": { "base_classes": [ "LanguageModel", @@ -3848,8 +3835,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-EnsCt", + "height": 605, + "id": "OpenAIModel-lajm6", "position": { "x": -173.231944282948, "y": 3277.114857802737 @@ -3866,7 +3853,7 @@ "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", - "id": "Prompt-a0x5s", + "id": "Prompt-g5dyc", "node": { "base_classes": [ "Message" @@ -4022,8 +4009,8 @@ "type": "Prompt" }, "dragging": false, - "height": 611, - "id": "Prompt-a0x5s", + "height": 588, + "id": "Prompt-g5dyc", "position": { "x": -559.9999554636487, "y": 2893.2894056013133 @@ -4040,7 +4027,7 @@ "data": { "description": "Call the searchapi.io API", "display_name": "Search API", - "id": "SearchAPI-nLBPg", + "id": "SearchAPI-1mPpu", "node": { "base_classes": [ "Data", @@ -4049,7 +4036,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, @@ -4122,7 +4109,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, @@ -4165,6 +4152,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", @@ -4185,8 +4204,8 @@ "type": "SearchAPI" }, "dragging": false, - "height": 545, - "id": "SearchAPI-nLBPg", + "height": 519, + "id": "SearchAPI-1mPpu", "position": { "x": 333.3937684700711, "y": 310.93183831810336 @@ -4201,15 +4220,15 @@ } ], "viewport": { - "x": 0, - "y": 0, - "zoom": 1 + "x": 514.3183520357233, + "y": 43.747988301750695, + "zoom": 0.4190366645156897 } }, "description": "This Agent is created on the fly based on what the user asks and a Manager Agent calls it if needed.", "endpoint_name": null, - "id": "07cd68d7-d864-4cfe-9901-0ccc61d6e80d", + "id": "93709197-049c-41fa-ab4d-f871c20e83eb", "is_component": false, - "last_tested_version": "1.0.9", + "last_tested_version": "1.0.17", "name": "Dynamic Agent" } \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json index 0b92a7813..1c3f9c054 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json @@ -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", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json index a64f3af61..9a7df3576 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json @@ -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" diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json index 48f3f6495..4267b3505 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json @@ -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" } \ No newline at end of file diff --git a/src/backend/tests/unit/components/tools/test_python_repl_tool.py b/src/backend/tests/unit/components/tools/test_python_repl_tool.py index 93f83d190..c5be4ba85 100644 --- a/src/backend/tests/unit/components/tools/test_python_repl_tool.py +++ b/src/backend/tests/unit/components/tools/test_python_repl_tool.py @@ -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" diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx index 3123c8ff0..ecf65efa0 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx @@ -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 ( diff --git a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts index 0a798185d..4e5c71c80 100644 --- a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts @@ -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); }); diff --git a/src/frontend/tests/core/integrations/Simple Agent.spec.ts b/src/frontend/tests/core/integrations/Simple Agent.spec.ts index d8325d36b..b173f4876 100644 --- a/src/frontend/tests/core/integrations/Simple Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Simple Agent.spec.ts @@ -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); diff --git a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts index 923b31377..2f9411215 100644 --- a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts @@ -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", {