§
    éƒtj¬–  ã            	      ó6  — U d Z ddlmZ ddlZddl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mZ edz  dz  Zedz  dz  Zedz  dz  dz  ZdZdZdZdZdZi Zde d<   da!de d<   dnd„Z"dod „Z#dpd"„Z$dqd$„Z%drd%„Z&dsd&„Z'dtd(„Z(dud+„Z)dud,„Z*dud-„Z+dvd/„Z,dwd2„Z-	 	 dxdyd3„Z.ddd4ddd5œdzdA„Z/dtdB„Z0d{dC„Z1dDddddddddEœd|dQ„Z2d}dT„Z3d~dV„Z4d~dW„Z5d~dX„Z6d~dY„Z7dd[„Z8d€d\„Z9d�d‚d]„Z:dƒd^„Z;	 d�dd_œd„de„Z<d�d…dg„Z=d�d†dh„Z>d�d‡di„Z?d�dˆdj„Z@d‰dk„ZAdŠdm„ZBdS )‹uN   Per-agent knowledge base: extract â†’ chunk â†’ embed â†’ Chroma â†’ retrieve.é    )ÚannotationsN)ÚPath)ÚAny)ÚChroma)ÚDocument)ÚBASE_DIRÚget_settings)Úget_rag_service)Údb)Ú	rag_debugÚdataÚ
kb_uploadsÚagent_avatarsÚchromaÚtenantsé(   é   ip  éP   é   zdict[str, Chroma]Ú_agent_storesú
int | NoneÚ_embed_dim_cacheÚagent_idÚstrÚreturnc                óD   — d|                       dd¦  «        d d…         › �S )NÚa_Ú-Ú é   )Úreplace)r   s    ú'/var/www/html/CA-Chatbot/app/saas/kb.pyÚagent_collection_namer#       s)   € Ø0�× Ò   bÑ)Ô)¨#¨2¨#Ô.Ð0Ð0Ð0ó    Úorg_idr   c                óN   — t           | z  |z  }|                     dd¬¦  «         |S ©NT©ÚparentsÚexist_ok)ÚTENANT_CHROMA_ROOTÚmkdir©r%   r   Úpaths      r"   Úagent_persist_dirr/   $   s,   € Ý Ñ&¨Ñ1€DØ‡J‚J�t d€JÑ+Ô+Ð+Ø€Kr$   r   c                óF  — | › d|› �}|t           v rt           |         S t          ¦   «         }t          |¦  «        }t          t	          | |¦  «        ¦  «        }t          ||j        |¬¦  «        }|t           |<   t          j        d||t          ¦   «         j
        ¦  «         |S )Nú:©Úcollection_nameÚembedding_functionÚpersist_directoryz;Opened agent Chroma collection=%s persist=%s embed_model=%s)r   r
   r#   r   r/   r   Ú
embeddingsÚdbgÚlog_infor	   Úembedding_model)r%   r   ÚkeyÚserviceÚnameÚpersistÚstores          r"   Úget_agent_vectorstorer?   *   sµ   € ØÐ
 Ð
 �hÐ
 Ð
 €CØ
�mÐÐÝ˜SÔ!Ð!ÝÑÔ€GÝ  Ñ*Ô*€DÝÕ# F¨HÑ5Ô5Ñ6Ô6€GÝØØ"Ô-Ø!ðñ ô €Eð
 …M�#ÑÝ„LØEØØÝ‰ŒÔ&ñ	ô ð ð €Lr$   Úintc                ó¬   — 	 t          | |¦  «        j                             ¦   «         S # t          $ r }t	          j        d|¦  «         Y d }~dS d }~ww xY w)Nzagent_document_count failed: %sr   )r?   Ú_collectionÚcountÚ	Exceptionr7   Úlog_warn)r%   r   Úexcs      r"   Úagent_document_countrG   @   se   € ðÝ$ V¨XÑ6Ô6ÔB×HÒHÑJÔJÐJøÝð ð ð ÝŒÐ6¸Ñ<Ô<Ð<Øˆqˆqˆqˆqˆqøøøøðøøøs   ‚&) ©
A³AÁAc                ó4  — t           | z  }|                     dd¬¦  «         d| › �}|t          v rt          |         S t          ¦   «         }t	          d|                      dd¦  «        d d…         › �|j        t          |¦  «        ¬¦  «        }|t          |<   |S )	NTr(   zorg:Úorg_r   r   r    r2   )r+   r,   r   r
   r   r!   r6   r   )r%   r.   r:   r;   r>   s        r"   Úget_tenant_vectorstorerJ   H   s¤   € Ý Ñ&€DØ‡J‚J�t d€JÑ+Ô+Ð+Ø
�ˆ/ˆ/€CØ
�mÐÐÝ˜SÔ!Ð!ÝÑÔ€GÝØ=˜vŸ~š~¨c°2Ñ6Ô6°s¸°sÔ;Ð=Ð=Ø"Ô-Ý˜d™)œ)ðñ ô €Eð
 …M�#ÑØ€Lr$   c                ór   — 	 t          | ¦  «        j                             ¦   «         S # t          $ r Y dS w xY w)Nr   )rJ   rB   rC   rD   )r%   s    r"   Útenant_document_countrL   X   sF   € ðÝ% fÑ-Ô-Ô9×?Ò?ÑAÔAÐAøÝð ð ð Øˆqˆqðøøøs   ‚%( ¨
6µ6Útextc                ó²   — | pd                      dd¦  «        } t          j        dd| ¦  «        } t          j        dd| ¦  «        } |                      ¦   «         S )Nr   õ   Â Ú z[ \t]+z\n{3,}ú

)r!   ÚreÚsubÚstrip)rM   s    r"   Únormalize_whitespacerU   _   sO   € ØˆJ�B×Ò ¨#Ñ.Ô.€DÝŒ6�)˜S $Ñ'Ô'€DÝŒ6�)˜V TÑ*Ô*€DØ�:Š:‰<Œ<Ðr$   ÚlineÚboolc                óT  — |                       ¦   «         }|rt          |¦  «        dk    rdS |                     d¦  «        rdS t          j        d|¦  «        rdS d„ |D ¦   «         }t          |¦  «        dk    r/t          d„ |D ¦   «         ¦  «        t          |¦  «        z  d	k    rdS dS )
Néx   Fú#Tz^\d+(\.\d+)*\s+\Sc                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS © )Úisalpha©Ú.0Úcs     r"   ú
<listcomp>z_is_heading.<locals>.<listcomp>n   s%   € Ð+Ð+Ð+�Q˜qŸyšy™{œ{Ð+ˆqÐ+Ð+Ð+r$   é   c              3  óB   K  — | ]}|                      ¦   «         ¯d V — ŒdS )é   N)Úisupperr^   s     r"   ú	<genexpr>z_is_heading.<locals>.<genexpr>o   s/   è è € Ð CÐ C q°q·y²y±{´{Ð C Ð CÐ CÐ CÐ CÐ CÐ Cr$   g      è?)rT   ÚlenÚ
startswithrR   ÚmatchÚsum)rV   ÚsÚletterss      r"   Ú_is_headingrm   f   s¸   € Ø�
Š
‰Œ€AØð •�A‘”˜’�ØˆuØ‡|‚|�CÑÔð ØˆtÝ	„xÐ$ aÑ(Ô(ð ØˆtØ+Ð+˜!Ð+Ñ+Ô+€GÝ
ˆ7�|„|�qÒÐ�SÐ CÐ C¨GÐ CÑ CÔ CÑCÔCÅcÈ'ÁlÄlÑRÐUYÒYÐYØˆtØˆ5r$   c                ój   — t          t          j        d|                      ¦   «         ¦  «        ¦  «        S )Nu   ^([-*â€¢]|\d+[.)])\s+\S)rW   rR   ri   rT   )rV   s    r"   Ú_is_list_itemro   t   s%   € Ý•”Ð3°T·Z²Z±\´\ÑBÔBÑCÔCÐCr$   c                óŽ   — |                       ¦   «         }|                     d¦  «        dk    p|                     d¦  «        dk    S )NÚ|é   ú	)rT   rC   )rV   rk   s     r"   Ú_is_table_rowrt   x   s8   € Ø�
Š
‰Œ€AØ�7Š7�3‰<Œ<˜1ÒÐ2 §¢¨¡¤°Ò 2Ð2r$   ú	list[str]c                óh  ‡‡‡— g Šg ŠdŠdˆˆˆfd„}| pd                      ¦   «         D ]õ}|                     ¦   «         }|                     ¦   «         }|s |¦   «          Œ7t          |¦  «        r  |¦   «          ‰                     |¦  «         Œft          |¦  «        r&‰dvr
 |¦   «          dŠ‰                     |¦  «         Œ›t          |¦  «        r&‰dvr
 |¦   «          d	Š‰                     |¦  «         ŒÐ‰d
v r
 |¦   «          dŠ‰                     |¦  «         Œö |¦   «          d„ ‰D ¦   «         S )zDSplit text into headings, paragraphs, list blocks, and table blocks.Nr   ÚNonec                 ó¬   •— ‰ rN‰                      d                     ‰ ¦  «                             ¦   «         ¦  «         ‰                      ¦   «          d Šd S )NÚ
)ÚappendÚjoinrT   Úclear)ÚbufÚmodeÚunitss   €€€r"   Úflushz&_split_structural_units.<locals>.flushƒ   sI   ø€ àð 	Ø�LŠL˜Ÿš 3™œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ø�IŠI‰KŒKˆKØˆˆˆr$   r   )NÚtabler�   )NÚlistr‚   )r‚   r�   Úparac                ó   — g | ]}|¯|‘ŒS r\   r\   )r_   Úus     r"   ra   z+_split_structural_units.<locals>.<listcomp>¥   s   € Ð"Ð"Ð"�! Ð"ˆAÐ"Ð"Ð"r$   )r   rw   )Ú
splitlinesÚrstriprT   rm   rz   rt   ro   )rM   r€   ÚrawrV   Ústrippedr}   r~   r   s        @@@r"   Ú_split_structural_unitsrŠ   }   s�  øøø€ à€EØ€CØ€Dðð ð ð ð ð ð ð ð �
˜×&Ò&Ñ(Ô(ð ð ˆØ�zŠz‰|Œ|ˆØ—:’:‘<”<ˆØð 	ØˆE‰GŒGˆGØÝ�xÑ Ô ð 	ØˆE‰GŒGˆGØ�LŠL˜Ñ"Ô"Ð"ØÝ˜Ñ"Ô"ð 	Ø˜?Ð*Ð*Ø�‘”�ØˆDØ�JŠJ�xÑ Ô Ð ØÝ˜Ñ"Ô"ð 	Ø˜>Ð)Ð)Ø�‘”�ØˆDØ�JŠJ�xÑ Ô Ð ØØÐ$Ð$Ð$ØˆE‰GŒGˆGØˆØ�
Š
�8ÑÔÐÐØ	€E�G„G€GØ"Ð"�uÐ"Ñ"Ô"Ð"r$   Ú
chunk_sizeÚoverlapc                óÚ  — g }d}t          | ¦  «        }||k     rÑt          ||z   |¦  «        }||k     re| ||…         }t          |                     d¦  «        |                     d¦  «        |                     d¦  «        ¦  «        }||dz  k    r||z   dz   }| ||…                              ¦   «         }	|	r|                     |	¦  «         ||k    rnt          d||z
  ¦  «        }||k     °Ñ|S )Nr   ry   z. rP   é   rd   )rg   ÚminÚmaxÚrfindrT   rz   )
