§
    éƒ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mZ g d	¢Zdd
lmZmZ ed         Z ed¬¦  «         G d„ d¦  «        ¦   «         Zdd„Zd d„Zd d„Zddddœd!d„Z d"d„Z!dS )#u-  Chat routing policy â€” channel selection after primary intent classification.

Primary intents (see intent_router.py):
  document_lookup | document_metadata | general_knowledge | calculation | conversational

Maps those into concrete answer targets (templates / calculator / Ollama / structured KB).
é    )ÚannotationsN)Ú	dataclass)ÚLiteral)ÚResolvedTurn)Úclassify_finance_intent)
ÚPrimaryIntentÚclassify_primary_intentÚis_ask_first_questionÚis_ask_my_nameÚis_document_metadata_questionÚis_general_knowledge_questionÚis_self_introÚis_today_date_questionÚprimary_uses_kb_inventoryÚprimary_uses_retrieval)Ú	ChatRouter   r	   r
   r   r   r   Úis_general_llm_questionÚis_ollama_conceptr   r   Úneeds_document_groundingÚ
route_chatÚroute_summary)Ú_HOW_ARE_YOU_REÚ_normalize_smalltalk)Útemplate_greetingÚtemplate_how_are_youÚtemplate_thanksÚtemplate_byeÚtemplate_offtopicÚtemplate_helpÚtemplate_clarifyÚtemplate_personalÚtemplate_todayÚ
calculatorÚollama_conceptÚstructured_or_ragÚkb_metadataT)Úfrozenc                  ó^   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   dZded<   dS )r   zDecision for one user turn.ÚRouteTargetÚtargetÚstrÚchat_intentÚfinance_intentÚboolÚuse_docsÚ
use_ollamaÚreasonÚconversationalr   Úprimary_intentN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r3   © ó    ú0/var/www/html/CA-Chatbot/app/saas/chat_router.pyr   r   E   sk   € € € € € € à%Ð%àÐÐÑØÐÐÑØÐÐÑØ€N€N�NØÐÐÑØ€K€K�KØ$4€NÐ4Ð4Ð4Ñ4Ð4Ð4r:   r   Úquestionr+   r-   r,   Úreturnr.   c                óL   — t          | |¬¦  «        }t          |j        ¦  «        S )zGTrue when the answer must be grounded in uploaded statement *contents*.©r-   )r	   r   Úintent)r<   r-   r,   Úprimarys       r;   r   r   R   s$   € å% h¸~ÐNÑNÔN€GÝ! '¤.Ñ1Ô1Ð1r:   c                ó    — t          | ¦  «        S ©N©r   ©r<   s    r;   r   r   X   ó   € Ý(¨Ñ2Ô2Ð2r:   c                ó    — t          | ¦  «        S rC   rD   rE   s    r;   r   r   \   rF   r:   )Úresolvedr-   r,   rH   úResolvedTurn | Noneú
str | Nonec          	     ób  — | pd                      ¦   «         }|r|j        n|p|}|r|j        n|p|}|pt          |¦  «        }|dk    r ||k    r|r|j        dv rt          |¦  «        }|}|r|j        dv r||k    r|}t          ||¬¦  «        }	|rA|j        dv r8|	j        dv r/t          |¦  «        dvrt          |t          |¦  «        ¬¦  «        }	|	j        }|p|	j        }
t          |¦  «        }|	j        dk    rRdd	l
m}  ||¦  «        rt          d
d|dd|	j        |	j        ¦  «        S t          dd|dd|	j        dz   |	j        ¦  «        S |	j        dk    �r�t          |¦  «        rt          dddddd|	j        ¦  «        S t          |¦  «        st!          |¦  «        st#          |¦  «        rt          dddddd|	j        ¦  «        S ddlm}m}  ||¦  «        s ||¦  «        s|
dk    rt          dddddd|	j        ¦  «        S d|	j        v rt          ddddd|	j        |	j        ¦  «        S t+          j        |¦  «        sd|v rt          dddddd |	j        ¦  «        S |
d!k    rt          d"d!dddd!|	j        ¦  «        S |
d#k    rt          d$d#dddd%|	j        ¦  «        S |
dk    st+          j        |¦  «        rt          d&ddddd|	j        ¦  «        S t          d'dddd|	j        pd(|	j        ¦  «        S |	j        d)k    rt          ddddd|	j        |	j        ¦  «        S |	j        d*k    st/          |	j        ¦  «        rt          d+d,d-dd|	j        |	j        ¦  «        S |	j        d.k    st1          |	j        ¦  «        rt          d/d,|dd|	j        |	j        ¦  «        S t          d'ddddd0d¦  «        S )1zEPick the answer channel for this turn using the 5-way primary intent.Ú Úgeneral>   ÚverifyÚ	follow_upÚexplain_calcr?   >   r2   Úgeneral_knowledge>   rM   Úcalculationr   )Úis_pure_mathr#   ÚmathFr$   ÚconceptTu    â†’ base LLMr2   r"   Úgreetingztoday's dater!   zconversation memory)Úis_capability_questionÚis_identity_questionÚhelpr   zcapability / identityzunrelated third-partyr   Úofftopiczhow are your   zwellbeing check-inÚthanksr   Úbyer   Úgoodbyer   r    ÚclarifyrQ   Údocument_metadatar&   ÚdataÚdocument_qaÚdocument_lookupr%   zfallback clarify)ÚstripÚoriginalÚ	rewrittenr   Úconv_intentr	   r@   r-   r,   r   Úapp.rag.calculatorrS   r   r1   r   r   r   r
   Úapp.saas.personalityrW   rX   r   Úmatchr   r   )r<   rH   r-   r,   Úqrd   re   ÚfinÚ
