Ë
    Ç) i[  ã            	       ój  — d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlZd dlmZ d dlm Z  de!dee"   fd„Z#dee   dee"   dee   fd„Z$dde!dee"   de!de!fd„Z% G d„ d«      Z& G d„ d«      Z' G d„ d«      Z(da)d„ Z*y)é    N)ÚListÚDictÚAnyÚOptional)ÚChatGoogleGenerativeAIÚGoogleGenerativeAIEmbeddings)ÚMongoDBAtlasVectorSearch)ÚMongoClient)ÚDocument)ÚRecursiveCharacterTextSplitter)ÚChatPromptTemplate)ÚRunnablePassthroughÚRunnableLambda)ÚStrOutputParser)ÚAsyncIOMotorClient)Úsettings)Úextract_contentÚprompt_textÚreturnc                 óh   — ddl }|j                  d| «      }|rt        |j                  «       «      S dS )zNExtract number from admin prompt like 'Please consider company providing 9...'r   Nz\d+)ÚreÚsearchÚintÚgroup)r   r   Úmatchs      úK/var/www/html/Whatsapp_Customer_Support_Chatbot/src/services/rag_service.pyÚextract_admin_overrider      s-   € ãØ�I‰I�f˜kÓ*€EÙ!&Œ3ˆu�{‰{‹}ÓÐ0¨DÐ0ó    ÚdocsÚadmin_numberc                 óì   — |s|dk7  r| S g d¢}g }| D ]_  }|j                   }ddl}|D ]"  }|j                  d|› d�t        |«      |«      }Œ$ |j	                  t        ||j                  ¬«      «       Œa |S )a  Filter/modify document content based on admin override number.
    
    OPTION 1: Replace ALL policy numbers (not just specific keywords).
    When admin specifies a number like "0", replace all occurrences of 
    common policy numbers (5, 6, 8, 10, 12, 15, 18, 20, 25, 30, etc.)
    r   )é   é   é   é   é   é   é   é
   é   é   é   é   é   Nz\b©Úpage_contentÚmetadata)r0   r   ÚsubÚstrÚappendr   r1   )r   r    Úpolicy_numbersÚfiltered_docsÚdocÚcontentr   Úold_nums           r   Úfilter_docs_by_admin_ruler:      sž   € ñ ˜L¨AÒ-Øˆò E€Nà€MØò ˆØ×"Ñ"ˆó 	Ø%ò 	ˆGð —f‘fØ�g�Y˜bÐ!Ü�LÓ!Øó‰Gð	ð 	×ÑœXØ Ø—\‘\ô
õ 	ðð( Ðr   Úsystem_promptÚ
admin_textc           	      ó8   — |s| S d|› d|› d|› d|› d�	}|dz   | z   S )z?Inject strict override instruction at the top of system prompt.zg
### CRITICAL ADMIN OVERRIDE (HIGHEST PRIORITY - ENFORCE STRICTLY):
- Admin has specified: Use EXACTLY z— items/holidays/values
- If any document says a different number (like 12, 15, 20, etc.), that is OUTDATED
- IGNORE the outdated number and ALWAYS use z-
- Your response MUST consistently reference z[, not any other number
- If asked about count/quantity in this domain, ALWAYS respond with ú
© )r;   r    r<   Úoverride_instructions       r   Úinject_strict_overriderA   @   sT   € áØÐð $à$0 >ð 2-à-9¨Nð ;-Ø-9¨Nð ;EØEQÀNð SðÐð   $Ñ&¨Ñ6Ð6r   c                   óŒ   — e Zd ZdZdej
                  fd„Zdefd„Zdefd„Z	dde
j                  d	ee   fd
„Zdefd„Zd	efd„Zy)ÚDocumentIndexManagerz-Handles MongoDB Atlas Vector Search indexing.Úloggerc                 óR   — || _         t        dt        j                  ¬«      | _        y )Nzmodels/gemini-embedding-001)ÚmodelÚgoogle_api_key)rD   r   r   ÚGEMINI_API_KEYÚ
embeddings)ÚselfrD   s     r   Ú__init__zDocumentIndexManager.__init__U   s!   € ØˆŒÜ6Ø/Ü#×2Ñ2ô
ˆ�r   r   c                 óB  — t        t        j                  «      }|t        j                     t        j                     }|j                  i «      dkD  r| j                  j                  d«       n| j                  j                  d«       t        || j                  d¬«      S )Nr   z(MongoDB Atlas index found. Connecting...zFVector Database is empty. Use Admin API to upload and index documents.Úvector_index)Ú
collectionÚ	embeddingÚ
index_name)r
   r   ÚMONGODB_URIÚDB_NAMEÚVECTOR_COLLECTIONÚcount_documentsrD   ÚinfoÚwarningr	   rI   )rJ   ÚclientrN   s      r   Úload_or_build_indexz(DocumentIndexManager.load_or_build_index\   s‚   € ÜœX×1Ñ1Ó2ˆØœH×,Ñ,Ñ-¬h×.HÑ.HÑIˆ
ð ×%Ñ% bÓ)¨AÒ-Ø�K‰K×ÑÐGÕHà�K‰K×ÑÐ hÔiä'Ø!Ø—o‘oØ%ô
ð 	
r   c           	      ó<  — t        j                  t        j                  «      }|j	                  «       st        d|› �«      ‚t        |j                  d«      «      }| j                  j                  dt        |«      › d�«       g }t        |d«      D ]¯  \  }}| j                  j                  d|› dt        |«      › d|j                  › �«       	 t        t        |«      «      }|j                  «       sŒct!        d	d
¬«      }|j#                  |«      }|D ]*  }	|j%                  t'        |	d|j                  i¬«      «       Œ, Œ± |st'        dddi¬«      g}| j                  j                  dt        |«      › d�«       t-        j.                  || j0                  t3        t        j4                  «      t        j6                     t        j8                     d¬«      }|S # t(        $ r6}
| j                  j+                  d|j                  › d|
› �«       Y d }
~
�Œ„d }
~
ww xY w)NzData dir not found: z*.pdfz	Indexing z documents to MongoDB Atlas.é   ú[ú/z] Processing: éÐ  é,  ©Ú
chunk_sizeÚchunk_overlapÚsourcer/   zError processing ú: zSystem active.Úsystemz
Uploading z chunks to Atlas...rM   ©Ú	documentsrO   rN   rP   )ÚpathlibÚPathr   ÚDATA_DIRÚexistsÚFileNotFoundErrorÚlistÚrglobrD   rU   ÚlenÚ	enumerateÚnamer   r3   Ústripr   Ú
split_textr4   r   Ú	ExceptionÚerrorr	   Úfrom_documentsrI   r
   rQ   rR   rS   )rJ   Ú	data_pathÚ	pdf_filesÚdocument_chunksÚindexÚpdf_fileÚraw_contentÚsplitterÚchunksÚchunkÚeÚvector_stores               r   Úrebuild_indexz"DocumentIndexManager.rebuild_indexl   sì  € Ü—L‘L¤×!2Ñ!2Ó3ˆ	Ø×ÑÔ!Ü#Ð&:¸9¸+Ð$FÓGÐGä˜Ÿ™¨Ó1Ó2ˆ	Ø�‰×Ñ˜9¤S¨£^Ð$4Ð4PÐQÔRàˆÜ(¨°AÓ6ò 	L‰OˆE�8Ø�K‰K×Ñ˜q   q¬¨Y«Ð(8¸ÀxÇ}Á}ÀoÐVÔWðLÜ-¬c°(«mÓ<�à"×(Ñ(Ô*¨Hä9ÀTÐY\Ô]�Ø!×,Ñ,¨[Ó9�à#ò �EØ#×*Ñ*¬8Ø%*Ø"*¨H¯M©MÐ!:ô,õ ñð	Lñ$ Ü'Ð5EÐQYÐ[cÐPdÔeÐfˆOà�‰×Ñ˜:¤c¨/Ó&:Ð%;Ð;NÐOÔPÜ/×>Ñ>Ø%Ø—o‘oÜ"¤8×#7Ñ#7Ó8¼×9IÑ9IÑJÌ8×KeÑKeÑfØ%ô	
ˆð Ðøô ò LØ—‘×!Ñ!Ð$5°h·m±m°_ÀBÀqÀcÐ"J×KÒKûðLús   Ã$GÃ5AGÇ	HÇ%+HÈHNÚ	file_pathÚfolder_namec                 óš  — 	 t        t        |«      «      }|j                  «       syt        dd¬«      }|j	                  |«      }d|j
                  i}|r||d<   |D �cg c]  }t        ||j                  «       ¬«      ‘Œ }}|r…t        j                  || j                  t        t        j                  «      t        j                     t        j                     d¬	«       | j                   j#                  d
|j
                  › �«       yyc c}w # t$        $ r2}	| j                   j'                  d|j
                  › d|	› �«       |	‚d}	~	ww xY w)z0Indexes a single PDF file into the vector store.Nr]   r^   r_   rb   rƒ   r/   rM   re   zSuccessfully indexed zError indexing rc   )r   r3   rq   r   rr   rp   r   Úcopyr	   ru   rI   r
   r   rQ   rR   rS   rD   rU   rs   rt   )