rM   r‹   rŒ   ÚpiecesÚstartÚnÚendÚwindowÚbrÚpieces
             r"   Ú
_hard_wrapr™   ¨   sÿ   € Ø€FØ€EÝˆD‰	Œ	€AØ
�!Š)ˆ)Ý�%˜*Ñ$ aÑ(Ô(ˆØ�Š7ˆ7Ø˜% ˜)”_ˆFÝ�V—\’\ $Ñ'Ô'¨¯ª°dÑ);Ô);¸V¿\º\È#Ñ=NÔ=NÑOÔOˆBØ�J !‘OÒ#Ð#Ø˜b‘j 1‘n�Ø�U˜3�Y”×%Ò%Ñ'Ô'ˆØð 	!Ø�MŠM˜%Ñ Ô Ð Ø�!Š8ˆ8ØÝ�A�s˜W‘}Ñ%Ô%ˆð �!Š)ˆ)ð €Mr$   c                ó  — t          ¦   «         }|p|j        }|p|j        }t          | ¦  «        } | sg S t	          | ¦  «        t
          k     rg S t	          | ¦  «        |k    r| dt          …         gS t          | ¦  «        }|s| g}g }d}|D ]´}|                     ¦   «         }|sŒt	          |¦  «        |k    r>|r| 	                    |¦  «         d}| 
                    t          |||¦  «        ¦  «         Œj|s|}Œot	          |¦  «        dz   t	          |¦  «        z   |k    r|› d|› �}Œ�| 	                    |¦  «         |}Œµ|r| 	                    |¦  «         g }|D ]’}	|	                     ¦   «         }	|	sŒ|rUt	          |	¦  «        t          k     r=t	          |d         ¦  «        dz   t	          |	¦  «        z   |k    r|d         › d|	› �|d<   Œp| 	                    |	dt          …         ¦  «         Œ“|s(t	          | ¦  «        t
          k    r| dt          …         g}|dk    �rbt	          |¦  «        dk    �rN|d         g}
t          dt	          |¦  «        ¦  «        D �]$}||dz
           }|| d…         }t          |                     d¦  «        |                     d	¦  «        ¦  «        }d|cxk     rt	          |¦  «        dz  k     rn n||dz   d…         }||         }|                     |                     ¦   «         dd
…         ¦  «        sO|                     ¦   «         › d|› �                     ¦   «         }|
 	                    |dt          …         ¦  «         �Œ|
 	                    |dt          …         ¦  «         �Œ&|
}d„ |D ¦   «         }|S )zAStructure-aware chunking with overlap between consecutive chunks.Nr   rr   rQ   éÿÿÿÿr   rd   ry   rP   r   c                ó´   — g | ]U}|¯t          |                     ¦   «         ¦  «        t          t          t          ¦  «        k    ¯A|                     ¦   «         ‘ŒVS r\   )rg   rT   r�   ÚMIN_CHUNK_CHARSÚMIN_DOC_CHARSr^   s     r"   ra   zchunk_text.<locals>.<listcomp>  sH   € Ð
dÐ
dÐ
d˜¨Ð
d­c°!·'²'±)´)©n¬nÅÅOÕUbÑ@cÔ@cÒ.cÐ.cˆ1�7Š7‰9Œ9Ð.cÐ.cÐ.cr$   )r	   Úkb_chunk_sizeÚkb_chunk_overlaprU   rg   rž   ÚMAX_CHUNK_CHARSrŠ   rT   rz   Úextendr™   r�   Úranger�   Úfindrh   )rM   r‹   rŒ   Úsettingsr   Úpackedr}   ÚunitÚmergedr˜   Ú
overlappedÚiÚprevÚtailÚspÚ
next_chunkÚcomboÚouts                     r"   Ú
chunk_textr±   ¼   sß  € õ ‰~Œ~€HØÐ5˜xÔ5€JØÐ2˜Ô2€GÝ Ñ%Ô%€DØð Øˆ	Ý
ˆ4�y„y•=Ò Ð Øˆ	Ý
ˆ4�y„y�JÒÐØÐ%•oÐ%Ô&Ð'Ð'å# DÑ)Ô)€EØð Ø�ˆà€FØ
€CØð ð ˆØ�zŠz‰|Œ|ˆØð 	ØÝˆt‰9Œ9�zÒ!Ð!Øð Ø—’˜cÑ"Ô"Ð"Ø�Ø�MŠM�* T¨:°wÑ?Ô?Ñ@Ô@Ð@ØØð 	ØˆCˆCÝ�‰XŒX˜‰\�C ™IœIÑ%¨Ò3Ð3ØÐ$Ð$˜dÐ$Ð$ˆCˆCà�MŠM˜#ÑÔÐØˆCˆCØ
ð Ø�Š�cÑÔÐð €FØð 3ð 3ˆØ—’‘”ˆØð 	Øàð	3å�E‘
”
�_Ò,Ð,Ý�F˜2”J‘” !Ñ#¥c¨%¡j¤jÑ0°JÒ>Ð>à" 2œJÐ3Ð3¨EÐ3Ð3ˆF�2‰JˆJà�MŠM˜%Ð 0¥Ð 0Ô1Ñ2Ô2Ð2Ð2àð *•c˜$‘i”i¥=Ò0Ð0ØÐ'�Ð'Ô(Ð)ˆð �‚{�{•s˜6‘{”{ Q’‘Ø!'¨¤ ˆ
Ý�q�#˜f™+œ+Ñ&Ô&ð 	@ñ 	@ˆAØ˜!˜a™%”=ˆDØ˜˜˜	˜	”?ˆDå�T—Y’Y˜t‘_”_ d§i¢i°¡n¤nÑ5Ô5ˆBØ�2Ð&Ð&Ò&Ð&�˜D™	œ	 Q™Ò&Ð&Ð&Ð&Ð&Ø˜B ™F˜H˜H”~�Ø œˆJØ×(Ò(¨¯ª©¬°c°r°cÔ):Ñ;Ô;ð @ØŸ:š:™<œ<Ð9Ð9¨ZÐ9Ð9×?Ò?ÑAÔA�Ø×!Ò! %Ð(8­Ð(8Ô"9Ñ:Ô:Ð:Ñ:à×!Ò! *Ð-=­oÐ-=Ô">Ñ?Ô?Ð?Ñ?Øˆà
dÐ
d˜fÐ
dÑ
dÔ
d€CØ€Jr$   r   )Úchunk_indexÚ
chunk_kindÚcontentÚparent_chunk_idÚsectionÚdoc_idÚfilenameÚpageÚridr²   r³   ú
str | Noner´   rµ   r¶   Údictc               ó    — |pt          |¦  «        }d|› �d|› �| ||d||t          |¦  «        t          |¦  «        |dœ}|	r|	|d<   |
r|
|d<   |S )NÚkb_Ú	tenant_kb)Ú	record_idÚchunk_idr%   r   r·   Údata_categoryÚsource_datasetÚsource_filer¹   r²   r³   rµ   r¶   )Úinfer_chunk_kindr@   )r%   r   r·   r¸   r¹   rº   r²   r³   r´   rµ   r¶   ÚkindÚmetas                r"   Ú_metarÈ     s‰   € ð Ð2Õ)¨'Ñ2Ô2€Dà ˜3�[�[Ø˜#�K�KØØØØ$Ø"ØÝ�D‘	”	Ý˜;Ñ'Ô'Øðð €Dð ð 2Ø"1ˆÐÑØð "Ø!ˆˆY‰Ø€Kr$   c                ól  — | pd                      ¦   «         }t          j        d|¦  «        rdS t          j        d|¦  «        rdS t          j        d|¦  «        rdS t          j        d|¦  «        rt          |¦  «        d	k     rd
S t          j        d|¦  «        rdS t          j        d|¦  «        rdS d
S )z7Classify chunk content for metadata-filtered retrieval.r   z@statement\s+period|from\s+date|to\s+date|period\s*:|date\s*rangeÚstatement_periodz�account\s+holder|customer\s+name|a/?c\s*(?:no|number)|ifsc|micr|branch\s*(?:code|name)|cust(?:omer)?\s*id|opening\s+balance|closing\s+balanceÚheaderzftotal\s+money|payments?\s+made|money\s+paid|money\s+received|total\s+(?:spent|debit|credit)|net\s+cashÚtotalsz\bsummary\b|\boverview\bi°  Úsummaryzmerchant|upi\s+id|paid\s+to|vpaÚmerchantui   â‚¹|rs\.?\s*\d|\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)|debit|credit|txn|transactionÚtransaction)ÚlowerrR   Úsearchrg   )rM   Úts     r"   rÅ   rÅ   3  sê   € à	ˆ�×ÒÑÔ€AÝ	„yØKØ	ñô ð "ð "Ð!Ý	„yð	Yà	ñô ð ð
 ˆxÝ	„yð	5à	ñô ð ð
 ˆxÝ	„yÐ,¨aÑ0Ô0ð µS¸±V´V¸d²]°]ØˆyÝ	„yÐ3°QÑ7Ô7ð ØˆzÝ	„yð	(à	ñô ð ð
 ˆ}Øˆ9r$   c                 ó  — t           �t           S t          ¦   «         } | j                             d¦  «        }|st	          d¦  «        ‚t          |¦  «        a t          j        dt          ¦   «         j	        t           ¦  «         t           S )NÚprobez*Embedding generation returned empty vectorzEmbedding model=%s dimension=%s)