classify_qrA   ÚchatÚnormrS   rW   rX   s                  r;   r   r   `   sF  € ð 
ˆ�R×ÒÑ Ô €AØ%-Ð4�Ô!Ð!°1Ð:¸€HØ'/Ð6�Ô#Ð#°QÐ<¸1€Ià
Ð
=Õ3°HÑ=Ô=€CØ
ˆiÒÐ˜I¨Ò1Ð1àð 	5˜Ô,Ð0WÐWÐWÝ)¨)Ñ4Ô4ˆCð €JàðàÔ Ð$KÐKÐKØ˜Ò!Ð!àˆ
å% jÀÐEÑEÔE€Gð 	ðhàÔ Ð$KÐKÐKØŒNÐEÐEÐEÝ# IÑ.Ô.°kÐAÐAå)¨)ÕD[Ð\eÑDfÔDfÐgÑgÔgˆà
Ô
 €CØÐ-˜'Ô-€DÝ Ñ)Ô)€Dð „~˜Ò&Ð&Ø3Ð3Ð3Ð3Ð3Ð3àˆ<˜Ñ!Ô!ð 		ÝØØØØØØ”Ø”ñô ð õ ØØØØØØŒN˜_Ñ,ØŒNñ
ô 
ð 	
ð „~Ð)Ò)Ñ)Ý! (Ñ+Ô+ð 		ÝØ ØØØØØØ”ñô ð õ ˜Ñ"Ô"ð 		¥n°XÑ&>Ô&>ð 		ÕBWÐX`ÑBaÔBað 		ÝØ#ØØØØØ%Ø”ñô ð ð 	VÐUÐUÐUÐUÐUÐUÐUàÐ Ñ)Ô)ð 	Ð-CÐ-CÀHÑ-MÔ-Mð 	ÐQUÐY_ÒQ_ÐQ_ÝØ ¨°E¸5ÐBYÐ[bÔ[iñô ð ð # g¤nÐ4Ð4ÝØ#ØØØØØ”Ø”ñô ð õ Ô  Ñ&Ô&ð 		¨-¸4Ð*?Ð*?ÝØ&ØØØØØ$Ø”ñô ð ð �8ÒÐÝØ! 8¨Y¸¸uÀhÐPWÔP^ñô ð ð �5Š=ˆ=ÝØ  y°%¸À	È7Ì>ñô ð ð �:ÒÐ¥Ô!6°tÑ!<Ô!<ÐÝØ#ØØØØØØ”ñô ð õ ØØØØØØŒNÐ'˜iØŒNñ
ô 
ð 	
ð „~Ð,Ò,Ð,ÝØØØØØØŒNØŒNñ
ô 
ð 	
ð „~Ð,Ò,Ð,Õ0IÈ'Ì.Ñ0YÔ0YÐ,ÝØØØØØØŒNØŒNñ
ô 
ð 	
ð „~Ð*Ò*Ð*Õ.DÀWÄ^Ñ.TÔ.TÐ*ÝØØØØØØŒNØŒNñ
ô 
ð 	
õ ØØØØØØØñô ð r:   c                 ó   — 	 dS )Nu‡   I can help with your uploaded statements (spend, merchants, dates), answer general questions, or do quick math â€” what would you like?r9   r9   r:   r;   r   r     s   € ð	Nðð r:   )r<   r+   r-   r+   r,   r+   r=   r.   )r<   r+   r=   r.   )
r<   r+   rH   rI   r-   rJ   r,   rJ   r=   r   )r=   r+   )"r7   Ú
__future__r   ÚreÚdataclassesr   Útypingr   Úapp.saas.conversationr   Úapp.saas.finance_intentr   Úapp.saas.intent_routerr   r	   r
   r   r   r   r   r   r   r   Ú__all__Úapp.rag.chainr   r   r)   r   r   r   r   r   r   r9   r:   r;   ú<module>ry      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð €ð ð ð ð ð ð ð ð ð
 ðô€ð" €�$ÐÑÔð	5ð 	5ð 	5ð 	5ð 	5ñ 	5ô 	5ñ Ôð	5ð2ð 2ð 2ð 2ð3ð 3ð 3ð 3ð3ð 3ð 3ð 3ð %)Ø!%Ø"ðzð zð zð zð zð zðzð ð ð ð ð r:   