diff --git a/.cursor/rules/icons.mdc b/.cursor/rules/icons.mdc
index 70e570f2d..9d30d9ad6 100644
--- a/.cursor/rules/icons.mdc
+++ b/.cursor/rules/icons.mdc
@@ -8,10 +8,10 @@ globs:
alwaysApply: false
---
-
# Component Icon Rules
## Purpose
+
To ensure consistent, clear, and functional icon usage for components, covering both backend (Python) and frontend (React/TypeScript) steps.
---
@@ -36,17 +36,19 @@ To ensure consistent, clear, and functional icon usage for components, covering
- **Where:**
In a new directory for your icon, e.g., `src/frontend/src/icons/AstraDB/`.
- **How:**
+
- Add your SVG as a React component, e.g., `AstraSVG` in `AstraDB.jsx`.
```jsx
const AstraSVG = (props) => (
);
```
- Create an `index.tsx` that exports your icon using `forwardRef`:
+
```tsx
import React, { forwardRef } from "react";
import AstraSVG from "./AstraDB";
@@ -118,6 +120,7 @@ To ensure consistent, clear, and functional icon usage for components, covering
---
**Example for AstraDB:**
+
- Backend:
```python
icon = "AstraDB"
diff --git a/src/backend/base/langflow/base/huggingface/model_bridge.py b/src/backend/base/langflow/base/huggingface/model_bridge.py
index 6a08f106b..c042ceaca 100644
--- a/src/backend/base/langflow/base/huggingface/model_bridge.py
+++ b/src/backend/base/langflow/base/huggingface/model_bridge.py
@@ -3,19 +3,19 @@ from langchain_core.language_models.chat_models import BaseChatModel
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, ToolCall
from langchain_core.tools import BaseTool
-# Import HuggingFace Model base
+# Import Hugging Face Model base
from smolagents import Model, Tool
from smolagents.models import ChatMessage, ChatMessageToolCall, ChatMessageToolCallDefinition
def _lc_tool_call_to_hf_tool_call(tool_call: ToolCall) -> ChatMessageToolCall:
- """Convert a LangChain ToolCall to a HuggingFace ChatMessageToolCall.
+ """Convert a LangChain ToolCall to a Hugging Face ChatMessageToolCall.
Args:
tool_call (ToolCall): LangChain tool call to convert
Returns:
- ChatMessageToolCall: Equivalent HuggingFace tool call
+ ChatMessageToolCall: Equivalent Hugging Face tool call
"""
return ChatMessageToolCall(
function=ChatMessageToolCallDefinition(name=tool_call.name, arguments=tool_call.args),
@@ -24,24 +24,24 @@ def _lc_tool_call_to_hf_tool_call(tool_call: ToolCall) -> ChatMessageToolCall:
def _hf_tool_to_lc_tool(tool) -> BaseTool:
- """Convert a HuggingFace Tool to a LangChain BaseTool.
+ """Convert a Hugging Face Tool to a LangChain BaseTool.
Args:
- tool (Tool): HuggingFace tool to convert
+ tool (Tool): Hugging Face tool to convert
Returns:
BaseTool: Equivalent LangChain tool
"""
if not hasattr(tool, "langchain_tool"):
- msg = "HuggingFace Tool does not have a langchain_tool attribute"
+ msg = "Hugging Face Tool does not have a langchain_tool attribute"
raise ValueError(msg)
return tool.langchain_tool
class LangChainHFModel(Model):
- """A class bridging HuggingFace's `Model` interface with a LangChain `BaseChatModel`.
+ """A class bridging Hugging Face's `Model` interface with a LangChain `BaseChatModel`.
- This adapter allows using any LangChain chat model with the HuggingFace interface.
+ This adapter allows using any LangChain chat model with the Hugging Face interface.
It handles conversion of message formats and tool calls between the two frameworks.
Usage:
@@ -68,7 +68,7 @@ class LangChainHFModel(Model):
tools_to_call_from: list[Tool] | None = None,
**kwargs,
) -> ChatMessage:
- """Process messages through the LangChain model and return HuggingFace format.
+ """Process messages through the LangChain model and return Hugging Face format.
Args:
messages: List of message dictionaries with 'role' and 'content' keys
@@ -78,7 +78,7 @@ class LangChainHFModel(Model):
**kwargs: Additional arguments passed to the LangChain model
Returns:
- ChatMessage: Response in HuggingFace format
+ ChatMessage: Response in Hugging Face format
"""
if grammar:
msg = "Grammar is not yet supported."
diff --git a/src/backend/base/langflow/base/models/aiml_constants.py b/src/backend/base/langflow/base/models/aiml_constants.py
index 1d4591746..c3b8a47e6 100644
--- a/src/backend/base/langflow/base/models/aiml_constants.py
+++ b/src/backend/base/langflow/base/models/aiml_constants.py
@@ -17,10 +17,10 @@ class AimlModels:
response = client.get("https://api.aimlapi.com/models")
response.raise_for_status()
except httpx.RequestError as e:
- msg = "Failed to connect to the AIML API."
+ msg = "Failed to connect to the AI/ML API."
raise APIConnectionError(msg) from e
except httpx.HTTPStatusError as e:
- msg = f"AIML API responded with status code: {e.response.status_code}"
+ msg = f"AI/ML API responded with status code: {e.response.status_code}"
raise APIError(
message=msg,
body=None,
@@ -31,7 +31,7 @@ class AimlModels:
models = response.json().get("data", [])
self.separate_models_by_type(models)
except (ValueError, KeyError, TypeError) as e:
- msg = "Failed to parse response data from AIML API. The format may be incorrect."
+ msg = "Failed to parse response data from AI/ML API. The format may be incorrect."
raise ValueError(msg) from e
def separate_models_by_type(self, models):
diff --git a/src/backend/base/langflow/base/models/groq_constants.py b/src/backend/base/langflow/base/models/groq_constants.py
index d4f97fbee..49554a62e 100644
--- a/src/backend/base/langflow/base/models/groq_constants.py
+++ b/src/backend/base/langflow/base/models/groq_constants.py
@@ -97,7 +97,7 @@ GROQ_MODELS_DETAILED = [
create_model_metadata( # OpenAI
provider="Groq", name="whisper-large-v3-turbo", icon="Groq", not_supported=True
),
- create_model_metadata( # HuggingFace
+ create_model_metadata( # Hugging Face
provider="Groq", name="distil-whisper-large-v3-en", icon="Groq", not_supported=True
),
]
diff --git a/src/backend/base/langflow/components/aiml/aiml.py b/src/backend/base/langflow/components/aiml/aiml.py
index 941cb22f3..f93c84acc 100644
--- a/src/backend/base/langflow/components/aiml/aiml.py
+++ b/src/backend/base/langflow/components/aiml/aiml.py
@@ -17,8 +17,8 @@ from langflow.inputs.inputs import (
class AIMLModelComponent(LCModelComponent):
- display_name = "AIML"
- description = "Generates text using AIML LLMs."
+ display_name = "AI/ML API"
+ description = "Generates text using AI/ML API LLMs."
icon = "AIML"
name = "AIMLModel"
documentation = "https://docs.aimlapi.com/api-reference"
@@ -42,15 +42,15 @@ class AIMLModelComponent(LCModelComponent):
),
StrInput(
name="aiml_api_base",
- display_name="AIML API Base",
+ display_name="AI/ML API Base",
advanced=True,
- info="The base URL of the OpenAI API. Defaults to https://api.aimlapi.com . "
+ info="The base URL of the API. Defaults to https://api.aimlapi.com . "
"You can change this to use other APIs like JinaChat, LocalAI and Prem.",
),
SecretStrInput(
name="api_key",
- display_name="AIML API Key",
- info="The AIML API Key to use for the OpenAI model.",
+ display_name="AI/ML API Key",
+ info="The AI/ML API Key to use for the OpenAI model.",
advanced=False,
value="AIML_API_KEY",
required=True,
diff --git a/src/backend/base/langflow/components/aiml/aiml_embeddings.py b/src/backend/base/langflow/components/aiml/aiml_embeddings.py
index e9ed2bdfd..84b49c459 100644
--- a/src/backend/base/langflow/components/aiml/aiml_embeddings.py
+++ b/src/backend/base/langflow/components/aiml/aiml_embeddings.py
@@ -6,9 +6,9 @@ from langflow.io import SecretStrInput
class AIMLEmbeddingsComponent(LCEmbeddingsModel):
- display_name = "AI/ML Embeddings"
+ display_name = "AI/ML API Embeddings"
description = "Generate embeddings using the AI/ML API."
- icon = "AI/ML"
+ icon = "AIML"
name = "AIMLEmbeddings"
inputs = [
diff --git a/src/backend/base/langflow/components/anthropic/anthropic.py b/src/backend/base/langflow/components/anthropic/anthropic.py
index 7dc825bb0..f0a5144df 100644
--- a/src/backend/base/langflow/components/anthropic/anthropic.py
+++ b/src/backend/base/langflow/components/anthropic/anthropic.py
@@ -19,7 +19,7 @@ from langflow.schema.dotdict import dotdict
class AnthropicModelComponent(LCModelComponent):
display_name = "Anthropic"
- description = "Generate text using Anthropic Chat&Completion LLMs with prefill support."
+ description = "Generate text using Anthropic's Messages API and models."
icon = "Anthropic"
name = "AnthropicModel"
@@ -74,9 +74,6 @@ class AnthropicModelComponent(LCModelComponent):
value=False,
real_time_refresh=True,
),
- MessageTextInput(
- name="prefill", display_name="Prefill", info="Prefill text to guide the model's response.", advanced=True
- ),
]
def build_model(self) -> LanguageModel: # type: ignore[type-var]
diff --git a/src/backend/base/langflow/components/datastax/astra_vectorize.py b/src/backend/base/langflow/components/datastax/astra_vectorize.py
index b1334a378..1e867832b 100644
--- a/src/backend/base/langflow/components/datastax/astra_vectorize.py
+++ b/src/backend/base/langflow/components/datastax/astra_vectorize.py
@@ -12,6 +12,7 @@ class AstraVectorizeComponent(Component):
"This component is deprecated. Please use the Astra DB Component directly."
)
documentation: str = "https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html"
+ legacy = True
icon = "AstraDB"
name = "AstraVectorize"
diff --git a/src/backend/base/langflow/components/datastax/astradb_cql.py b/src/backend/base/langflow/components/datastax/astradb_cql.py
index ea86f6554..e70e68237 100644
--- a/src/backend/base/langflow/components/datastax/astradb_cql.py
+++ b/src/backend/base/langflow/components/datastax/astradb_cql.py
@@ -277,7 +277,7 @@ class AstraDBCQLToolComponent(LCToolComponent):
name (str, optional): The name of the tool.
Returns:
- Tool: The built AstraDB tool.
+ Tool: The built Astra DB tool.
"""
schema_dict = self.create_args_schema()
return StructuredTool.from_function(
diff --git a/src/backend/base/langflow/components/datastax/astradb_tool.py b/src/backend/base/langflow/components/datastax/astradb_tool.py
index c3e28e002..8bf41cc94 100644
--- a/src/backend/base/langflow/components/datastax/astradb_tool.py
+++ b/src/backend/base/langflow/components/datastax/astradb_tool.py
@@ -268,7 +268,7 @@ class AstraDBToolComponent(LCToolComponent):
return tool
def projection_args(self, input_str: str) -> dict | None:
- """Build the projection arguments for the AstraDB query."""
+ """Build the projection arguments for the Astra DB query."""
elements = input_str.split(",")
result = {}
@@ -329,7 +329,7 @@ class AstraDBToolComponent(LCToolComponent):
raise ValueError(msg)
def build_filter(self, args: dict, filter_settings: list) -> dict:
- """Build filter dictionary for AstraDB query.
+ """Build filter dictionary for Astra DB query.
Args:
args: Dictionary of arguments from the tool
@@ -370,7 +370,7 @@ class AstraDBToolComponent(LCToolComponent):
return filters
def run_model(self, **args) -> Data | list[Data]:
- """Run the query to get the data from the AstraDB collection."""
+ """Run the query to get the data from the Astra DB collection."""
collection = self._build_collection()
sort = {}
diff --git a/src/backend/base/langflow/components/datastax/cassandra.py b/src/backend/base/langflow/components/datastax/cassandra.py
index b91ca77c5..95213504e 100644
--- a/src/backend/base/langflow/components/datastax/cassandra.py
+++ b/src/backend/base/langflow/components/datastax/cassandra.py
@@ -13,28 +13,28 @@ class CassandraChatMemory(LCChatMemoryComponent):
MessageTextInput(
name="database_ref",
display_name="Contact Points / Astra Database ID",
- info="Contact points for the database (or AstraDB database ID)",
+ info="Contact points for the database (or Astra DB database ID)",
required=True,
),
MessageTextInput(
- name="username", display_name="Username", info="Username for the database (leave empty for AstraDB)."
+ name="username", display_name="Username", info="Username for the database (leave empty for Astra DB)."
),
SecretStrInput(
name="token",
- display_name="Password / AstraDB Token",
- info="User password for the database (or AstraDB token).",
+ display_name="Password / Astra DB Token",
+ info="User password for the database (or Astra DB token).",
required=True,
),
MessageTextInput(
name="keyspace",
display_name="Keyspace",
- info="Table Keyspace (or AstraDB namespace).",
+ info="Table Keyspace (or Astra DB namespace).",
required=True,
),
MessageTextInput(
name="table_name",
display_name="Table Name",
- info="The name of the table (or AstraDB collection) where vectors will be stored.",
+ info="The name of the table (or Astra DB collection) where vectors will be stored.",
required=True,
),
MessageTextInput(
diff --git a/src/backend/base/langflow/components/datastax/getenvvar.py b/src/backend/base/langflow/components/datastax/getenvvar.py
index 9becc8173..346fea7fa 100644
--- a/src/backend/base/langflow/components/datastax/getenvvar.py
+++ b/src/backend/base/langflow/components/datastax/getenvvar.py
@@ -7,20 +7,20 @@ from langflow.template.field.base import Output
class GetEnvVar(Component):
- display_name = "Get env var"
- description = "Get env var"
+ display_name = "Get Environment Variable"
+ description = "Gets the value of an environment variable from the system."
icon = "AstraDB"
inputs = [
StrInput(
name="env_var_name",
- display_name="Env var name",
+ display_name="Environment Variable Name",
info="Name of the environment variable to get",
)
]
outputs = [
- Output(display_name="Env var value", name="env_var_value", method="process_inputs"),
+ Output(display_name="Environment Variable Value", name="env_var_value", method="process_inputs"),
]
def process_inputs(self) -> Message:
diff --git a/src/backend/base/langflow/components/firecrawl/firecrawl_crawl_api.py b/src/backend/base/langflow/components/firecrawl/firecrawl_crawl_api.py
index e58e1e112..6fc381bf6 100644
--- a/src/backend/base/langflow/components/firecrawl/firecrawl_crawl_api.py
+++ b/src/backend/base/langflow/components/firecrawl/firecrawl_crawl_api.py
@@ -6,8 +6,8 @@ from langflow.schema.data import Data
class FirecrawlCrawlApi(Component):
- display_name: str = "FirecrawlCrawlApi"
- description: str = "Firecrawl Crawl API."
+ display_name: str = "Firecrawl Crawl API"
+ description: str = "Crawls a URL and returns the results."
name = "FirecrawlCrawlApi"
documentation: str = "https://docs.firecrawl.dev/v1/api-reference/endpoint/crawl-post"
diff --git a/src/backend/base/langflow/components/firecrawl/firecrawl_extract_api.py b/src/backend/base/langflow/components/firecrawl/firecrawl_extract_api.py
index fda1f745a..84742b1bc 100644
--- a/src/backend/base/langflow/components/firecrawl/firecrawl_extract_api.py
+++ b/src/backend/base/langflow/components/firecrawl/firecrawl_extract_api.py
@@ -12,8 +12,8 @@ from langflow.schema.data import Data
class FirecrawlExtractApi(Component):
- display_name: str = "FirecrawlExtractApi"
- description: str = "Firecrawl Extract API."
+ display_name: str = "Firecrawl Extract API"
+ description: str = "Extracts data from a URL."
name = "FirecrawlExtractApi"
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/extract"
diff --git a/src/backend/base/langflow/components/firecrawl/firecrawl_map_api.py b/src/backend/base/langflow/components/firecrawl/firecrawl_map_api.py
index d28b74e14..287210901 100644
--- a/src/backend/base/langflow/components/firecrawl/firecrawl_map_api.py
+++ b/src/backend/base/langflow/components/firecrawl/firecrawl_map_api.py
@@ -9,8 +9,8 @@ from langflow.schema.data import Data
class FirecrawlMapApi(Component):
- display_name: str = "FirecrawlMapApi"
- description: str = "Firecrawl Map API."
+ display_name: str = "Firecrawl Map API"
+ description: str = "Maps a URL and returns the results."
name = "FirecrawlMapApi"
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/map"
diff --git a/src/backend/base/langflow/components/firecrawl/firecrawl_scrape_api.py b/src/backend/base/langflow/components/firecrawl/firecrawl_scrape_api.py
index e182e9292..fb2fa2216 100644
--- a/src/backend/base/langflow/components/firecrawl/firecrawl_scrape_api.py
+++ b/src/backend/base/langflow/components/firecrawl/firecrawl_scrape_api.py
@@ -10,8 +10,8 @@ from langflow.schema.data import Data
class FirecrawlScrapeApi(Component):
- display_name: str = "FirecrawlScrapeApi"
- description: str = "Firecrawl Scrape API."
+ display_name: str = "Firecrawl Scrape API"
+ description: str = "Scrapes a URL and returns the results."
name = "FirecrawlScrapeApi"
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/scrape"
diff --git a/src/backend/base/langflow/components/google/google_generative_ai_embeddings.py b/src/backend/base/langflow/components/google/google_generative_ai_embeddings.py
index 1d8c602fa..29f97b354 100644
--- a/src/backend/base/langflow/components/google/google_generative_ai_embeddings.py
+++ b/src/backend/base/langflow/components/google/google_generative_ai_embeddings.py
@@ -24,7 +24,7 @@ class GoogleGenerativeAIEmbeddingsComponent(Component):
"found in the langchain-google-genai package."
)
documentation: str = "https://python.langchain.com/v0.2/docs/integrations/text_embedding/google_generative_ai/"
- icon = "Google"
+ icon = "GoogleGenerativeAI"
name = "Google Generative AI Embeddings"
inputs = [
diff --git a/src/backend/base/langflow/components/homeassistant/list_home_assistant_states.py b/src/backend/base/langflow/components/homeassistant/list_home_assistant_states.py
index 048db2d18..63fdedfd9 100644
--- a/src/backend/base/langflow/components/homeassistant/list_home_assistant_states.py
+++ b/src/backend/base/langflow/components/homeassistant/list_home_assistant_states.py
@@ -12,7 +12,7 @@ from langflow.schema.data import Data
class ListHomeAssistantStates(LCToolComponent):
- display_name: str = "List HomeAssistant States"
+ display_name: str = "List Home Assistant States"
description: str = (
"Retrieve states from Home Assistant. "
"The agent only needs to specify 'filter_domain' (optional). "
diff --git a/src/backend/base/langflow/components/huggingface/huggingface.py b/src/backend/base/langflow/components/huggingface/huggingface.py
index 88b8651cf..77b59a260 100644
--- a/src/backend/base/langflow/components/huggingface/huggingface.py
+++ b/src/backend/base/langflow/components/huggingface/huggingface.py
@@ -16,7 +16,7 @@ DEFAULT_MODEL = "meta-llama/Llama-3.3-70B-Instruct"
class HuggingFaceEndpointsComponent(LCModelComponent):
- display_name: str = "HuggingFace"
+ display_name: str = "Hugging Face"
description: str = "Generate text using Hugging Face Inference APIs."
icon = "HuggingFace"
name = "HuggingFaceModel"
@@ -26,7 +26,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
DropdownInput(
name="model_id",
display_name="Model ID",
- info="Select a model from HuggingFace Hub",
+ info="Select a model from Hugging Face Hub",
options=[
DEFAULT_MODEL,
"mistralai/Mixtral-8x7B-Instruct-v0.1",
@@ -44,7 +44,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
StrInput(
name="custom_model",
display_name="Custom Model ID",
- info="Enter a custom model ID from HuggingFace Hub",
+ info="Enter a custom model ID from Hugging Face Hub",
value="",
show=False,
required=True,
@@ -191,7 +191,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
repetition_penalty=repetition_penalty,
)
except Exception as e:
- msg = "Could not connect to HuggingFace Endpoints API."
+ msg = "Could not connect to Hugging Face Endpoints API."
raise ValueError(msg) from e
return llm
diff --git a/src/backend/base/langflow/components/huggingface/huggingface_inference_api.py b/src/backend/base/langflow/components/huggingface/huggingface_inference_api.py
index 3ccd9f55c..46ebb3cb6 100644
--- a/src/backend/base/langflow/components/huggingface/huggingface_inference_api.py
+++ b/src/backend/base/langflow/components/huggingface/huggingface_inference_api.py
@@ -13,8 +13,8 @@ from langflow.io import MessageTextInput, Output, SecretStrInput
class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
- display_name = "HuggingFace Embeddings Inference"
- description = "Generate embeddings using HuggingFace Text Embeddings Inference (TEI)"
+ display_name = "Hugging Face Embeddings Inference"
+ description = "Generate embeddings using Hugging Face Text Embeddings Inference (TEI)"
documentation = "https://huggingface.co/docs/text-embeddings-inference/index"
icon = "HuggingFace"
name = "HuggingFaceInferenceAPIEmbeddings"
@@ -66,7 +66,7 @@ class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
raise ValueError(msg) from e
if response.status_code != requests.codes.ok:
- msg = f"HuggingFace health check failed: {response.status_code}"
+ msg = f"Hugging Face health check failed: {response.status_code}"
raise ValueError(msg)
# returning True to solve linting error
return True
@@ -102,5 +102,5 @@ class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
try:
return self.create_huggingface_embeddings(api_key, api_url, self.model_name)
except Exception as e:
- msg = "Could not connect to HuggingFace Inference API."
+ msg = "Could not connect to Hugging Face Inference API."
raise ValueError(msg) from e
diff --git a/src/backend/base/langflow/components/langchain_utilities/character.py b/src/backend/base/langflow/components/langchain_utilities/character.py
index 2f075ebc8..c8f9ac0be 100644
--- a/src/backend/base/langflow/components/langchain_utilities/character.py
+++ b/src/backend/base/langflow/components/langchain_utilities/character.py
@@ -8,7 +8,7 @@ from langflow.utils.util import unescape_string
class CharacterTextSplitterComponent(LCTextSplitterComponent):
- display_name = "CharacterTextSplitter"
+ display_name = "Character Text Splitter"
description = "Split text by number of characters."
documentation = "https://docs.langflow.org/components/text-splitters#charactertextsplitter"
name = "CharacterTextSplitter"
diff --git a/src/backend/base/langflow/components/langchain_utilities/csv_agent.py b/src/backend/base/langflow/components/langchain_utilities/csv_agent.py
index 757829692..edc19cad8 100644
--- a/src/backend/base/langflow/components/langchain_utilities/csv_agent.py
+++ b/src/backend/base/langflow/components/langchain_utilities/csv_agent.py
@@ -14,7 +14,7 @@ from langflow.template.field.base import Output
class CSVAgentComponent(LCAgentComponent):
- display_name = "CSVAgent"
+ display_name = "CSV Agent"
description = "Construct a CSV agent from a CSV and tools."
documentation = "https://python.langchain.com/docs/modules/agents/toolkits/csv"
name = "CSVAgent"
diff --git a/src/backend/base/langflow/components/maritalk/maritalk.py b/src/backend/base/langflow/components/maritalk/maritalk.py
index 094f5f537..26877255d 100644
--- a/src/backend/base/langflow/components/maritalk/maritalk.py
+++ b/src/backend/base/langflow/components/maritalk/maritalk.py
@@ -7,8 +7,8 @@ from langflow.inputs.inputs import DropdownInput, FloatInput, IntInput, SecretSt
class MaritalkModelComponent(LCModelComponent):
- display_name = "Maritalk"
- description = "Generates text using Maritalk LLMs."
+ display_name = "MariTalk"
+ description = "Generates text using MariTalk LLMs."
icon = "Maritalk"
name = "Maritalk"
inputs = [
@@ -29,8 +29,8 @@ class MaritalkModelComponent(LCModelComponent):
),
SecretStrInput(
name="api_key",
- display_name="Maritalk API Key",
- info="The Maritalk API Key to use for the OpenAI model.",
+ display_name="MariTalk API Key",
+ info="The MariTalk API Key to use for authentication.",
advanced=False,
),
FloatInput(name="temperature", display_name="Temperature", value=0.1, range_spec=RangeSpec(min=0, max=1)),
diff --git a/src/backend/base/langflow/components/scrapegraph/scrapegraph_markdownify_api.py b/src/backend/base/langflow/components/scrapegraph/scrapegraph_markdownify_api.py
index 78d149735..872579f8a 100644
--- a/src/backend/base/langflow/components/scrapegraph/scrapegraph_markdownify_api.py
+++ b/src/backend/base/langflow/components/scrapegraph/scrapegraph_markdownify_api.py
@@ -8,14 +8,12 @@ from langflow.schema.data import Data
class ScrapeGraphMarkdownifyApi(Component):
- display_name: str = "ScrapeGraphMarkdownifyApi"
- description: str = """ScrapeGraph Markdownify API.
- Given a URL, it will return the markdownified content of the website.
- More info at https://docs.scrapegraphai.com/services/markdownify"""
+ display_name: str = "ScrapeGraph Markdownify API"
+ description: str = "Given a URL, it will return the markdownified content of the website."
name = "ScrapeGraphMarkdownifyApi"
output_types: list[str] = ["Document"]
- documentation: str = "https://docs.scrapegraphai.com/introduction"
+ documentation: str = "https://docs.scrapegraphai.com/services/markdownify"
inputs = [
SecretStrInput(
diff --git a/src/backend/base/langflow/components/scrapegraph/scrapegraph_search_api.py b/src/backend/base/langflow/components/scrapegraph/scrapegraph_search_api.py
index a24f339df..cd068e67b 100644
--- a/src/backend/base/langflow/components/scrapegraph/scrapegraph_search_api.py
+++ b/src/backend/base/langflow/components/scrapegraph/scrapegraph_search_api.py
@@ -8,13 +8,11 @@ from langflow.schema.data import Data
class ScrapeGraphSearchApi(Component):
- display_name: str = "ScrapeGraphSearchApi"
- description: str = """ScrapeGraph Search API.
- Given a search prompt, it will return search results using ScrapeGraph's search functionality.
- More info at https://docs.scrapegraphai.com/services/searchscraper"""
+ display_name: str = "ScrapeGraph Search API"
+ description: str = "Given a search prompt, it will return search results using ScrapeGraph's search functionality."
name = "ScrapeGraphSearchApi"
- documentation: str = "https://docs.scrapegraphai.com/introduction"
+ documentation: str = "https://docs.scrapegraphai.com/services/searchscraper"
icon = "ScrapeGraph"
inputs = [
diff --git a/src/backend/base/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py b/src/backend/base/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py
index 6e249381e..9f285a29c 100644
--- a/src/backend/base/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py
+++ b/src/backend/base/langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py
@@ -8,14 +8,12 @@ from langflow.schema.data import Data
class ScrapeGraphSmartScraperApi(Component):
- display_name: str = "ScrapeGraphSmartScraperApi"
- description: str = """ScrapeGraph Smart Scraper API.
- Given a URL, it will return the structured data of the website.
- More info at https://docs.scrapegraphai.com/services/smartscraper"""
+ display_name: str = "ScrapeGraph Smart Scraper API"
+ description: str = "Given a URL, it will return the structured data of the website."
name = "ScrapeGraphSmartScraperApi"
output_types: list[str] = ["Document"]
- documentation: str = "https://docs.scrapegraphai.com/introduction"
+ documentation: str = "https://docs.scrapegraphai.com/services/smartscraper"
inputs = [
SecretStrInput(
diff --git a/src/backend/base/langflow/components/searchapi/search.py b/src/backend/base/langflow/components/searchapi/search.py
index 2bdf15a0f..091643ddd 100644
--- a/src/backend/base/langflow/components/searchapi/search.py
+++ b/src/backend/base/langflow/components/searchapi/search.py
@@ -10,8 +10,8 @@ from langflow.schema.dataframe import DataFrame
class SearchComponent(Component):
- display_name: str = "Search API"
- description: str = "Call the searchapi.io API with result limiting"
+ display_name: str = "SearchApi"
+ description: str = "Calls the SearchApi API with result limiting. Supports Google, Bing and DuckDuckGo."
documentation: str = "https://www.searchapi.io/docs/google"
icon = "SearchAPI"
diff --git a/src/backend/base/langflow/components/serper/__init__.py b/src/backend/base/langflow/components/serper/__init__.py
new file mode 100644
index 000000000..d7779b8d7
--- /dev/null
+++ b/src/backend/base/langflow/components/serper/__init__.py
@@ -0,0 +1,3 @@
+from .google_serper_api_core import GoogleSerperAPICore
+
+__all__ = ["GoogleSerperAPICore"]
diff --git a/src/backend/base/langflow/components/serper/google_serper_api_core.py b/src/backend/base/langflow/components/serper/google_serper_api_core.py
new file mode 100644
index 000000000..cf86fd069
--- /dev/null
+++ b/src/backend/base/langflow/components/serper/google_serper_api_core.py
@@ -0,0 +1,74 @@
+from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
+
+from langflow.custom.custom_component.component import Component
+from langflow.io import IntInput, MultilineInput, Output, SecretStrInput
+from langflow.schema.dataframe import DataFrame
+from langflow.schema.message import Message
+
+
+class GoogleSerperAPICore(Component):
+ display_name = "Serper Google Search API"
+ description = "Calls the Serper.dev Google Search API and fetches the results."
+ icon = "Serper"
+
+ inputs = [
+ SecretStrInput(
+ name="serper_api_key",
+ display_name="Serper API Key",
+ required=True,
+ ),
+ MultilineInput(
+ name="input_value",
+ display_name="Input",
+ tool_mode=True,
+ ),
+ IntInput(
+ name="k",
+ display_name="Number of results",
+ value=4,
+ required=True,
+ ),
+ ]
+
+ outputs = [
+ Output(
+ display_name="Results",
+ name="results",
+ type_=DataFrame,
+ method="search_serper",
+ ),
+ ]
+
+ def search_serper(self) -> DataFrame:
+ try:
+ wrapper = self._build_wrapper()
+ results = wrapper.results(query=self.input_value)
+ list_results = results.get("organic", [])
+
+ # Convert results to DataFrame using list comprehension
+ df_data = [
+ {
+ "title": result.get("title", ""),
+ "link": result.get("link", ""),
+ "snippet": result.get("snippet", ""),
+ }
+ for result in list_results
+ ]
+
+ return DataFrame(df_data)
+ except (ValueError, KeyError, ConnectionError) as e:
+ error_message = f"Error occurred while searching: {e!s}"
+ self.status = error_message
+ # Return DataFrame with error as a list of dictionaries
+ return DataFrame([{"error": error_message}])
+
+ def text_search_serper(self) -> Message:
+ search_results = self.search_serper()
+ text_result = search_results.to_string(index=False) if not search_results.empty else "No results found."
+ return Message(text=text_result)
+
+ def _build_wrapper(self):
+ return GoogleSerperAPIWrapper(serper_api_key=self.serper_api_key, k=self.k)
+
+ def build(self):
+ return self.search_serper
diff --git a/src/backend/base/langflow/components/tools/yahoo_finance.py b/src/backend/base/langflow/components/tools/yahoo_finance.py
index 0fca70e94..aa604ea3d 100644
--- a/src/backend/base/langflow/components/tools/yahoo_finance.py
+++ b/src/backend/base/langflow/components/tools/yahoo_finance.py
@@ -49,9 +49,9 @@ class YahooFinanceSchema(BaseModel):
class YfinanceToolComponent(LCToolComponent):
- display_name = "Yahoo Finance [DEPRECATED]"
+ display_name = "Yahoo! Finance [DEPRECATED]"
description = """Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \
-to access financial data and market information from Yahoo Finance."""
+to access financial data and market information from Yahoo! Finance."""
icon = "trending-up"
name = "YahooFinanceTool"
legacy = True
@@ -87,7 +87,7 @@ to access financial data and market information from Yahoo Finance."""
def build_tool(self) -> Tool:
return StructuredTool.from_function(
name="yahoo_finance",
- description="Access financial data and market information from Yahoo Finance.",
+ description="Access financial data and market information from Yahoo! Finance.",
func=self._yahoo_finance_tool,
args_schema=YahooFinanceSchema,
)
diff --git a/src/backend/base/langflow/components/twelvelabs/convert_astra_results.py b/src/backend/base/langflow/components/twelvelabs/convert_astra_results.py
index a54f673f3..b92c69145 100644
--- a/src/backend/base/langflow/components/twelvelabs/convert_astra_results.py
+++ b/src/backend/base/langflow/components/twelvelabs/convert_astra_results.py
@@ -7,10 +7,10 @@ from langflow.schema.message import Message
class ConvertAstraToTwelveLabs(Component):
- """Convert AstraDB search results to TwelveLabs Pegasus inputs."""
+ """Convert Astra DB search results to TwelveLabs Pegasus inputs."""
- display_name = "Convert AstraDB to Pegasus Input"
- description = "Converts AstraDB search results to inputs compatible with TwelveLabs Pegasus."
+ display_name = "Convert Astra DB to Pegasus Input"
+ description = "Converts Astra DB search results to inputs compatible with TwelveLabs Pegasus."
icon = "TwelveLabs"
name = "ConvertAstraToTwelveLabs"
documentation = "https://github.com/twelvelabs-io/twelvelabs-developer-experience/blob/main/integrations/Langflow/TWELVE_LABS_COMPONENTS_README.md"
@@ -18,9 +18,9 @@ class ConvertAstraToTwelveLabs(Component):
inputs = [
HandleInput(
name="astra_results",
- display_name="AstraDB Results",
+ display_name="Astra DB Results",
input_types=["Data"],
- info="Search results from AstraDB component",
+ info="Search results from Astra DB component",
required=True,
is_list=True,
)
@@ -47,7 +47,7 @@ class ConvertAstraToTwelveLabs(Component):
self._index_id = None
def build(self, **kwargs: Any) -> None: # noqa: ARG002 - Required for parent class compatibility
- """Process the AstraDB results and extract TwelveLabs index information."""
+ """Process the Astra DB results and extract TwelveLabs index information."""
if not self.astra_results:
return
diff --git a/src/backend/base/langflow/components/twelvelabs/pegasus_index.py b/src/backend/base/langflow/components/twelvelabs/pegasus_index.py
index c5552e9c2..5c814afbf 100644
--- a/src/backend/base/langflow/components/twelvelabs/pegasus_index.py
+++ b/src/backend/base/langflow/components/twelvelabs/pegasus_index.py
@@ -13,7 +13,7 @@ from langflow.schema import Data
class TwelveLabsError(Exception):
- """Base exception for Twelve Labs errors."""
+ """Base exception for TwelveLabs errors."""
class IndexCreationError(TwelveLabsError):
@@ -29,10 +29,10 @@ class TaskTimeoutError(TwelveLabsError):
class PegasusIndexVideo(Component):
- """Indexes videos using Twelve Labs Pegasus API and adds the video ID to metadata."""
+ """Indexes videos using TwelveLabs Pegasus API and adds the video ID to metadata."""
- display_name = "Twelve Labs Pegasus Index Video"
- description = "Index videos using Twelve Labs and add the video_id to metadata."
+ display_name = "TwelveLabs Pegasus Index Video"
+ description = "Index videos using TwelveLabs and add the video_id to metadata."
icon = "TwelveLabs"
name = "TwelveLabsPegasusIndexVideo"
documentation = "https://github.com/twelvelabs-io/twelvelabs-developer-experience/blob/main/integrations/Langflow/TWELVE_LABS_COMPONENTS_README.md"
@@ -46,7 +46,7 @@ class PegasusIndexVideo(Component):
required=True,
),
SecretStrInput(
- name="api_key", display_name="Twelve Labs API Key", info="Enter your Twelve Labs API Key.", required=True
+ name="api_key", display_name="TwelveLabs API Key", info="Enter your TwelveLabs API Key.", required=True
),
DropdownInput(
name="model_name",
@@ -215,7 +215,7 @@ class PegasusIndexVideo(Component):
return []
if not self.api_key:
- error_msg = "Twelve Labs API Key is required"
+ error_msg = "TwelveLabs API Key is required"
raise IndexCreationError(error_msg)
if not (hasattr(self, "index_name") and self.index_name) and not (hasattr(self, "index_id") and self.index_id):
@@ -230,7 +230,7 @@ class PegasusIndexVideo(Component):
index_id, index_name = self._get_or_create_index(client)
self.status = f"Using index: {index_name} (ID: {index_id})"
except IndexCreationError as e:
- self.status = f"Failed to get/create Twelve Labs index: {e!s}"
+ self.status = f"Failed to get/create TwelveLabs index: {e!s}"
raise
# First, validate all videos and create a list of valid ones
diff --git a/src/backend/base/langflow/components/twelvelabs/text_embeddings.py b/src/backend/base/langflow/components/twelvelabs/text_embeddings.py
index 40668346d..72d3f10e2 100644
--- a/src/backend/base/langflow/components/twelvelabs/text_embeddings.py
+++ b/src/backend/base/langflow/components/twelvelabs/text_embeddings.py
@@ -34,14 +34,14 @@ class TwelveLabsTextEmbeddings(Embeddings):
class TwelveLabsTextEmbeddingsComponent(LCEmbeddingsModel):
- display_name = "Twelve Labs Text Embeddings"
- description = "Generate embeddings using Twelve Labs text embedding models."
+ display_name = "TwelveLabs Text Embeddings"
+ description = "Generate embeddings using TwelveLabs text embedding models."
icon = "TwelveLabs"
name = "TwelveLabsTextEmbeddings"
documentation = "https://github.com/twelvelabs-io/twelvelabs-developer-experience/blob/main/integrations/Langflow/TWELVE_LABS_COMPONENTS_README.md"
inputs = [
- SecretStrInput(name="api_key", display_name="Twelve Labs API Key", value="TWELVELABS_API_KEY", required=True),
+ SecretStrInput(name="api_key", display_name="TwelveLabs API Key", value="TWELVELABS_API_KEY", required=True),
DropdownInput(
name="model",
display_name="Model",
diff --git a/src/backend/base/langflow/components/twelvelabs/twelvelabs_pegasus.py b/src/backend/base/langflow/components/twelvelabs/twelvelabs_pegasus.py
index 04818e349..efdfb3768 100644
--- a/src/backend/base/langflow/components/twelvelabs/twelvelabs_pegasus.py
+++ b/src/backend/base/langflow/components/twelvelabs/twelvelabs_pegasus.py
@@ -35,8 +35,8 @@ class VideoValidationError(Exception):
class TwelveLabsPegasus(Component):
- display_name = "Twelve Labs Pegasus"
- description = "Chat with videos using Twelve Labs Pegasus API."
+ display_name = "TwelveLabs Pegasus"
+ description = "Chat with videos using TwelveLabs Pegasus API."
icon = "TwelveLabs"
name = "TwelveLabsPegasus"
documentation = "https://github.com/twelvelabs-io/twelvelabs-developer-experience/blob/main/integrations/Langflow/TWELVE_LABS_COMPONENTS_README.md"
@@ -44,7 +44,7 @@ class TwelveLabsPegasus(Component):
inputs = [
DataInput(name="videodata", display_name="Video Data", info="Video Data", is_list=True),
SecretStrInput(
- name="api_key", display_name="Twelve Labs API Key", info="Enter your Twelve Labs API Key.", required=True
+ name="api_key", display_name="TwelveLabs API Key", info="Enter your TwelveLabs API Key.", required=True
),
MessageInput(
name="video_id",
@@ -306,7 +306,7 @@ class TwelveLabsPegasus(Component):
def process_video(self) -> Message:
"""Process video using Pegasus and generate response if message is provided.
- Handles video indexing and question answering using the Twelve Labs API.
+ Handles video indexing and question answering using the TwelveLabs API.
"""
# Check and initialize inputs
if hasattr(self, "index_id") and self.index_id:
diff --git a/src/backend/base/langflow/components/twelvelabs/video_embeddings.py b/src/backend/base/langflow/components/twelvelabs/video_embeddings.py
index af7e25997..fd86698ba 100644
--- a/src/backend/base/langflow/components/twelvelabs/video_embeddings.py
+++ b/src/backend/base/langflow/components/twelvelabs/video_embeddings.py
@@ -79,8 +79,8 @@ class TwelveLabsVideoEmbeddings(Embeddings):
class TwelveLabsVideoEmbeddingsComponent(LCEmbeddingsModel):
- display_name = "Twelve Labs Video Embeddings"
- description = "Generate embeddings from videos using Twelve Labs video embedding models."
+ display_name = "TwelveLabs Video Embeddings"
+ description = "Generate embeddings from videos using TwelveLabs video embedding models."
name = "TwelveLabsVideoEmbeddings"
icon = "TwelveLabs"
documentation = "https://github.com/twelvelabs-io/twelvelabs-developer-experience/blob/main/integrations/Langflow/TWELVE_LABS_COMPONENTS_README.md"
diff --git a/src/backend/base/langflow/components/vectorstores/cassandra.py b/src/backend/base/langflow/components/vectorstores/cassandra.py
index 4dc86b7f6..464df97ca 100644
--- a/src/backend/base/langflow/components/vectorstores/cassandra.py
+++ b/src/backend/base/langflow/components/vectorstores/cassandra.py
@@ -24,28 +24,28 @@ class CassandraVectorStoreComponent(LCVectorStoreComponent):
MessageTextInput(
name="database_ref",
display_name="Contact Points / Astra Database ID",
- info="Contact points for the database (or AstraDB database ID)",
+ info="Contact points for the database (or Astra DB database ID)",
required=True,
),
MessageTextInput(
- name="username", display_name="Username", info="Username for the database (leave empty for AstraDB)."
+ name="username", display_name="Username", info="Username for the database (leave empty for Astra DB)."
),
SecretStrInput(
name="token",
- display_name="Password / AstraDB Token",
- info="User password for the database (or AstraDB token).",
+ display_name="Password / Astra DB Token",
+ info="User password for the database (or Astra DB token).",
required=True,
),
MessageTextInput(
name="keyspace",
display_name="Keyspace",
- info="Table Keyspace (or AstraDB namespace).",
+ info="Table Keyspace (or Astra DB namespace).",
required=True,
),
MessageTextInput(
name="table_name",
display_name="Table Name",
- info="The name of the table (or AstraDB collection) where vectors will be stored.",
+ info="The name of the table (or Astra DB collection) where vectors will be stored.",
required=True,
),
IntInput(
diff --git a/src/backend/base/langflow/components/vectorstores/cassandra_graph.py b/src/backend/base/langflow/components/vectorstores/cassandra_graph.py
index 6183c1835..aa7f90e42 100644
--- a/src/backend/base/langflow/components/vectorstores/cassandra_graph.py
+++ b/src/backend/base/langflow/components/vectorstores/cassandra_graph.py
@@ -25,28 +25,28 @@ class CassandraGraphVectorStoreComponent(LCVectorStoreComponent):
MessageTextInput(
name="database_ref",
display_name="Contact Points / Astra Database ID",
- info="Contact points for the database (or AstraDB database ID)",
+ info="Contact points for the database (or Astra DB database ID)",
required=True,
),
MessageTextInput(
- name="username", display_name="Username", info="Username for the database (leave empty for AstraDB)."
+ name="username", display_name="Username", info="Username for the database (leave empty for Astra DB)."
),
SecretStrInput(
name="token",
- display_name="Password / AstraDB Token",
- info="User password for the database (or AstraDB token).",
+ display_name="Password / Astra DB Token",
+ info="User password for the database (or Astra DB token).",
required=True,
),
MessageTextInput(
name="keyspace",
display_name="Keyspace",
- info="Table Keyspace (or AstraDB namespace).",
+ info="Table Keyspace (or Astra DB namespace).",
required=True,
),
MessageTextInput(
name="table_name",
display_name="Table Name",
- info="The name of the table (or AstraDB collection) where vectors will be stored.",
+ info="The name of the table (or Astra DB collection) where vectors will be stored.",
required=True,
),
DropdownInput(
diff --git a/src/backend/base/langflow/components/vertexai/vertexai_embeddings.py b/src/backend/base/langflow/components/vertexai/vertexai_embeddings.py
index 026dd5d41..60655b2de 100644
--- a/src/backend/base/langflow/components/vertexai/vertexai_embeddings.py
+++ b/src/backend/base/langflow/components/vertexai/vertexai_embeddings.py
@@ -4,8 +4,8 @@ from langflow.io import BoolInput, FileInput, FloatInput, IntInput, MessageTextI
class VertexAIEmbeddingsComponent(LCModelComponent):
- display_name = "VertexAI Embeddings"
- description = "Generate embeddings using Google Cloud VertexAI models."
+ display_name = "Vertex AI Embeddings"
+ description = "Generate embeddings using Google Cloud Vertex AI models."
icon = "VertexAI"
name = "VertexAIEmbeddings"
diff --git a/src/backend/base/langflow/components/wolframalpha/wolfram_alpha_api.py b/src/backend/base/langflow/components/wolframalpha/wolfram_alpha_api.py
index 34482b020..61e1e8ada 100644
--- a/src/backend/base/langflow/components/wolframalpha/wolfram_alpha_api.py
+++ b/src/backend/base/langflow/components/wolframalpha/wolfram_alpha_api.py
@@ -10,7 +10,7 @@ from langflow.schema.dataframe import DataFrame
class WolframAlphaAPIComponent(LCToolComponent):
display_name = "WolframAlpha API"
- description = """Enables queries to Wolfram Alpha for computational data, facts, and calculations across various \
+ description = """Enables queries to WolframAlpha for computational data, facts, and calculations across various \
topics, delivering structured responses."""
name = "WolframAlphaAPI"
@@ -45,7 +45,7 @@ topics, delivering structured responses."""
return data
def fetch_content_dataframe(self) -> DataFrame:
- """Convert the Wolfram Alpha results to a DataFrame.
+ """Convert the WolframAlpha results to a DataFrame.
Returns:
DataFrame: A DataFrame containing the query results.
diff --git a/src/backend/base/langflow/components/yahoosearch/yahoo.py b/src/backend/base/langflow/components/yahoosearch/yahoo.py
index 09824ca1f..1ac54302f 100644
--- a/src/backend/base/langflow/components/yahoosearch/yahoo.py
+++ b/src/backend/base/langflow/components/yahoosearch/yahoo.py
@@ -49,9 +49,9 @@ class YahooFinanceSchema(BaseModel):
class YfinanceComponent(Component):
- display_name = "Yahoo Finance"
+ display_name = "Yahoo! Finance"
description = """Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \
-to access financial data and market information from Yahoo Finance."""
+to access financial data and market information from Yahoo! Finance."""
icon = "trending-up"
inputs = [
diff --git a/src/backend/base/langflow/components/youtube/playlist.py b/src/backend/base/langflow/components/youtube/playlist.py
index 9d0866766..5cb453741 100644
--- a/src/backend/base/langflow/components/youtube/playlist.py
+++ b/src/backend/base/langflow/components/youtube/playlist.py
@@ -8,7 +8,7 @@ from langflow.template.field.base import Output
class YouTubePlaylistComponent(Component):
- display_name = "Youtube Playlist"
+ display_name = "YouTube Playlist"
description = "Extracts all video URLs from a YouTube playlist."
icon = "YouTube" # Replace with a suitable icon
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Search agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Search agent.json
index c979d3d3f..e4e82039b 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Search agent.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Search agent.json
@@ -90,7 +90,7 @@
"beta": false,
"conditional_paths": [],
"custom_fields": {},
- "description": "ScrapeGraph Search API.\n Given a search prompt, it will return search results using ScrapeGraph's search functionality.\n More info at https://docs.scrapegraphai.com/services/searchscraper",
+ "description": "Given a search prompt, it will return search results using ScrapeGraph's search functionality.",
"display_name": "ScrapeGraphSearchApi",
"documentation": "https://docs.scrapegraphai.com/introduction",
"edited": false,
@@ -103,7 +103,7 @@
"legacy": false,
"lf_version": "1.1.5",
"metadata": {
- "code_hash": "cdea312e9de9",
+ "code_hash": "99b8b89dc4ca",
"module": "langflow.components.scrapegraph.scrapegraph_search_api.ScrapeGraphSearchApi"
},
"minimized": false,
@@ -163,7 +163,7 @@
"show": true,
"title_case": false,
"type": "code",
- "value": "from langflow.custom.custom_component.component import Component\nfrom langflow.io import (\n MessageTextInput,\n Output,\n SecretStrInput,\n)\nfrom langflow.schema.data import Data\n\n\nclass ScrapeGraphSearchApi(Component):\n display_name: str = \"ScrapeGraphSearchApi\"\n description: str = \"\"\"ScrapeGraph Search API.\n Given a search prompt, it will return search results using ScrapeGraph's search functionality.\n More info at https://docs.scrapegraphai.com/services/searchscraper\"\"\"\n name = \"ScrapeGraphSearchApi\"\n\n documentation: str = \"https://docs.scrapegraphai.com/introduction\"\n icon = \"ScrapeGraph\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"ScrapeGraph API Key\",\n required=True,\n password=True,\n info=\"The API key to use ScrapeGraph API.\",\n ),\n MessageTextInput(\n name=\"user_prompt\",\n display_name=\"Search Prompt\",\n tool_mode=True,\n info=\"The search prompt to use.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"search\"),\n ]\n\n def search(self) -> list[Data]:\n try:\n from scrapegraph_py import Client\n from scrapegraph_py.logger import sgai_logger\n except ImportError as e:\n msg = \"Could not import scrapegraph-py package. Please install it with `pip install scrapegraph-py`.\"\n raise ImportError(msg) from e\n\n # Set logging level\n sgai_logger.set_logging(level=\"INFO\")\n\n # Initialize the client with API key\n sgai_client = Client(api_key=self.api_key)\n\n try:\n # SearchScraper request\n response = sgai_client.searchscraper(\n user_prompt=self.user_prompt,\n )\n\n # Close the client\n sgai_client.close()\n\n return Data(data=response)\n except Exception:\n sgai_client.close()\n raise\n"
+ "value": "from langflow.custom.custom_component.component import Component\nfrom langflow.io import (\n MessageTextInput,\n Output,\n SecretStrInput,\n)\nfrom langflow.schema.data import Data\n\n\nclass ScrapeGraphSearchApi(Component):\n display_name: str = \"ScrapeGraph Search API\"\n description: str = \"Given a search prompt, it will return search results using ScrapeGraph's search functionality.\"\n name = \"ScrapeGraphSearchApi\"\n\n documentation: str = \"https://docs.scrapegraphai.com/services/searchscraper\"\n icon = \"ScrapeGraph\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"ScrapeGraph API Key\",\n required=True,\n password=True,\n info=\"The API key to use ScrapeGraph API.\",\n ),\n MessageTextInput(\n name=\"user_prompt\",\n display_name=\"Search Prompt\",\n tool_mode=True,\n info=\"The search prompt to use.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"search\"),\n ]\n\n def search(self) -> list[Data]:\n try:\n from scrapegraph_py import Client\n from scrapegraph_py.logger import sgai_logger\n except ImportError as e:\n msg = \"Could not import scrapegraph-py package. Please install it with `pip install scrapegraph-py`.\"\n raise ImportError(msg) from e\n\n # Set logging level\n sgai_logger.set_logging(level=\"INFO\")\n\n # Initialize the client with API key\n sgai_client = Client(api_key=self.api_key)\n\n try:\n # SearchScraper request\n response = sgai_client.searchscraper(\n user_prompt=self.user_prompt,\n )\n\n # Close the client\n sgai_client.close()\n\n return Data(data=response)\n except Exception:\n sgai_client.close()\n raise\n"
},
"tools_metadata": {
"_input_type": "ToolsInput",
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json
index 694bbcc4a..d7c4aa7fd 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json
@@ -9,16 +9,12 @@
"dataType": "Prompt",
"id": "Prompt-WvveL",
"name": "prompt",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "system_prompt",
"id": "Agent-X1iAT",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -37,16 +33,12 @@
"dataType": "Prompt",
"id": "Prompt-6JL4E",
"name": "prompt",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "system_prompt",
"id": "Agent-EQcU8",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -65,17 +57,12 @@
"dataType": "Agent",
"id": "Agent-EQcU8",
"name": "response",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "finance_agent_output",
"id": "Prompt-WvveL",
- "inputTypes": [
- "Message",
- "Text"
- ],
+ "inputTypes": ["Message", "Text"],
"type": "str"
}
},
@@ -94,16 +81,12 @@
"dataType": "ChatInput",
"id": "ChatInput-NuUHZ",
"name": "message",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "input_value",
"id": "Agent-b7nmW",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -122,16 +105,12 @@
"dataType": "Prompt",
"id": "Prompt-ajhmq",
"name": "prompt",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "system_prompt",
"id": "Agent-b7nmW",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -150,16 +129,12 @@
"dataType": "Agent",
"id": "Agent-b7nmW",
"name": "response",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "input_value",
"id": "Agent-EQcU8",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -178,17 +153,12 @@
"dataType": "Agent",
"id": "Agent-b7nmW",
"name": "response",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "research_agent_output",
"id": "Prompt-WvveL",
- "inputTypes": [
- "Message",
- "Text"
- ],
+ "inputTypes": ["Message", "Text"],
"type": "str"
}
},
@@ -207,16 +177,12 @@
"dataType": "CalculatorComponent",
"id": "CalculatorComponent-0P2yI",
"name": "component_as_tool",
- "output_types": [
- "Tool"
- ]
+ "output_types": ["Tool"]
},
"targetHandle": {
"fieldName": "tools",
"id": "Agent-X1iAT",
- "inputTypes": [
- "Tool"
- ],
+ "inputTypes": ["Tool"],
"type": "other"
}
},
@@ -235,16 +201,12 @@
"dataType": "YfinanceComponent",
"id": "YfinanceComponent-hAneS",
"name": "component_as_tool",
- "output_types": [
- "Tool"
- ]
+ "output_types": ["Tool"]
},
"targetHandle": {
"fieldName": "tools",
"id": "Agent-EQcU8",
- "inputTypes": [
- "Tool"
- ],
+ "inputTypes": ["Tool"],
"type": "other"
}
},
@@ -263,16 +225,12 @@
"dataType": "TavilySearchComponent",
"id": "TavilySearchComponent-DTUmi",
"name": "component_as_tool",
- "output_types": [
- "Tool"
- ]
+ "output_types": ["Tool"]
},
"targetHandle": {
"fieldName": "tools",
"id": "Agent-b7nmW",
- "inputTypes": [
- "Tool"
- ],
+ "inputTypes": ["Tool"],
"type": "other"
}
},
@@ -291,18 +249,12 @@
"dataType": "Agent",
"id": "Agent-X1iAT",
"name": "response",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-gbqPo",
- "inputTypes": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "inputTypes": ["Data", "DataFrame", "Message"],
"type": "other"
}
},
@@ -321,9 +273,7 @@
"display_name": "Finance Agent",
"id": "Agent-EQcU8",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -372,9 +322,7 @@
"required_inputs": null,
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -406,9 +354,7 @@
"display_name": "Agent Description [Deprecated]",
"dynamic": false,
"info": "The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -529,9 +475,7 @@
"display_name": "Input",
"dynamic": false,
"info": "The input provided by the user for the agent to process.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -739,9 +683,7 @@
"display_name": "Agent Instructions",
"dynamic": false,
"info": "System Prompt: Initial instructions and context provided to guide the agent's behavior.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -809,9 +751,7 @@
"display_name": "Tools",
"dynamic": false,
"info": "These are the tools that the agent can use to help with tasks.",
- "input_types": [
- "Tool"
- ],
+ "input_types": ["Tool"],
"list": true,
"list_add_label": "Add More",
"name": "tools",
@@ -872,9 +812,7 @@
"display_name": "Analysis & Editor Agent",
"id": "Agent-X1iAT",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -923,9 +861,7 @@
"required_inputs": null,
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -957,9 +893,7 @@
"display_name": "Agent Description [Deprecated]",
"dynamic": false,
"info": "The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1080,9 +1014,7 @@
"display_name": "Input",
"dynamic": false,
"info": "The input provided by the user for the agent to process.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1290,9 +1222,7 @@
"display_name": "Agent Instructions",
"dynamic": false,
"info": "System Prompt: Initial instructions and context provided to guide the agent's behavior.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1360,9 +1290,7 @@
"display_name": "Tools",
"dynamic": false,
"info": "These are the tools that the agent can use to help with tasks.",
- "input_types": [
- "Tool"
- ],
+ "input_types": ["Tool"],
"list": true,
"list_add_label": "Add More",
"name": "tools",
@@ -1423,9 +1351,7 @@
"display_name": "Prompt",
"id": "Prompt-ajhmq",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {
@@ -1436,9 +1362,7 @@
"documentation": "",
"edited": false,
"error": null,
- "field_order": [
- "template"
- ],
+ "field_order": ["template"],
"frozen": false,
"full_path": null,
"icon": "braces",
@@ -1463,9 +1387,7 @@
"name": "prompt",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1514,9 +1436,7 @@
"display_name": "Tool Placeholder",
"dynamic": false,
"info": "A placeholder input for tool mode.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "tool_placeholder",
@@ -1561,9 +1481,7 @@
"display_name": "Prompt",
"id": "Prompt-6JL4E",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {
@@ -1574,9 +1492,7 @@
"documentation": "",
"edited": false,
"error": null,
- "field_order": [
- "template"
- ],
+ "field_order": ["template"],
"frozen": false,
"full_path": null,
"icon": "braces",
@@ -1601,9 +1517,7 @@
"name": "prompt",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1644,7 +1558,7 @@
"tool_mode": false,
"trace_as_input": true,
"type": "prompt",
- "value": "# Financial Analysis Expert Protocol\n\nYou are an elite financial analyst with access to Yahoo Finance tools. Your role is to perform comprehensive financial analysis based on the research provided and the data available through Yahoo Finance methods.\n\n## CRITICAL: Stock Symbol Usage\n- Always use correct stock ticker symbols in UPPERCASE format\n- Examples of valid symbols:\n * AAPL (Apple Inc.)\n * MSFT (Microsoft)\n * NVDA (NVIDIA)\n * GOOGL (Alphabet/Google)\n * TSLA (Tesla)\n- Invalid formats to avoid:\n * ❌ Apple (company name instead of symbol)\n * ❌ aapl (lowercase)\n * ❌ $AAPL (with dollar sign)\n * ❌ AAPL.US (with extension)\n\n## Data Collection Strategy\n\n1. Initial Symbol Verification\n - Confirm valid stock symbol format before any analysis\n - Use get_info first to verify symbol validity\n - Cross-reference with get_fast_info to ensure data availability\n - If symbol is invalid, immediately report the error\n\n2. Core Company Analysis\n - Get basic info (get_info): Full company details\n - Fast metrics (get_fast_info): Quick market data\n - Earnings data (get_earnings): Performance history\n - Calendar events (get_calendar): Upcoming events\n\n3. Financial Statement Analysis\n - Income statements (get_income_stmt)\n - Balance sheets (get_balance_sheet)\n - Cash flow statements (get_cashflow)\n\n4. Market Intelligence\n - Latest recommendations (get_recommendations)\n - Recommendation trends (get_recommendations_summary)\n - Recent rating changes (get_upgrades_downgrades)\n - Breaking news (get_news, specify number of articles needed)\n\n5. Ownership Structure\n - Institutional holdings (get_institutional_holders)\n - Major stakeholders (get_major_holders)\n - Fund ownership (get_mutualfund_holders)\n - Insider activity:\n * Recent purchases (get_insider_purchases)\n * Transaction history (get_insider_transactions)\n * Insider roster (get_insider_roster_holders)\n\n6. Historical Patterns\n - Corporate actions (get_actions)\n - Dividend history (get_dividends)\n - Split history (get_splits)\n - Capital gains (get_capital_gains)\n - Regulatory filings (get_sec_filings)\n - ESG metrics (get_sustainability)\n\n## Analysis Framework\n\n1. Profitability Metrics\n - Revenue trends\n - Margin analysis\n - Efficiency ratios\n - Return metrics\n\n2. Financial Health\n - Liquidity ratios\n - Debt analysis\n - Working capital\n - Cash flow quality\n\n3. Growth Assessment\n - Historical rates\n - Future projections\n - Market opportunity\n - Expansion plans\n\n4. Risk Evaluation\n - Financial risks\n - Market position\n - Operational challenges\n - Competitive threats\n\n## Output Structure\n\n### Symbol Information\n[Confirm stock symbol and basic company information]\n\n### Financial Overview\n[Key metrics summary with actual numbers]\n\n### Profitability Analysis\n[Detailed profit metrics with comparisons]\n\n### Balance Sheet Review\n[Asset and liability analysis]\n\n### Cash Flow Assessment\n[Cash generation and usage patterns]\n\n### Market Sentiment\n[Analyst views and institutional activity]\n\n### Growth Analysis\n[Historical and projected growth]\n\n### Risk Factors\n[Comprehensive risk assessment]\n\nRemember to:\n- ALWAYS verify stock symbol validity first\n- Use exact numbers from the data\n- Compare with industry standards\n- Highlight significant trends\n- Flag data anomalies\n- Identify key risks\n- Provide metric context\n- Focus on material information\n\nPass your comprehensive financial analysis to the Analysis & Editor Agent for final synthesis and recommendations. Include any invalid symbol errors or data availability issues in your report."
+ "value": "# Financial Analysis Expert Protocol\n\nYou are an elite financial analyst with access to Yahoo! Finance tools. Your role is to perform comprehensive financial analysis based on the research provided and the data available through Yahoo! Finance methods.\n\n## CRITICAL: Stock Symbol Usage\n- Always use correct stock ticker symbols in UPPERCASE format\n- Examples of valid symbols:\n * AAPL (Apple Inc.)\n * MSFT (Microsoft)\n * NVDA (NVIDIA)\n * GOOGL (Alphabet/Google)\n * TSLA (Tesla)\n- Invalid formats to avoid:\n * ❌ Apple (company name instead of symbol)\n * ❌ aapl (lowercase)\n * ❌ $AAPL (with dollar sign)\n * ❌ AAPL.US (with extension)\n\n## Data Collection Strategy\n\n1. Initial Symbol Verification\n - Confirm valid stock symbol format before any analysis\n - Use get_info first to verify symbol validity\n - Cross-reference with get_fast_info to ensure data availability\n - If symbol is invalid, immediately report the error\n\n2. Core Company Analysis\n - Get basic info (get_info): Full company details\n - Fast metrics (get_fast_info): Quick market data\n - Earnings data (get_earnings): Performance history\n - Calendar events (get_calendar): Upcoming events\n\n3. Financial Statement Analysis\n - Income statements (get_income_stmt)\n - Balance sheets (get_balance_sheet)\n - Cash flow statements (get_cashflow)\n\n4. Market Intelligence\n - Latest recommendations (get_recommendations)\n - Recommendation trends (get_recommendations_summary)\n - Recent rating changes (get_upgrades_downgrades)\n - Breaking news (get_news, specify number of articles needed)\n\n5. Ownership Structure\n - Institutional holdings (get_institutional_holders)\n - Major stakeholders (get_major_holders)\n - Fund ownership (get_mutualfund_holders)\n - Insider activity:\n * Recent purchases (get_insider_purchases)\n * Transaction history (get_insider_transactions)\n * Insider roster (get_insider_roster_holders)\n\n6. Historical Patterns\n - Corporate actions (get_actions)\n - Dividend history (get_dividends)\n - Split history (get_splits)\n - Capital gains (get_capital_gains)\n - Regulatory filings (get_sec_filings)\n - ESG metrics (get_sustainability)\n\n## Analysis Framework\n\n1. Profitability Metrics\n - Revenue trends\n - Margin analysis\n - Efficiency ratios\n - Return metrics\n\n2. Financial Health\n - Liquidity ratios\n - Debt analysis\n - Working capital\n - Cash flow quality\n\n3. Growth Assessment\n - Historical rates\n - Future projections\n - Market opportunity\n - Expansion plans\n\n4. Risk Evaluation\n - Financial risks\n - Market position\n - Operational challenges\n - Competitive threats\n\n## Output Structure\n\n### Symbol Information\n[Confirm stock symbol and basic company information]\n\n### Financial Overview\n[Key metrics summary with actual numbers]\n\n### Profitability Analysis\n[Detailed profit metrics with comparisons]\n\n### Balance Sheet Review\n[Asset and liability analysis]\n\n### Cash Flow Assessment\n[Cash generation and usage patterns]\n\n### Market Sentiment\n[Analyst views and institutional activity]\n\n### Growth Analysis\n[Historical and projected growth]\n\n### Risk Factors\n[Comprehensive risk assessment]\n\nRemember to:\n- ALWAYS verify stock symbol validity first\n- Use exact numbers from the data\n- Compare with industry standards\n- Highlight significant trends\n- Flag data anomalies\n- Identify key risks\n- Provide metric context\n- Focus on material information\n\nPass your comprehensive financial analysis to the Analysis & Editor Agent for final synthesis and recommendations. Include any invalid symbol errors or data availability issues in your report."
},
"tool_placeholder": {
"_input_type": "MessageTextInput",
@@ -1652,9 +1566,7 @@
"display_name": "Tool Placeholder",
"dynamic": false,
"info": "A placeholder input for tool mode.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "tool_placeholder",
@@ -1699,25 +1611,18 @@
"display_name": "Prompt",
"id": "Prompt-WvveL",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {
- "template": [
- "research_agent_output",
- "finance_agent_output"
- ]
+ "template": ["research_agent_output", "finance_agent_output"]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
"documentation": "",
"edited": false,
"error": null,
- "field_order": [
- "template"
- ],
+ "field_order": ["template"],
"frozen": false,
"full_path": null,
"icon": "braces",
@@ -1742,9 +1647,7 @@
"name": "prompt",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1777,10 +1680,7 @@
"fileTypes": [],
"file_path": "",
"info": "",
- "input_types": [
- "Message",
- "Text"
- ],
+ "input_types": ["Message", "Text"],
"list": false,
"load_from_db": false,
"multiline": true,
@@ -1800,10 +1700,7 @@
"fileTypes": [],
"file_path": "",
"info": "",
- "input_types": [
- "Message",
- "Text"
- ],
+ "input_types": ["Message", "Text"],
"list": false,
"load_from_db": false,
"multiline": true,
@@ -1839,9 +1736,7 @@
"display_name": "Tool Placeholder",
"dynamic": false,
"info": "A placeholder input for tool mode.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "tool_placeholder",
@@ -1884,9 +1779,7 @@
"data": {
"id": "ChatInput-NuUHZ",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -1924,9 +1817,7 @@
"name": "message",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1939,9 +1830,7 @@
"display_name": "Background Color",
"dynamic": false,
"info": "The background color of the icon.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "background_color",
@@ -1961,9 +1850,7 @@
"display_name": "Icon",
"dynamic": false,
"info": "The icon of the message.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "chat_icon",
@@ -2067,10 +1954,7 @@
"dynamic": false,
"info": "Type of sender.",
"name": "sender",
- "options": [
- "Machine",
- "User"
- ],
+ "options": ["Machine", "User"],
"placeholder": "",
"required": false,
"show": true,
@@ -2086,9 +1970,7 @@
"display_name": "Sender Name",
"dynamic": false,
"info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "sender_name",
@@ -2108,9 +1990,7 @@
"display_name": "Session ID",
"dynamic": false,
"info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "session_id",
@@ -2146,9 +2026,7 @@
"display_name": "Text Color",
"dynamic": false,
"info": "The text color of the name",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"name": "text_color",
@@ -2228,9 +2106,7 @@
"display_name": "Researcher Agent",
"id": "Agent-b7nmW",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -2279,9 +2155,7 @@
"required_inputs": null,
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -2313,9 +2187,7 @@
"display_name": "Agent Description [Deprecated]",
"dynamic": false,
"info": "The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2436,9 +2308,7 @@
"display_name": "Input",
"dynamic": false,
"info": "The input provided by the user for the agent to process.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2646,9 +2516,7 @@
"display_name": "Agent Instructions",
"dynamic": false,
"info": "System Prompt: Initial instructions and context provided to guide the agent's behavior.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2716,9 +2584,7 @@
"display_name": "Tools",
"dynamic": false,
"info": "These are the tools that the agent can use to help with tasks.",
- "input_types": [
- "Tool"
- ],
+ "input_types": ["Tool"],
"list": true,
"list_add_label": "Add More",
"name": "tools",
@@ -2775,32 +2641,24 @@
},
{
"data": {
- "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo Finance.",
- "display_name": "Yahoo Finance",
+ "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo! Finance.",
+ "display_name": "Yahoo! Finance",
"id": "YfinanceComponent-hAneS",
"node": {
- "base_classes": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "base_classes": ["Data", "DataFrame", "Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
- "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo Finance.",
- "display_name": "Yahoo Finance",
+ "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo! Finance.",
+ "display_name": "Yahoo! Finance",
"documentation": "",
"edited": false,
- "field_order": [
- "symbol",
- "method",
- "num_news"
- ],
+ "field_order": ["symbol", "method", "num_news"],
"frozen": false,
"icon": "trending-up",
"legacy": false,
"metadata": {
- "code_hash": "e17c98e16912",
+ "code_hash": "436519c08bd4",
"module": "langflow.components.yahoosearch.yahoo.YfinanceComponent"
},
"minimized": false,
@@ -2818,9 +2676,7 @@
"required_inputs": null,
"selected": "Tool",
"tool_mode": true,
- "types": [
- "Tool"
- ],
+ "types": ["Tool"],
"value": "__UNDEFINED__"
}
],
@@ -2843,7 +2699,7 @@
"show": true,
"title_case": false,
"type": "code",
- "value": "import ast\nimport pprint\nfrom enum import Enum\n\nimport yfinance as yf\nfrom langchain_core.tools import ToolException\nfrom loguru import logger\nfrom pydantic import BaseModel, Field\n\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.inputs.inputs import DropdownInput, IntInput, MessageTextInput\nfrom langflow.io import Output\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass YahooFinanceMethod(Enum):\n GET_INFO = \"get_info\"\n GET_NEWS = \"get_news\"\n GET_ACTIONS = \"get_actions\"\n GET_ANALYSIS = \"get_analysis\"\n GET_BALANCE_SHEET = \"get_balance_sheet\"\n GET_CALENDAR = \"get_calendar\"\n GET_CASHFLOW = \"get_cashflow\"\n GET_INSTITUTIONAL_HOLDERS = \"get_institutional_holders\"\n GET_RECOMMENDATIONS = \"get_recommendations\"\n GET_SUSTAINABILITY = \"get_sustainability\"\n GET_MAJOR_HOLDERS = \"get_major_holders\"\n GET_MUTUALFUND_HOLDERS = \"get_mutualfund_holders\"\n GET_INSIDER_PURCHASES = \"get_insider_purchases\"\n GET_INSIDER_TRANSACTIONS = \"get_insider_transactions\"\n GET_INSIDER_ROSTER_HOLDERS = \"get_insider_roster_holders\"\n GET_DIVIDENDS = \"get_dividends\"\n GET_CAPITAL_GAINS = \"get_capital_gains\"\n GET_SPLITS = \"get_splits\"\n GET_SHARES = \"get_shares\"\n GET_FAST_INFO = \"get_fast_info\"\n GET_SEC_FILINGS = \"get_sec_filings\"\n GET_RECOMMENDATIONS_SUMMARY = \"get_recommendations_summary\"\n GET_UPGRADES_DOWNGRADES = \"get_upgrades_downgrades\"\n GET_EARNINGS = \"get_earnings\"\n GET_INCOME_STMT = \"get_income_stmt\"\n\n\nclass YahooFinanceSchema(BaseModel):\n symbol: str = Field(..., description=\"The stock symbol to retrieve data for.\")\n method: YahooFinanceMethod = Field(YahooFinanceMethod.GET_INFO, description=\"The type of data to retrieve.\")\n num_news: int | None = Field(5, description=\"The number of news articles to retrieve.\")\n\n\nclass YfinanceComponent(Component):\n display_name = \"Yahoo Finance\"\n description = \"\"\"Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \\\nto access financial data and market information from Yahoo Finance.\"\"\"\n icon = \"trending-up\"\n\n inputs = [\n MessageTextInput(\n name=\"symbol\",\n display_name=\"Stock Symbol\",\n info=\"The stock symbol to retrieve data for (e.g., AAPL, GOOG).\",\n tool_mode=True,\n ),\n DropdownInput(\n name=\"method\",\n display_name=\"Data Method\",\n info=\"The type of data to retrieve.\",\n options=list(YahooFinanceMethod),\n value=\"get_news\",\n ),\n IntInput(\n name=\"num_news\",\n display_name=\"Number of News\",\n info=\"The number of news articles to retrieve (only applicable for get_news).\",\n value=5,\n ),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n ]\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def _fetch_yfinance_data(self, ticker: yf.Ticker, method: YahooFinanceMethod, num_news: int | None) -> str:\n try:\n if method == YahooFinanceMethod.GET_INFO:\n result = ticker.info\n elif method == YahooFinanceMethod.GET_NEWS:\n result = ticker.news[:num_news]\n else:\n result = getattr(ticker, method.value)()\n return pprint.pformat(result)\n except Exception as e:\n error_message = f\"Error retrieving data: {e}\"\n logger.debug(error_message)\n self.status = error_message\n raise ToolException(error_message) from e\n\n def fetch_content(self) -> list[Data]:\n try:\n return self._yahoo_finance_tool(\n self.symbol,\n YahooFinanceMethod(self.method),\n self.num_news,\n )\n except ToolException:\n raise\n except Exception as e:\n error_message = f\"Unexpected error: {e}\"\n logger.debug(error_message)\n self.status = error_message\n raise ToolException(error_message) from e\n\n def _yahoo_finance_tool(\n self,\n symbol: str,\n method: YahooFinanceMethod,\n num_news: int | None = 5,\n ) -> list[Data]:\n ticker = yf.Ticker(symbol)\n result = self._fetch_yfinance_data(ticker, method, num_news)\n\n if method == YahooFinanceMethod.GET_NEWS:\n data_list = [\n Data(text=f\"{article['title']}: {article['link']}\", data=article)\n for article in ast.literal_eval(result)\n ]\n else:\n data_list = [Data(text=result, data={\"result\": result})]\n\n return data_list\n\n def fetch_content_dataframe(self) -> DataFrame:\n data = self.fetch_content()\n return DataFrame(data)\n"
+ "value": "import ast\nimport pprint\nfrom enum import Enum\n\nimport yfinance as yf\nfrom langchain_core.tools import ToolException\nfrom loguru import logger\nfrom pydantic import BaseModel, Field\n\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.inputs.inputs import DropdownInput, IntInput, MessageTextInput\nfrom langflow.io import Output\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass YahooFinanceMethod(Enum):\n GET_INFO = \"get_info\"\n GET_NEWS = \"get_news\"\n GET_ACTIONS = \"get_actions\"\n GET_ANALYSIS = \"get_analysis\"\n GET_BALANCE_SHEET = \"get_balance_sheet\"\n GET_CALENDAR = \"get_calendar\"\n GET_CASHFLOW = \"get_cashflow\"\n GET_INSTITUTIONAL_HOLDERS = \"get_institutional_holders\"\n GET_RECOMMENDATIONS = \"get_recommendations\"\n GET_SUSTAINABILITY = \"get_sustainability\"\n GET_MAJOR_HOLDERS = \"get_major_holders\"\n GET_MUTUALFUND_HOLDERS = \"get_mutualfund_holders\"\n GET_INSIDER_PURCHASES = \"get_insider_purchases\"\n GET_INSIDER_TRANSACTIONS = \"get_insider_transactions\"\n GET_INSIDER_ROSTER_HOLDERS = \"get_insider_roster_holders\"\n GET_DIVIDENDS = \"get_dividends\"\n GET_CAPITAL_GAINS = \"get_capital_gains\"\n GET_SPLITS = \"get_splits\"\n GET_SHARES = \"get_shares\"\n GET_FAST_INFO = \"get_fast_info\"\n GET_SEC_FILINGS = \"get_sec_filings\"\n GET_RECOMMENDATIONS_SUMMARY = \"get_recommendations_summary\"\n GET_UPGRADES_DOWNGRADES = \"get_upgrades_downgrades\"\n GET_EARNINGS = \"get_earnings\"\n GET_INCOME_STMT = \"get_income_stmt\"\n\n\nclass YahooFinanceSchema(BaseModel):\n symbol: str = Field(..., description=\"The stock symbol to retrieve data for.\")\n method: YahooFinanceMethod = Field(YahooFinanceMethod.GET_INFO, description=\"The type of data to retrieve.\")\n num_news: int | None = Field(5, description=\"The number of news articles to retrieve.\")\n\n\nclass YfinanceComponent(Component):\n display_name = \"Yahoo! Finance\"\n description = \"\"\"Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \\\nto access financial data and market information from Yahoo! Finance.\"\"\"\n icon = \"trending-up\"\n\n inputs = [\n MessageTextInput(\n name=\"symbol\",\n display_name=\"Stock Symbol\",\n info=\"The stock symbol to retrieve data for (e.g., AAPL, GOOG).\",\n tool_mode=True,\n ),\n DropdownInput(\n name=\"method\",\n display_name=\"Data Method\",\n info=\"The type of data to retrieve.\",\n options=list(YahooFinanceMethod),\n value=\"get_news\",\n ),\n IntInput(\n name=\"num_news\",\n display_name=\"Number of News\",\n info=\"The number of news articles to retrieve (only applicable for get_news).\",\n value=5,\n ),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n ]\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def _fetch_yfinance_data(self, ticker: yf.Ticker, method: YahooFinanceMethod, num_news: int | None) -> str:\n try:\n if method == YahooFinanceMethod.GET_INFO:\n result = ticker.info\n elif method == YahooFinanceMethod.GET_NEWS:\n result = ticker.news[:num_news]\n else:\n result = getattr(ticker, method.value)()\n return pprint.pformat(result)\n except Exception as e:\n error_message = f\"Error retrieving data: {e}\"\n logger.debug(error_message)\n self.status = error_message\n raise ToolException(error_message) from e\n\n def fetch_content(self) -> list[Data]:\n try:\n return self._yahoo_finance_tool(\n self.symbol,\n YahooFinanceMethod(self.method),\n self.num_news,\n )\n except ToolException:\n raise\n except Exception as e:\n error_message = f\"Unexpected error: {e}\"\n logger.debug(error_message)\n self.status = error_message\n raise ToolException(error_message) from e\n\n def _yahoo_finance_tool(\n self,\n symbol: str,\n method: YahooFinanceMethod,\n num_news: int | None = 5,\n ) -> list[Data]:\n ticker = yf.Ticker(symbol)\n result = self._fetch_yfinance_data(ticker, method, num_news)\n\n if method == YahooFinanceMethod.GET_NEWS:\n data_list = [\n Data(text=f\"{article['title']}: {article['link']}\", data=article)\n for article in ast.literal_eval(result)\n ]\n else:\n data_list = [Data(text=result, data={\"result\": result})]\n\n return data_list\n\n def fetch_content_dataframe(self) -> DataFrame:\n data = self.fetch_content()\n return DataFrame(data)\n"
},
"method": {
"_input_type": "DropdownInput",
@@ -2915,9 +2771,7 @@
"display_name": "Stock Symbol",
"dynamic": false,
"info": "The stock symbol to retrieve data for (e.g., AAPL, GOOG).",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2959,15 +2813,13 @@
"type": "string"
}
},
- "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo Finance.",
- "display_description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo Finance.",
+ "description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo! Finance.",
+ "display_description": "Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) to access financial data and market information from Yahoo! Finance.",
"display_name": "fetch_content_dataframe",
"name": "fetch_content_dataframe",
"readonly": false,
"status": true,
- "tags": [
- "fetch_content_dataframe"
- ]
+ "tags": ["fetch_content_dataframe"]
}
]
}
@@ -2995,9 +2847,7 @@
"data": {
"id": "CalculatorComponent-0P2yI",
"node": {
- "base_classes": [
- "Data"
- ],
+ "base_classes": ["Data"],
"beta": false,
"category": "tools",
"conditional_paths": [],
@@ -3006,9 +2856,7 @@
"display_name": "Calculator",
"documentation": "",
"edited": false,
- "field_order": [
- "expression"
- ],
+ "field_order": ["expression"],
"frozen": false,
"icon": "calculator",
"key": "CalculatorComponent",
@@ -3032,9 +2880,7 @@
"required_inputs": null,
"selected": "Tool",
"tool_mode": true,
- "types": [
- "Tool"
- ],
+ "types": ["Tool"],
"value": "__UNDEFINED__"
}
],
@@ -3066,9 +2912,7 @@
"display_name": "Expression",
"dynamic": false,
"info": "The arithmetic expression to evaluate (e.g., '4*4*(33/22)+12-20').",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3116,9 +2960,7 @@
"name": "evaluate_expression",
"readonly": false,
"status": true,
- "tags": [
- "evaluate_expression"
- ]
+ "tags": ["evaluate_expression"]
}
]
}
@@ -3146,10 +2988,7 @@
"data": {
"id": "TavilySearchComponent-DTUmi",
"node": {
- "base_classes": [
- "Data",
- "Message"
- ],
+ "base_classes": ["Data", "Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -3189,9 +3028,7 @@
"required_inputs": null,
"selected": "Tool",
"tool_mode": true,
- "types": [
- "Tool"
- ],
+ "types": ["Tool"],
"value": "__UNDEFINED__"
}
],
@@ -3275,9 +3112,7 @@
"display_name": "Exclude Domains",
"dynamic": false,
"info": "Comma-separated list of domains to exclude from the search results.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3316,9 +3151,7 @@
"display_name": "Include Domains",
"dynamic": false,
"info": "Comma-separated list of domains to include in the search results.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3393,9 +3226,7 @@
"display_name": "Search Query",
"dynamic": false,
"info": "The search query you want to execute with Tavily.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3419,10 +3250,7 @@
"dynamic": false,
"info": "The depth of the search.",
"name": "search_depth",
- "options": [
- "basic",
- "advanced"
- ],
+ "options": ["basic", "advanced"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -3442,12 +3270,7 @@
"dynamic": false,
"info": "The time range back from the current date to filter results.",
"name": "time_range",
- "options": [
- "day",
- "week",
- "month",
- "year"
- ],
+ "options": ["day", "week", "month", "year"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -3490,9 +3313,7 @@
"name": "fetch_content_dataframe",
"readonly": false,
"status": true,
- "tags": [
- "fetch_content_dataframe"
- ]
+ "tags": ["fetch_content_dataframe"]
}
]
},
@@ -3505,10 +3326,7 @@
"dynamic": false,
"info": "The category of the search.",
"name": "topic",
- "options": [
- "general",
- "news"
- ],
+ "options": ["general", "news"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -3543,9 +3361,7 @@
"data": {
"id": "ChatOutput-gbqPo",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"category": "outputs",
"conditional_paths": [],
@@ -3586,9 +3402,7 @@
"name": "message",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -3602,9 +3416,7 @@
"display_name": "Background Color",
"dynamic": false,
"info": "The background color of the icon.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3625,9 +3437,7 @@
"display_name": "Icon",
"dynamic": false,
"info": "The icon of the message.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3684,9 +3494,7 @@
"display_name": "Data Template",
"dynamic": false,
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3707,11 +3515,7 @@
"display_name": "Inputs",
"dynamic": false,
"info": "Message to be passed as output.",
- "input_types": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "input_types": ["Data", "DataFrame", "Message"],
"list": false,
"list_add_label": "Add More",
"name": "input_value",
@@ -3732,10 +3536,7 @@
"dynamic": false,
"info": "Type of sender.",
"name": "sender",
- "options": [
- "Machine",
- "User"
- ],
+ "options": ["Machine", "User"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -3752,9 +3553,7 @@
"display_name": "Sender Name",
"dynamic": false,
"info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3775,9 +3574,7 @@
"display_name": "Session ID",
"dynamic": false,
"info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3816,9 +3613,7 @@
"display_name": "Text Color",
"dynamic": false,
"info": "The text color of the name",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -3865,9 +3660,5 @@
"is_component": false,
"last_tested_version": "1.4.3",
"name": "Sequential Tasks Agents",
- "tags": [
- "assistants",
- "agents",
- "web-scraping"
- ]
-}
\ No newline at end of file
+ "tags": ["assistants", "agents", "web-scraping"]
+}
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 1e9efdd96..e02523608 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
@@ -1417,7 +1417,7 @@
"beta": false,
"conditional_paths": [],
"custom_fields": {},
- "description": "Call the searchapi.io API with result limiting",
+ "description": "Calls the SearchApi API with result limiting. Supports Google, Bing and DuckDuckGo.",
"display_name": "Search API",
"documentation": "https://www.searchapi.io/docs/google",
"edited": false,
@@ -1434,7 +1434,7 @@
"legacy": false,
"lf_version": "1.2.0",
"metadata": {
- "code_hash": "727befdc79e7",
+ "code_hash": "c561e416205b",
"module": "langflow.components.searchapi.search.SearchComponent"
},
"minimized": false,
@@ -1494,7 +1494,7 @@
"show": true,
"title_case": false,
"type": "code",
- "value": "from typing import Any\n\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\n\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.inputs.inputs import DictInput, DropdownInput, IntInput, MultilineInput, SecretStrInput\nfrom langflow.io import Output\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass SearchComponent(Component):\n display_name: str = \"Search API\"\n description: str = \"Call the searchapi.io API with result limiting\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n icon = \"SearchAPI\"\n\n inputs = [\n DropdownInput(name=\"engine\", display_name=\"Engine\", value=\"google\", options=[\"google\", \"bing\", \"duckduckgo\"]),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n tool_mode=True,\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 outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n ]\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def fetch_content(self) -> list[Data]:\n wrapper = self._build_wrapper()\n\n def search_func(\n query: str, params: dict[str, Any] | None = None, max_results: int = 5, max_snippet_length: int = 100\n ) -> list[Data]:\n params = params or {}\n full_results = wrapper.results(query=query, **params)\n organic_results = full_results.get(\"organic_results\", [])[:max_results]\n\n return [\n Data(\n text=result.get(\"snippet\", \"\"),\n data={\n \"title\": result.get(\"title\", \"\")[:max_snippet_length],\n \"link\": result.get(\"link\", \"\"),\n \"snippet\": result.get(\"snippet\", \"\")[:max_snippet_length],\n },\n )\n for result in organic_results\n ]\n\n results = search_func(\n self.input_value,\n self.search_params or {},\n self.max_results,\n self.max_snippet_length,\n )\n self.status = results\n return results\n\n def fetch_content_dataframe(self) -> DataFrame:\n \"\"\"Convert the search results to a DataFrame.\n\n Returns:\n DataFrame: A DataFrame containing the search results.\n \"\"\"\n data = self.fetch_content()\n return DataFrame(data)\n"
+ "value": "from typing import Any\n\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\n\nfrom langflow.custom.custom_component.component import Component\nfrom langflow.inputs.inputs import DictInput, DropdownInput, IntInput, MultilineInput, SecretStrInput\nfrom langflow.io import Output\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass SearchComponent(Component):\n display_name: str = \"SearchApi\"\n description: str = \"Calls the SearchApi API with result limiting. Supports Google, Bing and DuckDuckGo.\"\n documentation: str = \"https://www.searchapi.io/docs/google\"\n icon = \"SearchAPI\"\n\n inputs = [\n DropdownInput(name=\"engine\", display_name=\"Engine\", value=\"google\", options=[\"google\", \"bing\", \"duckduckgo\"]),\n SecretStrInput(name=\"api_key\", display_name=\"SearchAPI API Key\", required=True),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n tool_mode=True,\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 outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n ]\n\n def _build_wrapper(self):\n return SearchApiAPIWrapper(engine=self.engine, searchapi_api_key=self.api_key)\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def fetch_content(self) -> list[Data]:\n wrapper = self._build_wrapper()\n\n def search_func(\n query: str, params: dict[str, Any] | None = None, max_results: int = 5, max_snippet_length: int = 100\n ) -> list[Data]:\n params = params or {}\n full_results = wrapper.results(query=query, **params)\n organic_results = full_results.get(\"organic_results\", [])[:max_results]\n\n return [\n Data(\n text=result.get(\"snippet\", \"\"),\n data={\n \"title\": result.get(\"title\", \"\")[:max_snippet_length],\n \"link\": result.get(\"link\", \"\"),\n \"snippet\": result.get(\"snippet\", \"\")[:max_snippet_length],\n },\n )\n for result in organic_results\n ]\n\n results = search_func(\n self.input_value,\n self.search_params or {},\n self.max_results,\n self.max_snippet_length,\n )\n self.status = results\n return results\n\n def fetch_content_dataframe(self) -> DataFrame:\n \"\"\"Convert the search results to a DataFrame.\n\n Returns:\n DataFrame: A DataFrame containing the search results.\n \"\"\"\n data = self.fetch_content()\n return DataFrame(data)\n"
},
"engine": {
"_input_type": "DropdownInput",
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json b/src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json
index d18d7c3db..fa8b74256 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json
@@ -9,16 +9,12 @@
"dataType": "YouTubeCommentsComponent",
"id": "YouTubeCommentsComponent-y3wJZ",
"name": "comments",
- "output_types": [
- "DataFrame"
- ]
+ "output_types": ["DataFrame"]
},
"targetHandle": {
"fieldName": "df",
"id": "BatchRunComponent-30WdR",
- "inputTypes": [
- "DataFrame"
- ],
+ "inputTypes": ["DataFrame"],
"type": "other"
}
},
@@ -37,16 +33,12 @@
"dataType": "Prompt",
"id": "Prompt-yqoLt",
"name": "prompt",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "input_value",
"id": "Agent-JRSRu",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -65,18 +57,12 @@
"dataType": "Agent",
"id": "Agent-JRSRu",
"name": "response",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-vlskP",
- "inputTypes": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "inputTypes": ["Data", "DataFrame", "Message"],
"type": "str"
}
},
@@ -95,16 +81,12 @@
"dataType": "YouTubeTranscripts",
"id": "YouTubeTranscripts-TlFcG",
"name": "component_as_tool",
- "output_types": [
- "Tool"
- ]
+ "output_types": ["Tool"]
},
"targetHandle": {
"fieldName": "tools",
"id": "Agent-JRSRu",
- "inputTypes": [
- "Tool"
- ],
+ "inputTypes": ["Tool"],
"type": "other"
}
},
@@ -123,17 +105,12 @@
"dataType": "BatchRunComponent",
"id": "BatchRunComponent-30WdR",
"name": "batch_results",
- "output_types": [
- "DataFrame"
- ]
+ "output_types": ["DataFrame"]
},
"targetHandle": {
"fieldName": "input_data",
"id": "parser-k0Bpy",
- "inputTypes": [
- "DataFrame",
- "Data"
- ],
+ "inputTypes": ["DataFrame", "Data"],
"type": "other"
}
},
@@ -152,16 +129,12 @@
"dataType": "parser",
"id": "parser-k0Bpy",
"name": "parsed_text",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "analysis",
"id": "Prompt-yqoLt",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -180,16 +153,12 @@
"dataType": "LanguageModelComponent",
"id": "LanguageModelComponent-OvIt5",
"name": "model_output",
- "output_types": [
- "LanguageModel"
- ]
+ "output_types": ["LanguageModel"]
},
"targetHandle": {
"fieldName": "model",
"id": "BatchRunComponent-30WdR",
- "inputTypes": [
- "LanguageModel"
- ],
+ "inputTypes": ["LanguageModel"],
"type": "other"
}
},
@@ -208,16 +177,12 @@
"dataType": "ChatInput",
"id": "ChatInput-kaWcL",
"name": "message",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "video_url",
"id": "YouTubeCommentsComponent-y3wJZ",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -236,16 +201,12 @@
"dataType": "ChatInput",
"id": "ChatInput-kaWcL",
"name": "message",
- "output_types": [
- "Message"
- ]
+ "output_types": ["Message"]
},
"targetHandle": {
"fieldName": "url",
"id": "Prompt-yqoLt",
- "inputTypes": [
- "Message"
- ],
+ "inputTypes": ["Message"],
"type": "str"
}
},
@@ -262,9 +223,7 @@
"data": {
"id": "BatchRunComponent-30WdR",
"node": {
- "base_classes": [
- "DataFrame"
- ],
+ "base_classes": ["DataFrame"],
"beta": false,
"category": "helpers",
"conditional_paths": [],
@@ -273,12 +232,7 @@
"display_name": "Batch Run",
"documentation": "",
"edited": false,
- "field_order": [
- "model",
- "system_message",
- "df",
- "column_name"
- ],
+ "field_order": ["model", "system_message", "df", "column_name"],
"frozen": false,
"icon": "List",
"key": "BatchRunComponent",
@@ -300,9 +254,7 @@
"name": "batch_results",
"selected": "DataFrame",
"tool_mode": true,
- "types": [
- "DataFrame"
- ],
+ "types": ["DataFrame"],
"value": "__UNDEFINED__"
}
],
@@ -353,9 +305,7 @@
"display_name": "DataFrame",
"dynamic": false,
"info": "The DataFrame whose column (specified by 'column_name') we'll treat as text messages.",
- "input_types": [
- "DataFrame"
- ],
+ "input_types": ["DataFrame"],
"list": false,
"list_add_label": "Add More",
"name": "df",
@@ -393,9 +343,7 @@
"display_name": "Language Model",
"dynamic": false,
"info": "Connect the 'Language Model' output from your LLM component here.",
- "input_types": [
- "LanguageModel"
- ],
+ "input_types": ["LanguageModel"],
"list": false,
"list_add_label": "Add More",
"name": "model",
@@ -413,9 +361,7 @@
"display_name": "Output Column Name",
"dynamic": false,
"info": "Name of the column where the model's response will be stored.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -436,9 +382,7 @@
"display_name": "Instructions",
"dynamic": false,
"info": "Multi-line system instruction for all rows in the DataFrame.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -478,9 +422,7 @@
"data": {
"id": "YouTubeCommentsComponent-y3wJZ",
"node": {
- "base_classes": [
- "DataFrame"
- ],
+ "base_classes": ["DataFrame"],
"beta": false,
"category": "youtube",
"conditional_paths": [],
@@ -518,9 +460,7 @@
"name": "comments",
"selected": "DataFrame",
"tool_mode": true,
- "types": [
- "DataFrame"
- ],
+ "types": ["DataFrame"],
"value": "__UNDEFINED__"
}
],
@@ -626,10 +566,7 @@
"dynamic": false,
"info": "Sort comments by time or relevance.",
"name": "sort_by",
- "options": [
- "time",
- "relevance"
- ],
+ "options": ["time", "relevance"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -646,9 +583,7 @@
"display_name": "Video URL",
"dynamic": false,
"info": "The URL of the YouTube video to get comments from.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -687,9 +622,7 @@
"data": {
"id": "Agent-JRSRu",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -740,9 +673,7 @@
"required_inputs": null,
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -774,9 +705,7 @@
"display_name": "Agent Description [Deprecated]",
"dynamic": false,
"info": "The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -897,9 +826,7 @@
"display_name": "Input",
"dynamic": false,
"info": "The input provided by the user for the agent to process.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1107,9 +1034,7 @@
"display_name": "Agent Instructions",
"dynamic": false,
"info": "System Prompt: Initial instructions and context provided to guide the agent's behavior.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1177,9 +1102,7 @@
"display_name": "Tools",
"dynamic": false,
"info": "These are the tools that the agent can use to help with tasks.",
- "input_types": [
- "Tool"
- ],
+ "input_types": ["Tool"],
"list": true,
"list_add_label": "Add More",
"name": "tools",
@@ -1233,26 +1156,18 @@
"data": {
"id": "Prompt-yqoLt",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {
- "template": [
- "url",
- "analysis"
- ]
+ "template": ["url", "analysis"]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
"documentation": "",
"edited": false,
"error": null,
- "field_order": [
- "template",
- "tool_placeholder"
- ],
+ "field_order": ["template", "tool_placeholder"],
"frozen": false,
"full_path": null,
"icon": "braces",
@@ -1275,9 +1190,7 @@
"name": "prompt",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1292,9 +1205,7 @@
"fileTypes": [],
"file_path": "",
"info": "",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"multiline": true,
@@ -1348,9 +1259,7 @@
"display_name": "Tool Placeholder",
"dynamic": false,
"info": "A placeholder input for tool mode.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1373,9 +1282,7 @@
"fileTypes": [],
"file_path": "",
"info": "",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"load_from_db": false,
"multiline": true,
@@ -1411,9 +1318,7 @@
"data": {
"id": "ChatOutput-vlskP",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"category": "outputs",
"conditional_paths": [],
@@ -1454,9 +1359,7 @@
"name": "message",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -1470,9 +1373,7 @@
"display_name": "Background Color",
"dynamic": false,
"info": "The background color of the icon.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1493,9 +1394,7 @@
"display_name": "Icon",
"dynamic": false,
"info": "The icon of the message.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1552,9 +1451,7 @@
"display_name": "Data Template",
"dynamic": false,
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1575,11 +1472,7 @@
"display_name": "Inputs",
"dynamic": false,
"info": "Message to be passed as output.",
- "input_types": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "input_types": ["Data", "DataFrame", "Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1603,10 +1496,7 @@
"dynamic": false,
"info": "Type of sender.",
"name": "sender",
- "options": [
- "Machine",
- "User"
- ],
+ "options": ["Machine", "User"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -1623,9 +1513,7 @@
"display_name": "Sender Name",
"dynamic": false,
"info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1646,9 +1534,7 @@
"display_name": "Session ID",
"dynamic": false,
"info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1687,9 +1573,7 @@
"display_name": "Text Color",
"dynamic": false,
"info": "The text color of the name",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1727,11 +1611,7 @@
"data": {
"id": "YouTubeTranscripts-TlFcG",
"node": {
- "base_classes": [
- "Data",
- "DataFrame",
- "Message"
- ],
+ "base_classes": ["Data", "DataFrame", "Message"],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@@ -1739,11 +1619,7 @@
"display_name": "YouTube Transcripts",
"documentation": "",
"edited": false,
- "field_order": [
- "url",
- "chunk_size_seconds",
- "translation"
- ],
+ "field_order": ["url", "chunk_size_seconds", "translation"],
"frozen": false,
"icon": "YouTube",
"last_updated": "2025-07-07T14:52:15.000Z",
@@ -1768,9 +1644,7 @@
"required_inputs": null,
"selected": "Tool",
"tool_mode": true,
- "types": [
- "Tool"
- ],
+ "types": ["Tool"],
"value": "__UNDEFINED__"
}
],
@@ -1845,9 +1719,7 @@
"name": "get_dataframe_output",
"readonly": false,
"status": true,
- "tags": [
- "get_dataframe_output"
- ]
+ "tags": ["get_dataframe_output"]
},
{
"args": {
@@ -1863,9 +1735,7 @@
"name": "get_message_output",
"readonly": false,
"status": true,
- "tags": [
- "get_message_output"
- ]
+ "tags": ["get_message_output"]
},
{
"args": {
@@ -1881,9 +1751,7 @@
"name": "get_data_output",
"readonly": false,
"status": true,
- "tags": [
- "get_data_output"
- ]
+ "tags": ["get_data_output"]
}
]
},
@@ -1927,9 +1795,7 @@
"display_name": "Video URL",
"dynamic": false,
"info": "Enter the YouTube video URL to get transcripts from.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -1969,7 +1835,7 @@
"data": {
"id": "note-eKoWw",
"node": {
- "description": "# 📖 README\nThis flow performs comprehensive analysis of YouTube videos.\n1. Extract video comments and transcripts.\n2. Run sentiment analysis on comments using LLM.\n3. Combine transcript content and comment sentiment for comprehensive video analysis.\n## Quickstart\n- Add your **OpenAI API Key** to the **Language Model** and **YT-Insight** Agent Component\n- Add your **YouTube Data API v3 key**\n- If you don't have a YoutTube API key, create one in the [Google Cloud Console](https://console.cloud.google.com).\n- Ensure the chat input is a valid Youtube video URL. A sample URL is provided in the chat input component.\n",
+ "description": "# 📖 README\nThis flow performs comprehensive analysis of YouTube videos.\n1. Extract video comments and transcripts.\n2. Run sentiment analysis on comments using LLM.\n3. Combine transcript content and comment sentiment for comprehensive video analysis.\n## Quickstart\n- Add your **OpenAI API Key** to the **Language Model** and **YT-Insight** Agent Component\n- Add your **YouTube Data API v3 key**\n- If you don't have a YoutTube API key, create one in the [Google Cloud Console](https://console.cloud.google.com).\n- Ensure the chat input is a valid YouTube video URL. A sample URL is provided in the chat input component.\n",
"display_name": "",
"documentation": "",
"template": {
@@ -1998,9 +1864,7 @@
"data": {
"id": "parser-k0Bpy",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"category": "processing",
"conditional_paths": [],
@@ -2009,12 +1873,7 @@
"display_name": "Parser",
"documentation": "",
"edited": false,
- "field_order": [
- "mode",
- "pattern",
- "input_data",
- "sep"
- ],
+ "field_order": ["mode", "pattern", "input_data", "sep"],
"frozen": false,
"icon": "braces",
"key": "parser",
@@ -2032,9 +1891,7 @@
"name": "parsed_text",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -2066,10 +1923,7 @@
"display_name": "Data or DataFrame",
"dynamic": false,
"info": "Accepts either a DataFrame or a Data object.",
- "input_types": [
- "DataFrame",
- "Data"
- ],
+ "input_types": ["DataFrame", "Data"],
"list": false,
"list_add_label": "Add More",
"name": "input_data",
@@ -2088,10 +1942,7 @@
"dynamic": false,
"info": "Convert into raw string instead of using a template.",
"name": "mode",
- "options": [
- "Parser",
- "Stringify"
- ],
+ "options": ["Parser", "Stringify"],
"placeholder": "",
"real_time_refresh": true,
"required": false,
@@ -2109,9 +1960,7 @@
"display_name": "Template",
"dynamic": true,
"info": "Use variables within curly brackets to extract column values for DataFrames or key values for Data.For example: `Name: {Name}, Age: {Age}, Country: {Country}`",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2133,9 +1982,7 @@
"display_name": "Separator",
"dynamic": false,
"info": "String used to separate rows/items.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2174,10 +2021,7 @@
"data": {
"id": "LanguageModelComponent-OvIt5",
"node": {
- "base_classes": [
- "LanguageModel",
- "Message"
- ],
+ "base_classes": ["LanguageModel", "Message"],
"beta": false,
"category": "models",
"conditional_paths": [],
@@ -2223,9 +2067,7 @@
"required_inputs": null,
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
},
{
@@ -2239,9 +2081,7 @@
"required_inputs": null,
"selected": "LanguageModel",
"tool_mode": true,
- "types": [
- "LanguageModel"
- ],
+ "types": ["LanguageModel"],
"value": "__UNDEFINED__"
}
],
@@ -2292,9 +2132,7 @@
"display_name": "Input",
"dynamic": false,
"info": "The input text to send to the model",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2350,11 +2188,7 @@
"dynamic": false,
"info": "Select the model provider",
"name": "provider",
- "options": [
- "OpenAI",
- "Anthropic",
- "Google"
- ],
+ "options": ["OpenAI", "Anthropic", "Google"],
"options_metadata": [
{
"icon": "OpenAI"
@@ -2402,9 +2236,7 @@
"display_name": "System Message",
"dynamic": false,
"info": "A system message that helps set the behavior of the assistant",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2472,9 +2304,7 @@
"data": {
"id": "ChatInput-kaWcL",
"node": {
- "base_classes": [
- "Message"
- ],
+ "base_classes": ["Message"],
"beta": false,
"category": "input_output",
"conditional_paths": [],
@@ -2515,9 +2345,7 @@
"name": "message",
"selected": "Message",
"tool_mode": true,
- "types": [
- "Message"
- ],
+ "types": ["Message"],
"value": "__UNDEFINED__"
}
],
@@ -2531,9 +2359,7 @@
"display_name": "Background Color",
"dynamic": false,
"info": "The background color of the icon.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2554,9 +2380,7 @@
"display_name": "Icon",
"dynamic": false,
"info": "The icon of the message.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2665,10 +2489,7 @@
"dynamic": false,
"info": "Type of sender.",
"name": "sender",
- "options": [
- "Machine",
- "User"
- ],
+ "options": ["Machine", "User"],
"options_metadata": [],
"placeholder": "",
"required": false,
@@ -2686,9 +2507,7 @@
"display_name": "Sender Name",
"dynamic": false,
"info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2709,9 +2528,7 @@
"display_name": "Session ID",
"dynamic": false,
"info": "The session ID of the chat. If empty, the current session ID parameter will be used.",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2750,9 +2567,7 @@
"display_name": "Text Color",
"dynamic": false,
"info": "The text color of the name",
- "input_types": [
- "Message"
- ],
+ "input_types": ["Message"],
"list": false,
"list_add_label": "Add More",
"load_from_db": false,
@@ -2798,9 +2613,6 @@
"id": "3d1e15c2-b095-46de-8247-949c7a5bda04",
"is_component": false,
"last_tested_version": "1.4.3",
- "name": "Youtube Analysis",
- "tags": [
- "agents",
- "assistants"
- ]
-}
\ No newline at end of file
+ "name": "YouTube Analysis",
+ "tags": ["agents", "assistants"]
+}
diff --git a/src/backend/tests/unit/components/search/test_yfinance_tool.py b/src/backend/tests/unit/components/search/test_yfinance_tool.py
index 3aa2661eb..af4dce878 100644
--- a/src/backend/tests/unit/components/search/test_yfinance_tool.py
+++ b/src/backend/tests/unit/components/search/test_yfinance_tool.py
@@ -22,7 +22,7 @@ class TestYfinanceComponent:
def test_initialization(self, component_class):
component = component_class()
- assert component.display_name == "Yahoo Finance"
+ assert component.display_name == "Yahoo! Finance"
assert component.icon == "trending-up"
assert "yfinance" in component.description
diff --git a/src/frontend/src/constants/constants.ts b/src/frontend/src/constants/constants.ts
index 0f589d7e4..d91d2c7fa 100644
--- a/src/frontend/src/constants/constants.ts
+++ b/src/frontend/src/constants/constants.ts
@@ -761,7 +761,7 @@ export const BUNDLES_SIDEBAR_FOLDER_NAMES = [
"assemblyai",
"LangWatch",
"langwatch",
- "Youtube",
+ "YouTube",
"youtube",
];
diff --git a/src/frontend/src/icons/eagerIconImports.ts b/src/frontend/src/icons/eagerIconImports.ts
index 4a502b9e9..d8aaff2ee 100644
--- a/src/frontend/src/icons/eagerIconImports.ts
+++ b/src/frontend/src/icons/eagerIconImports.ts
@@ -117,7 +117,7 @@ import { WindsurfIcon } from "./Windsurf";
// Export the eagerly loaded icons map
export const eagerIconsMapping = {
- "AI/ML": AIMLIcon,
+ AIML: AIMLIcon,
AgentQL: AgentQLIcon,
Airbyte: AirbyteIcon,
Anthropic: AnthropicIcon,
diff --git a/src/frontend/src/icons/lazyIconImports.ts b/src/frontend/src/icons/lazyIconImports.ts
index 2efd43c44..512b71a01 100644
--- a/src/frontend/src/icons/lazyIconImports.ts
+++ b/src/frontend/src/icons/lazyIconImports.ts
@@ -1,7 +1,6 @@
// Export the lazy loading mapping for icons
export const lazyIconsMapping = {
- "AI/ML": () =>
- import("@/icons/AIML").then((mod) => ({ default: mod.AIMLIcon })),
+ AIML: () => import("@/icons/AIML").then((mod) => ({ default: mod.AIMLIcon })),
AgentQL: () =>
import("@/icons/AgentQL").then((mod) => ({ default: mod.AgentQLIcon })),
Airbyte: () =>
diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts
index ff0cbf461..1ec93e2a3 100644
--- a/src/frontend/src/utils/styleUtils.ts
+++ b/src/frontend/src/utils/styleUtils.ts
@@ -230,13 +230,13 @@ export const SIDEBAR_CATEGORIES = [
];
export const SIDEBAR_BUNDLES = [
- { display_name: "AI/ML", name: "aiml", icon: "AI/ML" },
+ { display_name: "AI/ML API", name: "aiml", icon: "AIML" },
{ display_name: "AgentQL", name: "agentql", icon: "AgentQL" },
{ display_name: "Amazon", name: "amazon", icon: "Amazon" },
{ display_name: "Anthropic", name: "anthropic", icon: "Anthropic" },
{ display_name: "Apify", name: "apify", icon: "Apify" },
- { display_name: "Arxiv", name: "arxiv", icon: "arXiv" },
+ { display_name: "arXiv", name: "arxiv", icon: "arXiv" },
{ display_name: "AssemblyAI", name: "assemblyai", icon: "AssemblyAI" },
{ display_name: "Azure", name: "azure", icon: "Azure" },
{ display_name: "Baidu", name: "baidu", icon: "BaiduQianfan" },
@@ -270,7 +270,7 @@ export const SIDEBAR_BUNDLES = [
name: "homeassistant",
icon: "HomeAssistant",
},
- { display_name: "HuggingFace", name: "huggingface", icon: "HuggingFace" },
+ { display_name: "Hugging Face", name: "huggingface", icon: "HuggingFace" },
{ display_name: "IBM", name: "ibm", icon: "WatsonxAI" },
{ display_name: "Icosa Computing", name: "icosacomputing", icon: "Icosa" },
{ display_name: "JigsawStack", name: "jigsawstack", icon: "JigsawStack" },
@@ -282,7 +282,7 @@ export const SIDEBAR_BUNDLES = [
{ display_name: "Memories", name: "memories", icon: "Cpu" },
{ display_name: "MistralAI", name: "mistral", icon: "MistralAI" },
{ display_name: "Needle", name: "needle", icon: "Needle" },
- { display_name: "NotDiamond", name: "notdiamond", icon: "NotDiamond" },
+ { display_name: "Not Diamond", name: "notdiamond", icon: "NotDiamond" },
{ display_name: "Notion", name: "Notion", icon: "Notion" },
{ display_name: "Novita", name: "novita", icon: "Novita" },
{ display_name: "NVIDIA", name: "nvidia", icon: "NVIDIA" },
@@ -295,13 +295,14 @@ export const SIDEBAR_BUNDLES = [
{ display_name: "Redis", name: "redis", icon: "Redis" },
{ display_name: "SambaNova", name: "sambanova", icon: "SambaNova" },
{ display_name: "ScrapeGraph AI", name: "scrapegraph", icon: "ScrapeGraph" },
- { display_name: "SearchAPI", name: "searchapi", icon: "SearchAPI" },
+ { display_name: "SearchApi", name: "searchapi", icon: "SearchAPI" },
{ display_name: "SerpApi", name: "serpapi", icon: "SerpSearch" },
+ { display_name: "Serper", name: "serper", icon: "Serper" },
{ display_name: "Tavily", name: "tavily", icon: "TavilyIcon" },
- { display_name: "Twelve Labs", name: "twelvelabs", icon: "TwelveLabs" },
+ { display_name: "TwelveLabs", name: "twelvelabs", icon: "TwelveLabs" },
{ display_name: "Unstructured", name: "unstructured", icon: "Unstructured" },
{ display_name: "Vectara", name: "vectara", icon: "Vectara" },
- { display_name: "VertexAI", name: "vertexai", icon: "VertexAI" },
+ { display_name: "Vertex AI", name: "vertexai", icon: "VertexAI" },
{ display_name: "Wikipedia", name: "wikipedia", icon: "Wikipedia" },
{
display_name: "WolframAlpha",
@@ -309,8 +310,8 @@ export const SIDEBAR_BUNDLES = [
icon: "WolframAlphaAPI",
},
{ display_name: "xAI", name: "xai", icon: "xAI" },
- { display_name: "YahooSearch", name: "yahoosearch", icon: "trending-up" },
- { display_name: "Youtube", name: "youtube", icon: "YouTube" },
+ { display_name: "Yahoo! Finance", name: "yahoosearch", icon: "trending-up" },
+ { display_name: "YouTube", name: "youtube", icon: "YouTube" },
{ display_name: "Zep", name: "zep", icon: "ZepMemory" },
];
@@ -371,7 +372,7 @@ export const nodeIconToDisplayIconMap: Record = {
ChatOutput: "MessagesSquare",
//Integration Icons
Outlook: "Outlook",
- AIML: "AI/ML",
+ AIML: "AIML",
AgentQL: "AgentQL",
LanguageModels: "BrainCircuit",
EmbeddingModels: "Binary",
diff --git a/src/frontend/tests/core/features/filterSidebar.spec.ts b/src/frontend/tests/core/features/filterSidebar.spec.ts
index 3d0e794da..77580d251 100644
--- a/src/frontend/tests/core/features/filterSidebar.spec.ts
+++ b/src/frontend/tests/core/features/filterSidebar.spec.ts
@@ -73,7 +73,7 @@ test(
await expect(page.getByTestId("input_outputChat Input")).toBeVisible();
await expect(page.getByTestId("input_outputChat Output")).toBeVisible();
await expect(page.getByTestId("processingPrompt Template")).toBeVisible();
- await expect(page.getByTestId("langchain_utilitiesCSVAgent")).toBeVisible();
+ await expect(page.getByTestId("langchain_utilitiesCSV Agent")).toBeVisible();
await expect(
page.getByTestId("langchain_utilitiesConversationChain"),
).toBeVisible();
diff --git a/src/frontend/tests/core/integrations/Youtube Analysis.spec.ts b/src/frontend/tests/core/integrations/Youtube Analysis.spec.ts
index 5b80f162f..9d828d97b 100644
--- a/src/frontend/tests/core/integrations/Youtube Analysis.spec.ts
+++ b/src/frontend/tests/core/integrations/Youtube Analysis.spec.ts
@@ -6,7 +6,7 @@ import { initialGPTsetup } from "../../utils/initialGPTsetup";
import { withEventDeliveryModes } from "../../utils/withEventDeliveryModes";
withEventDeliveryModes(
- "Youtube Analysis",
+ "YouTube Analysis",
{ tag: ["@release", "@starter-projects"] },
async ({ page }) => {
test.skip(
@@ -27,7 +27,7 @@ withEventDeliveryModes(
await awaitBootstrapTest(page);
await page.getByTestId("side_nav_options_all-templates").click();
- await page.getByRole("heading", { name: "Youtube Analysis" }).click();
+ await page.getByRole("heading", { name: "YouTube Analysis" }).click();
await page.waitForSelector('[data-testid="fit_view"]', {
timeout: 100000,
diff --git a/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts b/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts
index b7d3af35b..87c014299 100644
--- a/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts
+++ b/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts
@@ -1,5 +1,4 @@
import { expect, test } from "@playwright/test";
-import { addFlowToTestOnEmptyLangflow } from "../../utils/add-flow-to-test-on-empty-langflow";
import { addLegacyComponents } from "../../utils/add-legacy-components";
import { adjustScreenView } from "../../utils/adjust-screen-view";
import { awaitBootstrapTest } from "../../utils/await-bootstrap-test";
@@ -78,7 +77,7 @@ test(
"mem0Mem0 Chat Memory",
"logicCondition",
"langchain_utilitiesSelf Query Retriever",
- "langchain_utilitiesCharacterTextSplitter",
+ "langchain_utilitiesCharacter Text Splitter",
];
await Promise.all(
@@ -104,7 +103,7 @@ test(
"cohereCohere Language Models",
"groqGroq",
"lmstudioLM Studio",
- "maritalkMaritalk",
+ "maritalkMariTalk",
"mistralMistralAI",
"perplexityPerplexity",
"baiduQianfan",
diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts
index 56251456e..62933cd1c 100644
--- a/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts
+++ b/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts
@@ -49,14 +49,14 @@ test(
await page.getByTestId("sidebar-search-input").click();
await page.getByTestId("sidebar-search-input").fill("search api");
- await page.waitForSelector('[data-testid="searchapiSearch API"]', {
+ await page.waitForSelector('[data-testid="searchapiSearchApi"]', {
timeout: 1000,
});
await zoomOut(page, 3);
await page
- .getByTestId("searchapiSearch API")
+ .getByTestId("searchapiSearchApi")
.dragTo(page.locator('//*[@id="react-flow-id"]'), {
targetPosition: { x: 100, y: 100 },
});
@@ -78,7 +78,7 @@ test(
await page.getByTestId("fit_view").click();
- await page.getByTestId("title-Search API").first().click();
+ await page.getByTestId("title-SearchApi").first().click();
await page.getByTestId("tool-mode-button").click();
//connection