r   r
   r6   Úembed_queryÚRuntimeErrorrg   r7   r8   r	   r9   )r;   Úvecs     r"   Ú_probe_embedding_dimrØ   T  s   € åÐ#ÝÐÝÑÔ€GØ
Ô
×
(Ò
(¨Ñ
1Ô
1€CØð IÝÐGÑHÔHÐHÝ˜3‘x”xÐÝ„LØ)Ý‰ŒÔ&Ýñô ð õ
 Ðr$   Ú
processing)ÚstatusÚerrorÚ
page_countÚpages_processedÚchunks_createdÚembeddings_doneÚvectors_storedÚchunk_countÚstageÚpctrÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   rw   c       
        ó–   — t          j        | ||t          dt          dt	          |¦  «        ¦  «        ¦  «        ||||||	|
¬¦  «         d S )Nr   éd   )
rÚ   Úprogress_stageÚprogress_pctrÛ   rÜ   rÝ   rÞ   rß   rà   rá   )Úsaas_dbÚupdate_kb_documentr�   r�   r@   )r·   râ   rã   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   s              r"   Ú_set_progressrê   e  sc   € õ ÔØØØÝ˜�C ¥S¨¡X¤XÑ.Ô.Ñ/Ô/ØØØ'Ø%Ø'Ø%Øðñ ô ð ð ð r$   r.   ú"tuple[list[tuple[int, str]], dict]c                óš  — ddl }g }d}|                     t          | ¦  «        ¦  «        5 }t          |j        ¦  «        }t          |j        d¬¦  «        D �]"\  }}t          |                     ¦   «         pd¦  «        }	 |                     ¦   «         pg }	n# t          $ r g }	Y nw xY wg }
|	D ]{}g }|pg D ]E}d„ |D ¦   «         }t          |¦  «        r(|                     d                     |¦  «        ¦  «         ŒF|r+|
                     dd	                     |¦  «        z   ¦  «         Œ||
r-d
                     |
¦  «        }t          |r|› d
|› �n|¦  «        }|s|dz  }�Œ|                     ||f¦  «         �Œ$	 ddd¦  «         n# 1 swxY w Y   d
                     d„ |D ¦   «         ¦  «        }|t          |¦  «        ||t          |¦  «        |dd…         |dk    ot          |¦  «        dk    dt          |¦  «        cxk     o
t          k     nc ddœ	}|d         |d         k    r!t          d|d         › d|d         › �¦  «        ‚||fS )z©Return [(page_num, text), ...] for pages with text, plus extraction stats.

    Every page is examined; empty/scanned pages are counted but omitted from text pairs.
    r   Nrd   ©r“   r   c                óX   — g | ]'}|�!t          |¦  «                             ¦   «         nd‘Œ(S )Nr   )r   rT   r^   s     r"   ra   z%extract_pdf_pages.<locals>.<listcomp>˜  s.   € ÐRÐRÐRÈ¨q¨}�S ™VœVŸ\š\™^œ^˜^À"ÐRÐRÐRr$   ú | z[Table]
ry   rQ   c              3  ó    K  — | ]	\  }}|V — Œ
d S ©Nr\   )r_   Ú_rÒ   s      r"   rf   z$extract_pdf_pages.<locals>.<genexpr>¥  s&   è è € Ð+Ð+™T˜Q �qÐ+Ð+Ð+Ð+Ð+Ð+r$   éô  )	Útotal_pagesÚpages_with_textrÝ   Úempty_pagesÚtotal_charsÚpreview_500Úlikely_scannedÚ
very_shortÚpages_skippedrÝ   rô   z"Page coverage mismatch: processed=z total=)Ú
pdfplumberÚopenr   rg   ÚpagesÚ	enumeraterU   Úextract_textÚextract_tablesrD   Úanyrz   r{   ÚEMPTY_EXTRACT_WARN_CHARSrÖ   )r.   rü   rþ   rö   Úpdfrô   Úpage_numr¹   Ú	page_textÚtablesÚtable_blocksr�   ÚrowsÚrowÚcellsÚextraÚfullÚstatss                     r"   Úextract_pdf_pagesr  ‚  s
  € ð
 ÐÐÐà#%€EØ€KØ	�Š�˜T™œÑ	#Ô	#ð 0 sÝ˜#œ)‘n”nˆÝ'¨¬	¸Ð;Ñ;Ô;ð 	0ñ 	0‰NˆH�dÝ,¨T×->Ò->Ñ-@Ô-@Ð-FÀBÑGÔGˆIðØ×,Ò,Ñ.Ô.Ð4°"��øÝð ð ð Ø���ðøøøà&(ˆLØð Gð G�Ø"$�Ø ˜; Bð 7ð 7�CØRÐRÈcÐRÑRÔR�EÝ˜5‘z”zð 7ØŸš E§J¢J¨uÑ$5Ô$5Ñ6Ô6Ð6øØð GØ ×'Ò'¨°d·i²iÀ±o´oÑ(EÑFÔFÐFøØð dØŸš LÑ1Ô1�Ý0ÈiÐ1b°IÐ1JÐ1JÀ5Ð1JÐ1JÐ1JÐ]bÑcÔc�	Øð Ø˜qÑ �ÙØ�LŠL˜( IÐ.Ñ/Ô/Ð/Ñ/ð-	0ð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð4 �;Š;Ð+Ð+ UÐ+Ñ+Ô+Ñ+Ô+€Dà"Ý˜u™:œ:Ø&Ø"Ý˜4‘y”yØ˜D˜S˜D”zØ%¨š/Ð=­c°%©j¬j¸AªoØ�#˜d™)œ)Ð>Ð>Ò>Ð>Õ&>Ò>Ð>Ð>Ð>Øð
ð 
€Eð ÐÔ 5¨Ô#7Ò7Ð7ÝØh°Ð7HÔ1IÐhÐhÐRWÐXeÔRfÐhÐhñ
ô 
ð 	
ð �%ˆ<Ðs7   «AFÂ BÂFÂB&Â#FÂ%B&Â&CFÆFÆFútuple[list[Document], dict]c                ó  — t          | ¦  «        \  }}t          j        d||d         |d         |d         |d         ¦  «         t          j        d|d         ¦  «         |d         r$t          j        d|¦  «         t	          d	¦  «        ‚|d
         rt          j        d|d         |¦  «         |st	          d¦  «        ‚g }t          ¦   «         }d}	|D �]†\  }
}t          j        |› d|› d|
› �                     ¦   «         ¦  «         	                    ¦   «         d d…         }d|› �}d|
› d|› d|› �}t          t          |¦  «        ¦  «        D �]
\  }}t          j        |                     dd¬¦  «        ¦  «         	                    ¦   «         }||v rt          j        d|
|¦  «         Œ\|                     |¦  «         t          j        |› d|› d|
› d|› d|d d…         › �	                     ¦   «         ¦  «         	                    ¦   «         d d…         }|                     t          |t          |||||
||	||d|
› �¬¦
  «
        ¬¦  «        ¦  «         |	dz  }	�Œ�Œˆi |¥t!          |¦  «        t!          |¦  «        dœ¥}||fS )Nz3PDF extract file=%s pages=%s/%s chars=%s scanned=%srõ   rô   r÷   rù   z#PDF extract preview (500 chars): %srø   uY   PDF appears scanned/image-only (no extractable text): %s â€” OCR not applied in KB ingestz]No extractable text in PDF (likely scanned/image). Export a text PDF or OCR it before upload.rú   z+PDF extraction very short (%s chars) for %sz*PDF text extraction returned empty contentr   r1   z	:parent:pr   r¾   z[Page rï   ú]
úutf-8Úignore)Úerrorsz'Skipping duplicate chunk page=%s idx=%sé   Úpage_©r²   r´   rµ   r¶   ©Úpage_contentÚmetadatard   )rÞ   Úunique_chunk_hashes)r  r7   r8   rE   Ú
ValueErrorÚsetÚhashlibÚmd5ÚencodeÚ	hexdigestrÿ   r±   Úaddrz   r   rÈ   rg   )r.   r%   r   r·   r¸   rþ   r  ÚdocsÚseen_hashesÚ
global_idxr  r  Ú
parent_ridrµ   ÚheadedÚidxÚchunkÚdigestrº   s                      r"   Ú_docs_from_pdfr,  ¸  s#  € õ % TÑ*Ô*�L€Eˆ5Ý„LØ=ØØÐÔ ØˆmÔØˆmÔØÐÔñô ð õ „LÐ6¸¸mÔ8LÑMÔMÐMØÐÔð 
ÝŒØgØñ	
ô 	
ð 	
õ ð9ñ
ô 
ð 	
ð ˆ\Ôð 
ÝŒØ9Ø�-Ô Øñ	
ô 	
ð 	
ð
 ð GÝÐEÑFÔFÐFà€DÝ™EœE€KØ€JØ$ð !ñ !Ñˆ�)å”[ØÐ5Ð5˜&Ð5Ð5¨8Ð5Ð5×<Ò<Ñ>Ô>ñ
ô 
ç
Š)‰+Œ+�c�r�côˆ
ð - 
Ð,Ð,ˆØ?˜(Ð?Ð? xÐ?Ð?°IÐ?Ð?ˆÝ#¥J¨vÑ$6Ô$6Ñ7Ô7ð 	ñ 	‰JˆC�Ý”[ §¢¨g¸h Ñ!GÔ!GÑHÔH×RÒRÑTÔTˆFØ˜Ð$Ð$Ý”ÐFÈÐRUÑVÔVÐVØØ�OŠO˜FÑ#Ô#Ð#Ý”+ØÐDÐD˜fÐDÐD xÐDÐD°#ÐDÐD¸¸rÀ¸r¼
ÐDÐD×KÒKÑMÔMñô çŠi‰kŒk˜#˜2˜#ôˆCð �KŠKÝØ!&Ý"ØØ ØØ Ø ØØ$.Ø %Ø(7Ø 2¨Ð 2Ð 2ðñ ô ðñ ô ñô ð ð" ˜!‰OˆJ‰Jñ5	ð6 \ˆuÐ[­¨D©	¬	Í#ÈkÑJZÔJZÐ[Ð[Ð[€EØ�ˆ;Ðr$   c                ó  — t          |                      dd¬¦  «        ¦  «        }t          j        d|t	          |¦  «        |d d…         ¦  «         t	          |¦  «        t
          k     rt          dt
          › d�¦  «        ‚g }t          ¦   «         }t          j	        |› d|› d	� 
                    ¦   «         ¦  «                             ¦   «         d d
