Ë
    §‘ˆj‡  ã                   óÐ   — d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlZ ej                  e«      Zddeded	efd
„Zddededefd„Zddeded	efd„Zddeded	efd„Zy)é    )Úsettings)Úinsert_llm_usage)Úcheck_quotaÚestimate_text_tokens)ÚSUMMARY_SYSTEM_PROMPTÚSUMMARY_USER_PROMPTÚTITLE_GENERATION_PROMPT)ÚclientNÚtextÚ	tenant_idÚuser_idc                 ó´  — | j                  «       st        j                  d«       g S |rt        |d|t	        | «      ¬«       	 t        j                  dt        j                  › �«       t        j                  j                  | t        j                  d¬«      }|j                  }t        j                  d|j                  › d|j                  › �«       |r2t        |d	t        j                  |j                  d
|j                  «       |j                  d
   j                   S # t"        $ r-}t        j%                  d|› �d¬«       t'        d|› �«      ‚d}~ww xY w)zI
    Generates embeddings for the provided text with error handling.
    z#Empty text provided for embeddings.Ú	ai_tokens©r   Úrequested_amountz#Generating embeddings using model: ç      >@)ÚinputÚmodelÚtimeoutzLLM Usage (Embedding): Prompt: ú	, Total: Ú	Embeddingr   z.Error generating embeddings via Azure OpenAI: T©Úexc_infozEmbedding service failure: N)ÚstripÚloggerÚwarningr   r   Úinfor   ÚEMBED_MODELr
   Ú
embeddingsÚcreateÚusageÚprompt_tokensÚtotal_tokensr   ÚdataÚ	embeddingÚ	ExceptionÚerrorÚRuntimeError)r   r   r   Úresponser!   Úes         ú;/var/www/html/strategist-ai/app/services/infra/embedding.pyÚget_embeddingsr,   
   s9  € ð �:‰:Œ<Ü�‰Ð<Ô=Øˆ	áÜ�I˜{°GÔNbÐcgÓNhÕið>Ü�‰Ð9¼(×:NÑ:NÐ9OÐPÔQÜ×$Ñ$×+Ñ+ØÜ×&Ñ&Øð ,ó 
ˆð
 —‘ˆÜ�‰Ð5°e×6IÑ6IÐ5JÈ)ÐTY×TfÑTfÐSgÐhÔiñ ÜØØÜ×$Ñ$Ø×#Ñ#ØØ×"Ñ"ôð �}‰}˜QÑ×)Ñ)Ð)øÜò >Ü�‰ÐEÀaÀSÐIÐTXˆÔYÜÐ8¸¸Ð<Ó=Ð=ûð>ús   ÁCD! Ä!	EÄ*(EÅEÚ
chunk_sizeÚoverlapc                 ó”   — | sg S g }d}t        | «      }||k  r/||z   }|j                  | || «       ||k\  r	 |S |||z
  z  }||k  rŒ/|S )z‰
    Simple sliding window chunking with basic validation.
    Optimized for larger embedding models (e.g., text-embedding-3-large).
    r   )ÚlenÚappend)r   r-   r.   ÚchunksÚstartÚtext_lenÚends          r+   Ú
chunk_textr6   /   st   € ñ
 Øˆ	à€FØ€EÜ�4‹y€HØ
�(Ò
Ø�jÑ ˆØ�‰�d˜5 �oÔ&Ø�(Š?Øà€Mð 	�˜gÑ%Ñ%ˆð �(Ó
ð €Mó    c                 óš  — | j                  «       st        j                  d«       yt        | «      dkD  r| dd n| }|rt	        |«      dz   }t        |d||¬«       	 t        j                  dt        j                  › �«       t        j                  j                  j                  t        j                  d	t        d
œdt        j                  |¬«      d
œgdd¬«      }|j                   d   j"                  j$                  }|j&                  }t        j                  d|j(                  › d|j*                  › d|j,                  › �«       |r<t/        |dt        j                  |j(                  |j*                  |j,                  «       t        j                  d«       |S # t0        $ r$}t        j3                  d|› �d¬«       Y d}~yd}~ww xY w)zd
    Generates a concise summary of the provided text using the chat model with error handling.
    z Empty text provided for summary.z!No content provided to summarize.ép  Néô  r   r   z Generating summary using model: Úsystem©ÚroleÚcontentÚuser)Úcontent_to_summarizeg      N@)r   ÚmessagesÚmax_completion_tokensr   r   z%LLM Usage (Content Summary): Prompt: z, Completion: r   zContent SummaryzSummary generated successfully.z+Error generating summary via Azure OpenAI: Tr   z6Summary could not be generated due to a service error.)r   r   r   r0   r   r   r   r   Ú	LLM_MODELr
   ÚchatÚcompletionsr    r   r   ÚformatÚchoicesÚmessager>   r!   r"   Úcompletion_tokensr#   r   r&   r'   )	r   r   r   r@   Úprojected_tokensr)   Úsummaryr!   r*   s	            r+   Úgenerate_summaryrL   B   sÀ  € ð �:‰:Œ<Ü�‰Ð9Ô:Ø2ä*-¨d«)°dÒ*:˜4  ™;ÀÐáÜ/Ð0DÓEÈÑKÐÜ�I˜{°GÐN^Õ_ðHÜ�‰Ð6´x×7IÑ7IÐ6JÐKÔLÜ—;‘;×*Ñ*×1Ñ1Ü×$Ñ$à!Ô.CÑDØÔ,?×,FÑ,FÐ\pÔ,qÑrðð #&Øð 2ó 
