Spaces:
Running
Running
import logging | |
from typing import TYPE_CHECKING | |
from langflow.custom import Component | |
from langflow.io import HandleInput, MessageInput, Output | |
from langflow.schema import Data | |
if TYPE_CHECKING: | |
from langflow.field_typing import Embeddings | |
from langflow.schema.message import Message | |
class TextEmbedderComponent(Component): | |
display_name: str = "Text Embedder" | |
description: str = "Generate embeddings for a given message using the specified embedding model." | |
icon = "binary" | |
inputs = [ | |
HandleInput( | |
name="embedding_model", | |
display_name="Embedding Model", | |
info="The embedding model to use for generating embeddings.", | |
input_types=["Embeddings"], | |
), | |
MessageInput( | |
name="message", | |
display_name="Message", | |
info="The message to generate embeddings for.", | |
), | |
] | |
outputs = [ | |
Output(display_name="Embedding Data", name="embeddings", method="generate_embeddings"), | |
] | |
def generate_embeddings(self) -> Data: | |
try: | |
embedding_model: Embeddings = self.embedding_model | |
message: Message = self.message | |
# Validate embedding model | |
if not embedding_model: | |
msg = "Embedding model not provided" | |
raise ValueError(msg) | |
# Extract the text content from the message | |
text_content = message.text if message and message.text else "" | |
if not text_content: | |
msg = "No text content found in message" | |
raise ValueError(msg) | |
# Check if the embedding model has the required attributes | |
if not hasattr(embedding_model, "client") or not embedding_model.client: | |
msg = "Embedding model client not properly initialized" | |
raise ValueError(msg) | |
# Ensure the base URL has proper protocol | |
if hasattr(embedding_model.client, "base_url"): | |
base_url = embedding_model.client.base_url | |
if not base_url.startswith(("http://", "https://")): | |
embedding_model.client.base_url = f"https://{base_url}" | |
# Generate embeddings using the provided embedding model | |
embeddings = embedding_model.embed_documents([text_content]) | |
# Validate embeddings output | |
if not embeddings or not isinstance(embeddings, list): | |
msg = "Invalid embeddings generated" | |
raise ValueError(msg) | |
embedding_vector = embeddings[0] | |
except Exception as e: | |
logging.exception("Error generating embeddings") | |
# Return empty data with error status | |
error_data = Data(data={"text": "", "embeddings": [], "error": str(e)}) | |
self.status = {"error": str(e)} | |
return error_data | |
# Create a Data object to encapsulate the results | |
result_data = Data(data={"text": text_content, "embeddings": embedding_vector}) | |
self.status = {"text": text_content, "embeddings": embedding_vector} | |
return result_data | |