…         }d|› �}	t          t          d|› d|› �¦  «        ¦  «        D ]å\  }
}t          j	        | 
                    ¦   «         ¦  «                             ¦   «         }||v rŒB|                     |¦  «         t          j	        |› d|› d|
› d|d d…         › � 
                    ¦   «         ¦  «                             ¦   «         d d
…         }|                     t!          |t#          ||||d||
||	d¬¦
  «
        ¬¦  «        ¦  «         Œæd|rdndddt	          |¦  «        t	          |¦  «        dœ}||fS )Nr  r  )Úencodingr  z(Text extract file=%s chars=%s preview=%sró   zSNo usable text extracted (file too short, empty, or image-only PDF). Need at least z characters.r1   z:parent:filer   r¾   z[File r  z:t:r  rd   Úfiler  r  r   ©rô   rõ   rÝ   rö   r÷   rÞ   )rU   Ú	read_textr7   r8   rg   rž   r  r  r  r   r!  r"  rÿ   r±   r#  rz   r   rÈ   )r.   r%   r   r·   r¸   rM   r$  Úseenr'  rµ   r)  r*  r+  rº   r  s                  r"   Ú_docs_from_textr3     sU  € õ   §¢¸È Ñ QÔ QÑRÔR€DÝ„LÐ;¸XÅsÈ4ÁyÄyÐRVÐW[ÐX[ÐW[ÔR\Ñ]Ô]Ð]Ý
ˆ4�y„y•=Ò Ð Ýð9Ý*ð9ð 9ð 9ñ
ô 
ð 	
ð €DÝ‘U”U€DÝ” Ð?Ð?¨6Ð?Ð?Ð?×FÒFÑHÔHÑIÔI×SÒSÑUÔUÐVYÐWYÐVYÔZ€JØ(˜JÐ(Ð(€OÝ¥
Ð+G°HÐ+GÐ+GÀÐ+GÐ+GÑ HÔ HÑIÔIð 
ð 
‰
ˆˆUÝ”˜UŸ\š\™^œ^Ñ,Ô,×6Ò6Ñ8Ô8ˆØ�Tˆ>ˆ>ØØ�Š�ÑÔÐÝŒk˜XÐEÐE¨ÐEÐE°3ÐEÐE¸ÀÀÀ¼ÐEÐE×LÒLÑNÔNÑOÔO×YÒYÑ[Ô[Ð\_Ð]_Ð\_Ô`ˆØ�ŠÝØ"ÝØØØØØØØ #Ø!Ø$3Ø"ðñ ô ðñ ô ñ	
ô 	
ð 	
ð 	
ð$ Ø $Ð+˜1˜1¨!ØØÝ˜4‘y”yÝ˜d™)œ)ðð €Eð �ˆ;Ðr$   c                ó(  ‡— dd l }|                     | ¦  «        }t          j        d|t	          |¦  «        t          |j        ¦  «        ¦  «         g }t          ¦   «         }|                     ¦   «         D �]Œ\  }	Šˆfd„|j        D ¦   «         }
t          d 
                    |
¦  «        ¦  «        }t	          |¦  «        t          k     rŒTt          j        |                     ¦   «         ¦  «                             ¦   «         }||v rŒ‘|                     |¦  «         t          j        |› d|› d|	› d|d d…         › �                     ¦   «         ¦  «                             ¦   «         d d…         }t#          |	t$          ¦  «        rt%          |	¦  «        d	z   nd	}|                     t)          |d t*          …         t-          ||||||t#          |	t$          ¦  «        rt%          |	¦  «        nd|¬
¦  «        ¬¦  «        ¦  «         �ŒŽt/          d	t	          |¦  «        ¦  «        t	          |¦  «        t	          |¦  «        t/          dt	          |¦  «        t	          |¦  «        z
  ¦  «        t1          d„ |D ¦   «         ¦  «        t	          |¦  «        dœ}||fS )Nr   z#CSV extract file=%s rows=%s cols=%sc                óX   •— g | ]&}t          ‰|         ¦  «        d v¯|› d‰|         › �‘Œ'S )>   r   Únanú: )r   )r_   Úcolr
  s     €r"   ra   z"_docs_from_csv.<locals>.<listcomp>:  s@   ø€ Ð`Ð`Ð`¨#½sÀ3ÀsÄ8¹}¼}ÐT_Ð?_Ð?_�CÐ%Ð%˜3˜sœ8Ð%Ð%Ð?_Ð?_Ð?_r$   rï   r1   z:csv:r  r   rd   )r²   r´   r  c              3  ó>   K  — | ]}t          |j        ¦  «        V — Œd S rñ   )rg   r  ©r_   Úds     r"   rf   z!_docs_from_csv.<locals>.<genexpr>X  s,   è è € Ð=Ð=°1�3˜qœ~Ñ.Ô.Ð=Ð=Ð=Ð=Ð=Ð=r$   r0  )ÚpandasÚread_csvr7   r8   rg   r‚   Úcolumnsr  ÚiterrowsrU   r{   r�   r  r   r!  r"  r#  Ú
isinstancer@   rz   r   r¡   rÈ   r�   rj   )r.   r%   r   r·   r¸   ÚpdÚdfr$  r2  r)  Úpartsr´   r+  rº   r¹   r  r
  s                   @r"   Ú_docs_from_csvrD  0  sv  ø€ ð ÐÐÐà	�Š�TÑ	Ô	€BÝ„LÐ6¸Å#ÀbÁ'Ä'Í4ÐPRÔPZÑK[ÔK[Ñ\Ô\Ð\Ø€DÝ‘U”U€DØ—K’K‘M”Mð 
ñ 
‰ˆˆSØ`Ð`Ð`Ð`°´Ð`Ñ`Ô`ˆÝ& u§z¢z°%Ñ'8Ô'8Ñ9Ô9ˆÝˆw‰<Œ<�/Ò)Ð)ØÝ”˜WŸ^š^Ñ-Ô-Ñ.Ô.×8Ò8Ñ:Ô:ˆØ�Tˆ>ˆ>ØØ�Š�ÑÔÐÝŒk˜XÐGÐG¨ÐGÐG°SÐGÐG¸6À"À1À"¼:ÐGÐG×NÒNÑPÔPÑQÔQ×[Ò[Ñ]Ô]Ð^aÐ_aÐ^aÔbˆÝ)¨#­sÑ3Ô3Ð:�s�3‰xŒx˜!‰|ˆ|¸ˆØ�ŠÝØ$Ð%5¥oÐ%5Ô6ÝØØØØØØÝ,6°s½CÑ,@Ô,@Ð G¥ C¡¤ ÀaØ#ð	ñ 	ô 	ðñ ô ñ	
ô 	
ð 	
ñ 	
õ  ˜1�c "™gœg‘”Ý˜t™9œ9Ý˜r™7œ7Ý˜1�c "™gœg­¨D©	¬	Ñ1Ñ2Ô2ÝÐ=Ð=¸Ð=Ñ=Ô=Ñ=Ô=Ý˜d™)œ)ðð €Eð �ˆ;Ðr$   c                ó$  — | j                              ¦   «         }|dk    rt          | ||||¦  «        \  }}nK|dv rt          | ||||¦  «        \  }}n0|dk    rt	          | ||||¦  «        \  }}nt          d|› d�¦  «        ‚t          j        d„ |D ¦   «         ¦  «        }t          j        d||d         |d	         |d
         |d         | 	                    d¦  «        | 	                    d¦  «        ¦  «         |d         dk    rt          d¦  «        ‚|d
         t          k     rt          j        d|d
         ¦  «         |d         t          k    rt          j        d|d         ¦  «         d„ |D ¦   «         }	t          |	¦  «        t          t          |	¦  «        ¦  «        k    rt          d¦  «        ‚t          |¦  «        | 	                    dt          |¦  «        ¦  «        k    rt          d¦  «        ‚i |¥|¥dt          |¦  «        i¥}
||
fS )Nú.pdf>   ú.mdú.txtú	.markdownz.csvzUnsupported file type: z. Use PDF, TXT, MD, or CSV.c              3  ó$   K  — | ]}|j         V — Œd S rñ   )r  r:  s     r"   rf   z"build_documents.<locals>.<genexpr>k  s$   è è € Ð >Ð >°A ¤Ð >Ð >Ð >Ð >Ð >Ð >r$   zCChunking complete file=%s count=%s avg=%s min=%s max=%s pages=%s/%srC   Úavgr�   r�   rõ   rô   r   zChunking produced zero chunksz#Some chunks are very small (min=%s)z$Some chunks exceed hard cap (max=%s)c                ó`   — g | ]+}t          |j        pi                      d ¦  «        ¦  «        ‘Œ,S ©rÀ   ©r   r  Úgetr:  s     r"   ra   z#build_documents.<locals>.<listcomp>~  s5   € Ð
BÐ
BÐ
B¸�3�”
Ð ˜b×%Ò% kÑ2Ô2Ñ3Ô3Ð
BÐ
BÐ
Br$   z-Duplicate chunk IDs generated during chunkingrÞ   z Chunk count mismatch after build)ÚsuffixrÐ   r,  r3  rD  r  r7   Úsummarize_chunksr8   rO  r�   rE   r¡   rg   r  rÖ   )r.   r%   r   r·   r¸   rP  r$  Úextract_statsr  ÚidsrÇ   s              r"   Úbuild_documentsrT  ^  s.  € ð Œ[×ÒÑ Ô €FØ�ÒÐÝ,¨T°6¸8ÀVÈXÑVÔVÑˆˆmˆmØ	Ð/Ð	/Ð	/Ý-¨d°F¸HÀfÈhÑWÔWÑˆˆmˆmØ	�6Ò	Ð	Ý,¨T°6¸8ÀVÈXÑVÔVÑˆˆmˆmåÐV°6ÐVÐVÐVÑWÔWÐWåÔ Ð >Ð >¸Ð >Ñ >Ô >Ñ>Ô>€EÝ„LØMØØˆgŒØˆeŒØˆeŒØˆeŒØ×ÒÐ+Ñ,Ô,Ø×Ò˜-Ñ(Ô(ñ	ô 	ð 	ð ˆW„~˜ÒÐÝÐ8Ñ9Ô9Ð9ØˆU„|•oÒ%Ð%ÝŒÐ:¸EÀ%¼LÑIÔIÐIØˆU„|•oÒ%Ð%ÝŒÐ;¸UÀ5¼\ÑJÔJÐJð CÐ
B¸TÐ
BÑ
BÔ
B€CÝ
ˆ3�x„x•3•s˜3‘x”x‘=”=Ò Ð ÝÐJÑKÔKÐKÝ
ˆ4�y„y�M×%Ò%Ð&6½¸D¹	¼	ÑBÔBÒBÐBÝÐ=Ñ>Ô>Ð>àBˆmÐB˜uÐBÐ&6½¸D¹	¼	ÐBÐB€DØ�ˆ:Ðr$   r>   c                óâ   — 	 | j                              d|ig ¬¦  «        }t          |                     d¦  «        pg ¦  «        S # t          $ r }t	          j        d|¦  «         Y d }~dS d }~ww xY w)Nr·   ©ÚwhereÚincluderS  z!vector count by doc_id failed: %sr›   )rB   rO  rg   rD   r7   rE   )r>   r·   ÚgotrF   s       r"   Ú_count_vectors_for_docrZ  ˆ  sƒ   € ðØÔ×#Ò#¨8°VÐ*<ÀbÐ#ÑIÔIˆÝ�3—7’7˜5‘>”>Ð' RÑ(Ô(Ð(øÝð ð ð ÝŒÐ8¸#Ñ>Ô>Ð>Øˆrˆrˆrˆrˆrøøøøðøøøs   ‚AA Á
A.ÁA)Á)A.c               ó¾
  — t          |dddd¬¦  «         	 t          ¦   «         }t          |dd¬¦  «         t          || |||¦  «        \  }}t          |¦  «        }t          |d	|› d
