embedding.py 1.45 KB
"""Embedding provider - HTTP service."""

from __future__ import annotations

from config.services_config import (
    get_embedding_config,
    get_embedding_image_base_url,
    get_embedding_text_base_url,
)


def create_embedding_provider() -> "EmbeddingProvider":
    """Create embedding provider from services config."""
    cfg = get_embedding_config()
    provider = (cfg.provider or "http").strip().lower()
    if provider != "http":
        raise ValueError(f"Unsupported embedding provider: {provider}")
    return EmbeddingProvider()


class EmbeddingProvider:
    """
    Provides text and image encoders. Both use HTTP embedding service
    configured via services_config.
    """

    def __init__(self) -> None:
        self._text_base_url = get_embedding_text_base_url()
        self._image_base_url = get_embedding_image_base_url()
        from embeddings.text_encoder import TextEmbeddingEncoder
        from embeddings.image_encoder import CLIPImageEncoder

        # Initialize once; avoid per-access instantiation.
        self._text_encoder = TextEmbeddingEncoder(service_url=self._text_base_url)
        self._image_encoder = CLIPImageEncoder(service_url=self._image_base_url)

    @property
    def text_encoder(self):
        """Pre-initialized text encoder (TextEmbeddingEncoder)."""
        return self._text_encoder

    @property
    def image_encoder(self):
        """Pre-initialized image encoder (CLIPImageEncoder)."""
        return self._image_encoder