rJ   r‚   rƒ   r{   r|   r}   r1   r~   r   r   s
             r   Úindex_single_filez&DocumentIndexManager.index_single_file“   s2  € ð	Ü)¬#¨i«.Ó9ˆKØ×$Ñ$Ô&¨ä5ÀÐUXÔYˆHØ×(Ñ(¨Ó5ˆFà  )§.¡.Ð1ˆHÙØ*5�˜Ñ'ð $öàô  e°h·m±m³oÖFðˆDð ñ
 Ü(×7Ñ7Ø"Ø"Ÿo™oÜ*¬8×+?Ñ+?Ó@Ä×AQÑAQÑRÔS[×SmÑSmÑnØ-õ	ð —‘× Ñ Ð#8¸¿¹Ð8HÐ!IÕJð ùòøô ò 	Ø�K‰K×Ñ °	·±Ð/?¸rÀ!ÀÐEÔFØˆGûð	ús/   ‚$D §7D Á"D
Â BD Ä
D Ä	E
Ä-EÅE
Úfilenamec                 óp  — 	 t        t        j                  «      }|t        j                     t        j                     }|j                  dd|id|igi«      }| j                  j                  d|j                  › d|› �«       y# t        $ r(}| j                  j                  d|› d|› �«       |‚d}~ww xY w)	z8Deletes all vectors associated with a specific filename.ú$orzmetadata.sourcerb   úDeleted z vectors for zError deleting vectors for rc   N©r
   r   rQ   rR   rS   Údelete_manyrD   rU   Údeleted_countrs   rt   )rJ   r‡   rW   rN   Úresultr   s         r   Údelete_file_vectorsz(DocumentIndexManager.delete_file_vectors±   s¼   € ð	Ü ¤×!5Ñ!5Ó6ˆFØ¤× 0Ñ 0Ñ1´(×2LÑ2LÑMˆJØ×+Ñ+ØØ&¨Ð1Ø˜xÐ(ðð-ó ˆFð �K‰K×Ñ˜x¨×(<Ñ(<Ð'=¸]È8È*ÐUÕVøÜò 	Ø�K‰K×ÑÐ ;¸H¸:ÀRÈÀsÐKÔLØˆGûð	úó   ‚BB Â	B5Â#B0Â0B5c                 óp  — 	 t        t        j                  «      }|t        j                     t        j                     }|j                  dd|id|igi«      }| j                  j                  d|j                  › d|› �«       y# t        $ r(}| j                  j                  d|› d|› �«       |‚d}~ww xY w)	z;Deletes all vectors associated with a specific folder name.r‰   zmetadata.folder_namerƒ   rŠ   z vectors for folder: z"Error deleting vectors for folder rc   Nr‹   )rJ   rƒ   rW   rN   rŽ   r   s         r   Údelete_folder_vectorsz*DocumentIndexManager.delete_folder_vectorsÁ   sÁ   € ð	Ü ¤×!5Ñ!5Ó6ˆFØ¤× 0Ñ 0Ñ1´(×2LÑ2LÑMˆJØ×+Ñ+ØØ+¨[Ð9Ø" KÐ0ðð-ó ˆFð �K‰K×Ñ˜x¨×(<Ñ(<Ð'=Ð=RÐS^ÐR_Ð`ÕaøÜò 	Ø�K‰K×ÑÐ BÀ;À-ÈrÐRSÐQTÐUÔVØˆGûð	úr�   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚloggingÚLoggerrK   r	   rX   r�   rg   rh   r   r3   r†   r�   r’   r?   r   r   rC   rC   R   sc   „ Ù7ð
˜wŸ~™~ó 
ð
Ð%=ó 
ð %Ð7ó %ñN¨7¯<©<ð ÀhÈsÁmó ð<¨Có ð °ô r   rC   c                   ó^   — e Zd Zdedej
                  fd„Zd„ Zdefd„Z	ddeded	efd
„Z
d„ Zy)ÚRERAInferenceEnginer€   rD   c                 óŒ  — || _         || _        t        t        j                  t        j
                  t        j                  t        j                  ¬«      | _        t        t        j                  «      | _        | j                  t        j                     | _        d | _        d | _        i | _        d | _        d| _        d | _        y )N)rF   ÚtemperatureÚmax_output_tokensrG   r   )r€   rD   r   r   Ú
MODEL_NAMEÚTEMPERATUREÚ
MAX_TOKENSrH   Úllmr   rQ   rW   rR   ÚdbÚ_cached_chainÚ_last_prompt_textÚ_response_cacheÚ_prompt_cacheÚ_prompt_cache_timeÚ_admin_override_number)rJ   r€   rD   s      r   rK   zRERAInferenceEngine.__init__Ò   s›   € Ø(ˆÔØˆŒÜ)Ü×%Ñ%Ü ×,Ñ,Ü&×1Ñ1Ü#×2Ñ2ô	
ˆŒô )¬×)=Ñ)=Ó>ˆŒØ—+‘+œh×.Ñ.Ñ/ˆŒØ!ˆÔØ!%ˆÔØ!ˆÔØ!ˆÔØ"#ˆÔØ&*ˆÕ#r   c              ƒ   ó  ‡K  — ddl }| j                  r,|j                  «       | j                  z
  dk  r| j                  S 	 | j                  d   j	                  ddi«      j                  dd«      }|j                  d	¬
«      ƒ d{  –—† }ddlm} ddlm} |�rW|D �cg c]&  }|j                  d«      sŒ|j                  dd«      ‘Œ( }}|�r| j                  j                  dt        |«      › d�«       dj                  |«      }t        |«      }d}	|	dj                  |D �
cg c]  }
d|
› �‘Œ	 c}
«      z   }|j                  «       Šd}t!        ˆfd„dD «       «      rd}|j#                  dd«      j#                  dd«      j#                  dd«      }|› d|› d|› �}|r4| j                  j                  d|› d�«       || _        t'        |||«      }nd| _        || _        n8|| _        d| _        n)| j                  j                  d«       || _        d| _        |j                  «       | _        | j                  S 7 �Œµc c}w c c}
w # t(        $ r7}| j                  j+                  d |› �«       ddlm} d| _        |cY d}~S d}~ww xY w­w)!zAFetch ALL active prompts with a 5-minute cache to reduce DB load.r   Nr^   ÚpromptsÚ	is_activeTÚ
updated_atrZ   éd   )Úlength)ÚDEFAULT_SYSTEM_PROMPTr8   Ú zUsing z active prompts from DB.r>   zE### ABSOLUTE PRIORITY: CUSTOM ADMIN RULES (OVERRIDE ALL OTHER RULES)
z- c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr“   r?   )Ú.0ÚwordÚprompt_text_lowers     €r   ú	<genexpr>z?RERAInferenceEngine._get_system_instructions.<locals>.<genexpr>   s   øè ø€ Òg¸˜4Ð#4Ô4Ñgùs   ƒ)Úignorezdo notzdon'tÚonlya>  
STRICT COMPLIANCE RULE: If any Admin Rule tells you to ignore a specific topic/folder/company, or to ONLY use a specific folder/file, you MUST follow it strictly. If the 'Context' provided below is empty or doesn't match the required folder, you MUST state that you don't have the information in that specific folder.z{chat_history}z[Prior history provided below]z	{context}z[Context provided below]z
{question}z[Question provided below]z#

### GENERAL OPERATING PRINCIPLES
zAdmin Override Detected: z itemsz.No active prompts found. Using default prompt.zError fetching prompts: )Útimer§   r¨   r£   ÚfindÚsortÚto_listÚsrc.utils.promptsr°   ÚgetrD   rU   rn   Újoinr   ÚlowerÚanyÚreplacer©   rA   rs   rt   )rJ   r¹   ÚcursorÚactive_promptsr°   ÚpÚcontentsr<   r    Úcustom_headerÚcÚcustom_blockÚstrict_enforcementÚcleaned_defaultÚfull_promptr   rµ   s                   @r   Ú_get_system_instructionsz,RERAInferenceEngine._get_system_instructionsä   s˜  øè ø€ ãØ×Ò 4§9¡9£;°×1HÑ1HÑ#HÈ3Ò#NØ×%Ñ%Ð%ð6	)à—W‘W˜YÑ'×,Ñ,¨k¸4Ð-@ÓA×FÑFÀ|ÐUVÓWˆFØ#)§>¡>¸ >Ó#=×=ˆNå?Ý?Úð ;IÖ]°QÈAÏEÉEÐR[ÕL\˜AŸE™E )¨RÕ0Ð]�Ð]ÚØ—K‘K×$Ñ$ v¬c°(«m¨_Ð<TÐ%UÔVØ!%§¡¨8Ó!4�JÜ#9¸*Ó#E�Là$l�MØ#0°4·9±9ÐPXÖ=YÈ1ÀÀ1À#ºhÒ=YÓ3ZÑ#Z�Là(2×(8Ñ(8Ó(:Ð%Ø)+Ð&äÓgÐAfÔgÔgðjð +ð '<×&CÑ&CÐDTÐVvÓ&w×&Ñ&ð  ALð  Nhó  'i÷  'qñ  'qð  r~ð  @[ó  '\�OØ%1 N°"Ð5GÐ4HÐHnÐo~Ðnð  #A�Ká#ØŸ™×(Ñ(Ð+DÀ\ÀNÐRXÐ)YÔZØ6B˜Ô3Ü&<¸[È,ÐXbÓ&c™à6:˜Ô3à)4�DÕ&à)>�DÔ&Ø26�DÕ/à—‘× Ñ Ð!QÔRØ%:�Ô"Ø.2�Ô+à&*§i¡i£kˆDÔ#ð ×!Ñ!Ð!ðk >ûò ^ùò >ZøôB ò 	)Ø�K‰K×ÑÐ 8¸¸Ð<Ô=Ý?Ø*.ˆDÔ'Ø(Õ(ûð		)üsn   ƒ=JÁAI ÂH;ÂI ÂH>Â5H>Ã	AI Ä$I
Ä0C?I È/JÈ;I È>
I É	JÉ,JÉ=JÉ>JÊJÊJÚsystem_instructionsc                 óf  — | j                   r| j                  |k(  r| j                   S t        j                  |«      }| j                  j                  ddi¬«      }d„ }d„ |z  t        |«      z  t        d„ «      t        d„ «      dœ|z  | j                  z  t        «       z  }|| _         || _        |S )	NÚkr,   ©Úsearch_kwargsc           
      óž   — dj                  | D �cg c].  }d|j                  j                  dd«      › d|j                  › �‘Œ0 c}«      S c c}w )Nú

úSOURCE: rb   ÚUnknownr>   )r¿   r1   r¾   r0   )r   Úds     r   Úformat_docsz3RERAInferenceEngine._get_chain.<locals>.format_docs-  sF   € Ø—;‘;ÐkoÖpÐfg (¨1¯:©:¯>©>¸(À9Ó+MÐ*NÈbÐQR×Q_ÑQ_ÐP`Ò aÒpÓqÐqùÒps   �3A
c                 ó   — | d   S ©NÚquestionr?   ©Úxs    r   ú<lambda>z0RERAInferenceEngine._get_chain.<locals>.<lambda>2  s
   €  a¨
¡m€ r   c                 ó   — | d   S rÚ   r?   rÜ   s    r   rÞ   z0RERAInferenceEngine._get_chain.<locals>.<lambda>3  s
   € °Q°z±]€ r   c                 ó&   — | j                  dd«      S )NÚchat_historyúNo prior history.)r¾   rÜ   s    r   rÞ   z0RERAInferenceEngine._get_chain.<locals>.<lambda>4  s   € ¸¿¹¸~ÐObÓ9c€ r   )ÚcontextrÛ   rá   )	r¤   r¥   r   Úfrom_templater€   Úas_retrieverr   r¢   r   )rJ   rÎ   ÚpromptÚ	retrieverrØ   Ú	new_chains         r   Ú
