diff --git a/src/backend/base/langflow/components/embeddings/__init__.py b/src/backend/base/langflow/components/embeddings/__init__.py index 0d17fe357..e0ab27f16 100644 --- a/src/backend/base/langflow/components/embeddings/__init__.py +++ b/src/backend/base/langflow/components/embeddings/__init__.py @@ -2,6 +2,7 @@ from .aiml import AIMLEmbeddingsComponent from .amazon_bedrock import AmazonBedrockEmbeddingsComponent from .astra_vectorize import AstraVectorizeComponent from .azure_openai import AzureOpenAIEmbeddingsComponent +from .cloudflare import CloudflareWorkersAIEmbeddingsComponent from .cohere import CohereEmbeddingsComponent from .google_generative_ai import GoogleGenerativeAIEmbeddingsComponent from .huggingface_inference_api import HuggingFaceInferenceAPIEmbeddingsComponent @@ -19,6 +20,7 @@ __all__ = [ "AmazonBedrockEmbeddingsComponent", "AstraVectorizeComponent", "AzureOpenAIEmbeddingsComponent", + "CloudflareWorkersAIEmbeddingsComponent", "CohereEmbeddingsComponent", "EmbeddingSimilarityComponent", "GoogleGenerativeAIEmbeddingsComponent", diff --git a/src/backend/base/langflow/components/embeddings/cloudflare.py b/src/backend/base/langflow/components/embeddings/cloudflare.py new file mode 100644 index 000000000..c92959867 --- /dev/null +++ b/src/backend/base/langflow/components/embeddings/cloudflare.py @@ -0,0 +1,80 @@ +from langchain_community.embeddings.cloudflare_workersai import CloudflareWorkersAIEmbeddings + +from langflow.base.models.model import LCModelComponent +from langflow.field_typing import Embeddings +from langflow.io import BoolInput, DictInput, IntInput, MessageTextInput, Output, SecretStrInput + + +class CloudflareWorkersAIEmbeddingsComponent(LCModelComponent): + display_name: str = "Cloudflare Workers AI Embeddings" + description: str = "Generate embeddings using Cloudflare Workers AI models." + documentation: str = "https://python.langchain.com/docs/integrations/text_embedding/cloudflare_workersai/" + icon = "Cloudflare" + name = "CloudflareWorkersAIEmbeddings" + + inputs = [ + MessageTextInput( + name="account_id", + display_name="Cloudflare account ID", + info="Find your account ID https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/#find-account-id-workers-and-pages", + required=True, + ), + SecretStrInput( + name="api_token", + display_name="Cloudflare API token", + info="Create an API token https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", + required=True, + ), + MessageTextInput( + name="model_name", + display_name="Model Name", + info="List of supported models https://developers.cloudflare.com/workers-ai/models/#text-embeddings", + required=True, + value="@cf/baai/bge-base-en-v1.5" + ), + BoolInput( + name="strip_new_lines", + display_name="Strip New Lines", + advanced=True, + value=True, + ), + IntInput( + name="batch_size", + display_name="Batch Size", + advanced=True, + value=50, + ), + MessageTextInput( + name="api_base_url", + display_name="Cloudflare API base URL", + advanced=True, + value="https://api.cloudflare.com/client/v4/accounts", + ), + DictInput( + name="headers", + display_name="Headers", + info="Additional request headers", + is_list=True, + advanced=True, + ), + ] + + outputs = [ + Output(display_name="Embeddings", name="embeddings", method="build_embeddings"), + ] + + def build_embeddings(self) -> Embeddings: + try: + embeddings = CloudflareWorkersAIEmbeddings( + account_id=self.account_id, + api_base_url=self.api_base_url, + api_token=self.api_token, + batch_size=self.batch_size, + headers=self.headers, + model_name=self.model_name, + strip_new_lines=self.strip_new_lines, + ) + except Exception as e: + raise ValueError(f"Could not connect to CloudflareWorkersAIEmbeddings API: {str(e)}") from e + + return embeddings diff --git a/src/frontend/src/icons/Cloudflare/Cloudflare.jsx b/src/frontend/src/icons/Cloudflare/Cloudflare.jsx new file mode 100644 index 000000000..5ce65fba8 --- /dev/null +++ b/src/frontend/src/icons/Cloudflare/Cloudflare.jsx @@ -0,0 +1,14 @@ +const SvgCloudflareIcon = (props) => ( + + + + +); + +export default SvgCloudflareIcon; diff --git a/src/frontend/src/icons/Cloudflare/cloudflare.svg b/src/frontend/src/icons/Cloudflare/cloudflare.svg new file mode 100644 index 000000000..76559f1d1 --- /dev/null +++ b/src/frontend/src/icons/Cloudflare/cloudflare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/frontend/src/icons/Cloudflare/index.tsx b/src/frontend/src/icons/Cloudflare/index.tsx new file mode 100644 index 000000000..529badd4a --- /dev/null +++ b/src/frontend/src/icons/Cloudflare/index.tsx @@ -0,0 +1,9 @@ +import React, { forwardRef } from "react"; +import SvgCloudflareIcon from "./Cloudflare"; + +export const CloudflareIcon = forwardRef< + SVGSVGElement, + React.PropsWithChildren<{}> +>((props, ref) => { + return ; +}); diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index 49fe972ab..5abb70c43 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -241,6 +241,7 @@ import { BotMessageSquareIcon } from "../icons/BotMessageSquare"; import { CassandraIcon } from "../icons/Cassandra"; import { ChromaIcon } from "../icons/ChromaIcon"; import { ClickhouseIcon } from "../icons/Clickhouse"; +import { CloudflareIcon } from "../icons/Cloudflare"; import { CohereIcon } from "../icons/Cohere"; import { ComposioIcon } from "../icons/Composio"; import { ConfluenceIcon } from "../icons/Confluence"; @@ -601,6 +602,7 @@ export const nodeIconsLucide: iconsType = { Chroma: ChromaIcon, Couchbase: CouchbaseIcon, Clickhouse: ClickhouseIcon, + Cloudflare: CloudflareIcon, AirbyteJSONLoader: AirbyteIcon, AmazonBedrockEmbeddings: AWSIcon, Amazon: AWSIcon,