§
    éƒtj}<  ã                  ó  — d Z ddlm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mZmZmZmZmZmZmZ dd	lmZmZmZmZmZmZmZmZmZm Z m!Z! dd
l"m#Z# ed         Z$ ej%        d¦  «        Z& ej%        d¦  «        Z' ej%        d¦  «        Z( ej%        d¦  «        Z) ej%        d¦  «        Z* ej%        d¦  «        Z+ ej%        d¦  «        Z, ej%        d¦  «        Z- ej%        d¦  «        Z. ej%        d¦  «        Z/ ej%        d¦  «        Z0 ej%        d¦  «        Z1 ej%        d¦  «        Z2 ed¬¦  «         G d„ d¦  «        ¦   «         Z3d2d!„Z4d3d#„Z5d3d$„Z6d3d%„Z7d3d&„Z8d3d'„Z9d3d(„Z:d3d)„Z;d3d*„Z<dd+œd4d-„Z=d5d0„Z>d5d1„Z?dS )6u¬  Primary intent classification â€” decide the channel BEFORE any retrieval.

Five intents (exactly one per turn):
  1. document_lookup   â€” answer depends on uploaded PDF/statement contents â†’ structured KB / Chroma
  2. document_metadata â€” filenames, page counts, doc count, upload/index status â†’ inventory only
  3. general_knowledge â€” concepts, geography, science, finance theory â†’ base LLM (no RAG)
  4. calculation       â€” pure math or hypothetical numeric scenarios â†’ calculator / LLM math
  5. conversational    â€” greetings, smalltalk, capability, personal memory â†’ templates

