from typing import Any from urllib.parse import urljoin import httpx from typing_extensions import override from langflow.base.embeddings.model import LCEmbeddingsModel from langflow.field_typing import Embeddings from langflow.inputs.inputs import DropdownInput, SecretStrInput from langflow.io import FloatInput, MessageTextInput class LMStudioEmbeddingsComponent(LCEmbeddingsModel): display_name: str = "LM Studio Embeddings" description: str = "Generate embeddings using LM Studio." icon = "LMStudio" @override def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None): if field_name == "model": base_url_dict = build_config.get("base_url", {}) base_url_load_from_db = base_url_dict.get("load_from_db", False) base_url_value = base_url_dict.get("value") if base_url_load_from_db: base_url_value = self.variables(base_url_value) elif not base_url_value: base_url_value = "http://localhost:1234/v1" build_config["model"]["options"] = self.get_model(base_url_value) return build_config def get_model(self, base_url_value: str) -> list[str]: try: url = urljoin(base_url_value, "/v1/models") with httpx.Client() as client: response = client.get(url) response.raise_for_status() data = response.json() return [model["id"] for model in data.get("data", [])] except Exception as e: msg = "Could not retrieve models. Please, make sure the LM Studio server is running." raise ValueError(msg) from e inputs = [ DropdownInput( name="model", display_name="Model", advanced=False, refresh_button=True, ), MessageTextInput( name="base_url", display_name="LM Studio Base URL", refresh_button=True, value="http://localhost:1234/v1", ), SecretStrInput( name="api_key", display_name="LM Studio API Key", advanced=True, value="LMSTUDIO_API_KEY", ), FloatInput( name="temperature", display_name="Model Temperature", value=0.1, advanced=True, ), ] def build_embeddings(self) -> Embeddings: try: from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings except ImportError as e: msg = "Please install langchain-nvidia-ai-endpoints to use LM Studio Embeddings." raise ImportError(msg) from e try: output = NVIDIAEmbeddings( model=self.model, base_url=self.base_url, temperature=self.temperature, nvidia_api_key=self.api_key, ) except Exception as e: msg = f"Could not connect to LM Studio API. Error: {e}" raise ValueError(msg) from e return output