�dt	          |                     d¦  «        pd¦  «        t	          |                     d¦  «        pd¦  «        |¬¦  «         t          | |¦  «        }		 |	j                             d|i¬¦  «         n# t          $ r Y nw xY wt          |¦  «        }
|	j                             ¦   «         }d„ |D ¦   «         }t          |¦  «        t          t          |¦  «        ¦  «        k    rt          d¦  «        ‚d}t          d|t          ¦  «        D �]}|||t          z   …         }|||t          z   …         }dt	          d|t!          d|¦  «        z  z  ¦  «        z   }t          |d|› d|› d�|||¬¦  «         	 |	                     ||¬¦  «         nC# t          $ r6}t%          j        d|t          z  |¦  «         t          d|› �¦  «        |‚d }~ww xY w|t          |¦  «        z  }t          |d|› d|› d�dt	          d|t!          d|¦  «        z  z  ¦  «        z   ||¬¦  «         �Œt          |dd||¬¦  «         |	j                             ¦   «         }||z
  }t)          |	|¦  «        }t%          j        d|
|||||||¦	  «	         ||k    rt          d |› d!|› �¦  «        ‚|dk    r||k    rt          d"|› d#|› d$|› �¦  «        ‚||k     r'|dk     r!|||z   k     rt          d%|› d&|› d'|› �¦  «        ‚|d         }t%          j        d(||                     d)¦  «        |                     d¦  «        |||dk    r|n||j        d d*…                              d+d,¦  «        ¦  «         t1          ¦   «         j        ru|j                             ¦   «         d-k    rX	 t          |d.d/¬¦  «         dd0lm}  || ||||d1¬2¦  «         n-# t          $ r }t%          j        d3||¦  «         Y d }~nd }~ww xY wt          |d4d5d6dt	          |                     d¦  «        pd¦  «        t	          |                     d¦  «        pd¦  «        |||dk    r|n||¬7¦  «         t?          j         |¦  «        }|r/|                     d8¦  «        d9k    rt?          j!        |d:¬;¦  «         |S # t          $ rK}t%          j        d<|||¦  «         t?          j"        |d=tG          |¦  «        d d>…         d?d¬@¦  «         ‚ d }~ww xY w)ANu   Extracting textâ€¦é   rÙ   r   )râ   rã   rÚ   rÛ   u   Creating chunksâ€¦é   )râ   rã   zCreated z chunksé   rô   r   rÝ   )râ   rã   rÜ   rÝ   rÞ   r·   ©rW  c                ó`   — g | ]+}t          |j        pi                      d ¦  «        ¦  «        ‘Œ,S rM  rN  r:  s     r"   ra   z"ingest_kb_file.<locals>.<listcomp>±  s5   € ÐFÐFÐF¸A�s�A”JÐ$ "×)Ò)¨+Ñ6Ô6Ñ7Ô7ÐFÐFÐFr$   z+Duplicate chunk IDs generated during ingestéF   rd   u   Generating embeddingsâ€¦ (ú/ú))râ   rã   rÞ   rß   )rS  z(Embedding/storage failed at batch %s: %sz#Embedding or Chroma insert failed: u   Indexingâ€¦é_   un   Chroma ingest collection=%s before=%s after=%s insertedâ‰ˆ%s chunks=%s embeddings=%s vectors_for_doc=%s dim=%sz*Embedding count mismatch: embeddings_done=z chunks=zVector store mismatch: stored=z
 expected=z for doc_id=z)Chroma count did not grow enough: before=z after=z
 expected+zRIngest validated file=%s pages=%s/%s chunks=%s embeddings=%s vectors=%s example=%srõ   é    ry   rP   rF  u#   Indexing structured finance dataâ€¦éa   )Úindex_document_structuredzapplication/pdf)r%   r   Ú	kb_doc_idr.   r¸   Ú	mime_typez)FDI structured index failed doc_id=%s: %sÚDonerå   Úready)
râ   rã   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   Úkb_modeÚplatformÚcombined)rl  z.ingest_kb_file failed doc_id=%s file=%s err=%sÚfailedró   ÚFailed)rÚ   rÛ   ræ   rç   )$rê   rØ   rT  rg   r@   rO  r?   rB   ÚdeleterD   r#   rC   r  rÖ   r£   ÚEMBED_BATCHr�   Úadd_documentsr7   Ú	log_errorrZ  r8   r  r!   r	   Úfdi_enabledrP  rÐ   Úapp.fdi.pipelinerg  rE   rè   Ú	get_agentÚupdate_agentré   r   )r%   r·   r.   r¸   r   Údimr$  rÇ   r”   r>   Ú
collectionÚbeforerS  rß   rª   Ú
batch_docsÚ	batch_idsrã   rF   ÚafterÚinsertedÚstoredÚsamplerg  Úfdi_excÚagents                             r"   Úingest_kb_filer„  ‘  sç  € õ �&Ð 4¸!ÀLÐXZÐ[Ñ[Ô[Ð[ðUÝ"Ñ$Ô$ˆÝ�fÐ$8¸bÐAÑAÔAÐAÝ$ T¨6°8¸VÀXÑNÔN‰
ˆˆdÝ�‰IŒIˆÝØØ'˜QÐ'Ð'Ð'ØÝ˜4Ÿ8š8 MÑ2Ô2Ð7°aÑ8Ô8Ý §¢Ð):Ñ ;Ô ;Ð @¸qÑAÔAØð	
ñ 	
ô 	
ð 	
õ & f¨hÑ7Ô7ˆð	ØÔ×$Ò$¨H°fÐ+=Ð$Ñ>Ô>Ð>Ð>øÝð 	ð 	ð 	ØˆDð	øøøõ +¨8Ñ4Ô4ˆ
ØÔ"×(Ò(Ñ*Ô*ˆØFÐFÀÐFÑFÔFˆÝˆs‰8Œ8•s�3˜s™8œ8‘}”}Ò$Ð$ÝÐLÑMÔMÐMàˆÝ�q˜!�[Ñ)Ô)ð 	ñ 	ˆAØ˜a !¥k¡/Ð1Ô2ˆJØ˜A ¥K¡Ð/Ô0ˆIØ•s˜2 µ3°q¸!±9´9Ñ!<Ñ=Ñ>Ô>Ñ>ˆCÝØØI°?ÐIÐIÀQÐIÐIÐIØØ Ø /ðñ ô ð ðYØ×#Ò# J°IÐ#Ñ>Ô>Ð>Ð>øÝð Yð Yð YÝ”ÐHÈ!Í{ÑJZÐ\_Ñ`Ô`Ð`Ý"Ð#NÈÐ#NÐ#NÑOÔOÐUXÐXøøøøðYøøøð �s :™œÑ.ˆOÝØØI°?ÐIÐIÀQÐIÐIÐIØ�˜R ?µS¸¸A±Y´YÑ#>Ñ?Ñ@Ô@Ñ@Ø Ø /ðñ ô ð ñ õ 	ØØØØØ+ð	
ñ 	
ô 	
ð 	
ð Ô!×'Ò'Ñ)Ô)ˆØ˜6‘>ˆÝ'¨¨vÑ6Ô6ˆÝŒð@àØØØØØØØñ	
ô 	
ð 	
ð ˜aÒÐÝØY¸_ÐYÐYÐVWÐYÐYñô ð ð �QŠ;ˆ;˜6 Qš;˜;ÝØZ°ÐZÐZÀ1ÐZÐZÐRXÐZÐZñô ð ð �aŠ<ˆ<˜F QšJ˜Jà�v ‘zÒ!Ð!Ý"ØcÀÐcÐcÈuÐcÐcÐ`aÐcÐcñô ð ð �a”ˆÝŒØ`ØØ�HŠHÐ&Ñ'Ô'Ø�HŠH�]Ñ#Ô#ØØØ ’k�kˆFˆF xØÔ   # Ô&×/Ò/°°cÑ:Ô:ñ		
ô 		
ð 		
õ ‰>Œ>Ô%ð 	[¨$¬+×*;Ò*;Ñ*=Ô*=ÀÒ*GÐ*Gð[Ý˜fÐ,QÐWYÐZÑZÔZÐZØFÐFÐFÐFÐFÐFà)Ð)Ø!Ø%Ø$ØØ%Ø/ðñ ô ð ð øõ ð [ð [ð [å”ÐHÈ&ÐRYÑZÔZÐZÐZÐZÐZÐZÐZøøøøð[øøøõ 	ØØØØØÝ˜4Ÿ8š8 MÑ2Ô2Ð7°aÑ8Ô8Ý §¢Ð):Ñ ;Ô ;Ð @¸qÑAÔAØØ+Ø%+¨q¢[ [˜6˜6°aØð	
ñ 	
ô 	
ð 	
õ Ô! (Ñ+Ô+ˆØð 	?�U—Y’Y˜yÑ)Ô)¨ZÒ7Ð7ÝÔ  °:Ð>Ñ>Ô>Ð>ØˆøÝð 	ð 	ð 	ÝŒÐFÈÐPXÐZ]Ñ^Ô^Ð^ÝÔ"ØØÝ�c‘(”(˜4˜C˜4”.Ø#Øð	
ñ 	
ô 	
ð 	
ð 	øøøøð	øøøsŽ   –B2T Ã	C' Ã&T Ã'
C4Ã1T Ã3C4Ã4C3T Ç(H Ç?T È 
I È
1H;È;I É GT Ð)P- Ð,T Ð-
QÐ7QÑT ÑQÑB/T Ô
UÔAUÕUc                ó‚  — |s+t          j        |¦  «        }|pi                      d¦  «        }|sd S t          | |¦  «        }	 |j                             d|i¬¦  «         d S # t          $ rR 	 |j                             dd|ii¬¦  «         Y d S # t          $ r!}t          j        d|¦  «         Y d }~Y d S d }~ww xY ww xY w)Nr   r·   r_  z$eqzdelete_kb_vectors failed: %s)	rè   Úget_kb_documentrO  r?   rB   rq  rD   r7   rE   )r%   r·   r   Údocr>   rF   s         r"   Údelete_kb_vectorsrˆ  2  s  € Øð /ÝÔ% fÑ-Ô-ˆØ�I˜2—?’? :Ñ.Ô.ˆØð ØˆÝ! &¨(Ñ3Ô3€Eð>ØÔ× Ò ¨°&Ð'9Ð Ñ:Ô:Ð:Ð:Ð:øÝð >ð >ð >ð	>ØÔ×$Ò$¨H°u¸f°oÐ+FÐ$ÑGÔGÐGÐGÐGÐGøÝð 	>ð 	>ð 	>ÝŒLÐ7¸Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøð>øøøs0   ÁA" Á"
B>Á-BÂ
B:ÂB5Â.B>Â5B:Â:B>c                óÌ   — | › d|› �}t                                |d ¦  «         t          | |¦  «        }dd l}|                     ¦   «         r|                     |d¬¦  «         d S d S )Nr1   r   T)Úignore_errors)r   Úpopr/   ÚshutilÚexistsÚrmtree)r%   r   r:   r.   rŒ  s        r"   Údrop_agent_storer�  B  sy   € ØÐ
 Ð
 �hÐ
 Ð
 €CÝ×Ò�c˜4Ñ Ô Ð Ý˜V XÑ.Ô.€DØ€M€M€Mà‡{‚{�}„}ð 0Ø�Š�d¨$ˆÑ/Ô/Ð/Ð/Ð/ð0ð 0r$   )Úchunk_kindsÚquestionÚkr�  ú"tuple[str, ...] | list[str] | Noneú6tuple[list[tuple[Document, float | None]], str | None]c               óâ	  ‡— t          ¦   «         }t          |¦  «        }|sg dfS t          | |¦  «        }t          |¦  «        }	 |j                             ¦   «         }n# t          $ r}	g d|	› �fcY d}	~	S d}	~	ww xY w|dk    r.t          j        | |¦  «        }