Only (1) and (2) touch the knowledge base. (2) never summarizes document contents.
é    )ÚannotationsN)Ú	dataclass)ÚLiteral)Úis_pdf_overview_question)Úis_pure_math)	Ú
_BYE_WORDSÚ_GREETING_WORDSÚ_HELP_WORDSÚ_HOW_ARE_YOU_REÚ_OFFTOPIC_REÚ_THANKS_WORDSÚ_detect_intentÚ_likely_greetingÚ_normalize_smalltalk)Úclassify_finance_intentÚis_analyse_overview_askÚis_analytical_self_containedÚis_biggest_expenses_questionÚis_payment_list_questionÚis_period_coverage_questionÚis_profit_loss_questionÚis_statement_field_questionÚis_statement_identity_questionÚis_statement_period_questionÚ!is_unrelated_party_spend_question)Úis_kb_meta_question)Údocument_lookupÚdocument_metadataÚgeneral_knowledgeÚcalculationÚconversationalu¢   (?i)^(what|huh|eh|and|so|ok|okay|um+|hmm*|complete|done|yes|yep|yeah|sure|cool|nice|great|alright|right|got\s+it|fine|k|kk|tell\s+me|[?!.â€¦]+|what\?+|huh\?+)\s*$z§(?i)^\s*(?:hi[,!]?\s+|hello[,!]?\s+)?(?:my\s+name\s+is|i(?:'m|\s+am|\s*m)\s+(?:called\s+)?)\s*([A-Za-z][A-Za-z'\-]{1,30})(?:\s+[A-Za-z][A-Za-z'\-]{1,30})?\s*[!.?]*\s*$a  (?i)^\s*(?:what(?:'s|\s+is)\s+my\s+name|what\s+do\s+you\s+think\s+(?:is\s+)?my\s+name|what\s+do\s+you\s+think\s+my\s+name\s+is|(?:can\s+you\s+)?(?:guess|infer)\s+my\s+name|who\s+am\s+i|do\s+you\s+know\s+my\s+name|remind\s+me\s+(?:of\s+)?my\s+name)\s*[?.!]?\s*$zŽ(?i)^\s*(?:what\s+was\s+my\s+first\s+question|what\s+did\s+i\s+(?:ask|say)\s+first|remind\s+me\s+(?:of\s+)?my\s+first\s+question)\s*[?.!]?\s*$zÃ(?i)^\s*what(?:'s|\s+is)\s+(?:the\s+)?date\s+(?:today|todat|todqy|now|currently)\s*[?.!]?\s*$|^\s*what(?:'s|\s+is)\s+today'?s\s+date\s*[?.!]?\s*$|^\s*(?:today'?s\s+date|date\s+today)\s*[?.!]*\s*$ah  (?i)\b(knowledge\s*base|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|which\s+(?:files?|documents?|pdfs?)\s+(?:are|do|did)|what\s+(?:documents?|files?|pdfs?)\s+(?:do\s+you\s+have|are\s+(?:uploaded|ready|indexed|loaded))|upload\s+status|indexing\s+status|is\s+(?:it|the\s+(?:file|pdf|document))\s+(?:ready|uploaded|indexed)|my\s+(?:documents?|files?|uploads?|pdfs?)\b|uploaded\s+(?:documents?|files?|pdfs?)|which\s+(?:statement|pdf|document|file|upload)\b|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)|tell\s+me\s+about\s+(?:the\s+)?knowledge\s*base|list\s+(?:my\s+)?(?:documents?|files?|uploads?))\ba*  (?i)\b(my\s+(?:spend|spending|statement|payment|payments|account|balance|transaction|transactions|invoice|outflow|inflow|merchant)|i\s+(?:spent|spend|paid|pay|received|receive|owe)|how\s+much\s+(?:did\s+i|have\s+i|was\s+spent|spent)|how\s+many\s+(?:payments?|transactions?|times|credits?|deposits?|debits?)|this\s+(?:statement|pdf|document|file)|passbook|upi\s+statement|spent\s+on|paid\s+to|sent\s+to|money\s+(?:in|out)|branch\s*(?:code|number|no\.?)?|account\s*(?:number|no\.?|branch)|ifsc|micr|cust(?:omer)?\s*id|zepto|blinkit|swiggy|zomato|myntra|nykaa|instamart|meesho|grocer(?:y|ies)|merchant|category\s+spend|biggest\s+expenses?|largest\s+outflows?|\d{1,2}(?:st|nd|rd|th)?\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*|(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+\d{1,2})\bzÚ(?i)\b(what\s+if|suppose\s+(?:i|we)|hypothetic|if\s+i\s+(?:cut|reduce|increase|spent|spend|saved|save)|(?:would|could)\s+(?:my|the)\s+(?:net|cashflow|balance|spend)|\d+\s*%\s+(?:less|more|of)|percent\s+(?:less|more))\ba“  (?i)\b(capital\s+of|who\s+invented|who\s+discovered|photosynthesis|gravity|solar\s+system|planet\b|continent|ocean|mountain|president\s+of|population\s+of|distance\s+between|fun\s+fact|tell\s+me\s+a\s+joke|weather|football|cricket|movie|song|joke|recipe|horoscope|ebitda|gaap|ifrs|gst|vat|depreciation|amorti[sz]ation|accrual|working\s+capital|current\s+ratio|debt[\s-]?to[\s-]?equity|roi|roe|npv|irr)\ba  (?i)^\s*(what\s+is|what\s+are|what'?s|define|definition\s+of|explain|meaning\s+of|how\s+to|how\s+does|how\s+do(?:\s+i|\s+you)?|how\s+can\s+(?:i|you|one|we)\b|difference\s+between|why\s+is|why\s+are|who\s+(?:is|was|invented|discovered|wrote|painted)|where\s+is|when\s+was|when\s+did|tell\s+me\s+about(?!\s+(?:my|the\s+statement|the\s+pdf|the\s+document|this\s+pdf|the\s+knowledge)))\bz‰(?i)^\s*how\s+(?:to|do\s+i|can\s+i|does\s+one)\s+(?!much\b|many\b|often\b|(?:i\s+)?(?:spend|save|pay|reduce|cut|budget)|(?:did|do)\s+i\s)z–(?i)\b(indexing|embeddings?|vector\s*(?:search|store|database)?|semantic\s+search|chunking|retrieval|rag\b|knowledge\s+base\s+(?:index|search|work))\bzH(?i)\b(stock|market|fund|portfolio|s\s*&\s*p|nasdaq|benchmark\s+index)\bT)Úfrozenc                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )ÚPrimaryRouteÚPrimaryIntentÚintentÚstrÚreasonÚfinance_intentÚchat_intentN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú2/var/www/html/CA-Chatbot/app/saas/intent_router.pyr$   r$   »   s?   € € € € € € àÐÐÑØ€K€K�KØÐÐÑØÐÐÑÐÐr0   r$   Úquestionr'   Úreturnú
str | Nonec                ó  — t                                | pd                     ¦   «         ¦  «        }|sd S |                     d¦  «                             ¦   «         }|                     ¦   «         dv rd S |                     ¦   «         S )NÚ é   >   ÚokÚyouÚalexÚfineÚgoodÚhereÚokay)Ú_SELF_INTRO_REÚmatchÚstripÚgroupÚlowerÚtitle)r2   ÚmÚnames      r1   Úis_self_introrG   Ã   st   € Ý×Ò˜h˜n¨"×3Ò3Ñ5Ô5Ñ6Ô6€AØð ØˆtØ�7Š7�1‰:Œ:×ÒÑÔ€DØ‡z‚z�|„|ÐLÐLÐLØˆtØ�:Š:‰<Œ<Ðr0   Úboolc                óØ   — | pd                      ¦   «         }|rt                               |¦  «        sdS t                               |¦  «        sdS t                               |¦  «         S )uC   Document/search indexing concepts â€” not financial market indexes.r6   F)rA   Ú_CONCEPT_LEAD_REÚsearchÚ_KB_TECH_CONCEPT_REÚ_FINANCE_INDEX_RE©r2   Úqs     r1   Úis_kb_tech_concept_questionrP   Í   sl   € à	ˆ�R×ÒÑ Ô €AØð Õ$×+Ò+¨AÑ.Ô.ð ØˆuÝ×%Ò% aÑ(Ô(ð ØˆuÝ ×'Ò'¨Ñ*Ô*Ð*Ð*r0   c                óx   — t          t                               | pd                     ¦   «         ¦  «        ¦  «        S ©Nr6   )rH   Ú_ASK_MY_NAME_REr@   rA   ©r2   s    r1   Úis_ask_my_namerU   ×   s.   € Ý•×%Ò% x ~°2×&<Ò&<Ñ&>Ô&>Ñ?Ô?Ñ@Ô@Ð@r0   c                óx   — t          t                               | pd                     ¦   «         ¦  «        ¦  «        S rR   )rH   Ú_ASK_FIRST_QUESTION_REr@   rA   rT   s    r1   Úis_ask_first_questionrX   Û   s/   € ÝÕ&×,Ò,¨h¨n¸"×-CÒ-CÑ-EÔ-EÑFÔFÑGÔGÐGr0   c                óx   — t          t                               | pd                     ¦   «         ¦  «        ¦  «        S rR   )rH   Ú_TODAY_DATE_REr@   rA   rT   s    r1   Úis_today_date_questionr[   ß   s.   € Ý•×$Ò$ h n°"×%;Ò%;Ñ%=Ô%=Ñ>Ô>Ñ?Ô?Ð?r0   c                óv  — | pd}t          |¦  «        st          |¦  «        st          |¦  «        rdS t          j        d|¦  «        rdS t          |¦  «        st                               |¦  «        rEt          j        d|¦  «        rdS t          j        d|¦  «        rt          j        d|¦  «        sdS dS dS )u=   Inventory / status of indexed docs â€” not a content summary.r6   Fzr(?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?)\bzQ(?i)\b(analy[sz]e|summar(?:y|ize)|overview)\b.*\b(statement|pdf|document|spend)\bz%(?i)\b(spent|spend|paid|how\s+much)\bzj(?i)\b(how\s+many\s+(?:pages?|documents?|files?)|page\s+count|filename|upload\s+status|knowledge\s*base)\bT)r   r   r   ÚrerK   r   Ú_DOC_METADATA_RErN   s     r1   Úis_document_metadata_questionr_   ã   sì   € àˆ�B€Aå% aÑ(Ô(ð Õ,HÈÑ,KÔ,Kð ÕOjÐklÑOmÔOmð ØˆuÝ	„yð	;à	ñô ð ð
 ˆuå˜1ÑÔð Õ!1×!8Ò!8¸Ñ!;Ô!;ð ÝŒ9Ø`Øñ
ô 
ð 	ð �5ÝŒ9Ð=¸qÑAÔAð 	Í"Ì)ØyØñK
ô K
ð 	ð �5ØˆtØˆ5r0   c                óø   — | pd                      ¦   «         }t          |¦  «        rdS t                               |¦  «        rt                               |¦  «        sdS t                               |¦  «        rdS dS )Nr6   TF)rA   r   Ú_HYPOTHETICAL_RErK   Ú_DOC_LOOKUP_RErN   s     r1   Úis_hypothetical_or_calcrc   ÿ   sz   € Ø	ˆ�R×ÒÑ Ô €AÝ�A�„ð ØˆtÝ×Ò˜qÑ!Ô!ð ­.×*?Ò*?ÀÑ*BÔ*Bð Øˆtå×Ò˜qÑ!Ô!ð ØˆtØˆ5r0   c                óþ  — | pd                      ¦   «         }|sdS t          |¦  «        st                               |¦  «        rdS t	          |¦  «        st          |¦  «        rdS t          |¦  «        st          |¦  «        rdS t          |¦  «        st          |¦  «        rdS t          |¦  «        st          |¦  «        st          |¦  «        rdS t          j        d|¦  «        rdS t          |                     ¦   «         ¦  «        }|dk    rdS t                                |¦  «        rdS t"                               |¦  «        st%          j        |¦  «        rdS t&                               |¦  «        rdS dS )Nr6   Fzç(?i)\b(my\s+(?:statement|spend|spending|payments?)|how\s+much\s+(?:did|do)\s+i|total\s+spent|uploaded\s+(?:pdf|statement)|(?:the\s+)?statement\s+(?:period|year|date|balance|summary|holder)|account\s+holder|\bifsc\b|branch\s+code)\bé   T)rA   r_   rb   rK   r   r   r   r   r   r   r   r   r   r]   ÚlenÚsplitÚ_HOWTO_GENERAL_REÚ_GENERAL_KNOWLEDGE_REr   rJ   )r2   rO   Úwordss      r1   Úis_general_knowledge_questionrk     s¡  € Ø	ˆ�R×ÒÑ Ô €AØð ØˆuÝ$ QÑ'Ô'ð ­>×+@Ò+@ÀÑ+CÔ+Cð ØˆuÝ" 1Ñ%Ô%ð Õ)GÈÑ)JÔ)Jð ØˆuÝ# AÑ&Ô&ð Õ*EÀaÑ*HÔ*Hð ØˆuÝ˜qÑ!Ô!ð Õ%=¸aÑ%@Ô%@ð ØˆuÝ˜qÑ!Ô!ð Õ%AÀ!Ñ%DÔ%Dð ÕH`ÐabÑHcÔHcð Øˆuå	„yð	ð 	
ñ	ô 	ð 
ð ˆuÝ�—’‘	”	‰NŒN€EØˆr‚z€zØˆuÝ×Ò Ñ"Ô"ð ØˆtÝ×#Ò# AÑ&Ô&ð ­,Ô*=¸aÑ*@Ô*@ð ØˆtÝ×Ò˜qÑ!Ô!ð ØˆtØˆ5r0   c                ó8  — | pd                      ¦   «         }t          |¦  «        }|sdS t          |¦  «        s-t          |¦  «        st	          |¦  «        st          |¦  «        rdS ddlm}m}  ||¦  «        s ||¦  «        rdS t           
                    |¦  «        st           
                    |¦  «        rdS |t          v s|t          v s|t          v s	|t          v rdS t          j
        |¦  «        st!          |¦  «        rdS t#          |¦  «        }|dv S )Nr6   Tr   )Úis_capability_questionÚis_identity_question>   ÚbyeÚhelpÚthanksÚgreeting)rA   r   rG   rU   rX   r[   Úapp.saas.personalityrm   rn   Ú_VAGUE_PING_REr@   r	   r   r   r
   r   r   r   )r2   rO   Únormrm   rn   Úchats         r1   Úis_conversational_questionrw   1  sZ  € Ø	ˆ�R×ÒÑ Ô €AÝ Ñ"Ô"€DØð ØˆtÝ�QÑÔð �>¨!Ñ,Ô,ð Õ0EÀaÑ0HÔ0Hð ÕLbÐcdÑLeÔLeð ØˆtØQÐQÐQÐQÐQÐQÐQÐQàÐ˜AÑÔð Ð"8Ð"8¸Ñ";Ô";ð ØˆtÝ×Ò˜DÑ!Ô!ð ¥^×%9Ò%9¸!Ñ%<Ô%<ð ØˆtØ�ÐÐ $­-Ð"7Ð"7¸4Å:Ð;MÐ;MÐQUÕYdÐQdÐQdØˆtÝÔ˜TÑ"Ô"ð Õ&6°tÑ&<Ô&<ð ØˆtÝ˜!ÑÔ€DØÐ8Ð8Ð8r0   )r)   r)   c               ó¸  — | pd                      ¦   «         }|pt          |¦  «        }t          |¦  «        }t          |¦  «        }t	          |¦  «        st          |¦  «        rt          dd|d¦  «        S t          |¦  «        rt          dd||¦  «        S t          |¦  «        rt          ddd	d