_get_chainzRERAInferenceEngine._get_chain$  sÇ   € à×Ò $×"8Ñ"8Ð<OÒ"OØ×%Ñ%Ð%ä#×1Ñ1Ð2EÓFˆà×%Ñ%×2Ñ2À#ÀqÀÐ2ÓJˆ	ò	rñ
 4°yÑ@Ä>ÐR]ÓC^Ñ^Ü*Ñ+BÓCÜ .Ñ/cÓ dñð
 ñð �h‰hñô Óñ ð 	ð 'ˆÔØ!4ˆÔØÐr   Úqueryrá   r   c           
   ƒ   ó  K  — dd l }|j                  «       }	 |j                  «       j                  «       }|j                  «       }| j                  «       ƒ d {  –—† }|j                  «       }| j                  j                  d||z
  d›d�«       | j                  j                  d|d d › d�«       |j                  «       }	| j                  j                  dd	i¬
«      }
|
j                  |«      ƒ d {  –—† }| j                  r>| j                  j                  d| j                  › �«       t        || j                  «      }dd l}|j                  d||j                  «      }|r|j                  d«      j                  «       nd}g }g d¢}|D ]D  }|j                  ||«      }|sŒ|j!                  |D �cg c]  }|j                  «       ‘Œ c}«       ŒF t#        t%        |D �cg c]	  }|dvsŒ|‘Œ c}«      «      }g }g d¢}|D ]D  }|j                  ||«      }|sŒ|j!                  |D �cg c]  }|j                  «       ‘Œ c}«       ŒF t#        t%        |D �cg c]	  }|dvsŒ|‘Œ c}«      «      }|j                  «       }	ddi}| j                  j                  |¬
«      }
|
j                  |«      ƒ d {  –—† }g }|D ]ö  }|j&                  j)                  d«      xs t+        |dd«      }|j&                  j)                  d«      xs t+        |dd«      }t-        |«      j                  «       }t-        |«      j                  «       }d}|rd}|D ]  }||k(  s|sŒ||v sŒd} n |r|r|D ]  }||k(  s|sŒ||v sŒd} n |r|j/                  |«       ŒÕ| j                  j                  d|› d|› d�«       Œø |d d	 }dj1                  |D �cg c].  }d|j&                  j)                  dd«      › d|j2                  › �‘Œ0 c}«      } | j                  j                  d|j                  «       |	z
  d›d t5        |«      › d!t5        |«      › d�«       |j                  «       }!d"|fd#d$| › d%|› d&|› �fg}"| j6                  j                  |"«      ƒ d {  –—† }#|#j8                  }$|j                  «       }%| j                  j                  d'|%|!z
  d›d�«       |j                  «       }&|$j;                  d(d«      j;                  d)d«      j;                  dd*«      j;                  dd*«      j                  «       }$d+|$v r|$j;                  d+d*«      }$d+|$v rŒ| j                  j                  d,|j                  «       |&z
  d›d�«       | j                  j                  d-|j                  «       |z
  d›d�«       |$S 7 �ŒZ7 �ŒÁc c}w c c}w c c}w c c}w 7 �Œc c}w 7 �ŒE# t<        $ r%}'| j                  j?                  d.|'› �«       |'‚d }'~'ww xY w­w)/Nr   zPrompt fetch took z.4fÚszSYSTEM_PROMPT_USED: r^   z...rÐ   r,   rÑ   z Applying admin override filter: zu### ABSOLUTE PRIORITY: CUSTOM ADMIN RULES \(OVERRIDE ALL OTHER RULES\)\n(.*?)(?=\n### GENERAL OPERATING PRINCIPLES|$)rZ   r±   )z.(?:from|in|use|of)\s+([a-zA-Z0-9_-]+)\s+folderz ([a-zA-Z0-9_-]+)\s+folder\s+onlyz([a-zA-Z0-9_-]+)\s+file\s+onlyz'only\s+answer\s+from\s+([a-zA-Z0-9_-]+))ÚtheÚmyÚthisÚaÚan)z"ignore\s+([a-zA-Z0-9_-]+)\s+folderz ignore\s+([a-zA-Z0-9_-]+)\s+filez)(?:don't|do not)\s+use\s+([a-zA-Z0-9_-]+)é2   rb   rƒ   TFzPost-filter REJECTED: z
 (Folder: ú)rÔ   rÕ   rÖ   r>   zRetrieval took z.2fzs (Result: z docs after filtering rd   Úhumanz	Context:
z

History:
z

Question: zGeneration took z**Ú*ú z  zCleaning took zTotal execute_query delay: zEngine execution error: ) r¹   rq   rÀ   rÍ   rD   rU   r€   rå   Úainvoker©   r:   r   r   ÚDOTALLr   ÚfindallÚextendrl   Úsetr1   r¾   Úgetattrr3   r4   r¿   r0   rn   r¢   r8   rÂ   rs   rt   )(rJ   rê   rá   r¹   Út_total_startÚ
norm_queryÚt_promptrÎ   Út_prompt_endÚt_retrç   r   r   Úadmin_constraints_matchÚadmin_constraintsÚallowed_foldersÚpatterns_onlyÚpatÚmatchesÚmÚfÚignored_foldersÚpatterns_ignorerÒ   r6   r×   Ú
source_valÚ
folder_valÚsource_lowerÚ
doc_folderÚ
is_allowedÚ
final_docsrã   Út_genÚmessagesÚraw_responseÚresponseÚ	t_gen_endÚt_cleanr   s(                                           r   Úexecute_queryz!RERAInferenceEngine.execute_query?  s-  è ø€ ÛØŸ	™	›ˆðK	àŸ™›×,Ñ,Ó.ˆJð —y‘y“{ˆHØ(,×(EÑ(EÓ(G×"GÐØŸ9™9›;ˆLØ�K‰K×ÑÐ1°,ÀÑ2IÈ#Ð1NÈaÐPÔQØ�K‰K×ÑÐ3Ð4GÈÈÐ4MÐ3NÈcÐRÔSð —I‘I“KˆEà×)Ñ)×6Ñ6ÀcÈ1ÀXÐ6ÓNˆIØ"×*Ñ*¨5Ó1×1ˆDð ×*Ò*Ø—‘× Ñ Ð#CÀD×D_ÑD_ÐC`Ð!aÔbÜ0°°t×7RÑ7RÓS�ó Ø&(§i¡ið  1ið  k~ð  @B÷  @Iñ  @Ió  'JÐ#ÙLcÐ 7× =Ñ =¸aÓ @× FÑ FÔ HÐikÐà ˆOòˆMð %ò I�ØŸ*™* SÐ*;Ó<�ÚØ#×*Ñ*¸wÖ+G¸!¨A¯G©G­IÒ+GÕHðIô #¤3°?Ö'p¨aÀaÐOoÒFoªÒ'pÓ#qÓrˆOà ˆOòˆOð
 'ò I�ØŸ*™* SÐ*;Ó<�ÚØ#×*Ñ*¸wÖ+G¸!¨A¯G©G­IÒ+GÕHðIô #¤3°?Ö'p¨aÀaÐOoÒFoªÒ'pÓ#qÓrˆOð —I‘I“KˆEð ! "˜IˆMà×)Ñ)×6Ñ6À]Ð6ÓSˆIØ"×*Ñ*¨5Ó1×1ˆDð ˆMØò e�ØŸZ™ZŸ^™^¨HÓ5ÒQ¼ÀÀHÈbÓ9Q�
ØŸZ™ZŸ^™^¨MÓ:Ò[¼gÀaÈÐXZÓ>[�
Ü" :›×4Ñ4Ó6�Ü  ›_×2Ñ2Ó4�
à!�
Ù"à!&�JØ,ò "˜à 
š?ªq°Q¸,Ò5FØ)-˜JÙ!ð	"ñ ¡/à,ò "˜Ø 
š?ªq°Q¸,Ò5FØ).˜JÙ!ð"ñ
 Ø!×(Ñ(¨Õ+à—K‘K×$Ñ$Ð'=¸l¸^È:ÐV`ÐUaÐabÐ%cÕdð5eð: ' r¨Ð*ˆJØ—k‘kÐnxÖ"yÐij X¨a¯j©j¯n©n¸XÀiÓ.PÐ-QÐQSÐTU×TbÑTbÐScÒ#dÒ"yÓzˆGØ�K‰K×Ñ˜¨t¯y©y«{¸UÑ/BÀ3Ð.GÀ{ÔSVÐWaÓSbÐRcÐcyÔz}ð  Có  {Dð  zEð  EFð  Gô  Hð —I‘I“KˆEð Ð.Ð/Ø˜J w i¨~¸l¸^È>ÐZ_ÐY`ÐaÐbðˆHð "&§¡×!1Ñ!1°(Ó!;×;ˆLØ#×+Ñ+ˆHØŸ	™	›ˆIØ�K‰K×ÑÐ/°	¸EÑ0AÀ#Ð/FÀaÐHÔIð —i‘i“kˆGà×'Ñ'¨¨bÓ1×9Ñ9¸#¸rÓB×JÑJÈ6ÐSVÓW×_Ñ_Ð`dÐfiÓj×pÑpÓrˆHà˜(Ñ"Ø#×+Ñ+¨D°#Ó6�ð ˜(Ò"ð �K‰K×Ñ˜~¨d¯i©i«k¸GÑ.CÀCÐ-HÈÐJÔKØ�K‰K×ÑÐ:¸4¿9¹9»;ÈÑ;VÐWZÐ:[Ð[\Ð]Ô^ØˆOðy #Hùð 2ûò, ,Hùò (qùò ,Hùò (qð 2ûòD #zð <úô* ò 	Ø�K‰K×ÑÐ 8¸¸Ð<Ô=ØˆGûð	üsë   ‚X	˜AW ÁV3ÁBW Ã5V6Ã6B1W Æ(W Æ7V9
ÇW Ç%	V>Ç/V>Ç3*W ÈW È-W
ÉW É	WÉ%WÉ)AW Ê8WÊ9B#W ÍW Í"W Í8W Í=AW Ï3WÐBW ÒWÒB=W ÕA#W Ö2X	Ö3W Ö6W Ö9W ×W ×	X×! XØXØX	c                 ó€   — d| _         d| _        i | _        d| _        d| _        | j
                  j                  d«       y)z Invalidates all internal caches.Nr   zInference Engine cache cleared.)r§   r¨   r¦   r¤   r¥   rD   rU   ©rJ   s    r   Úclear_cachezRERAInferenceEngine.clear_cacheÏ  s=   € à!ˆÔØ"#ˆÔØ!ˆÔØ!ˆÔØ!%ˆÔØ�‰×ÑÐ:Õ;r   N©râ   )r”   r•   r–   r	   r˜   r™   rK   rÍ   r3   ré   r  r  r?   r   r   r›   r›   Ñ   sQ   „ ð+Ð%=ð +ÀwÇ~Á~ó +ò$>"ð@¨có ñ6N¨ð N¸Cð NÐZ]ó Nó`<r   r›   c                   ó4   — e Zd Zd„ Zd„ Zd„ Zd	dededefd„Zy)
ÚRERAServicec                 óÈ   — | j                  «       | _        t        | j                  «      | _        t	        | j                  j                  «       | j                  «      | _        y r“   )Ú_setup_loggingrD   rC   Úmanagerr›   rX   Úenginer  s    r   rK   zRERAService.__init__Ú  sA   € Ø×)Ñ)Ó+ˆŒÜ+¨D¯K©KÓ8ˆŒÜ)¨$¯,©,×*JÑ*JÓ*LÈdÏkÉkÓZˆ�r   c                 ó8   — | j                   j                  «        y)z'Delegates cache clearing to the engine.N)r"  r  r  s    r   r  zRERAService.clear_cacheß  s   € à�‰×ÑÕ!r   c                 ó$  — t        j                  t        j                  d¬«       t	        j
                  d«      }|j                  t        j                  «       |j                  sªt	        j                  t         j                  j                  t        j                  t        j                  «      dd¬«      }|j                  t	        j                  d«      «       |j                  |«       |j                  t	        j                   «       «       |S )NT)Úexist_okÚ	RERA_COREÚwzutf-8)ÚmodeÚencodingz%(asctime)s | %(message)s)ÚosÚmakedirsr   ÚLOG_DIRr˜   Ú	getLoggerÚsetLevelÚINFOÚhandlersÚFileHandlerÚpathr¿   ÚLOG_FILEÚsetFormatterÚ	FormatterÚ
addHandlerÚStreamHandler)rJ   rD   Úhandlers      r   r   zRERAService._setup_loggingã  s²   € Ü
�‰”H×$Ñ$¨tÕ4Ü×"Ñ" ;Ó/ˆØ�‰œŸ™Ô%Ø�ŠÜ×)Ñ)¬"¯'©'¯,©,´x×7GÑ7GÌ×IZÑIZÓ*[ÐbeÐpwÔxˆGØ× Ñ ¤×!2Ñ!2Ð3NÓ!OÔPØ×Ñ˜gÔ&Ø×Ñœg×3Ñ3Ó5Ô6Øˆr   rÛ   rá   r   c              ƒ   óV   K  — | j                   j                  ||«      ƒ d {  –—† S 7 Œ­wr“   )r"  r  )rJ   rÛ   rá   s      r   Úget_legal_assessmentz RERAService.get_legal_assessmentî  s#   è ø€ Ø—[‘[×.Ñ.¨x¸ÓF×FÐFÐFús   ‚ )¢'£)Nr  )r”   r•   r–   rK   r  r   r3   r:  r?   r   r   r  r  Ù  s1   „ ò[ò
"ò	ñG°3ð GÀcð GÐdgô Gr   r  c                  ó.   — t         €
t        «       a t         S r“   )Ú_service_instancer  r?   r   r   Úget_service_instancer=  ó  s   € äÐ Ü'›MÐÜÐr   )r±   )+r*  r˜   rg   Útypingr   r   r   r   Úlangchain_google_genair   r   Úlangchain_mongodbr	   Úpymongor
   Úlangchain_core.documentsr   Úlangchain_text_splittersr   Úlangchain_core.promptsr   Úlangchain_core.runnablesr   r   Úlangchain_core.output_parsersr   Úmotor.motor_asyncior   ÚasyncioÚsrc.core.configr   Úsrc.utils.document_processorr   r3   r   r   r:   rA   rC   r›   r  r<  r=  r?   r   r   ú<module>rK     sÓ   ðÛ 	Û Û ß ,Ó ,ç WÝ 6Ý Ý -Ý CÝ 5ß HÝ 9Ý 2Û å $Ý 8ð1¨ð 1°¸±ó 1ð" D¨¡Nð "À(È3Á-ð "ÐTXÐYaÑTbó "ñH7¨#ð 7¸XÀc¹]ð 7ÐX[ð 7Ðehó 7÷$}ñ }÷~E<ñ E<÷PGñ Gð0 Ð ór   