|
dk    rg d|
› d|› d�fS g d|› d�fS |p|j	        }d	„ |pg D ¦   «         }t          ||rd
ndz  d¦  «        }|j        Šg }	 t          |                     |t          ||¦  «        ¬¦  «        ¦  «        }|                     d„ ¬¦  «         nø# t          $ rë}t!          j        d|¦  «         	 |                     |t          ||¦  «        t          ||¦  «        ¬¦  «        }d„ |D ¦   «         }nŠ# t          $ r}}t!          j        d|¦  «         	 |                     |t          |dz  |¦  «        ¬¦  «        }d„ |D ¦   «         }n(# t          $ r}	g d|	› �fcY d}	~	cY d}~cY d}~S d}	~	ww xY wY d}~nd}~ww xY wY d}~nd}~ww xY w|sg d|› d|› d�fS ˆfd„|D ¦   «         }|s%t!          j        dt+          |¦  «        ‰¦  «         |}|r­g }|D ]s\  }}|j        pi }t/          |                     d¦  «        pd¦  «                             ¦   «         pt5          |j        ¦  «        }||v r|                     ||f¦  «         Œt|r|}n0t!          j        dt;          |¦  «        t+          |¦  «        ¦  «         g }t=          ¦   «         }|D ]±\  }}t/          |j        pi                      d¦  «        p<t?          j         |j         !                    ¦   «         ¦  «         "                    ¦   «         ¦  «        }||v rŒp| #                    |¦  «         |                     ||f¦  «         t+          |¦  «        |k    r nŒ²t!          j$        d|dd …         ||t+          |¦  «        |rt;          |¦  «        nd|r|d         d!         nd¦  «         tK          |dd"…         d!¬#¦  «        D ]™\  }\  }}|j        pi }t!          j$        d$|||                     d%¦  «        |                     d¦  «        pt5          |j        ¦  «        |                     d&¦  «        |j        dd …          &                    d'd(¦  «        ¦  «         Œš|sg d)|› d�fS |dfS )*zîReturn (scored docs, empty_reason). Never silently swallow failures.

    Optional chunk_kinds filters to header/summary/merchant/transaction/totals/
    statement_period (metadata when present; content heuristics for older indexes).
    Úempty_queryzchroma_count_failed: Nr   z$collection_empty but SQLite reports u4    ready chunks â€” re-upload or re-index (collection=rc  zcollection_empty (collection=c                ó:   — h | ]}|¯|                      ¦   «         ’ŒS r\   )rÐ   )r_   r’  s     r"   ú	<setcomp>z(retrieve_agent_scored.<locals>.<setcomp>o  s%   € Ð?Ð?Ð? ¸QÐ?�1—7’7‘9”9Ð?Ð?Ð?r$   r\  rŽ   r   ©r’  c                ó,   — | d         d u | d         pd fS )Nrd   g        r\   )Úpairs    r"   ú<lambda>z'retrieve_agent_scored.<locals>.<lambda>y  s   €  d¨1¤g° o¸¸a¼¸ÀCÐ7HÐ%I€ r$   )r:   z?similarity_search_with_relevance_scores failed (%s); trying MMR©r’  Úfetch_kc                ó   — g | ]}|d f‘ŒS rñ   r\   r:  s     r"   ra   z)retrieve_agent_scored.<locals>.<listcomp>€  s   € Ð2Ð2Ð2 A�q˜$�iÐ2Ð2Ð2r$   zMMR failed: %srr   c                ó   — g | ]}|d f‘ŒS rñ   r\   r:  s     r"   ra   z)retrieve_agent_scored.<locals>.<listcomp>…  s   € Ð2Ð2Ð2¨˜1˜d˜)Ð2Ð2Ð2r$   zretrieval_failed: z!search_returned_zero (collection=z
, vectors=c                ó.   •— g | ]\  }}|�|‰k    ¯||f‘ŒS rñ   r\   )r_   r;  rk   Ú	thresholds      €r"   ra   z)retrieve_agent_scored.<locals>.<listcomp>Œ  s*   ø€ ÐEÐEÐE‘t�q˜!¨¨°a¸9²n°nˆQ�ˆF°n°n°nr$   uQ   All %s hits below kb_similarity_threshold=%.3f â€” keeping unfiltered top resultsr³   r   uH   chunk_kind filter %s matched 0 of %s hits â€” falling back to unfilteredrÀ   zRretrieve_agent query=%r collection=%s vectors=%s returned=%s kinds=%s top_score=%srY   rd   é
   rí   z5  hit[%s] score=%s page=%s kind=%s file=%s preview=%sr¹   rÃ   ry   rP   zfiltered_empty (collection=)'r	   rU   r?   r#   rB   rC   rD   rè   Úcount_ready_kb_chunksÚkb_retrieval_top_kr�   Úkb_similarity_thresholdr‚   Ú'similarity_search_with_relevance_scoresr�   Úsortr7   rE   Úmax_marginal_relevance_searchrt  Úsimilarity_searchrg   r  r   rO  rÐ   rÅ   r  rz   Úsortedr  r  r   r!  r"  r#  r8   rÿ   r!   )r%   r   r‘  r’  r�  r¥   r>   rz  rC   rF   rk  Útop_kÚkind_filterrž  ÚscoredÚsim_excÚmmr_docsÚmmr_excr$  ÚkeptÚfilteredr‡  ÚscorerÇ   rÆ   r°   r2  rº   rª   r¢  s                                @r"   Úretrieve_agent_scoredrµ  L  se  ø€ õ ‰~Œ~€HÝ# HÑ-Ô-€HØð !Ø�=Ð Ð å! &¨(Ñ3Ô3€EÝ& xÑ0Ô0€Jð1ØÔ!×'Ò'Ñ)Ô)ˆˆøÝð 1ð 1ð 1ØÐ0¨3Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøð �‚z€zÝÔ-¨f°hÑ?Ô?ˆØ�1Š9ˆ9ØðC°uð Cð CØ5?ðCð Cð Cðð ð Ð@°:Ð@Ð@Ð@Ð@Ð@àÐ,�Ô,€EØ?Ð? {Ð'8°bÐ?Ñ?Ô?€Kå�% Ð2˜1˜1°Ñ3°RÑ8Ô8€GØÔ0€IØ24€Fð6ÝØ×9Ò9¸(ÅcÈ'ÐSXÑFYÔFYÐ9ÑZÔZñ
ô 
ˆð 	�ŠÐIÐIˆÑJÔJÐJÐJøÝð 6ð 6ð 6ÝŒÐVÐX_Ñ`Ô`Ð`ð	6Ø×:Ò:Ø�C ¨Ñ/Ô/½¸WÀeÑ9LÔ9Lð ;ñ ô ˆHð 3Ð2¨Ð2Ñ2Ô2ˆFˆFøÝð 	6ð 	6ð 	6ÝŒMÐ*¨GÑ4Ô4Ð4ð6Ø×.Ò.¨x½3¸uÀq¹yÈ%Ñ;PÔ;PÐ.ÑQÔQ�Ø2Ð2¨TÐ2Ñ2Ô2��øÝð 6ð 6ð 6ØÐ5°Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð6øøøð ����øøøøð		6øøøøøøøøøøøøð6øøøð ð VØÐU°zÐUÐUÈUÐUÐUÐUÐUÐUàEÐEÐEÐE˜vÐEÑEÔE€DØð ÝŒØ_Ý�‰KŒKØñ	
ô 	
ð 	
ð
 ˆàð Ø8:ˆØð 	.ð 	.‰JˆC�Ø”<Ð% 2ˆDÝ�t—x’x Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<ÐbÕ@PÐQTÔQaÑ@bÔ@bˆDØ�{Ð"Ð"Ø—’  e Ñ-Ô-Ð-øØð 	ØˆDˆDåŒLØZÝ�{Ñ#Ô#Ý�D‘	”	ñô ð ð 02€CÝ‘U”U€DØð 
ð 
‰
ˆˆUÝØŒ\Ð˜R×$Ò$ [Ñ1Ô1ð BÝŒ{˜3Ô+×2Ò2Ñ4Ô4Ñ5Ô5×?Ò?ÑAÔAñ
ô 
ˆð �$ˆ;ˆ;ØØ�Š�‰ŒˆØ�
Š
�C˜�<Ñ Ô Ð Ýˆs‰8Œ8�uÒÐØˆEð õ „LØ\Ø��#�ŒØØÝˆC‰ŒØ*Ð4�ˆ{ÑÔÐ°ØÐ"ˆˆAŒˆqŒ	ˆ	˜dñô ð õ % S¨¨"¨¤X°QÐ7Ñ7Ô7ð 

ð 

‰ˆ‰<ˆC�ØŒ|Ð!˜rˆÝŒØCØØØ�HŠH�VÑÔØ�HŠH�\Ñ"Ô"ÐHÕ&6°sÔ7GÑ&HÔ&HØ�HŠHÐ%Ñ&Ô&ØÔ˜d˜s˜dÔ#×,Ò,¨T°3Ñ7Ô7ñ	
ô 	
ð 	
ð 	
ð ð ?ØÐ>°Ð>Ð>Ð>Ð>Ð>Ø�ˆ9Ðs¤   ÁA Á
A:Á)A5Á/A:Á5A:Ã)A	D3 Ä3
H(Ä=H#ÅA FÆH#Æ
HÆHÆ44G)Ç(HÇ)
HÇ3H	Ç9HÇ:HÇ>HÇ?H#ÈH(È	HÈHÈH#ÈHÈH#È#H(úlist[Document]c                ó’   — t          | |||¬¦  «        \  }}d„ |D ¦   «         }d„ |D ¦   «         }t          j        ||||¬¦  «         |S )Nr™  c                ó   — g | ]\  }}|‘ŒS r\   r\   ©r_   r;  rò   s      r"   ra   z"retrieve_agent.<locals>.<listcomp>Î  s   € Ð!Ð!Ð!‘$�!�QˆAÐ!Ð!Ð!r$   c                ó   — g | ]\  }}|‘ŒS r\   r\   )r_   rò   rk   s      r"   ra   z"retrieve_agent.<locals>.<listcomp>Ï  s   € Ð#Ð#Ð#‘D�A�qˆaÐ#Ð#Ð#r$   )Úqueryr$  ÚscoresÚreason_if_empty)rµ  r7   Úprint_rag_debug)r%   r   r‘  r’  r®  Úreasonr$  r¼  s           r"   Úretrieve_agentrÀ  Ì  sb   € Ý*¨6°8¸XÈÐKÑKÔK�N€FˆFØ!Ð!˜&Ð!Ñ!Ô!€DØ#Ð#˜FÐ#Ñ#Ô#€FÝÔ˜h¨T¸&ÐRXÐYÑYÔYÐYØ€Kr$   c                ó~  — t          ¦   «         }t          | ¦  «        }|j                             ¦   «         dk    rg S |p|j        }	 |                     |||dz  ¬¦  «        S # t          $ rP 	 |                     ||¬¦  «        }d„ |D ¦   «         cY S # t          $ r |                     ||¬¦  «        cY cY S w xY ww xY w)Nr   rŽ   r�  r™  c                ó   — g | ]\  }}|‘ŒS r\   r\   r¹  s      r"   ra   z#retrieve_tenant.<locals>.<listcomp>à  s   € Ð)Ð)Ð)™$˜!˜Q�AÐ)Ð)Ð)r$   )	r	   rJ   rB   rC   r¥  r©  rD   r§  rª  )r%   r‘  r’  r¥   r>   r¬  r®  s          r"   Úretrieve_tenantrÃ  Ô  sû   € å‰~Œ~€HÝ" 6Ñ*Ô*€EØÔ×ÒÑ Ô  AÒ%Ð%Øˆ	ØÐ,�Ô,€Eð>Ø×2Ò2°8¸uÈeÐVWÉiÐ2ÑXÔXÐXøÝð >ð >ð >ð	>Ø×BÒBÀ8ÈuÐBÑUÔUˆFØ)Ð) &Ð)Ñ)Ô)Ð)Ð)Ð)øÝð 	>ð 	>ð 	>Ø×*Ò*¨8°uÐ*Ñ=Ô=Ð=Ð=Ð=Ð=Ð=ð	>øøøð	>øøøs0   ÁA" Á"
B<Á-"BÂB<Â!B8Â3B<Â7B8Â8B<c                ó<  ‡— t          ¦   «         }t          ¦   «         }|                     ¦   «         }|p|j        }	 |                     | |¬¦  «        }n'# t
          $ r |                     | |¬¦  «        cY S w xY w|j        Šˆfd„|D ¦   «         }|pd„ |D ¦   «         S )Nr™  c                ó*   •— g | ]\  }}|�|‰k    ¯|‘ŒS rñ   r\   )r_   r‡  r´  r¢  s      €r"   ra   z%retrieve_platform.<locals>.<listcomp>ï  s+   ø€ ÐPÐPÐP‘J�C˜¨E¨M¸UÀiÒ=OÐ=OˆCÐ=OÐ=OÐ=Or$   c                ó   — g | ]\  }}|‘ŒS r\   r\   )r_   r‡  rò   s      r"   ra   z%retrieve_platform.<locals>.<listcomp>ð  s   € Ð-Ð-Ð-™F˜C �CÐ-Ð-Ð-r$   )r	   r
   Úget_vectorstoreÚretrieval_top_kr§  rD   rª  Úsimilarity_threshold)	r‘  r’  r¥   r;   r>   r¬  r®  r²  r¢  s	           @r"   Úretrieve_platformrÊ  å  sÉ   ø€ Ý‰~Œ~€HÝÑÔ€GØ×#Ò#Ñ%Ô%€EØÐ)�Ô)€Eð:Ø×>Ò>¸xÈ5Ð>ÑQÔQˆˆøÝð :ð :ð :Ø×&Ò& x°5Ð&Ñ9Ô9Ð9Ð9Ð9ð:øøøàÔ-€IØPÐPÐPÐP &ÐPÑPÔP€DØÐ-Ð-Ð- fÐ-Ñ-Ô-Ð-s   ¼A Á!A8Á7A8c                óV   — t           | z  }|r||z  }|                     dd¬¦  «         |S r'   )ÚKB_UPLOAD_DIRr,   r-   s      r"   Úorg_storage_dirrÍ  ó  s8   € Ý˜6Ñ!€DØð Ø�h‰ˆØ‡J‚J�t d€JÑ+Ô+Ð+Ø€Kr$   c                óH   — t           | z  }|                     dd¬¦  «         |S r'   )Ú
AVATAR_DIRr,   )r%   r.   s     r"   Úavatar_storage_dirrÐ  û  s'   € Ý˜Ñ€DØ‡J‚J�t d€JÑ+Ô+Ð+Ø€Kr$   údict[str, Any]c                óT	  — t          ¦   «         }t          | |¦  «        }t          |¦  «        }t          |j                             ¦   «         pd¦  «        }d„ t          j        | |¦  «        pg D ¦   «         }g }g }d}	|D �]š}
t          |
 	                    d¦  «        pd¦  «        }t          |
 	                    d¦  «        pd¦  «        }|
 	                    d¦  «        }|
 	                    d¦  «        }	 |j         	                    d|id	d
g¬¦  «        }nE# t          $ r8}|                     |
 	                    d¦  «        › d|› d�¦  «         Y d}~ŒÔd}~ww xY w| 	                    d¦  «        pg }t          |¦  «        }| 	                    d	¦  «        }| 	                    d
¦  «        pg }t          d„ |D ¦   «         ¦  «        }d}d}|��›t          |¦  «        dk    �r‡	 ddl}|                     |d         t           ¬¦  «        }t          |j        d         ¦  «        }t!          |j                             |¦  «        ¦  «        }||k    r0|                     |
 	                    d¦  «        › d|› d|› �¦  «         t)          |                     |¦  «                             ¦   «         ¦  «        s+|                     |
 	                    d¦  «        › d�¦  «         t/          |dz
  ¦  «        dk    r.|                     |
 	                    d¦  «        › d|d›�¦  «         nE# t          $ r8}|                     |
 	                    d¦  «        › d|› d�¦  «         Y d}~nd}~ww xY w|r7||k    r1|                     |
 	                    d¦  «        › d|› d|› �¦  «         n|	dz  }	|r.|                     |
 	                    d¦  «        › d|› d �¦  «         |                     ||
 	                    d¦  «        |||||||||k    o|dk    o|d|fv d!œ
¦  «         �Œœd"}d}|dk    rNt1          | |d#d$¬%¦  «        \  }}t)          |¦  «        }|r|d         d         nd}|s|                     d&¦  «         | o|dk    o|}|t3          ¦   «         j        |||t          |¦  «        |	||||d'œS )(zRValidate that Chroma vectors match DB chunk counts and embedding geometry is sane.r   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )rÚ   rk  )rO  r:  s     r"   ra   z+verify_agent_embeddings.<locals>.<listcomp>  s7   € ð ð ð àØ�5Š5�‰?Œ?˜gÒ%Ð%ð 	
à%Ð%Ð%r$   Úidr   rá   rß   rà   r·   r6   Ú	documentsrV  r¸   z: chroma get failed (rc  NrS  c              3  óF   K  — | ]}|pd                       ¦   «         °dV — ŒdS )r   rd   N)rT   )r_   rÒ   s     r"   rf   z*verify_agent_embeddings.<locals>.<genexpr>  s5   è è € Ð>Ð>˜!¨Q¨W°"¯OªOÑ,=Ô,=Ð>�AÐ>Ð>Ð>Ð>Ð>Ð>r$   )Údtyper›   z: embedding dim z != z: non-finite embedding valuesg      ð?gš™™™™™É?z: unusual L2 norm z.4fz: embedding inspect failed (z: chunk_count=z but chroma_vectors=rd   r7  z empty chunk text(s))
r·   r¸   rá   rß   Úvectors_stored_dbÚchroma_vectorsÚ	embed_dimÚ
embed_normÚempty_chunksÚokFzwhat is this document aboutrŽ   r™  z4retrieval returned 0 hits for a basic overview query)rÝ  r9   Úexpected_dimrz  Útotal_vectorsÚ
ready_docsÚdocs_matchedÚretrieval_okÚ	top_scoreÚissuesrÕ  )rØ   r?   r#   r@   rB   rC   rè   Úlist_kb_documentsr   rO  rD   rz   rg   rj   ÚnumpyÚasarrayÚfloatÚshapeÚlinalgÚnormrW   ÚisfiniteÚallÚabsrµ  r	   r9   )r%   r   rÞ  r>   rz  rß  r$  Úper_docrä  Úmatchedr;  r·   rá   Úemb_doneÚvec_dbrY  rF   rS  Ún_vecÚembÚtextsÚemptyry  rë  ÚnpÚe0râ  rã  r®  Ú_reasonrÝ  s                                  r"   Úverify_agent_embeddingsrú    sR  € å'Ñ)Ô)€LÝ! &¨(Ñ3Ô3€EÝ& xÑ0Ô0€JÝ˜Ô)×/Ò/Ñ1Ô1Ð6°QÑ7Ô7€Mðð åÔ+¨F°HÑ=Ô=ÐCÀðñ ô €Dð
 (*€GØ€FØ€GØð 5
ñ 5
ˆÝ�Q—U’U˜4‘[”[Ð& BÑ'Ô'ˆÝ˜!Ÿ%š% Ñ.Ô.Ð3°!Ñ4Ô4ˆØ—5’5Ð*Ñ+Ô+ˆØ—’Ð'Ñ(Ô(ˆð	ØÔ#×'Ò'¨x¸Ð.@È<ÐYdÐJeÐ'ÑfÔfˆCˆCøÝð 	ð 	ð 	Ø�MŠM˜QŸUšU :Ñ.Ô.ÐKÐKÀSÐKÐKÐKÑLÔLÐLØˆHˆHˆHˆHøøøøð	øøøð �gŠg�e‰nŒnÐ" ˆÝ�C‘”ˆØ�gŠg�lÑ#Ô#ˆØ—’˜Ñ$Ô$Ð*¨ˆÝÐ>Ð>˜uÐ>Ñ>Ô>Ñ>Ô>ˆØˆØˆØ‰?�s 3™xœx¨!š|™|ðXØ"Ð"Ð"Ð"à—Z’Z  A¤­e�ZÑ4Ô4�Ý˜"œ( 2œ,Ñ'Ô'�Ý˜RœYŸ^š^¨BÑ/Ô/Ñ0Ô0�Ø˜,Ò&Ð&Ø—M’M Q§U¢U¨:Ñ%6Ô%6Ð"_Ð"_ÈÐ"_Ð"_ÐQ]Ð"_Ð"_Ñ`Ô`Ð`Ý˜BŸKšK¨™OœO×/Ò/Ñ1Ô1Ñ2Ô2ð WØ—M’M Q§U¢U¨:Ñ%6Ô%6Ð"UÐ"UÐ"UÑVÔVÐVÝ�t˜c‘z‘?”? SÒ(Ð(Ø—M’M Q§U¢U¨:Ñ%6Ô%6Ð"TÐ"TÈ$Ð"TÐ"TÐ"TÑUÔUÐUøøÝð Xð Xð XØ—’ §¢ zÑ!2Ô!2ÐVÐVÐPSÐVÐVÐVÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøàð 	˜5 KÒ/Ð/Ø�MŠMØ—5’5˜Ñ$Ô$Ð\Ð\°KÐ\Ð\ÐUZÐ\Ð\ñô ð ð ð �q‰LˆGØð 	OØ�MŠM˜QŸUšU :Ñ.Ô.ÐMÐM°%ÐMÐMÐMÑNÔNÐNØ�Šà ØŸEšE *Ñ-Ô-Ø*Ø#+Ø%+Ø"'Ø Ø"Ø %Ø! UÒ*Ð[¨u¸ªzÐ[¸sÀtÈ\ÐFZÐ?Zðð ñ	
ô 	
ð 	
ñ 	
ð €LØ€IØ�qÒÐÝ/°¸ÐB_ÐcdÐeÑeÔe‰ˆ�Ý˜F‘|”|ˆØ$*Ð4�F˜1”I˜a”L�L°ˆ	Øð 	RØ�MŠMÐPÑQÔQÐQàˆÐ	:˜¨Ò)Ð	:¨l€BàÝ'™>œ>Ô9Ø$Ø Ø&Ý˜$‘i”iØØ$ØØØðð ð s1   Ã5 DÄ
EÄ .EÅEÇ"E L#Ì#
M%Ì-.M Í M%)r   r   r   r   )r%   r   r   r   r   r   )r%   r   r   r   r   r   )r%   r   r   r   r   r@   )r%   r   r   r   )r%   r   r   r@   )rM   r   r   r   )rV   r   r   rW   )rM   r   r   ru   )rM   r   r‹   r@   rŒ   r@   r   ru   )NN)rM   r   r‹   r   rŒ   r   r   ru   )r%   r   r   r   r·   r   r¸   r   r¹   r@   rº   r   r²   r@   r³   r»   r´   r   rµ   r»   r¶   r»   r   r¼   )r   r@   )r·   r   râ   r   rã   r@   rÚ   r   rÛ   r»   rÜ   r   rÝ   r   rÞ   r   rß   r   rà   r   rá   r   r   rw   )r.   r   r   rë   )r.   r   r%   r   r   r   r·   r   r¸   r   r   r  )r>   r   r·   r   r   r@   )r%   r   r·   r   r.   r   r¸   r   r   r   r   r@   rñ   )r%   r   r·   r   r   r»   r   rw   )r%   r   r   r   r   rw   )r%   r   r   r   r‘  r   r’  r   r�  r“  r   r”  )
r%   r   r   r   r‘  r   r’  r   r   r¶  )r%   r   r‘  r   r’  r   r   r¶  )r‘  r   r’  r   r   r¶  )r%   r   r   r»   r   r   )r%   r   r   r   )r%   r   r   r   r   rÑ  )CÚ__doc__Ú
__future__r   r  rR   Úpathlibr   Útypingr   Ú langchain_community.vectorstoresr   Úlangchain_core.documentsr   Ú
app.configr   r	   Úapp.rag.chainr
   Úapp.saasr   rè   r   r7   rÌ  rÏ  r+   r�   rž   r¡   r  rr  r   Ú__annotations__r   r#   r/   r?   rG   rJ   rL   rU   rm   ro   rt   rŠ   r™   r±   rÈ   rÅ   rØ   rê   r  r,  r3  rD  rT  rZ  r„  rˆ  r�  rµ  rÀ  rÃ  rÊ  rÍ  rÐ  rú  r\   r$   r"   ú<module>r     s}  ðØ TÐ TÐ Tà "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø -Ð -Ð -Ð -Ð -Ð -à -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø )Ð )Ð )Ð )Ð )Ð )Ø "Ð "Ð "Ð "Ð "Ð "Ø %Ð %Ð %Ð %Ð %Ð %à˜6Ñ! LÑ0€Ø˜Ñ Ñ0€
Ø Ñ&¨Ñ1°IÑ=Ð à€Ø€Ø€ØÐ Ø€à#%€Ð %Ð %Ð %Ñ %Ø#Ð Ð #Ð #Ð #Ñ #ð1ð 1ð 1ð 1ðð ð ð ðð ð ð ð,ð ð ð ðð ð ð ð ð ð ð ðð ð ð ðð ð ð ðDð Dð Dð Dð3ð 3ð 3ð 3ð
(#ð (#ð (#ð (#ðVð ð ð ð, "ØðPð Pð Pð Pð Pðv Ø!ØØ"&Øð!ð !ð !ð !ð !ð !ðHð ð ð ðBð ð ð ð, ØØ!Ø"&Ø!%Ø"&Ø!%Ø"ðð ð ð ð ð ð:3ð 3ð 3ð 3ðlEð Eð Eð EðP-ð -ð -ð -ð`+ð +ð +ð +ð\'ð 'ð 'ð 'ðTð ð ð ð^ð ^ð ^ð ^ðB>ð >ð >ð >ð >ð 0ð 0ð 0ð 0ð ð	}ð 7;ð}ð }ð }ð }ð }ð }ð@ð ð ð ð ð>ð >ð >ð >ð >ð".ð .ð .ð .ð .ðð ð ð ð ðð ð ð ð[ð [ð [ð [ð [ð [r$   