¦  «        S t          |¦  «        rt          dddd¦  «        S t          |¦  «        rt          dddd¦  «        S t          |¦  «        s§t          |¦  «        s˜t          |¦  «        s‰t          |¦  «        szt          |¦  «        skt!          |¦  «        s\t#          |¦  «        sMt%          |¦  «        s>t'          |¦  «        s/t)          |¦  «        s t*                               |¦  «        s|dvr|rt          dd|dk    r|nd	d
¦  «        S |d	k    r!t          |¦  «        st          dd|d
¦  «        S t.                               |¦  «        st.                               |¦  «        rt          dddd¦  «        S t3          j        d|¦  «        s:|                     d¦  «        r7t7          |                     ¦   «         ¦  «        dk    rt          dddd¦  «        S t.                               |¦  «        s|dk    rt          dddd¦  «        S t          dd||¦  «        S )z+Single pre-retrieval decision for the turn.r6   r    u   math / hypothetical â€” no RAGÚmathr!   z!greeting / smalltalk / capabilityr   z(KB inventory / filename / pages / statusÚdocument_qaÚdatazunrelated third-party spendÚgeneralÚofftopicr   u   base LLM â€” no document RAGÚconcept>   r|   rz   r   z-answer depends on uploaded statement contentszdocument content questionz
vague pingrp   z7(?i)^\s*(what|who|where|when|why|how|which|tell\s+me)\bÚ?r7   zopen general questionzclarify / helpzdefault conversational)rA   r   r   r   r   rc   r$   rw   r_   r   rk   r   r   r   r   r   r   r   r   r   r   rb   rK   rt   r@   r]   Úendswithrf   rg   )r2   r)   rO   Úfinrv   ru   s         r1   Úclassify_primary_intentr‚   F  sW  € à	ˆ�R×ÒÑ Ô €AØ
Ð
6Õ3°AÑ6Ô6€CÝ˜!ÑÔ€DÝ Ñ"Ô"€Dõ �A�„ð ZÕ1°!Ñ4Ô4ð ZÝ˜MÐ+KÈSÐRXÑYÔYÐYõ " !Ñ$Ô$ð ^ÝÐ,Ð.QÐSVÐX\Ñ]Ô]Ð]õ % QÑ'Ô'ð 
ÝØØ6ØØñ	
ô 
ð 	
õ )¨Ñ+Ô+ð 
ÝØØ)ØØñ	
ô 
ð 	
õ % QÑ'Ô'ð gÝÐ/Ð1OÐQZÐ\eÑfÔfÐfõ 	% QÑ'Ô'ð
å& qÑ)Ô)ð
õ *¨!Ñ,Ô,ð
õ # 1Ñ%Ô%ð	
õ
 $ AÑ&Ô&ð
