
    i                     D    d Z ddlmZmZmZ ddlZddlmZ  G d d      Z	y)z
Embedding utilities - Generate vector embeddings using SentenceTransformers
Supports Qwen3 Embedding models through SentenceTransformers interface
    )ListOptionalAnyN)
get_configc                   B   e Zd ZdZddee   defdZddZddZ	dd	Z
dd
ee   dedej                  fdZddededej                  fdZdee   dej                  fdZdee   dej                  fdZd
ee   dej                  fdZd
ee   dej                  fdZy)EmbeddingModelzV
    Embedding model using SentenceTransformers (supports Qwen3 and other models)
    N
model_nameuse_optimizationc                 L   t               }|xs |j                  | _        || _        d | _        d| _        d| _        d| _        t        d| j                          | j                  j                         j                  d      r| j                          y | j                          y )Nr    FzLoading embedding model: qwen3)r   embedding_modelr	   r
   model	dimension
model_typesupports_query_promptprintlower
startswith _init_qwen3_sentence_transformer#_init_standard_sentence_transformer)selfr	   r
   configs       U/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/simplemem/utils/embedding.py__init__zEmbeddingModel.__init__   s    $>(>(> 0
!+0")$//):;< ??  "--g6113446    returnc                     	 ddl m} dddd}|j                  | j                  | j                        }t	        d|        | j
                  r#	  ||dd	d
ddid      | _        t	        d       n ||d      | _        | j                  j                         | _	        d| _
        t        | j                  d      xr dt        | j                  di       v | _        t	        d| j                          | j                  rt	        d       yy# t        $ r(}t	        d| d        ||d      | _        Y d}~d}~ww xY w# t        $ r3}t	        d|        t	        d       | j                          Y d}~yd}~ww xY w)z1Initialize Qwen3 model using SentenceTransformersr   SentenceTransformerzQwen/Qwen3-Embedding-0.6BzQwen/Qwen3-Embedding-4BzQwen/Qwen3-Embedding-8B)z
qwen3-0.6bzqwen3-4bzqwen3-8bz.Loading Qwen3 model via SentenceTransformers: flash_attention_2auto)attn_implementation
device_mappadding_sideleftT)model_kwargstokenizer_kwargstrust_remote_codez0Qwen3 loaded with flash_attention_2 optimizationzFlash attention failed (z), using standard loading...r)   Nqwen3_sentence_transformerpromptsqueryz0Qwen3 model loaded successfully with dimension: zQuery prompt support detectedzFailed to load Qwen3 model: z5Falling back to default SentenceTransformers model...)sentence_transformersr    getr	   r   r
   r   	Exception get_sentence_embedding_dimensionr   r   hasattrgetattrr   !_fallback_to_sentence_transformer)r   r    qwen3_models
model_pathes        r   r   z/EmbeddingModel._init_qwen3_sentence_transformer!   s   0	5A :55L &))$//4??KJB:,OP $$Y!4"3F*0& +9&)A*."DJ LM
 1tT
!ZZHHJDN:DO *1Y)G *GW^

IrX MD& DT^^DTUV))56 * ! Y4QC7STU!4ZSW!XDJJY$  	5045IJ2244	5sC   AE !D 0BE 	D>D94E 9D>>E 	E=
)E88E=c                    	 ddl m}  || j                  d      | _        | j                  j	                         | _        d| _        d| _        t        d| j
                          y	# t        $ r}t        d|         d	}~ww xY w)
z-Initialize standard SentenceTransformer modelr   r   Tr*   sentence_transformerFz1SentenceTransformer model loaded with dimension: z*Failed to load SentenceTransformer model: N)
r.   r    r	   r   r1   r   r   r   r   r0   )r   r    r7   s      r   r   z2EmbeddingModel._init_standard_sentence_transformerU   sx    
	A,T__PTUDJ!ZZHHJDN4DO).D&EdnnEUVW 	>qcBC	s   A$A' '	B0A??Bc                 R    d}t        d|        || _        | j                          y)z-Fallback to default SentenceTransformer modelz&sentence-transformers/all-MiniLM-L6-v2zUsing fallback model: N)r   r	   r   )r   fallback_models     r   r4   z0EmbeddingModel._fallback_to_sentence_transformerc   s+    A&~&678(002r   textsis_queryc                     t        |t              r|g}| j                  dk(  r| j                  r|r| j	                  |      S | j                  |      S )z
        Encode list of texts to vectors

        Args:
        - texts: List of texts to encode
        - is_query: Whether these are query texts (for Qwen3 prompt optimization)
        r+   )
isinstancestrr   r   _encode_with_query_prompt_encode_standard)r   r<   r=   s      r   encodezEmbeddingModel.encodej   sR     eS!GE OO;;**11%88((//r   textc                 0    | j                  |g|      d   S )z
        Encode single text

        Args:
        - text: Text to encode
        - is_query: Whether this is a query text (for Qwen3 prompt optimization)
        r=   r   rC   )r   rD   r=   s      r   encode_singlezEmbeddingModel.encode_single   s     {{D6H{5a88r   queriesc                 (    | j                  |d      S )z@
        Encode queries with optimal settings for Qwen3
        TrF   rG   )r   rI   s     r   encode_queryzEmbeddingModel.encode_query   s     {{7T{22r   	documentsc                 (    | j                  |d      S )z4
        Encode documents (no query prompt)
        FrF   rG   )r   rL   s     r   encode_documentszEmbeddingModel.encode_documents   s     {{9u{55r   c                     	 | j                   j                  |ddd      }|S # t        $ r*}t        d| d       | j	                  |      cY d}~S d}~ww xY w)z%Encode texts using Qwen3 query promptr-   FT)prompt_nameshow_progress_barnormalize_embeddingszQuery prompt encoding failed: z#, falling back to standard encodingN)r   rC   r0   r   rB   )r   r<   
embeddingsr7   s       r   rA   z(EmbeddingModel._encode_with_query_prompt   sh    
	0**#"'%)	 + J  	021#5XYZ((//	0s    # 	AAAAc                 B    | j                   j                  |dd      }|S )z"Encode texts using standard methodFT)rQ   rR   )r   rC   )r   r<   rS   s      r   rB   zEmbeddingModel._encode_standard   s,    ZZ&&#!% ' 


 r   )NT)r   N)F)__name__
__module____qualname____doc__r   r@   boolr   r   r   r4   r   npndarrayrC   rH   rK   rN   rA   rB    r   r   r   r      s    78C= 74 7"25h30DI 0 0"** 0*9# 9 9"** 93DI 3"** 36$s) 6

 60tCy 0RZZ 0d3i BJJ r   r   )
rX   typingr   r   r   numpyrZ   simplemem.configr   r   r\   r   r   <module>r`      s$    ' &  '_ _r   