
    Qi                         d Z ddlZddlmZmZ ddlmZ ddlmZ  ee	          Z
 G d de          Z G d d	e          Z G d
 de          ZdefdZdS )z4Embedding providers for the Second Brain RAG system.    N)ABCabstractmethod)List)setup_loggerc                   r    e Zd ZdZedee         deee                  fd            Zede	fd            Z
dS )EmbeddingProviderz,Abstract base class for embedding providers.textsreturnc                     dS )zGenerate embeddings for a list of texts.

        Args:
            texts: List of text strings to embed.

        Returns:
            List of embedding vectors (one per text).
        N )selfr	   s     6/root/projects/butler/slack_bot/obsidian/embeddings.pyembedzEmbeddingProvider.embed   s	     	    c                     dS )znReturn the embedding vector dimension.

        Returns:
            Embedding vector dimension size.
        Nr   r   s    r   get_dimensionzEmbeddingProvider.get_dimension   s	     	r   N)__name__
__module____qualname____doc__r   r   strfloatr   intr   r   r   r   r   r      sz        66	49 	d5k): 	 	 	 ^	 s    ^  r   r   c                   Z    e Zd ZdZddZdee         deee                  fdZde	fdZ
dS )	QwenEmbeddingProviderz>Cloud embedding provider using Qwen via OpenAI-compatible API.r
   Nc                     t           j                            d          }t           j                            dd          }t           j                            dd          | _        |st	          d          ddlm}  |||	          | _        d S )
NEMBEDDING_API_KEYEMBEDDING_BASE_URLzhttps://openrouter.ai/apiEMBEDDING_MODELzqwen/qwen3-embedding-8bz9EMBEDDING_API_KEY is required for cloud embedding backendr   )OpenAI)api_keybase_url)osenvirongetmodel
ValueErroropenair!   client)r   r"   r#   r!   s       r   __init__zQwenEmbeddingProvider.__init__(   s    *..!455:>>"68STTZ^^$57PQQ
 	ZXYYY!!!!!!fWx@@@r   r	   c                 p    | j         j                            || j                  }d |j        D             S )zEmbed texts using Qwen via OpenAI-compatible API.

        Args:
            texts: List of text strings to embed.

        Returns:
            List of embedding vectors.
        )inputr'   c                     g | ]	}|j         
S r   )	embedding).0items     r   
<listcomp>z/QwenEmbeddingProvider.embed.<locals>.<listcomp>=   s    9994999r   )r*   
embeddingscreater'   data)r   r	   responses      r   r   zQwenEmbeddingProvider.embed3   s9     ;)00uDJ0OO998=9999r   c                     dS )zwReturn embedding dimension for Qwen embedding model.

        Returns:
            Embedding dimension (4096).
        i   r   r   s    r   r   z#QwenEmbeddingProvider.get_dimension?   s	     tr   r
   N)r   r   r   r   r+   r   r   r   r   r   r   r   r   r   r   r   %   s|        HH	A 	A 	A 	A
:49 
:d5k): 
: 
: 
: 
:s      r   r   c                   `    e Zd ZdZd	dZd Zdee         deee                  fdZ	de
fdZdS )
SentenceTransformerProviderzCLocal embedding provider using sentence-transformers (lazy-loaded).r
   Nc                 ^    t           j                            dd          | _        d | _        d S )NEMBEDDING_LOCAL_MODELzall-MiniLM-L6-v2)r$   r%   r&   
model_name_modelr   s    r   r+   z$SentenceTransformerProvider.__init__K   s&    *..)@BTUUr   c                     | j         \	 ddlm} t                              d| j                     || j                  | _         n# t          $ r t          d          w xY w| j         S )z(Lazy-load the SentenceTransformer model.Nr   )SentenceTransformerzLoading local embedding model: zsentence-transformers is not installed.
Run: pip install sentence-transformers
Or set EMBEDDING_BACKEND=cloud to use a remote API instead.)r>   sentence_transformersr@   loggerinfor=   ImportError)r   r@   s     r   
_get_modelz&SentenceTransformerProvider._get_modelO   s    ;	EEEEEEOdoOOPPP11$/BB   !R   {s   =A A!r	   c                     |                                  }|                    |d          }|                                S )zEmbed texts using a local SentenceTransformer model.

        Args:
            texts: List of text strings to embed.

        Returns:
            List of embedding vectors.
        T)convert_to_numpy)rE   encodetolist)r   r	   r'   r3   s       r   r   z!SentenceTransformerProvider.embed^   s:     !!\\%$\??
  """r   c                     dS )zrReturn embedding dimension for all-MiniLM-L6-v2.

        Returns:
            Embedding dimension (384).
        i  r   r   s    r   r   z)SentenceTransformerProvider.get_dimensionk   s	     sr   r8   )r   r   r   r   r+   rE   r   r   r   r   r   r   r   r   r   r:   r:   H   s        MM     #49 #d5k): # # # #s      r   r:   r
   c                     t           j                            dd                                          } | dk    r(t                              d           t                      S t                              d           t                      S )zFactory: return the configured embedding provider.

    Reads EMBEDDING_BACKEND env var (default: "local").

    Returns:
        Configured EmbeddingProvider instance.
    EMBEDDING_BACKENDlocalcloudz%Using cloud (Qwen) embedding providerz4Using local (SentenceTransformer) embedding provider)r$   r%   r&   lowerrB   rC   r   r:   )backends    r   get_embedding_providerrQ   t   so     jnn0'::@@BBG';<<<$&&&
KKFGGG&(((r   )r   r$   abcr   r   typingr   health.utils.logging_configr   r   rB   r   r   r:   rQ   r   r   r   <module>rU      s   : : 				 # # # # # # # #       4 4 4 4 4 4	h		       2         -      F) ) ) ) )"3 ) ) )X) 1 ) ) ) ) ) )r   