õ # 1Ñ%Ô%ð
õ (¨Ñ*Ô*ð
õ $ AÑ&Ô&ð
õ ' qÑ)Ô)ð
õ (¨Ñ*Ô*ð
õ × Ò  Ñ#Ô#ð
ð Ð1Ð1Ð1°cÐ1õ ØØ;Ø˜)Ò#Ð#ˆCˆC¨Øñ	
ô 
ð 	
ð ˆmÒÐÕ$AÀ!Ñ$DÔ$DÐÝÐ-Ð/JÈCÐQWÑXÔXÐXõ ×Ò˜DÑ!Ô!ð O¥^×%9Ò%9¸!Ñ%<Ô%<ð OÝÐ,¨l¸IÀvÑNÔNÐNÝ	„yÐKÈQÑOÔOð `Ø	�
Š
�3‰Œð`Ý §¢¡	¤	™NœN¨QÒ.Ð.åÐ/Ð1HÈ)ÐU^Ñ_Ô_Ð_å×Ò˜DÑ!Ô!ð S T¨V¢^ ^ÝÐ,Ð.>À	È6ÑRÔRÐRåÐ(Ð*BÀCÈÑNÔNÐNr0   r&   r%   c                ó   — | dk    S )uN   Chroma / statement extract only for content lookup â€” not metadata inventory.r   r/   ©r&   s    r1   Úprimary_uses_retrievalr…   ”  s   € àÐ&Ò&Ð&r0   c                ó   — | dk    S )Nr   r/   r„   s    r1   Úprimary_uses_kb_inventoryr‡   ™  s   € ØÐ(Ò(Ð(r0   )r2   r'   r3   r4   )r2   r'   r3   rH   )r2   r'   r)   r4   r3   r$   )r&   r%   r3   rH   )@Ú__doc__Ú
__future__r   r]   Údataclassesr   Útypingr   Úapp.pdf.calcr   Úapp.rag.calculatorr   Úapp.rag.chainr   r	   r
   r   r   r   r   r   r   Úapp.saas.finance_intentr   r   r   r   r   r   r   r   r   r   r   Úapp.saas.knowledge_stater   r%   Úcompilert   r?   rS   rW   rZ   r^   rb   ra   ri   rJ   rh   rL   rM   r$   rG   rP   rU   rX   r[   r_   rc   rk   rw   r‚   r…   r‡   r/   r0   r1   ú<module>r’      sG  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø +Ð +Ð +Ð +Ð +Ð +ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 9Ð 8Ð 8Ð 8Ð 8Ð 8àðô€ð �”ð%ñô €ð �”ðñô €ð �"”*ðñ
ô 
€ð $˜œðCñô Ð ð
 �”ð:ñô €ð �2”:ðñô Ð ð, �”ðñô €ð* �2”:ðñô Ð ð #˜œ
ðñ	ô 	Ð ð �2”:ðñ	ô 	Ð ð �B”Jðñô Ð ð !�b”jðñô Ð ð �B”JØOñô Ð ð
 €�$ÐÑÔðð ð ð ð ñ ô ñ Ôððð ð ð ð+ð +ð +ð +ðAð Að Að AðHð Hð Hð Hð@ð @ð @ð @ðð ð ð ð8	ð 	ð 	ð 	ð#ð #ð #ð #ðL9ð 9ð 9ð 9ð* LPð KOð KOð KOð KOð KOð KOð\'ð 'ð 'ð 'ð
)ð )ð )ð )ð )ð )r0   