ó
    ^v(jÞ  ã                   ó”   • S r SSKJr  SSKJrJr  SSKrSSKJ	r	  SSK
Jr   " S S\5      r " S	 S
5      rSS\S-  S\S-  S\4S jjrg)z0Embedding generation service for table metadata.é    )ÚEnum)ÚAnyÚListN)Úlogger)Úget_settingsc                   ó    • \ rS rSrSrSrSrSrg)ÚEmbeddingProvideré   zAvailable embedding providers.ÚlocalÚopenai© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚLOCALÚOPENAIÚ__static_attributes__r   ó    Ú1/home/mande/repo/quber/src/quber/db/embeddings.pyr	   r	      s   † Ù(à€EØƒFr   r	   c            	       óØ   • \ rS rSrSr   SS\\-  S\S\S-  4S jjrS\S\4S jrS\4S	 jr	 SS
\
\   S\S\SS4S jjrS
\
\   S\S\SS4S jrS
\
\   SS4S jrS\S\SS4S jrSrg)ÚEmbeddingServiceé   zDGenerate embeddings for table metadata using local or OpenAI models.NÚproviderÚdeviceÚ
model_namec                 ó¶  • [        U[        5      (       a  [        U5      nXl        X l        SU l        SU l        SU l        SU l        U[        R                  :X  a  U R                  U=(       d    SU5        O=U[        R                  :X  a  U R                  U=(       d    S5        O[        SU 35      e[        R                  " SUR                    S35        g)	zÙ
Initialize the embedding service.

Args:
    provider: Embedding provider ('local' or 'openai')
    device: Device for local model ('cuda' or 'cpu')
    model_name: Optional custom model name (defaults per provider)
NÚ r   zBAAI/bge-large-en-v1.5ztext-embedding-3-smallzUnsupported provider: zInitialized z embedding service)Ú
isinstanceÚstrr	   r   r   ÚmodelÚclientr   Úembedding_dimr   Úinit_local_modelr   Úinit_openai_clientÚ
ValueErrorr   ÚinfoÚvalue)Úselfr   r   r   s       r   Ú__init__ÚEmbeddingService.__init__   s¸   € ô �h¤×$Ñ$Ü(¨Ó2ˆHà ŒØŒØˆŒ
ØˆŒØ!ˆŒØ"#ˆÔàÔ(×.Ñ.Ó.Ø×!Ñ! *×"HÐ0HÈ&ÕQØÔ*×1Ñ1Ó1Ø×#Ñ# J×$JÐ2JÕKäÐ5°h°ZÐ@ÓAÐAä�Š�l 8§>¡>Ð"2Ð2DÐEÕFr   c                 óÎ  •  SSK Jn  [        R                  " SU SU 35        U" U5      U l        US:X  a®  SSKnUR                  R                  5       (       aR  U R
                  R                  U5        [        R                  " SU S	UR                  R                  S5       S
35        OT[        R                  " S5        U R
                  R                  S5        SU l        OU R
                  R                  S5        Xl        U R
                  R                  5       U l        [        R                  " SU R                    35        g! [         a  n[        S5      UeSnAff = f)z-Initialize local sentence-transformers model.r   )ÚSentenceTransformerzTsentence-transformers not installed. Install with: pip install sentence-transformersNzLoading local model: z on ÚcudazModel loaded on z (GPU: Ú)zCUDA not available, using CPUÚcpuzModel embedding dimension: )Úsentence_transformersr.   ÚImportErrorr   r(   r"   Útorchr/   Úis_availableÚtoÚsuccessÚget_device_nameÚwarningr   r   Ú get_sentence_embedding_dimensionr$   )r*   r   r   r.   Úerrr4   s         r   r%   Ú!EmbeddingService.init_local_model7   s  € ð	ÝAô 	�ŠÐ+¨J¨<°t¸F¸8ÐDÔEÙ(¨Ó4ˆŒ
ð �VÓÛà�z‰z×&Ñ&×(Ñ(Ø—
‘
—‘˜fÔ%Ü—’Ð!1°&°¸ÀÇÁ×A[ÑA[Ð\]ÓA^Ð@_Ð_`ÐaÕbä—’Ð>Ô?Ø—
‘
—‘˜eÔ$Ø#�•à�J‰J�M‰M˜%Ô à$ŒØ!ŸZ™Z×HÑHÓJˆÔÜ�ŠÐ1°$×2DÑ2DÐ1EÐFÕGøô1 ó 	ÜØfóàðûð	ús   ‚E	 Å	
E$ÅEÅE$c                 ó<  •  SSK Jn  [        5       R                  R
                  nU(       d  [        S5      eU" US9U l        Xl        SU;   a  SOS	U l	        [        R                  " S
U SU R                   S35        g! [         a  n[        S5      UeSnAff = f)zInitialize OpenAI client.r   )ÚOpenAIz6openai not installed. Install with: pip install openaiNz+OPENAI_API_KEY environment variable not set)Úapi_keyz3-smalli   i   zUsing OpenAI model: z (z dims))r   r>   r3   r   ÚllmÚopenai_api_keyr'   r#   r   r$   r   r(   )r*   r   r>   r;   r?   s        r   r&   Ú#EmbeddingService.init_openai_clientU   s—   € ð	aÝ%ô “.×$Ñ$×3Ñ3ˆÞÜÐJÓKÐKá WÑ-ˆŒØ$Œà%.°*Ó%<™TÀ$ˆÔÜ�ŠÐ*¨:¨,°b¸×9KÑ9KÐ8LÈFÐSÕTøô ó 	aÜÐVÓWÐ]`Ð`ûð	aús   ‚B  Â 
BÂ
BÂBÚtextsÚ
batch_sizeÚshow_progressÚreturnznp.ndarray[Any, Any]c                 ó¾   • U(       d  [         R                  " / 5      $ U R                  [        R                  :X  a  U R                  XU5      $ U R                  U5      $ )a  
Generate embeddings for a list of texts.

Args:
    texts: List of text strings to embed
    batch_size: Batch size for processing (local model only)
    show_progress: Show progress bar (local model only)

Returns:
    NumPy array of shape (len(texts), embedding_dim)
)ÚnpÚarrayr   r	   r   Úembed_localÚembed_openai)r*   rC   rD   rE   s       r   ÚembedÚEmbeddingService.embedf   sL   € ö Ü—8’8˜B“<Ðà�=‰=Ô-×3Ñ3Ó3Ø×#Ñ# E°}ÓEÐEà×$Ñ$ UÓ+Ð+r   c                 óˆ   • [         R                  " S[        U5       SU S35        U R                  R	                  XUSS9nU$ )z&Generate embeddings using local model.úGenerating z embeddings (batch_size=r0   T)rD   Úshow_progress_barÚconvert_to_numpy)r   ÚdebugÚlenr"   Úencode)r*   rC   rD   rE   Ú
embeddingss        r   rJ   ÚEmbeddingService.embed_local|   sL   € ä�Š�{¤3 u£: ,Ð.FÀzÀlÐRSÐTÔUØ—Z‘Z×&Ñ&Ø¸MÐ\`ð 'ð 
ˆ
ð Ðr   c                 ó’  • [         R                  " S[        U5       S35        / nSn[        S[        U5      U5       Hl  nXXC-    nU R                  R
                  R                  XPR                  S9nUR                   Vs/ s H  owR                  PM     nnUR                  U5        Mn     [        R                  " U5      $ s  snf )z%Generate embeddings using OpenAI API.rO   z embeddings via OpenAIéd   r   )Úinputr"   )r   rR   rS   Úranger#   rU   Úcreater   ÚdataÚ	embeddingÚextendrH   rI   )	r*   rC   Úall_embeddingsÚ
chunk_sizeÚiÚchunkÚresponseÚitemrU   s	            r   rK   ÚEmbeddingService.embed_openai„   s«   € ä�Š�{¤3 u£: ,Ð.DÐEÔFð ˆØˆ
ä�qœ#˜e›* jÖ1ˆAØ˜a™nÐ-ˆEØ—{‘{×-Ñ-×4Ñ4¸5ÏÉÐ4ÐXˆHØ5=·]²]ÓC²]¨TŸ.œ.±]ˆJÐCØ×!Ñ! *Ö-ñ	 2ô �xŠx˜Ó'Ð'ùò Ds   ÂCÚtitleÚdescriptionc                 ó>   • U SU 3nU R                  U/5      nUS   $ )z÷
Generate embedding for table metadata.

Combines title and description into a single text for embedding.

Args:
    title: Table title (llm_title)
    description: Table description (llm_description)

Returns:
    Embedding vector as NumPy array
z

r   )rL   )r*   rf   rg   ÚtextrU   s        r   Úembed_table_metadataÚ%EmbeddingService.embed_table_metadata•   s.   € ð �˜˜[˜MÐ*ˆà—Z‘Z  Ó'ˆ
Ø˜!‰}Ðr   )r#   r   r$   r"   r   r   )r   r/   N)é    F)r   r   r   r   r   r!   r	   r+   r%   r&   r   ÚintÚboolrL   rJ   rK   rj   r   r   r   r   r   r      sí   † ÙNð -4ØØ!%ñ	GàÐ)Ñ)ðGð ðGð ˜$‘Jõ	GðBH¨3ð H¸ô Hð<U¨Sô Uð$ MRñ,Ø˜#‘Yð,Ø,/ð,ØEIð,à	õ,ð,  c¡ð ¸ð ÈDð ÐUkô ð( $ s¡)ð (Ð0Fô (ð"¨#ð ¸Cð ÐDZ÷ r   r   r   r   rF   c                 óx   • [        5       R                  nU c  UR                  n Uc  UR                  n[	        XS9$ )a)  
Factory function to create an embedding service based on environment config.

Args:
    provider: Override provider (defaults to EMBEDDING_PROVIDER env var or 'local')
    device: Override device (defaults to EMBEDDING_DEVICE env var or 'cuda')

Returns:
    Configured EmbeddingService instance
)r   r   )r   rU   r   r   r   )r   r   Úembedding_settingss      r   Úget_embedding_servicerq   ª   s>   € ô &›×2Ñ2ÐØÑØ%×.Ñ.ˆà�~Ø#×*Ñ*ˆä XÑ=Ð=r   )NN)r   Úenumr   Útypingr   r   ÚnumpyrH   Úlogurur   Úquber.settingsr   r	   r   r!   rq   r   r   r   Ú<module>rw      sS   ðÙ 6å ß ã Ý å 'ô˜ô ÷Tñ Tñn> C¨$¡Jð >¸sÀT¹zð >ÐUeö >r   