ˆð ×"Ñ" 1Ñ%×-Ñ-×5Ñ5ˆØ—‘ˆÜ�‰Ð;¸E×<OÑ<OÐ;PÐP^Ð_d×_vÑ_vÐ^wð  xAð  BG÷  BTñ  BTð  AUð  Vô  	Wñ ÜØØ!Ü×"Ñ"Ø×#Ñ#Ø×'Ñ'Ø×"Ñ"ôô 	�‰Ð5Ô6ØˆøÜò HÜ�‰ÐBÀ1À#ÐFÐQUˆÔVÜGûðHús   ÁE F Æ	G
Æ&GÇG
c                 ó(  — | j                  «       syt        j                  | dd ¬«      }|rt        |«      dz   }t	        |d||¬«       	 t
        j                  dt        j                  › �«       t        j                  j                  j                  t        j                  d	|d
œgd¬«      }|j                  d   j                  j                  j                  «       }ddl}|j#                  dd|«      j                  «       j%                  dd«      }|sy|j&                  }	|r<t)        |dt        j                  |	j*                  |	j,                  |	j.                  «       |S # t0        $ r$}
t
        j3                  d|
› �d¬«       Y d}
~
yd}
~
ww xY w)zN
    Generates a concise 3-5 word title for the given text using the LLM.
    ÚUntitled_DocumentNi¸  )Úcontent_to_titleéd   r   r   zGenerating title using model: r?   r<   r   )r   rA   r   r   z[^\w\s-]Ú Ú Ú_ÚTitleGenerationz)Error generating title via Azure OpenAI: Tr   ÚManual_Text_Input)r   r	   rF   r   r   r   r   r   rC   r
   rD   rE   r    rG   rH   r>   ÚreÚsubÚreplacer!   r   r"   rI   r#   r&   r'   )r   r   r   Úuser_promptrJ   r)   Ú
title_textrV   Úclean_titler!   r*   s              r+   Úgenerate_titler\   p   so  € ð �:‰:Œ<Ø"ä)×0Ñ0À$ÀuÈÀ+ÔN€KáÜ/°Ó<¸sÑBÐÜ�I˜{°GÐN^Õ_ð"#Ü�‰Ð4´X×5GÑ5GÐ4HÐIÔJä—;‘;×*Ñ*×1Ñ1Ü×$Ñ$à¨KÑ8ðð ð 2ó 
ˆð ×%Ñ% aÑ(×0Ñ0×8Ñ8×>Ñ>Ó@ˆ
ó 	Ø—f‘f˜[¨"¨jÓ9×?Ñ?ÓA×IÑIÈ#ÈsÓSˆÙØ&à—‘ˆñ ÜØØ!Ü×"Ñ"Ø×#Ñ#Ø×'Ñ'Ø×"Ñ"ôð ÐøÜò #Ü�‰Ð@ÀÀÐDÈtˆÔTÜ"ûð#ús    ÁCE$ ÄAE$ Å$	FÅ-FÆF)NN)r9   r:   )Úapp.core.configr   Úapp.services.infra.databaser   Úapp.services.infra.quotasr   r   Úapp.core.promptsr   r   r	   Úapp.core.llm_clientr
   ÚloggingÚ	getLoggerÚ__name__r   Ústrr,   Úintr6   rL   r\   © r7   r+   ú<module>rh      sš   ðÝ $Ý 8ß Gß `Ñ `Ý &Û à	ˆ×	Ñ	˜8Ó	$€ñ#>˜ð #>¨ð #>¸có #>ñJ�Sð  cð ¸3ó ñ&,H˜3ð ,H¨3ð ,HÀó ,Hñ\/#˜ð /#¨ð /#¸cô /#r7   