ref: sidebar experience improvement with new bundles (#8824)
* cohere sidebar * side bar embeddings * move memories * sort style utils * [autofix.ci] apply automated fixes * serach components add * Update __init__.py * Update styleUtils.ts * [autofix.ci] apply automated fixes * Update model_input_constants.py * fix lint * update to wikipedia * ✨ (tableInputComponent.spec.ts): Refactor test to use for loops for better readability and efficiency ✨ (filterEdge-shard-1.spec.ts): Update model names for better clarity and consistency 🐛 (duckduckgo.spec.ts): Update selector for search button to match changes in the frontend 🐛 (generalBugs-shard-11.spec.ts): Update selector for search button to match changes in the frontend * [autofix.ci] apply automated fixes * update tests path * update tests * Update test_arxiv_component.py * [autofix.ci] apply automated fixes * make embeddings functions --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
This commit is contained in:
parent
dc671ae204
commit
e28093234b
84 changed files with 264 additions and 238 deletions
|
|
@ -5,10 +5,10 @@ from langflow.components.amazon.amazon_bedrock_model import AmazonBedrockCompone
|
||||||
from langflow.components.anthropic.anthropic import AnthropicModelComponent
|
from langflow.components.anthropic.anthropic import AnthropicModelComponent
|
||||||
from langflow.components.azure.azure_openai import AzureChatOpenAIComponent
|
from langflow.components.azure.azure_openai import AzureChatOpenAIComponent
|
||||||
from langflow.components.google.google_generative_ai import GoogleGenerativeAIComponent
|
from langflow.components.google.google_generative_ai import GoogleGenerativeAIComponent
|
||||||
from langflow.components.languagemodels.groq import GroqModel
|
from langflow.components.groq.groq import GroqModel
|
||||||
from langflow.components.languagemodels.sambanova import SambaNovaComponent
|
|
||||||
from langflow.components.nvidia.nvidia import NVIDIAModelComponent
|
from langflow.components.nvidia.nvidia import NVIDIAModelComponent
|
||||||
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
|
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
|
||||||
|
from langflow.components.sambanova.sambanova import SambaNovaComponent
|
||||||
from langflow.inputs.inputs import InputTypes, SecretStrInput
|
from langflow.inputs.inputs import InputTypes, SecretStrInput
|
||||||
from langflow.template.field.base import Input
|
from langflow.template.field.base import Input
|
||||||
|
|
||||||
|
|
@ -125,7 +125,7 @@ def _get_azure_inputs_and_fields():
|
||||||
|
|
||||||
def _get_groq_inputs_and_fields():
|
def _get_groq_inputs_and_fields():
|
||||||
try:
|
try:
|
||||||
from langflow.components.languagemodels.groq import GroqModel
|
from langflow.components.groq.groq import GroqModel
|
||||||
|
|
||||||
groq_inputs = get_filtered_inputs(GroqModel)
|
groq_inputs = get_filtered_inputs(GroqModel)
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
|
|
@ -169,7 +169,7 @@ def _get_amazon_bedrock_inputs_and_fields():
|
||||||
|
|
||||||
def _get_sambanova_inputs_and_fields():
|
def _get_sambanova_inputs_and_fields():
|
||||||
try:
|
try:
|
||||||
from langflow.components.languagemodels.sambanova import SambaNovaComponent
|
from langflow.components.sambanova.sambanova import SambaNovaComponent
|
||||||
|
|
||||||
sambanova_inputs = get_filtered_inputs(SambaNovaComponent)
|
sambanova_inputs = get_filtered_inputs(SambaNovaComponent)
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
|
|
|
||||||
3
src/backend/base/langflow/components/arxiv/__init__.py
Normal file
3
src/backend/base/langflow/components/arxiv/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .arxiv import ArXivComponent
|
||||||
|
|
||||||
|
__all__ = ["ArXivComponent"]
|
||||||
3
src/backend/base/langflow/components/baidu/__init__.py
Normal file
3
src/backend/base/langflow/components/baidu/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .baidu_qianfan_chat import QianfanChatEndpoint
|
||||||
|
|
||||||
|
__all__ = ["QianfanChatEndpoint"]
|
||||||
3
src/backend/base/langflow/components/bing/__init__.py
Normal file
3
src/backend/base/langflow/components/bing/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .bing_search_api import BingSearchAPIComponent
|
||||||
|
|
||||||
|
__all__ = ["BingSearchAPIComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .cloudflare import CloudflareWorkersAIEmbeddingsComponent
|
||||||
|
|
||||||
|
__all__ = ["CloudflareWorkersAIEmbeddingsComponent"]
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
from .cohere_embeddings import CohereEmbeddingsComponent
|
||||||
|
from .cohere_models import CohereComponent
|
||||||
from .cohere_rerank import CohereRerankComponent
|
from .cohere_rerank import CohereRerankComponent
|
||||||
|
|
||||||
__all__ = ["CohereRerankComponent"]
|
__all__ = ["CohereComponent", "CohereEmbeddingsComponent", "CohereRerankComponent"]
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ from langflow.io import SecretStrInput, SliderInput
|
||||||
|
|
||||||
|
|
||||||
class CohereComponent(LCModelComponent):
|
class CohereComponent(LCModelComponent):
|
||||||
display_name = "Cohere"
|
display_name = "Cohere Language Models"
|
||||||
description = "Generate text using Cohere LLMs."
|
description = "Generate text using Cohere LLMs."
|
||||||
documentation = "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/cohere"
|
documentation = "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/cohere"
|
||||||
icon = "Cohere"
|
icon = "Cohere"
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .deepseek import DeepSeekModelComponent
|
||||||
|
|
||||||
|
__all__ = ["DeepSeekModelComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .duck_duck_go_search_run import DuckDuckGoSearchComponent
|
||||||
|
|
||||||
|
__all__ = ["DuckDuckGoSearchComponent"]
|
||||||
|
|
@ -1,15 +1,9 @@
|
||||||
from .cloudflare import CloudflareWorkersAIEmbeddingsComponent
|
|
||||||
from .cohere import CohereEmbeddingsComponent
|
|
||||||
from .lmstudioembeddings import LMStudioEmbeddingsComponent
|
|
||||||
from .mistral import MistralAIEmbeddingsComponent
|
|
||||||
from .similarity import EmbeddingSimilarityComponent
|
from .similarity import EmbeddingSimilarityComponent
|
||||||
from .text_embedder import TextEmbedderComponent
|
from .text_embedder import TextEmbedderComponent
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"CloudflareWorkersAIEmbeddingsComponent",
|
"CloudflareWorkersAIEmbeddingsComponent",
|
||||||
"CohereEmbeddingsComponent",
|
|
||||||
"EmbeddingSimilarityComponent",
|
"EmbeddingSimilarityComponent",
|
||||||
"LMStudioEmbeddingsComponent",
|
|
||||||
"MistralAIEmbeddingsComponent",
|
"MistralAIEmbeddingsComponent",
|
||||||
"TextEmbedderComponent",
|
"TextEmbedderComponent",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ class EmbeddingSimilarityComponent(Component):
|
||||||
display_name: str = "Embedding Similarity"
|
display_name: str = "Embedding Similarity"
|
||||||
description: str = "Compute selected form of similarity between two embedding vectors."
|
description: str = "Compute selected form of similarity between two embedding vectors."
|
||||||
icon = "equal"
|
icon = "equal"
|
||||||
|
legacy: bool = True
|
||||||
|
|
||||||
inputs = [
|
inputs = [
|
||||||
DataInput(
|
DataInput(
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ class TextEmbedderComponent(Component):
|
||||||
display_name: str = "Text Embedder"
|
display_name: str = "Text Embedder"
|
||||||
description: str = "Generate embeddings for a given message using the specified embedding model."
|
description: str = "Generate embeddings for a given message using the specified embedding model."
|
||||||
icon = "binary"
|
icon = "binary"
|
||||||
|
legacy: bool = True
|
||||||
inputs = [
|
inputs = [
|
||||||
HandleInput(
|
HandleInput(
|
||||||
name="embedding_model",
|
name="embedding_model",
|
||||||
|
|
|
||||||
3
src/backend/base/langflow/components/exa/__init__.py
Normal file
3
src/backend/base/langflow/components/exa/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .exa_search import ExaSearchToolkit
|
||||||
|
|
||||||
|
__all__ = ["ExaSearchToolkit"]
|
||||||
3
src/backend/base/langflow/components/glean/__init__.py
Normal file
3
src/backend/base/langflow/components/glean/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .glean_search_api import GleanSearchAPISchema
|
||||||
|
|
||||||
|
__all__ = ["GleanSearchAPISchema"]
|
||||||
3
src/backend/base/langflow/components/groq/__init__.py
Normal file
3
src/backend/base/langflow/components/groq/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .groq import GroqModel
|
||||||
|
|
||||||
|
__all__ = ["GroqModel"]
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
from .baidu_qianfan_chat import QianfanChatEndpointComponent
|
|
||||||
from .cohere import CohereComponent
|
|
||||||
from .deepseek import DeepSeekModelComponent
|
|
||||||
from .groq import GroqModel
|
|
||||||
from .lmstudiomodel import LMStudioModelComponent
|
|
||||||
from .maritalk import MaritalkModelComponent
|
|
||||||
from .mistral import MistralAIModelComponent
|
|
||||||
from .novita import NovitaModelComponent
|
|
||||||
from .openrouter import OpenRouterComponent
|
|
||||||
from .perplexity import PerplexityComponent
|
|
||||||
from .sambanova import SambaNovaComponent
|
|
||||||
from .xai import XAIModelComponent
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"ChatOllamaComponent",
|
|
||||||
"ChatVertexAIComponent",
|
|
||||||
"CohereComponent",
|
|
||||||
"DeepSeekModelComponent",
|
|
||||||
"GroqModel",
|
|
||||||
"HuggingFaceEndpointsComponent",
|
|
||||||
"LMStudioModelComponent",
|
|
||||||
"MaritalkModelComponent",
|
|
||||||
"MistralAIModelComponent",
|
|
||||||
"NovitaModelComponent",
|
|
||||||
"OpenRouterComponent",
|
|
||||||
"PerplexityComponent",
|
|
||||||
"QianfanChatEndpointComponent",
|
|
||||||
"SambaNovaComponent",
|
|
||||||
"WatsonxAIComponent",
|
|
||||||
"XAIModelComponent",
|
|
||||||
]
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
from .lmstudioembeddings import LMStudioEmbeddingsComponent
|
||||||
|
from .lmstudiomodel import LMStudioModelComponent
|
||||||
|
|
||||||
|
__all__ = ["LMStudioEmbeddingsComponent", "LMStudioModelComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .maritalk import MaritalkModelComponent
|
||||||
|
|
||||||
|
__all__ = ["MaritalkModelComponent"]
|
||||||
3
src/backend/base/langflow/components/mem0/__init__.py
Normal file
3
src/backend/base/langflow/components/mem0/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .mem0_chat_memory import Mem0MemoryComponent
|
||||||
|
|
||||||
|
__all__ = ["Mem0MemoryComponent"]
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
from .mem0_chat_memory import Mem0MemoryComponent
|
|
||||||
from .redis import RedisIndexChatMemory
|
|
||||||
from .zep import ZepChatMemory
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"Mem0MemoryComponent",
|
|
||||||
"RedisIndexChatMemory",
|
|
||||||
"ZepChatMemory",
|
|
||||||
]
|
|
||||||
4
src/backend/base/langflow/components/mistral/__init__.py
Normal file
4
src/backend/base/langflow/components/mistral/__init__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
from .mistral import MistralAIModelComponent
|
||||||
|
from .mistral_embeddings import MistralAIEmbeddingsComponent
|
||||||
|
|
||||||
|
__all__ = ["MistralAIEmbeddingsComponent", "MistralAIModelComponent"]
|
||||||
3
src/backend/base/langflow/components/novita/__init__.py
Normal file
3
src/backend/base/langflow/components/novita/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .novita import NovitaModelComponent
|
||||||
|
|
||||||
|
__all__ = ["NovitaModelComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .openrouter import OpenRouterComponent
|
||||||
|
|
||||||
|
__all__ = ["OpenRouterComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .perplexity import PerplexityComponent
|
||||||
|
|
||||||
|
__all__ = ["PerplexityComponent"]
|
||||||
3
src/backend/base/langflow/components/redis/__init__.py
Normal file
3
src/backend/base/langflow/components/redis/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .redis import RedisIndexChatMemory
|
||||||
|
|
||||||
|
__all__ = ["RedisIndexChatMemory"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .sambanova import SambaNovaComponent
|
||||||
|
|
||||||
|
__all__ = ["SambaNovaComponent"]
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
from .arxiv import ArXivComponent
|
|
||||||
from .bing_search_api import BingSearchAPIComponent
|
|
||||||
from .duck_duck_go_search_run import DuckDuckGoSearchComponent
|
|
||||||
from .exa_search import ExaSearchToolkit
|
|
||||||
from .glean_search_api import GleanSearchAPISchema
|
|
||||||
from .google_search_api_core import GoogleSearchAPICore
|
|
||||||
from .google_serper_api_core import GoogleSerperAPICore
|
|
||||||
from .search import SearchComponent
|
|
||||||
from .serp import SerpComponent
|
|
||||||
from .wikidata import WikidataComponent
|
|
||||||
from .wikipedia import WikipediaComponent
|
|
||||||
from .wolfram_alpha_api import WolframAlphaAPIComponent
|
|
||||||
from .yahoo import YahooFinanceSchema
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"ArXivComponent",
|
|
||||||
"BingSearchAPIComponent",
|
|
||||||
"DuckDuckGoSearchComponent",
|
|
||||||
"ExaSearchToolkit",
|
|
||||||
"GleanSearchAPISchema",
|
|
||||||
"GoogleSearchAPICore",
|
|
||||||
"GoogleSerperAPICore",
|
|
||||||
"SearchComponent",
|
|
||||||
"SerpComponent",
|
|
||||||
"WikidataComponent",
|
|
||||||
"WikipediaComponent",
|
|
||||||
"WolframAlphaAPIComponent",
|
|
||||||
"YahooFinanceSchema",
|
|
||||||
]
|
|
||||||
3
src/backend/base/langflow/components/serpapi/__init__.py
Normal file
3
src/backend/base/langflow/components/serpapi/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .serp import SerpComponent
|
||||||
|
|
||||||
|
__all__ = ["SerpComponent"]
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
from .wikidata import WikidataComponent
|
||||||
|
from .wikipedia import WikipediaComponent
|
||||||
|
|
||||||
|
__all__ = ["WikidataComponent", "WikipediaComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .wolfram_alpha_api import WolframAlphaAPIComponent
|
||||||
|
|
||||||
|
__all__ = ["WolframAlphaAPIComponent"]
|
||||||
3
src/backend/base/langflow/components/xai/__init__.py
Normal file
3
src/backend/base/langflow/components/xai/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .xai import XAIModelComponent
|
||||||
|
|
||||||
|
__all__ = ["XAIModelComponent"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .yahoo import YfinanceComponent
|
||||||
|
|
||||||
|
__all__ = ["YfinanceComponent"]
|
||||||
3
src/backend/base/langflow/components/zep/__init__.py
Normal file
3
src/backend/base/langflow/components/zep/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .zep import ZepChatMemory
|
||||||
|
|
||||||
|
__all__ = ["ZepChatMemory"]
|
||||||
|
|
@ -3,7 +3,7 @@ import os
|
||||||
import pytest
|
import pytest
|
||||||
from langchain.schema import HumanMessage
|
from langchain.schema import HumanMessage
|
||||||
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
|
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
|
||||||
from langflow.components.languagemodels.baidu_qianfan_chat import QianfanChatEndpointComponent
|
from langflow.components.baidu.baidu_qianfan_chat import QianfanChatEndpointComponent
|
||||||
from qianfan.errors import APIError
|
from qianfan.errors import APIError
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langflow.components.languagemodels import DeepSeekModelComponent
|
from langflow.components.deepseek.deepseek import DeepSeekModelComponent
|
||||||
from langflow.custom.custom_component.component import Component
|
from langflow.custom.custom_component.component import Component
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langflow.components.languagemodels import XAIModelComponent
|
from langflow.components.xai.xai import XAIModelComponent
|
||||||
from langflow.custom.custom_component.component import Component
|
from langflow.custom.custom_component.component import Component
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
from langflow.inputs.inputs import (
|
from langflow.inputs.inputs import (
|
||||||
|
|
@ -101,7 +101,7 @@ class TestXAIComponent(ComponentTestBaseWithoutClient):
|
||||||
component.base_url = "https://api.x.ai/v1"
|
component.base_url = "https://api.x.ai/v1"
|
||||||
component.seed = 1
|
component.seed = 1
|
||||||
|
|
||||||
mock_chat_openai = mocker.patch("langflow.components.languagemodels.xai.ChatOpenAI", return_value=MagicMock())
|
mock_chat_openai = mocker.patch("langflow.components.xai.xai.ChatOpenAI", return_value=MagicMock())
|
||||||
model = component.build_model()
|
model = component.build_model()
|
||||||
mock_chat_openai.assert_called_once_with(
|
mock_chat_openai.assert_called_once_with(
|
||||||
max_tokens=100,
|
max_tokens=100,
|
||||||
|
|
@ -156,7 +156,7 @@ class TestXAIComponent(ComponentTestBaseWithoutClient):
|
||||||
component.seed = 1
|
component.seed = 1
|
||||||
|
|
||||||
mocker.patch(
|
mocker.patch(
|
||||||
"langflow.components.languagemodels.xai.ChatOpenAI",
|
"langflow.components.xai.xai.ChatOpenAI",
|
||||||
side_effect=BadRequestError(
|
side_effect=BadRequestError(
|
||||||
message="Invalid API key",
|
message="Invalid API key",
|
||||||
response=MagicMock(),
|
response=MagicMock(),
|
||||||
|
|
@ -181,7 +181,7 @@ class TestXAIComponent(ComponentTestBaseWithoutClient):
|
||||||
mock_instance = MagicMock()
|
mock_instance = MagicMock()
|
||||||
mock_bound_instance = MagicMock()
|
mock_bound_instance = MagicMock()
|
||||||
mock_instance.bind.return_value = mock_bound_instance
|
mock_instance.bind.return_value = mock_bound_instance
|
||||||
mocker.patch("langflow.components.languagemodels.xai.ChatOpenAI", return_value=mock_instance)
|
mocker.patch("langflow.components.xai.xai.ChatOpenAI", return_value=mock_instance)
|
||||||
|
|
||||||
model = component.build_model()
|
model = component.build_model()
|
||||||
mock_instance.bind.assert_called_once_with(response_format={"type": "json_object"})
|
mock_instance.bind.assert_called_once_with(response_format={"type": "json_object"})
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ from tests.base import ComponentTestBaseWithClient
|
||||||
class TestArXivComponent(ComponentTestBaseWithClient):
|
class TestArXivComponent(ComponentTestBaseWithClient):
|
||||||
def test_component_versions(self, default_kwargs, file_names_mapping):
|
def test_component_versions(self, default_kwargs, file_names_mapping):
|
||||||
"""Test component compatibility across versions."""
|
"""Test component compatibility across versions."""
|
||||||
from langflow.components.search.arxiv import ArXivComponent
|
from langflow.components.arxiv.arxiv import ArXivComponent
|
||||||
|
|
||||||
# Test current version
|
# Test current version
|
||||||
component = ArXivComponent(**default_kwargs)
|
component = ArXivComponent(**default_kwargs)
|
||||||
|
|
@ -31,7 +31,7 @@ class TestArXivComponent(ComponentTestBaseWithClient):
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def component_class(self):
|
def component_class(self):
|
||||||
from langflow.components.search.arxiv import ArXivComponent
|
from langflow.components.arxiv.arxiv import ArXivComponent
|
||||||
|
|
||||||
return ArXivComponent
|
return ArXivComponent
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pytest
|
import pytest
|
||||||
from langflow.components.search import GoogleSearchAPICore
|
from langflow.components.google.google_search_api_core import GoogleSearchAPICore
|
||||||
from langflow.schema import DataFrame
|
from langflow.schema import DataFrame
|
||||||
|
|
||||||
from tests.base import ComponentTestBaseWithoutClient
|
from tests.base import ComponentTestBaseWithoutClient
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langflow.components.search import GoogleSerperAPICore
|
from langflow.components.google.google_serper_api_core import GoogleSerperAPICore
|
||||||
from langflow.schema import DataFrame
|
from langflow.schema import DataFrame
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from unittest.mock import MagicMock, patch
|
||||||
import httpx
|
import httpx
|
||||||
import pytest
|
import pytest
|
||||||
from langchain_core.tools import ToolException
|
from langchain_core.tools import ToolException
|
||||||
from langflow.components.search import WikidataComponent
|
from langflow.components.wikipedia import WikidataComponent
|
||||||
from langflow.custom import Component
|
from langflow.custom import Component
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langflow.components.search import WikipediaComponent
|
from langflow.components.wikipedia import WikipediaComponent
|
||||||
from langflow.custom import Component
|
from langflow.custom import Component
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langchain_core.tools import ToolException
|
from langchain_core.tools import ToolException
|
||||||
from langflow.components.search.yahoo import YahooFinanceMethod, YfinanceComponent
|
from langflow.components.yahoosearch.yahoo import YahooFinanceMethod, YfinanceComponent
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
from langflow.schema import Data
|
from langflow.schema import Data
|
||||||
|
|
||||||
|
|
@ -37,7 +37,7 @@ class TestYfinanceComponent:
|
||||||
for input_name in expected_inputs:
|
for input_name in expected_inputs:
|
||||||
assert input_name in input_names
|
assert input_name in input_names
|
||||||
|
|
||||||
@patch("langflow.components.search.yahoo.yf.Ticker")
|
@patch("langflow.components.yahoosearch.yahoo.yf.Ticker")
|
||||||
def test_fetch_info(self, mock_ticker, component_class, default_kwargs):
|
def test_fetch_info(self, mock_ticker, component_class, default_kwargs):
|
||||||
component = component_class(**default_kwargs)
|
component = component_class(**default_kwargs)
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ class TestYfinanceComponent:
|
||||||
assert len(result) == 1
|
assert len(result) == 1
|
||||||
assert "Apple Inc." in result[0].text
|
assert "Apple Inc." in result[0].text
|
||||||
|
|
||||||
@patch("langflow.components.search.yahoo.yf.Ticker")
|
@patch("langflow.components.yahoosearch.yahoo.yf.Ticker")
|
||||||
def test_fetch_news(self, mock_ticker, component_class):
|
def test_fetch_news(self, mock_ticker, component_class):
|
||||||
component = component_class(symbol="AAPL", method=YahooFinanceMethod.GET_NEWS, num_news=2)
|
component = component_class(symbol="AAPL", method=YahooFinanceMethod.GET_NEWS, num_news=2)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from langchain_core.tools import ToolException
|
from langchain_core.tools import ToolException
|
||||||
from langflow.components.search import SerpComponent
|
from langflow.components.serpapi.serp import SerpComponent
|
||||||
from langflow.custom import Component
|
from langflow.custom import Component
|
||||||
from langflow.custom.utils import build_custom_component_template
|
from langflow.custom.utils import build_custom_component_template
|
||||||
from langflow.schema import Data
|
from langflow.schema import Data
|
||||||
|
|
@ -34,7 +34,7 @@ def test_serpapi_template():
|
||||||
assert input_name in input_names
|
assert input_name in input_names
|
||||||
|
|
||||||
|
|
||||||
@patch("langflow.components.search.serp.SerpAPIWrapper")
|
@patch("langflow.components.serpapi.serp.SerpAPIWrapper")
|
||||||
def test_fetch_content(mock_serpapi_wrapper):
|
def test_fetch_content(mock_serpapi_wrapper):
|
||||||
component = SerpComponent()
|
component = SerpComponent()
|
||||||
component.serpapi_api_key = "test-key"
|
component.serpapi_api_key = "test-key"
|
||||||
|
|
@ -81,7 +81,7 @@ def test_error_handling():
|
||||||
component.serpapi_api_key = "test-key"
|
component.serpapi_api_key = "test-key"
|
||||||
component.input_value = "test query"
|
component.input_value = "test query"
|
||||||
|
|
||||||
with patch("langflow.components.search.serp.SerpAPIWrapper") as mock_serpapi:
|
with patch("langflow.components.serpapi.serp.SerpAPIWrapper") as mock_serpapi:
|
||||||
mock_instance = MagicMock()
|
mock_instance = MagicMock()
|
||||||
mock_serpapi.return_value = mock_instance
|
mock_serpapi.return_value = mock_instance
|
||||||
mock_instance.results.side_effect = Exception("API Error")
|
mock_instance.results.side_effect = Exception("API Error")
|
||||||
|
|
|
||||||
|
|
@ -228,69 +228,87 @@ export const SIDEBAR_CATEGORIES = [
|
||||||
];
|
];
|
||||||
|
|
||||||
export const SIDEBAR_BUNDLES = [
|
export const SIDEBAR_BUNDLES = [
|
||||||
{
|
|
||||||
display_name: "Language Models",
|
|
||||||
name: "languagemodels",
|
|
||||||
icon: "BrainCircuit",
|
|
||||||
},
|
|
||||||
{ display_name: "Embeddings", name: "embeddings", icon: "Binary" },
|
|
||||||
{ display_name: "Memories", name: "memories", icon: "Cpu" },
|
|
||||||
{ display_name: "AI/ML", name: "aiml", icon: "AI/ML" },
|
{ display_name: "AI/ML", name: "aiml", icon: "AI/ML" },
|
||||||
{ display_name: "Anthropic", name: "anthropic", icon: "Anthropic" },
|
|
||||||
{ display_name: "Amazon", name: "amazon", icon: "Amazon" },
|
|
||||||
// Add apify
|
|
||||||
{ display_name: "Apify", name: "apify", icon: "Apify" },
|
|
||||||
{ display_name: "LangChain", name: "langchain_utilities", icon: "LangChain" },
|
|
||||||
{ display_name: "AgentQL", name: "agentql", icon: "AgentQL" },
|
{ 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: "AssemblyAI", name: "assemblyai", icon: "AssemblyAI" },
|
{ display_name: "AssemblyAI", name: "assemblyai", icon: "AssemblyAI" },
|
||||||
{ display_name: "Azure", name: "azure", icon: "Azure" },
|
{ display_name: "Azure", name: "azure", icon: "Azure" },
|
||||||
{
|
{ display_name: "Baidu", name: "baidu", icon: "BaiduQianfan" },
|
||||||
display_name: "DataStax",
|
{ display_name: "Bing", name: "bing", icon: "Bing" },
|
||||||
name: "datastax",
|
{ display_name: "Cleanlab", name: "cleanlab", icon: "Cleanlab" },
|
||||||
icon: "AstraDB",
|
{ display_name: "Cloudflare", name: "cloudflare", icon: "Cloudflare" },
|
||||||
},
|
{ display_name: "Cohere", name: "cohere", icon: "Cohere" },
|
||||||
|
{ display_name: "Composio", name: "composio", icon: "Composio" },
|
||||||
|
{ display_name: "Confluence", name: "confluence", icon: "Confluence" },
|
||||||
|
{ display_name: "CrewAI", name: "crewai", icon: "CrewAI" },
|
||||||
|
{ display_name: "DataStax", name: "datastax", icon: "AstraDB" },
|
||||||
|
{ display_name: "DeepSeek", name: "deepseek", icon: "DeepSeek" },
|
||||||
{ display_name: "Docling", name: "docling", icon: "Docling" },
|
{ display_name: "Docling", name: "docling", icon: "Docling" },
|
||||||
{ display_name: "Gmail", name: "gmail", icon: "Gmail" },
|
{ display_name: "DuckDuckGo", name: "duckduckgo", icon: "DuckDuckGo" },
|
||||||
|
{ display_name: "Embeddings", name: "embeddings", icon: "Binary" },
|
||||||
|
{ display_name: "Exa", name: "exa", icon: "Exa" },
|
||||||
|
{ display_name: "Firecrawl", name: "firecrawl", icon: "FirecrawlCrawlApi" },
|
||||||
|
{ display_name: "Git", name: "git", icon: "GitLoader" },
|
||||||
{ display_name: "GitHub", name: "github", icon: "Github" },
|
{ display_name: "GitHub", name: "github", icon: "Github" },
|
||||||
|
{ display_name: "Glean", name: "glean", icon: "Glean" },
|
||||||
|
{ display_name: "Gmail", name: "gmail", icon: "Gmail" },
|
||||||
|
{ display_name: "Google", name: "google", icon: "Google" },
|
||||||
{
|
{
|
||||||
display_name: "Googlecalendar",
|
display_name: "Googlecalendar",
|
||||||
name: "googlecalendar",
|
name: "googlecalendar",
|
||||||
icon: "Googlecalendar",
|
icon: "Googlecalendar",
|
||||||
},
|
},
|
||||||
{ display_name: "HuggingFace", name: "huggingface", icon: "HuggingFace" },
|
{ display_name: "Groq", name: "groq", icon: "Groq" },
|
||||||
{ display_name: "IBM", name: "ibm", icon: "WatsonxAI" },
|
|
||||||
{ display_name: "LangWatch", name: "langwatch", icon: "Langwatch" },
|
|
||||||
{ display_name: "Olivya", name: "olivya", icon: "Olivya" },
|
|
||||||
{ display_name: "Outlook", name: "outlook", icon: "Outlook" },
|
|
||||||
{ display_name: "OpenAI", name: "openai", icon: "OpenAI" },
|
|
||||||
{ display_name: "Notion", name: "Notion", icon: "Notion" },
|
|
||||||
{ display_name: "Needle", name: "needle", icon: "Needle" },
|
|
||||||
{ display_name: "NVIDIA", name: "nvidia", icon: "NVIDIA" },
|
|
||||||
{ display_name: "Vectara", name: "vectara", icon: "Vectara" },
|
|
||||||
{ display_name: "Icosa Computing", name: "icosacomputing", icon: "Icosa" },
|
|
||||||
{ display_name: "Google", name: "google", icon: "Google" },
|
|
||||||
{ display_name: "CrewAI", name: "crewai", icon: "CrewAI" },
|
|
||||||
{ display_name: "NotDiamond", name: "notdiamond", icon: "NotDiamond" },
|
|
||||||
{ display_name: "Composio", name: "composio", icon: "Composio" },
|
|
||||||
{ display_name: "Cohere", name: "cohere", icon: "Cohere" },
|
|
||||||
{ display_name: "Firecrawl", name: "firecrawl", icon: "FirecrawlCrawlApi" },
|
|
||||||
{ display_name: "Unstructured", name: "unstructured", icon: "Unstructured" },
|
|
||||||
{ display_name: "Git", name: "git", icon: "GitLoader" },
|
|
||||||
{ display_name: "Confluence", name: "confluence", icon: "Confluence" },
|
|
||||||
{ display_name: "Mem0", name: "mem0", icon: "Mem0" },
|
|
||||||
{ display_name: "Youtube", name: "youtube", icon: "YouTube" },
|
|
||||||
{ display_name: "ScrapeGraph AI", name: "scrapegraph", icon: "ScrapeGraph" },
|
|
||||||
{ display_name: "Twelve Labs", name: "twelvelabs", icon: "TwelveLabs" },
|
|
||||||
{
|
{
|
||||||
display_name: "Home Assistant",
|
display_name: "Home Assistant",
|
||||||
name: "homeassistant",
|
name: "homeassistant",
|
||||||
icon: "HomeAssistant",
|
icon: "HomeAssistant",
|
||||||
},
|
},
|
||||||
{ display_name: "Cleanlab", name: "cleanlab", icon: "Cleanlab" },
|
{ display_name: "HuggingFace", name: "huggingface", icon: "HuggingFace" },
|
||||||
{ display_name: "Search", name: "search", icon: "Search" },
|
{ display_name: "IBM", name: "ibm", icon: "WatsonxAI" },
|
||||||
{ display_name: "Tavily", name: "tavily", icon: "TavilyIcon" },
|
{ display_name: "Icosa Computing", name: "icosacomputing", icon: "Icosa" },
|
||||||
|
{ display_name: "LangChain", name: "langchain_utilities", icon: "LangChain" },
|
||||||
|
{ display_name: "LangWatch", name: "langwatch", icon: "Langwatch" },
|
||||||
|
{ display_name: "LMStudio", name: "lmstudio", icon: "LMStudio" },
|
||||||
|
{ display_name: "MariTalk", name: "maritalk", icon: "MariTalk" },
|
||||||
|
{ display_name: "Mem0", name: "mem0", icon: "Mem0" },
|
||||||
|
{ 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: "Notion", name: "Notion", icon: "Notion" },
|
||||||
|
{ display_name: "Novita", name: "novita", icon: "Novita" },
|
||||||
|
{ display_name: "NVIDIA", name: "nvidia", icon: "NVIDIA" },
|
||||||
|
{ display_name: "Olivya", name: "olivya", icon: "Olivya" },
|
||||||
{ display_name: "Ollama", name: "ollama", icon: "Ollama" },
|
{ display_name: "Ollama", name: "ollama", icon: "Ollama" },
|
||||||
|
{ display_name: "OpenAI", name: "openai", icon: "OpenAI" },
|
||||||
|
{ display_name: "OpenRouter", name: "openrouter", icon: "OpenRouter" },
|
||||||
|
{ display_name: "Outlook", name: "outlook", icon: "Outlook" },
|
||||||
|
{ display_name: "Perplexity", name: "perplexity", icon: "Perplexity" },
|
||||||
|
{ 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: "SerpApi", name: "serpapi", icon: "SerpSearch" },
|
||||||
|
{ display_name: "Tavily", name: "tavily", icon: "TavilyIcon" },
|
||||||
|
{ display_name: "Twelve Labs", 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: "VertexAI", name: "vertexai", icon: "VertexAI" },
|
||||||
|
{ display_name: "Wikipedia", name: "wikipedia", icon: "Wikipedia" },
|
||||||
|
{
|
||||||
|
display_name: "WolframAlpha",
|
||||||
|
name: "wolframalpha",
|
||||||
|
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: "Zep", name: "zep", icon: "ZepMemory" },
|
||||||
];
|
];
|
||||||
|
|
||||||
export const categoryIcons: Record<string, string> = {
|
export const categoryIcons: Record<string, string> = {
|
||||||
|
|
|
||||||
|
|
@ -177,13 +177,14 @@ class CustomComponent(Component):
|
||||||
const visibleTexts = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"];
|
const visibleTexts = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"];
|
||||||
const notVisibleTexts = ["X1", "thirdRandomText"];
|
const notVisibleTexts = ["X1", "thirdRandomText"];
|
||||||
|
|
||||||
await Promise.all(
|
for (const text of visibleTexts) {
|
||||||
visibleTexts.map((text) => expect(page.getByText(text)).toBeVisible()),
|
const count = await page.getByText(text).count();
|
||||||
);
|
expect(count).toBeGreaterThanOrEqual(1);
|
||||||
await Promise.all(
|
}
|
||||||
notVisibleTexts.map((text) =>
|
|
||||||
expect(page.getByText(text)).not.toBeVisible(),
|
for (const text of notVisibleTexts) {
|
||||||
),
|
const count = await page.getByText(text).count();
|
||||||
);
|
expect(count).toBe(0);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ test(
|
||||||
"vectorstoresAstra DB",
|
"vectorstoresAstra DB",
|
||||||
"langchain_utilitiesTool Calling Agent",
|
"langchain_utilitiesTool Calling Agent",
|
||||||
"langchain_utilitiesConversationChain",
|
"langchain_utilitiesConversationChain",
|
||||||
"memoriesMem0 Chat Memory",
|
"mem0Mem0 Chat Memory",
|
||||||
"logicCondition",
|
"logicCondition",
|
||||||
"langchain_utilitiesSelf Query Retriever",
|
"langchain_utilitiesSelf Query Retriever",
|
||||||
"langchain_utilitiesCharacterTextSplitter",
|
"langchain_utilitiesCharacterTextSplitter",
|
||||||
|
|
@ -101,15 +101,15 @@ test(
|
||||||
await page.getByTestId("sidebar-search-input").click();
|
await page.getByTestId("sidebar-search-input").click();
|
||||||
|
|
||||||
const visibleModelSpecsTestIds = [
|
const visibleModelSpecsTestIds = [
|
||||||
"languagemodelsCohere",
|
"cohereCohere Language Models",
|
||||||
"languagemodelsGroq",
|
"groqGroq",
|
||||||
"languagemodelsLM Studio",
|
"lmstudioLM Studio",
|
||||||
"languagemodelsMaritalk",
|
"maritalkMaritalk",
|
||||||
"languagemodelsMistralAI",
|
"mistralMistralAI",
|
||||||
"languagemodelsPerplexity",
|
"perplexityPerplexity",
|
||||||
"languagemodelsQianfan",
|
"baiduQianfan",
|
||||||
"languagemodelsSambaNova",
|
"sambanovaSambaNova",
|
||||||
"languagemodelsxAI",
|
"xaixAI",
|
||||||
];
|
];
|
||||||
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,15 @@ test(
|
||||||
await page.getByTestId("sidebar-search-input").click();
|
await page.getByTestId("sidebar-search-input").click();
|
||||||
await page.getByTestId("sidebar-search-input").fill("duck");
|
await page.getByTestId("sidebar-search-input").fill("duck");
|
||||||
|
|
||||||
await page.waitForSelector('[data-testid="searchDuckDuckGo Search"]', {
|
await page.waitForSelector(
|
||||||
|
'[data-testid="disclosure-bundles-duckduckgo"]',
|
||||||
|
{
|
||||||
timeout: 3000,
|
timeout: 3000,
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
await page
|
await page
|
||||||
.getByTestId("searchDuckDuckGo Search")
|
.getByTestId("duckduckgoDuckDuckGo Search")
|
||||||
.hover()
|
.hover()
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
await page
|
await page
|
||||||
|
|
|
||||||
|
|
@ -49,14 +49,14 @@ test(
|
||||||
|
|
||||||
await page.getByTestId("sidebar-search-input").click();
|
await page.getByTestId("sidebar-search-input").click();
|
||||||
await page.getByTestId("sidebar-search-input").fill("search api");
|
await page.getByTestId("sidebar-search-input").fill("search api");
|
||||||
await page.waitForSelector('[data-testid="searchSearch API"]', {
|
await page.waitForSelector('[data-testid="searchapiSearch API"]', {
|
||||||
timeout: 1000,
|
timeout: 1000,
|
||||||
});
|
});
|
||||||
|
|
||||||
await zoomOut(page, 3);
|
await zoomOut(page, 3);
|
||||||
|
|
||||||
await page
|
await page
|
||||||
.getByTestId("searchSearch API")
|
.getByTestId("searchapiSearch API")
|
||||||
.dragTo(page.locator('//*[@id="react-flow-id"]'), {
|
.dragTo(page.locator('//*[@id="react-flow-id"]'), {
|
||||||
targetPosition: { x: 100, y: 100 },
|
targetPosition: { x: 100, y: 100 },
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue