§
    éƒtjí  ã                  ó   — 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 ed         ZdZd	Z ej        d
¦  «        Zi Zded<   dZ ed¬¦  «         G d„ d¦  «        ¦   «         Zd$d„Zd%d&d„Zd'd„Zd(d„Zd)d*d#„ZdS )+uD   Knowledge-awareness for SaaS chat â€” empty KB vs no match vs found.é    )ÚannotationsN)Ú	dataclass)ÚLiteral)Údb)ÚemptyÚno_relevantÚfounduß   I don't have a knowledge base yet, so I can't answer questions about your finances or documents.

Please upload a knowledge base first:
â€¢ Upload a PDF statement
â€¢ Upload a CSV export
â€¢ Add files in the Knowledge panelz¸I couldn't find any information related to your question in your uploaded knowledge base.

Try rephrasing, ask about totals or a merchant on your statement, or upload another document.a*  (?i)\b(knowledge\s*base|my\s+(?:documents?|files?|uploads?|pdfs?)|what\s+(?:documents?|files?)\s+(?:do\s+you\s+have|are\s+uploaded|are\s+ready|are\s+indexed)|uploaded\s+(?:documents?|files?|pdfs?)|which\s+(?:statement|pdf|document|file|upload)|what\s+(?:statement|pdf|document|file)\s+(?:is\s+)?(?:this|that|loaded|ready|uploaded)|what\s+(?:statement|pdf|document)\s+do\s+(?:you|i)\s+have|what\s+file\s+is\s+(?:this|loaded)|how\s+many\s+(?:documents?|files?|pdfs?|pages?|chunks?)|(?:page|pages)\s+count|number\s+of\s+(?:pages?|documents?|files?)|what(?:'s|\s+is)\s+the\s+filename|(?:file|document|pdf)\s+name|upload\s+status|indexing\s+status|is\s+(?:it|the\s+(?:file|pdf|document))\s+(?:ready|uploaded|indexed)|list\s+(?:my\s+)?(?:documents?|files?|uploads?)|tell\s+me\s+about\s+(?:the\s+)?knowledge\s*base)\bz*dict[str, tuple[float, 'KnowledgeStatus']]Ú_STATUS_CACHEg     €F@T)Úfrozenc                  óT   — e Zd ZU dZded<   ded<   ded<   ded<   edd	„¦   «         Zd
S )ÚKnowledgeStatuszBWhether the selected agent has any indexed / structured knowledge.ÚintÚvector_countÚ
ready_docsÚready_chunksÚstatement_jobsÚreturnÚboolc                óZ   — | j         dk    p | j        dk    p| j        dk    p
| j        dk    S )Nr   ©r   r   r   r   )Úselfs    ú4/var/www/html/CA-Chatbot/app/saas/knowledge_state.pyÚhas_knowledgezKnowledgeStatus.has_knowledge=   sE   € ð Ô Ò!ð 'ØŒ Ò"ð'àÔ  1Ò$ð'ð Ô" QÒ&ð		
ó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úpropertyr   © r   r   r   r   4   sg   € € € € € € àLÐLàÐÐÑØ€O€O�OØÐÐÑØÐÐÑàð
ð 
ð 
ñ „Xð
ð 
ð 
r   r   Údocsú
list[dict]r   c           
     óp  — i }| pg D �]}|                      d¦  «        dk    rŒt          j        ddt          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         ¦  «        }|sŒ|t          |                      d¦  «        p|                      d¦  «        pd¦  «        }|                      |¦  «        }|r=|t          |                      d¦  «        p|                      d¦  «        pd¦  «        k    r|||<   �Œt          |                     ¦   «         ¦  «        S )	zDCollapse duplicate ready uploads of the same filename (keep newest).ÚstatusÚreadyz\s+Ú ÚfilenameÚ Ú
updated_atÚ
created_at)ÚgetÚreÚsubÚstrÚstripÚlowerÚlistÚvalues)r"   ÚbestÚdÚkeyÚstampÚprevs         r   Úunique_ready_docsr9   G   s  € à€DØˆZ�Rð 	ñ 	ˆØ�5Š5�‰?Œ?˜gÒ%Ð%ØÝŒf�V˜S¥# a§e¢e¨JÑ&7Ô&7Ð&=¸2Ñ">Ô">×"DÒ"DÑ"FÔ"F×"LÒ"LÑ"NÔ"NÑOÔOˆØð 	ØÝ�A—E’E˜,Ñ'Ô'ÐD¨1¯5ª5°Ñ+>Ô+>ÐDÀ"ÑEÔEˆØ�xŠx˜‰}Œ}ˆØð 	�u¥ D§H¢H¨\Ñ$:Ô$:Ð$Z¸d¿hºhÀ|Ñ>TÔ>TÐ$ZÐXZÑ [Ô [Ò[Ð[ØˆD�‰IùÝ�—’‘”ÑÔÐr   Úorg_idú
str | NoneÚagent_idÚNonec                ó$  — | r$|r"t                                | › d|› �d¦  «         dS | rN| › d�}t          t           ¦  «        D ]2}|                     |¦  «        rt                                |d¦  «         Œ3dS t                                ¦   «          dS )z5Drop cached KB status after upload / delete / ingest.ú:N)r
   Úpopr2   Ú
startswithÚclear)r:   r<   Úprefixr6   s       r   Úinvalidate_knowledge_cacherD   W   s¬   € àð �(ð Ý×Ò˜VÐ0Ð0 hÐ0Ð0°$Ñ7Ô7Ð7ØˆØð Ø���ˆÝ�Ñ&Ô&ð 	-ð 	-ˆCØ�~Š~˜fÑ%Ô%ð -Ý×!Ò! # tÑ,Ô,Ð,øØˆÝ×ÒÑÔÐÐÐr   r/   c                ó  — | › d|› �}t                                |¦  «        }t          j        ¦   «         }|r||d         z
  t          k     r|d         S 	 t          j        | |¦  «        pg }n# t          $ r g }Y nw xY wd„ |D ¦   «         }t          |¦  «        }t          |¦  «        }t          d„ |D ¦   «         ¦  «        }	t          d„ |D ¦   «         ¦  «        }
|	dk    r|	n|rdnd}t          |||	|
¬¦  «        }||ft           |<   |S )z±Inspect the agent's KB before retrieval or LLM generation.

    Uses a single documents query (no Chroma open, no PDF re-extract) so chat
    stays fast on remote Postgres.
    r?   r   é   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )r%   r&   )r,   ©Ú.0r5   s     r   ú
<listcomp>z*assess_agent_knowledge.<locals>.<listcomp>v   s,   € Ð;Ð;Ð;�1 §¢ h¡¤°7Ò :Ð :ˆQÐ :Ð :Ð :r   c              3  ó^   K  — | ](}t          |                     d ¦  «        pd¦  «        V — Œ)dS )Úchunk_countr   N)r   r,   rH   s     r   ú	<genexpr>z)assess_agent_knowledge.<locals>.<genexpr>y   s;   è è € ÐFÐF¸!•s˜1Ÿ5š5 Ñ/Ô/Ð4°1Ñ5Ô5ÐFÐFÐFÐFÐFÐFr   c              3  ó¬   K  — | ]O}t          |                     d ¦  «        pd¦  «                             ¦   «                              d¦  «        ¯KdV — ŒPdS )r(   r)   z.pdfrF   N)r/   r,   r1   ÚendswithrH   s     r   rM   z)assess_agent_knowledge.<locals>.<genexpr>{   sn   è è € ð ð Ø�S §¢ zÑ!2Ô!2Ð!8°bÑ9Ô9×?Ò?ÑAÔA×JÒJÈ6ÑRÔRðØ	ðð ð ð ð ð r   r   )r
   r,   ÚtimeÚ	monotonicÚ_STATUS_TTL_SÚsaas_dbÚlist_kb_documentsÚ	Exceptionr9   ÚlenÚsumr   )r:   r<   r6   ÚhitÚnowr"   r&   Úuniquer   r   r   r   r%   s                r   Úassess_agent_knowledger[   e   sc  € ð Ð
 Ð
 �hÐ
 Ð
 €CÝ
×
Ò
˜CÑ
 Ô
 €CÝ
Œ.Ñ
Ô
€CØ
ð ��c˜!”f‘¥Ò-Ð-Ø�1ŒvˆðÝÔ(¨°Ñ:Ô:Ð@¸bˆˆøÝð ð ð Øˆˆˆðøøøð <Ð;˜Ð;Ñ;Ô;€EÝ˜uÑ%Ô%€FÝ�V‘”€JÝÐFÐF¸vÐFÑFÔFÑFÔF€Låð ð Øðñ ô ñ ô €Nð $0°!Ò#3Ð#3�<�<¸zÐ:P¸!¸!Èq€LåØ!ØØ!Ø%ð	ñ ô €Fð ˜v˜…M�#ÑØ€Ms   ÁA, Á,A;Á:A;Úquestionr   c                ó†   — | pd}t          j        d|¦  «        rdS t          t                               |¦  «        ¦  «        S )zITrue when the user is asking about the agent's uploaded knowledge itself.r)   zr(?i)\b(?:my\s+name|account\s+holder|who\s+am\s+i|whose\s+statement|how\s+much|total\s+spent|biggest\s+expenses?)\bF)r-   Úsearchr   Ú_KB_META_RE)r\   Úqs     r   Úis_kb_meta_questionra   ‹   sJ   € àˆ�B€Aå	„yð	;à	ñô ð ð
 ˆuÝ•×"Ò" 1Ñ%Ô%Ñ&Ô&Ð&r   r)   Úfinance_intentÚchat_intentc                ó’   — ddl m} |pd                     ¦   «         }|s| r| dvr|dv rdS dS |sdS  ||| pd¬	¦  «        }|j        d
v S )z½True when the question requires the agent's uploaded knowledge base.

    Document metadata and document content need the KB.
    Conversational / general knowledge / pure math do not.
    r   )Úclassify_primary_intentr)   >   Úgeneral>   ÚbyeÚhelpÚmathÚthanksÚconceptÚgreetingÚofftopicFTN)rb   >   Údocument_lookupÚdocument_metadata)Úapp.saas.intent_routerre   r0   Úintent)rb   rc   r\   re   r`   Úprimarys         r   Úneeds_knowledgers   ˜   s�   € ð ?Ð>Ð>Ð>Ð>Ð>à	ˆ�R×ÒÑ Ô €Aàð �ð  N¸+Ð$EÐ$EØÐ^Ð^Ð^Ø�5ØˆtØð ØˆuØ%Ð% a¸Ð8NÈ$ÐOÑOÔO€GØŒ>ÐEÐEÐEr   )r"   r#   r   r#   )NN)r:   r;   r<   r;   r   r=   )r:   r/   r<   r/   r   r   )r\   r/   r   r   )r)   )rb   r/   rc   r/   r\   r/   r   r   )r   Ú
__future__r   r-   rP   Údataclassesr   Útypingr   Úapp.saasr   rS   ÚKnowledgeStateÚEMPTY_KB_MESSAGEÚNO_RELEVANT_MESSAGEÚcompiler_   r
   r   rR   r   r9   rD   r[   ra   rs   r!   r   r   ú<module>r|      s|  ðØ JÐ JÐ Jà "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à "Ð "Ð "Ð "Ð "Ð "àÐ8Ô9€ð+ð ðdð ð
 ˆbŒjðñô €ð( =?€Ð >Ð >Ð >Ñ >Ø€ð €�$ÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð$ð ð ð ð ð ð ð ð ð#ð #ð #ð #ðL
'ð 
'ð 
'ð 
'ðFð Fð Fð Fð Fð Fð Fr   