§
    éƒtjµÅ  ã                  óˆ  — d Z ddlmZ ddl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mZmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z? ddl@mAZAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZKmLZLmMZM ddlNmOZOmPZP ddlQmRZRmSZS ddlTmUZUmVZVmWZWmXZX ddlmYZZ ddl[m\Z\ dZ]d_d"„Z^d#dd$œd`d(„Z_dadbd.„Z`d/d0œdcd6„Zaddd;„Zbddd<œded@„ZcdddddAœdfdG„ZddgdH„ZedhdK„ZfdddLd/dMœdidP„ZgdjdQ„Zhdddd/dd/ddRœdkd^„ZidS )luU   Tenant-aware SaaS agent â€” answers only from each chatbot's uploaded knowledge base.é    )ÚannotationsN)ÚCallable)Údatetime)Úget_settings)ÚChatResponseÚCitationÚStructuredInsight)Ú	calculate)Ú_clean_answerÚget_rag_service)ÚKB_TECH_CONCEPT_PROMPTÚUSER_PROMPT)Údb)ÚANALYST_POLICYÚsuggest_followups)Úis_kb_tech_concept_question)Úbuild_concept_promptÚbuild_meta_promptÚis_capability_questionÚis_identity_question)Úis_ask_first_questionÚis_ask_my_nameÚis_self_introÚ
route_chatÚroute_summary)Úclassify_analyst_intent)Úget_analysis_contextÚget_first_user_questionÚget_session_display_nameÚ	get_turnsÚis_analytical_finance_intentÚmark_session_introducedÚprior_was_analysisÚrecently_shown_metricÚremember_analysis_contextÚremember_shown_metricsÚremember_turnÚresolve_turnÚsession_was_introducedÚset_session_display_name)Úinsight_evidence_payloadÚscrub_internal_user_textÚsynthesize_from_evidence)ÚFINANCE_INTENT_LABELSÚclassify_finance_intent)Úapply_paragraph_styleÚchat_text_from_insightÚpolish_insight_with_llmÚwants_paragraph_formatÚwants_prose_answer)Úanalysis_evidence_dictÚbuild_financial_analysisÚinsight_to_markdownÚtry_structured_kb_answer)Úagent_document_countÚretrieve_agent_scored)Úlist_agent_statement_jobsÚstatement_context_notes)ÚEMPTY_KB_MESSAGEÚNO_RELEVANT_MESSAGEÚassess_agent_knowledgeÚunique_ready_docs)Ú	rag_debug)ÚAuthContextu|  You are {agent_name}, an AI assistant for {org_name} that answers from the uploaded knowledge base.
{persona}

{policy}

Intent for this question: {finance_intent_label}
Conversational mode: {conv_mode}

This turn needs knowledge-base evidence. Evidence notes below are the only document facts you may use â€” never paste them raw.
- Retrieve â†’ reason â†’ answer. Synthesize a natural reply from the notes.
- Lead with one direct sentence, then brief supporting detail.
- When notes contain a concrete fact (number, date, name, total), state it early.
- Answer narrowly â€” do not dump entire documents unless the user asked for a full list or summary.
- If this is a follow-up, resolve references using Recent conversation.
- Never invent figures, names, dates, or balances that are not supported by the notes.
- If notes are insufficient, say what is missing â€” do not guess.
- Attribute naturally: â€œBased on your uploaded documentâ€¦â€� or â€œFrom your knowledge baseâ€¦â€�.
- Never mention: extraction, incomplete indexing, chunks, OCR, vectors, embeddings, RAG, or internal IDs.

{history}

Evidence notes (most relevant only):
{context}
ÚmetaÚdictÚcontentÚstrÚfinance_intentÚreturnc                ó  — |pd                      ¦   «         }d|v sd|v rdS |dk    rt          j        d|¦  «        rdS |dk    rd	S |d
k    rd|v sd|d d…         v rdS d|v sd|v rdS |                      d¦  «        }|�d|› �S dS )NÚ ztotal money paidzpayments madezStatement header totalsÚdate_lookupz=\b\d{1,2}\s+(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)zDated payment activityÚcategory_spendingzCategory / merchant narrationsÚincomeÚreceivedú+éP   zCredit / inflow linesz
money sentzpaid tozPayment history detailÚpagezSupporting detail from page zKnowledge base excerpt)ÚlowerÚreÚsearchÚget)rC   rE   rG   ÚlowrQ   s        ú*/var/www/html/CA-Chatbot/app/saas/agent.pyÚ_citation_reasonrX   m   sÛ   € Øˆ=�b×
Ò
Ñ
!Ô
!€CØ˜SÐ Ð  O°sÐ$:Ð$:Ø(Ð(Ø˜Ò&Ð&­2¬9Ð5uÐwzÑ+{Ô+{Ð&Ø'Ð'ØÐ,Ò,Ð,Ø/Ð/Ø˜Ò!Ð! z°SÐ'8Ð'8¸CÀ7È3ÈBÈ3Ä<Ð<OÐ<OØ&Ð&Ø�sÐÐ˜i¨3Ð.Ð.Ø'Ð'Ø�8Š8�FÑÔ€DØÐØ4¨dÐ4Ð4Ð4Ø#Ð#ó    Úgeneral©rG   Úscoresr\   úlist[float] | Noneútuple[str, list[Citation]]c               ód  — g }g }t          ¦   «         }t          | d¬¦  «        D �]Q\  }}|j        pi }|j        }	|                     d¦  «        dk    rt          |	d¦  «        n|	}
|j        pdd |
…                              ¦   «         }|st          j	        d||¦  «         Œ}t          |j        pd¦  «        |
k    r|dz  }|                     d	¦  «        p|                     d
¦  «        pd}t          |¦  «                             d¦  «        d         }|                     d¦  «        }|                     d¦  «        p|                     d¦  «        pd|› �}|r!|dz
  t          |¦  «        k     r||dz
           nd }d }|�Kt          dt          dt          t          dt!          |¦  «        dz  z   ¦  «        ¦  «        ¦  «        ¦  «        }t#          |||¦  «        }d|› d|› �}|�|d|› �z  }|d|› �z  }|                     |› d|› �¦  «         |                     t'          t          |¦  «        t          |                     dd¦  «        ¦  «        t          |¦  «        d|||¬¦  «        ¦  «         �ŒS|s"t          j        dt          | ¦  «        ¦  «         d                     |¦  «        |fS )Né   )ÚstartÚdata_categoryÚ	tenant_kbi  rJ   z-Skipping empty retrieved chunk idx=%s meta=%sz...Úsource_datasetÚsource_fileÚ	Statementú/éÿÿÿÿrQ   Úchunk_idÚ	record_idÚsrc_é7   éb   é2   éd   zSource u    Â· u	    Â· page z:
)rj   rb   rd   ÚexcerptrQ   Ú
confidenceÚreasonz<Context assembly produced zero blocks from %s retrieved docsú

---

)r   Ú	enumerateÚmetadataÚmax_context_chars_per_docrU   ÚmaxÚpage_contentÚstripÚdbgÚlog_warnÚlenrF   ÚsplitÚminÚintÚroundÚfloatrX   Úappendr   Ú	log_errorÚjoin)ÚdocsrG   r\   ÚblocksÚ	citationsÚsettingsÚidxÚdocrC   ÚbaseÚ	max_charsrE   ÚsourceÚsource_namerQ   ri   ÚscoreÚconfrr   Úheaders                       rW   Ú_format_docsr’      sâ  € Ø€FØ "€IÝ‰~Œ~€HÝ˜d¨!Ð,Ñ,Ô,ð $
ñ $
‰ˆˆSØŒ|Ð!˜rˆØÔ1ˆØ'+§x¢x°Ñ'@Ô'@ÀKÒ'OÐ'O•C˜˜d‘O”O�OÐUYˆ	ØÔ#Ð) r¨:¨I¨:Ô6×<Ò<Ñ>Ô>ˆØð 	ÝŒLÐHÈ#ÈtÑTÔTÐTØÝˆsÔÐ% 2Ñ&Ô&¨Ò2Ð2Ø�uÑˆGØ—’Ð*Ñ+Ô+ÐU¨t¯xªx¸Ñ/FÔ/FÐUÈ+ˆå˜&‘k”k×'Ò'¨Ñ,Ô,¨RÔ0ˆØ�xŠx˜ÑÔˆØ—8’8˜JÑ'Ô'ÐP¨4¯8ª8°KÑ+@Ô+@ÐPÀLÈ3ÀLÀLˆØ#)ÐM¨c°A©g½¸F¹¼Ò.CÐ.C��s˜Q‘w”�ÈˆØˆØÐÝ�r�3˜r¥3¥u¨Rµ%¸±,´,ÀÑ2DÑ-DÑ'EÔ'EÑ#FÔ#FÑGÔGÑHÔHˆDÝ! $¨°Ñ@Ô@ˆà1˜3Ð1Ð1 KÐ1Ð1ˆØÐØÐ( $Ð(Ð(Ñ(ˆFØ�/˜�/�/Ñ!ˆØ�Š˜Ð-Ð- GÐ-Ð-Ñ.Ô.Ð.Ø×ÒÝÝ˜h™-œ-Ý! $§(¢(¨?¸KÑ"HÔ"HÑIÔIÝ" ;Ñ/Ô/ØØØØðñ ô ñ
	
ô 
	
ð 
	
ñ 
	
ð ð aÝŒÐTÕVYÐZ^ÑV_ÔV_Ñ`Ô`Ð`Ø×Ò˜fÑ%Ô% yÐ0Ð0rY   ÚauthrB   ÚagentÚoverrideú
str | Nonec                ó0  — |p|                      d¦  «        p| j        pd                     ¦   «         }|dvrd}t          | j        |d         ¦  «        dk    }t          j        | j        |d         ¦  «        dk    }|dk    r|s|rdndS |dk    r|s|sdS |S )u¹   Resolve retrieval mode for SaaS agent chat.

    The shared platform finance dataset is NEVER used here â€” answers come only
    from the selected agent's uploaded knowledge base.
    Úkb_modeÚtenant>   r™   ÚcombinedÚplatformÚidr   r›   rš   )rU   r˜   rR   r9   Úorg_idÚsaas_dbÚcount_ready_kb_chunks)r“   r”   r•   ÚmodeÚhas_vectorsÚ	has_readys         rW   Úresolve_kb_moder£   ­   s¸   € ð ÐH˜Ÿ	š	 )Ñ,Ô,ÐH°´ÐHÀ×OÒOÑQÔQ€DØÐ5Ð5Ð5ØˆÝ& t¤{°E¸$´KÑ@Ô@À1ÒD€KÝÔ-¨d¬k¸5À¼;ÑGÔGÈ!ÒK€IàˆzÒÐØ)ÐE¨YÐEˆzˆz¸XÐEØˆzÒÐ +Ð°iÐØˆxØ€KrY   F)ÚbriefÚ
agent_namer�   Úagent_idr¤   Úboolc                óÔ  — t          ||¦  «        }|r|j        rdS dS |j        r|t          d„ t          j        ||¦  «        D ¦   «         ¦  «        }t          |¦  «        }|dk    r&|d                              d¦  «        pd}d|› d	|› d
�S |dk    r	d|› d|› d�S d|› d�S |                      d¦  «        pd                     ¦   «         }	|	rd|	                     ¦   «         vr|	S d|› d�S )zAWarm greeting that adapts to whether Knowledge already has files.uF   Hi â€” happy to help. What would you like to know about your document?zHi! How can I help you today?c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©ÚstatusÚready©rU   ©Ú.0Úds     rW   ú
<listcomp>z#_greeting_reply.<locals>.<listcomp>Ñ   s7   € ð ð ð àØ—5’5˜‘?”? gÒ-Ð-ð à-Ð-Ð-rY   r`   r   Úfilenamezyour documentzHi! I'm z.

I've indexed **z�** in your knowledge base.

Ask me to summarize it, look up facts, or explain anything in the file.

What would you like to know?z.

I've got z� documents ready in your knowledge base. I can summarize them, find specifics, or compare details across files.

What would you like to know?uf   . Your knowledge base is ready â€” ask me to summarize, find details, or explain what's in your files.Úwelcome_messagerJ   zupload a knowledge base firstzHello! I'm uw    â€” I answer from your uploaded knowledge base. Upload a PDF, TXT, MD, or CSV in Knowledge, or ask a general question.)	r?   Úhas_knowledger@   rž   Úlist_kb_documentsr|   rU   ry   rR   )
r”   r¥   r�   r¦   r¤   Úkbr…   ÚnÚnameÚcustoms
             rW   Ú_greeting_replyrº   À   s„  € õ 
  ¨Ñ	1Ô	1€BØð /ØÔð 	\Ø[Ð[Ø.Ð.à	Ôð 
Ý ðð å Ô2°6¸8ÑDÔDðñ ô ñ
ô 
ˆõ �‰IŒIˆØ�Š6ˆ6Ø˜”7—;’;˜zÑ*Ô*Ð=¨oˆDð/˜:ð /ð /Ø"&ð/ð /ð /ðð ˆqŠ5ˆ5ð/˜:ð /ð /Øð/ð /ð /ððR�zð Rð Rð Rð	
ð
 �iŠiÐ)Ñ*Ô*Ð0¨b×7Ò7Ñ9Ô9€FØð Ð1¸¿º¹¼ÐGÐGØˆð	Q�jð 	Qð 	Qð 	QðrY   ÚtextÚon_tokenúCallable[[str], None] | NoneÚNonec                ó\   — |r| sdS t          j        d| ¦  «        D ]}|r ||¦  «         ŒdS )zDStream precomputed text word-by-word for template / insight replies.Nz(\s+))rS   r}   )r»   r¼   Úpieces      rW   Ú_emit_tokensrÁ   õ   sQ   € àð ˜4ð ØˆÝ”˜( DÑ)Ô)ð ð ˆØð 	ØˆH�U‰OŒOˆOøðð rY   ©Únum_predictr¼   ÚpromptrÃ   ú
int | Nonec               óÖ   — |rQg }|                       ||¬¦  «        D ]"}|                     |¦  «          ||¦  «         Œ#d                     |¦  «        S |                      ||¬¦  «        S )N)rÃ   rJ   )Ústream_ollamar‚   r„   Ú_invoke_ollama)ÚservicerÄ   rÃ   r¼   ÚpartsÚchunks         rW   Ú_ollama_textrÌ   þ   s}   € ð ð ØˆØ×*Ò*¨6¸{Ð*ÑKÔKð 	ð 	ˆEØ�LŠL˜ÑÔÐØˆH�U‰OŒOˆOˆOØ�wŠw�u‰~Œ~ÐØ×!Ò! &°kÐ!ÑBÔBÐBrY   )Ú
session_idr˜   r¼   Ú	on_statusÚquestionrÍ   r˜   rÎ   r   c                óÌ#  — t          j        ¦   «         }| pd                     ¦   «         } t          || ¦  «        }t	          |j        ¦  «        }	|	dk    r$|j        |j        k    rt	          |j        ¦  «        }	|j        }
t          j        |¦  «        }|r|d         |j	        k    rt          | dg ||d|||	¬¦	  «	        S t          ¦   «         }t          |||¦  «        }|                     d¦  «        pd}t          | ||	¬	¦  «        }|p	d
|j	        › �}t          | |	t!          |¦  «        ¬¦  «        }|j        dk    rd}	ddlm}  |ddddd|j        d¦  «        }|j        }|j        p|	}	t/          j        d|j        |j        ||	|j        |j        | d d…         ¦  «         |j        dk    r&t          | t7          | ¦  «        g ||d|||	d¬¦
  «
        S |j        dk    rÆt9          |j	        |¦  «        }t;          |¦  «        pt=          t?          |¦  «        ¦  «        }tA          |¦  «         t=          tC          j"        d|                      ¦   «         ¦  «        ¦  «        }|r|j#        r|rdnd}n|rd}n|j#        rd}nd}t          | |g ||d||d|j#        rdnd ¬¦
  «
        S |j        d!k    r˜t?          |¦  «        }t9          |j	        |¦  «        }t;          |¦  «        pt=          |¦  «        }tA          |¦  «         | o|j#         }tI          |||j	        || ¬"¦  «        }t          | |g ||d||d|j#        rdnd ¬¦
  «
        S |j        d#k    rt          | d$g ||d||dd¬¦
  «
        S |j        d%k    rt          | d&g ||d||dd¬¦
  «
        S |j        d'k    r)d(|j        pdv rd)}nd*}t          | |g ||d||dd¬¦
  «
        S |j        d+k    rÏt9          |j	        |¦  «        }t=          tC          j"        d,|                      ¦   «         ¦  «        ¦  «        }t=          tC          j"        d-|                      ¦   «         ¦  «        ¦  «        }|r
|j#        rd.}n|r
|j#        rd/}n|rd0}n|j#        rd1}nd2}t          | |g ||d||d|j#        rdnd |j#         ¬3¦  «        S |j        d4k    rEtK          j&        ¦   «          '                    d5¦  «        }d6|› d7�}t          | |g ||d||dd¬¦
  «
        S |j        d8k    �r!|p	d
|j	        › �}tQ          | ¦  «        rtS          |¦  «        }|rd9|› d:�}nÕd;}nÒtU          | ¦  «        r(tU          | ¦  «        } tW          || pd¦  «         d<| › d=�}n›tY          | ¦  «        rŠt[          |¦  «        }!d }"t]          |j	        |¦  «        }#|#rdd>l/m0}$  |$|#d         ¦  «        }"|!r4|"r2|! 1                    ¦   «         |" 1                    ¦   «         vr
d?|!› d@|"› dA�}n|!rdB|!› dA�}n|"rdC|"› dD�}ndE}ndF}t          | |g ||d||dd¬¦
  «
        S |j        dGk    �r¶t9          |j	        |¦  «        }%|p	d
|j	        › �}t[          |¦  «        }&|j2        pd}'t;          |¦  «        pt=          t?          |¦  «        ¦  «        }tg          | ¦  «        p#ti          | ¦  «        ptC          j5        dH| ¦  «        }(|(rytm          || |&|%j#        |%j7        dk    |'|¬I¦  «        })tq          ||)ts          ¦   «         j:        |¬J¦  «        }*t          | tw          |*¦  «        g ||d||dd|%j#        rdnd d¬K¦  «        S |%j#        rmtm          || pdL|&d|%j7        dk    |'|¬I¦  «        })tq          ||)ts          ¦   «         j:        |¬J¦  «        }*t          | tw          |*¦  «        g ||d||dddd¬K¦  «        S t          | tx          › dMt{          ¦   «         › �g ||d||dd d¬3¦  «        S |j        dNk    rê|p	d
|j	        › �}t[          |¦  «        }&|j2        pd}'t}          | ¦  «        r1t          j@        | ¬O¦  «        })|'r|'                     ¦   «         › dM|)› �})ntƒ          || |&|'¬P¦  «        })ts          ¦   «         j:        }+t…          |dQd¦  «        dRk    rt‡          |+d¦  «        }+tq          ||)|+|¬J¦  «        }*t          | tw          |*¦  «        g ||d||dddd¬K¦  «        S |j        dSk    r–ddTl/mD},mE}-  |,|j	        || ¦  «        }.|.r[ |-|.¦  «        }/t          | |/g ||dU||dV|.t9          |j	        |¦  «        j#        rdnd t9          |j	        |¦  «        j#         ¬W¦  «        S t          | tx          g ||d||dVd d¬3¦  «        S t9          |j	        |¦  «        }%|j        }0|0rT|%j#        sMt/          jF        dX||%jG        |%jH        |%jI        |%j7        | ¦  «         t          | tx          g ||d|||	d d¬3¦  «        S ts          ¦   «         jJ        pdY                     ¦   «          1                    ¦   «         }1|1dZk    }2t=          ts          ¦   «         jK        ¦  «        o|1d[v }3|0r¸|%j#        r±|3r¯|1dYk    r©	 dd\lLmM}4  |4| |j	        |¬]¦  «        }5|5jN        r:|5jO        r3|5jP        s,t          | t£          |5jO        ¦  «        g ||dU|||	dd^¬_¦  «        S |5jN        r|5jO        r|5jP        r|5jO        }6nd }6n0# t¤          $ r!}7t/          jF        d`|7¦  «         d }6Y d }7~7n
d }7~7ww xY wd }6|0�r¾|%j#        �r¶|2�r³|j        dk    r£t!          |¦  «        r”t§          |¦  «        }8|8rƒdd lT}9	 |9 U                    |8¦  «        }:n# t¤          $ r d }:Y nw xY w|:rTt[          |¦  «        }&t­          || |:|jW        |&d|¬a¦  «        };|;r(t          | t£          |;¦  «        g ||dU||ddddb¬K¦  «        S t±          |j	        ||
|j        |jY        |jZ        |j[        ¬c¦  «        }<|<r¥|<\  }/}=t¹          |=| |||||j        dk    p
|=j        dk    ¬d¦  «        \  }/}=}>|=j        dk    r7dd lT}9t»          ||9 ^                    t¿          |=| ¦  «        de¬f¦  «        ¦  «         t          | t£          |/¦  «        g ||dU|||>|=j        p|	|=ddb¬g¦  «        S |j        dk    r§t]          |j	        |¦  «        }#|#r�tÁ          |#d         | ¦  «        }=t¹          |=| ||||d¬d¦  «        \  }/}=}>dd lT}9t»          ||9 ^                    t¿          |=| ¦  «        de¬f¦  «        ¦  «         t          | t£          |/¦  «        g ||dU|||>d|=ddb¬g¦  «        S tÃ          |	¦  «        s<|jY        dhv s3|jY        dik    rZ|jZ        rStÃ          t	          |jZ        ¦  «        ¦  «        r2t]          |j	        |¦  «        }#|#rdj}?t          | |?g ||dU|||	d¬¦
  «
        S |
}@|jY        dik    rB|jZ        r;tÅ          |j         c                    ¦   «         ¦  «        dkk    r|jZ        › dl|j        › �}@g }Ad }Bg }C|%j#        �r'|r |dm¦  «         ts          ¦   «         }D|DjJ        pdY                     ¦   «          1                    ¦   «         }1t=          tC          j5        dn| pd¦  «        ¦  «        }E|Er|Djd        n"t‡          dotË          dp|Djd        ¦  «        ¦  «        }Fd }G|1dZk    r|jf        pd }G|j        dk    rdq}G|Djg        r#|1drv rddslhmi}H  |H|j	        ||@|F|G¬t¦  «        \  }I}BntÕ          |j	        ||@|F|G¬t¦  «        \  }I}B|A k                    du„ |ID ¦   «         ¦  «         dv„ |ID ¦   «         }C|As\t/          jl        dw| ||%|B¦  «         |%j#        st          | tx          g ||d|||	d d¬3¦  «        S t          | tÚ          g ||d|||	dx¬¦
  «
        S tÝ          |A|	|C¬y¦  «        \  }J}K|J                     ¦   «         s2t/          jl        dz¦  «         t          | tÚ          g ||d|||	dx¬¦
  «
        S |d{v rÈ|%j#        rÁts          ¦   «         jJ        pdY                     ¦   «          1                    ¦   «         }1|1dZk    r]tß          |j	        |¦  «        }L|LrF|L p                    d|d}¦  «         p                    d~d¦  «         p                    d€d¦  «        }M|Md�z   |Jz   }J|6rd‚|6z   d�z   |Jz   }JtÅ          |A¦  «        dƒk     r|Jd„z   }Jd}N|                     d…¦  «        rd†|d…         › �}N|j2        pd}'d‡dˆd‰dŠd‹œ                     |jY        d‡¦  «        }Otâ           @                    ||jr        |Ntæ          té          j        |	dŒ¦  «        |O|'|J¬�¦  «        dMz   të          j@        |j        ¬O¦  «        z   })t/          jv        | |A|Cr|Cnd |)¬Ž¦  «         tw          tq          ||)|¬�¦  «        ¦  «        }?t£          tï          |?¦  «        ¦  «        }?t          | |?|K||d�||d|	dd^¬K¦  «        S )‘NrJ   rZ   r�   zChatbot not found.Úconversational)r¼   rG   r¸   Ú	Assistant)ÚresolvedrG   úorg:)rG   r#   Úfinancial_analysisÚfinancial_advicer   )Ú	ChatRouteÚstructured_or_ragÚdataTÚdocument_lookupzFroute target=%s analyst=%s intent=%s finance=%s docs=%s reason=%s q=%réx   Ú
calculatorÚfound)r¼   rG   Úknowledge_stateÚtemplate_how_are_youzI(?i)^(yo|sup|wass?u+p+|whass?u+p+|(?:what'?s|whats)\s+(?:up|good))[?.!]*$uC   Hey â€” all good. What would you like to look at on your statement?uQ   Hey â€” all good. I've got your statement ready â€” totals, merchants, or a date?uM   Hey â€” all good! Upload a statement in Knowledge, or ask a finance question.zOI'm doing well, thanks! Happy to dig into your statement whenever you're ready.zpI'm doing well, thanks! Upload a statement in Knowledge when you're ready, or ask a general accounting question.ÚemptyÚtemplate_greeting)r”   r¥   r�   r¦   r¤   Útemplate_thanksu)   You're welcome â€” happy to help anytime.Útemplate_byeu   Goodbye â€” talk soon.Útemplate_offtopiczunrelated third-partyu£   I don't have information about that person's spending. I only analyze statements you upload â€” ask about your own payments, merchants, or dates on this statement.zrI focus on your documents and finances. Upload a statement in Knowledge, or ask about totals, merchants, or dates.Útemplate_clarifyzE(?i)^(ok|okay|sure|cool|nice|great|alright|fine|got\s+it|k|kk)[?.!]*$u*   (?i)^(what|huh|eh|and|so|[?!.â€¦]+)[?.!]*$z,Got it. What would you like to look at next?up   Happy to help â€” ask me to summarize your document, look up a fact, or explain anything in your knowledge base.uL   Happy to help â€” upload a document in Knowledge, or ask a general question.uk   Sure â€” what should we look at? I can summarize your knowledge base, find specifics, or explain a section.zZI'm not sure what you mean yet. Upload a document in Knowledge, or ask a general question.)r¼   rG   rÞ   Úshow_upload_ctaÚtemplate_todayz%A, %d %B %YzToday's date is uT   . If you meant the statement period instead, ask â€œwhat is the statement period?â€�Útemplate_personalu   Your first question was:

â€œõ   â€�z2I don't have an earlier question in this chat yet.zNice to meet you, zH! I'll remember that for this conversation. What would you like to know?)Ú_account_holderz2If you mean your name from our conversation, it's zA. If you mean the account holder on the uploaded statement, it's ú.zYou told me your name is z3From the uploaded statement, the account holder is u^   . If thatâ€™s you, great â€” or say â€œmy name is â€¦â€� and Iâ€™ll remember it for this chat.uŒ   I don't know your personal name yet â€” you can say â€œmy name is â€¦â€�. I can also tell you the account holder from an uploaded statement.u.   Happy to help â€” what would you like to know?Útemplate_helpzK(?i)\b(tell\s+me\s+about\s+(?:the\s+bot|this\s+bot|the\s+assistant|alex))\b)r¥   rÏ   Ú	user_namer´   Úhas_statementÚhistoryÚalready_spokerÂ   )r¼   Úskip_streamrG   rÞ   Úresponse_sourcezWhat can you help me with?z

Úollama_concept)rÏ   )r¥   rÏ   rí   rï   Úprimary_intentÚcalculationÚkb_metadata)Úbuild_kb_inventoryr7   ÚpdfÚdocument_qa)r¼   rG   ÚinsightrÞ   ræ   zLEmpty knowledge for agent=%s vectors=%s ready_docs=%s chunks=%s jobs=%s q=%rÚfdiÚhybrid>   rû   Úrag)Úrun_fdi_turn)rÏ   r�   r¦   Údocument)r¼   rG   rÞ   rò   zFDI planner failed: %s©r¥   rÏ   ÚevidenceÚinvoke_ollamarí   Úanalysisr¼   Ú	statement)Úoriginal_questionÚconv_intentÚprior_questionÚprior_answer©rÍ   r¼   r¥   Úforce_analysisF)Úensure_ascii)r¼   rñ   rG   rú   rÞ   rò   >   ÚverifyÚexplain_calcÚ	follow_upu¹   I re-checked the full statement but still need a clearer ask to compute that precisely. Try: statement period Â· how much did I spend Â· spend on 16 July Â· groceries Â· money received.é   Ú
Ú	searchingz3(?i)\b(analy[sz]e|summar(?:y|ize)|overview|about)\bé   é   )r‘   ÚsummaryÚtotalsÚstatement_period)rû   rý   )Úhybrid_retrieve)ÚkÚchunk_kindsc                ó   — g | ]\  }}|‘ŒS © r  )r¯   r°   Ú_s      rW   r±   zagent_chat.<locals>.<listcomp>  s   € Ð*Ð*Ð*™4˜1˜a�QÐ*Ð*Ð*rY   c                ó   — g | ]\  }}|‘ŒS r  r  )r¯   r  Úss      rW   r±   zagent_chat.<locals>.<listcomp>  s   € Ð'Ð'Ð'™˜˜1�!Ð'Ð'Ð'rY   z9No retrieval context for query=%r mode=%s kb=%s reason=%sÚno_relevantr[   zEEmpty context after formatting; refusing to call LLM with blank notes>   r™   rš   z=== SAMPLE TRANSACTIONSz=== TRANSACTION SAMPLESz=== BANK STATEMENT SUMMARYz=== STATEMENT TOTALSz,(prefer these totals for cashflow questions)rs   z:=== STRUCTURED FACTS (verified; prefer these numbers) ===
é   ué   

Note to assistant: retrieval coverage may be incomplete for this question; say if the answer may be incomplete. Do not claim you reviewed records that are not in the notes. Never invent totals â€” use structured facts when present.ÚdescriptionzPersona / role: znew questionu;   follow-up â€” resolve references using conversation historyu7   challenge â€” re-check data, do not defend prior answerz'explain calculation from full statement)Únew_questionr  r  r  ÚGeneral)r¥   Úorg_nameÚpersonaÚpolicyÚfinance_intent_labelÚ	conv_moderï   Úcontext)Úqueryr…   r\   rÄ   )r¼   rý   )xÚtimeÚ	monotonicry   r(   r/   ÚoriginalÚ	rewrittenrž   Ú	get_agentr�   Ú_finishr   r£   rU   r   r   r#   ÚintentÚapp.saas.chat_routerr×   rr   Úchat_intentrG   rz   Úlog_infoÚtargetÚuse_docsÚcalc_expressionr?   r)   r§   r    r"   rS   Úmatchr´   rº   r   ÚnowÚstrftimer   r   r   r*   r   r   r;   Úapp.saas.insightrê   rR   Úhistory_blockr   r   rT   r   Ústatement_jobsrÌ   r   Ú!ollama_num_predict_conversationalr   r=   r   r   r   Úformatr   Úgetattrrw   r÷   r7   r{   Úvector_countÚ
ready_docsÚready_chunksÚkb_chat_modeÚfdi_enabledÚapp.fdi.plannerrþ   ÚhandledÚanswerÚ
prefer_ragr,   Ú	Exceptionr   ÚjsonÚloadsr-   rÈ   r8   r  r  r  Ú_finalize_structured_answerr%   Údumpsr5   r6   r!   r|   r}   Úkb_retrieval_top_kr~   r  Úfdi_hybrid_searchÚapp.fdi.hybridr  r:   Úextendrƒ   r>   r’   r<   ÚreplaceÚAGENT_SYSTEMr$  r   r.   r   Úprint_rag_debugÚ_scrub_internal_language)PrÏ   r“   r¦   rÍ   r˜   r¼   rÎ   Út0rÓ   rG   Úeffective_qr”   rÉ   r    r¥   ÚrouteÚ	sid_earlyÚanalystr×   r3  r¶   ÚalreadyÚcasualÚmsgÚprior_turnsÚuse_fullÚofftopic_ansÚsoft_ackÚ	bare_pingÚtodayÚsidÚfirstÚintroÚknownÚholderÚjobsrê   Ú	kb_statusrí   rï   Úmeta_qrÄ   ÚrawÚpredictr÷   r7   Úinvr»   Údata_questionÚ	chat_modeÚuse_structuredÚfdi_onrþ   rû   Úquestion_fdi_prefaceÚexcÚcachedÚ_jsonr  ÚadviceÚ
structuredrú   ÚstreamedrH  Úretrieval_qr…   Úretrieval_reasonr\   rˆ   ÚoverviewishÚtop_kÚkindsr  Úscoredr)  r‡   ÚstmtÚ
stmt_cleanr%  r(  sP                                                                                   rW   Ú
agent_chatrƒ    s(  € õ 
ŒÑ	Ô	€BØ�˜B×%Ò%Ñ'Ô'€HÝ˜J¨Ñ1Ô1€Hå,¨XÔ->Ñ?Ô?€NØ˜Ò"Ð" xÔ'9¸XÔ=NÒ'NÐ'NÝ0°Ô1CÑDÔDˆØÔ$€KåÔ˜hÑ'Ô'€Eàð 
�E˜(”O t¤{Ò2Ð2ÝØØ ØØØØØØØ)ð

ñ 

ô 

ð 
	
õ ÑÔ€GÝ˜4 ¨Ñ0Ô0€DØ—’˜6Ñ"Ô"Ð1 k€Jõ ØØØ%ðñ ô €Eð
 Ð2Ð2 T¤[Ð2Ð2€IÝ%ØØ%Ý-¨iÑ8Ô8ðñ ô €Gð
 „~Ð-Ò-Ð-Ø+ˆà2Ð2Ð2Ð2Ð2Ð2à�	ØØØØØØŒNØñ
ô 
ˆð Ô#€KØÔ)Ð;¨^€NÝ„LØPØŒØŒØØØŒØŒØ��#�Œñ	ô 	ð 	ð „|�|Ò#Ð#ÝØÝ˜HÑ%Ô%ØØØØØØØ)Ø#ð
ñ 
ô 
ð 	
ð „|Ð-Ò-Ð-Ý# D¤K°Ñ:Ô:ˆÝ(¨Ñ4Ô4ÐS½½YÀzÑ=RÔ=RÑ8SÔ8SˆÝ 
Ñ+Ô+Ð+ÝÝŒHØ\Ø—’Ñ Ô ñô ñ
ô 
ˆð ð 	�bÔ&ð 	ð ðiÐUÐUàhð ˆCð
 ð 	ØaˆCˆCØÔð 	ØcˆCˆCð8ð õ ØØØØØØØØØ$Ø')Ô'7ÐD˜G˜G¸Wð
ñ 
ô 
ð 	
ð „|Ð*Ò*Ð*Ý 
Ñ+Ô+ˆÝ# D¤K°Ñ:Ô:ˆÝ(¨Ñ4Ô4ÐI½¸[Ñ8IÔ8IˆÝ 
Ñ+Ô+Ð+à�KÐ;¨"Ô*:Ð&:ˆÝØØ!Ø”;ØØ�,ð
ñ 
ô 
ˆõ ØØØØØØØØØ$Ø')Ô'7ÐD˜G˜G¸Wð
ñ 
ô 
ð 	
ð „|Ð(Ò(Ð(ÝØØ7ØØØØØØØ$Ø#ð
ñ 
ô 
ð 	
ð „|�~Ò%Ð%ÝØØ$ØØØØØØØ$Ø#ð
ñ 
ô 
ð 	
ð „|Ð*Ò*Ð*Ø" u¤|Ð'9°rÐ:Ð:ð9ð ˆLð]ð õ ØØØØØØØØØ$Ø#ð
ñ 
ô 
ð 	
ð „|Ð)Ò)Ð)Ý# D¤K°Ñ:Ô:ˆÝÝŒHØXØ—’Ñ Ô ñô ñ
ô 
ˆõ ÝŒHÐBÀHÇNÂNÑDTÔDTÑUÔUñ
ô 
ˆ	ð ð 	˜Ô(ð 	Ø@ˆCˆCØð 	˜2Ô+ð 	ðNð ˆCð ð 	ð-ð ˆCð Ôð 		ð]ð ˆCðMð õ ØØØØØØØØØ$Ø')Ô'7ÐD˜G˜G¸WØ "Ô 0Ð0ð
ñ 
ô 
ð 	
ð „|Ð'Ò'Ð'Ý”‘”×'Ò'¨Ñ7Ô7ˆða˜uð að að að 	õ ØØØØØØØØØ$Ø#ð
ñ 
ô 
ð 	
ð „|Ð*Ò*Ñ*ØÐ0Ð0 4¤;Ð0Ð0ˆÝ  Ñ*Ô*ð (	CÝ+¨CÑ0Ô0ˆEØð KØB¸ÐBÐBÐB��àJ��Ý˜8Ñ$Ô$ð "	CÝ! (Ñ+Ô+ˆEÝ$ S¨%¨+°2Ñ6Ô6Ð6ðY Uð Yð Yð Yð ˆCõ ˜HÑ%Ô%ð 	CÝ,¨SÑ1Ô1ˆEØˆFÝ,¨T¬[¸(ÑCÔCˆDØð 2Ø<Ð<Ð<Ð<Ð<Ð<à(˜¨¨a¬Ñ1Ô1�Øð ˜ð  E§K¢K¡M¤M¸¿º¹¼Ð$GÐ$Gð`Èð `ð `ØV\ð`ð `ð `ð �ð ð Ø:°%Ð:Ð:Ð:��Øð 
ðsÈ&ð sð sð sð �ðYð �ð
 CˆCÝØØØØØØØØØ$Ø#ð
ñ 
ô 
ð 	
ð „|�Ò&Ñ&Ý*¨4¬;¸ÑAÔAˆ	ØÐ0Ð0 4¤;Ð0Ð0ˆÝ,¨SÑ1Ô1ˆ	ØÔ(Ð.¨BˆÝ(¨Ñ-Ô-ÐEµµiÀ±n´nÑ1EÔ1Eˆå  Ñ*Ô*ð Ý% hÑ/Ô/ðåŒyØ^Øñô ð 	ð ð 	Ý&Ø%Ø!Ø#Ø'Ô5Ø'Ô6¸Ò:ØØ%ðñ ô ˆFõ ØØÝ(™NœNÔLØ!ð	ñ ô ˆCõ ØÝ˜cÑ"Ô"ØØØØ ØØ!Ø Ø(Ø+4Ô+BÐ O  ÈØ )ðñ ô ð ð Ô"ð 	Ý&Ø%Ø!ÐAÐ%AØ#Ø"Ø'Ô6¸Ò:ØØ%ðñ ô ˆFõ ØØÝ(™NœNÔLØ!ð	ñ ô ˆCõ ØÝ˜cÑ"Ô"ØØØØ ØØ!Ø Ø(Ø 'Ø )ðñ ô ð õ ØÝÐ6Ð6¥]¡_¤_Ð6Ð6ØØØØØØØ$Ø#Ø ð
ñ 
ô 
ð 	
ð „|Ð'Ò'Ð'ØÐ0Ð0 4¤;Ð0Ð0ˆÝ,¨SÑ1Ô1ˆ	ØÔ(Ð.¨BˆÝ& xÑ0Ô0ð 
	Ý+Ô2¸HÐEÑEÔEˆFØð :Ø#ŸMšM™OœOÐ9Ð9°Ð9Ð9�øå)Ø%Ø!Ø#Øð	ñ ô ˆFõ ‘.”.ÔBˆÝ�5Ð*¨BÑ/Ô/°=Ò@Ð@Ý˜' 3Ñ'Ô'ˆGÝ˜7 F¸È(ÐSÑSÔSˆÝØÝ˜#ÑÔØØØØØØØØ$Ø#Ø%ð
ñ 
ô 
ð 	
ð  „|�}Ò$Ð$ØLÐLÐLÐLÐLÐLÐLÐLà Ð  ¤¨h¸ÑAÔAˆØð 	Ø&Ð& sÑ+Ô+ˆDÝØØØØØØØØ!Ø,ØÝ+AÀ$Ä+ÈxÑ+XÔ+XÔ+fÐ s  ÐlsÝ$:¸4¼;ÈÑ$QÔ$QÔ$_Ð _ðñ ô ð õ ØÝØØØØØØØ(Ø#Ø ð
ñ 
ô 
ð 	
õ ' t¤{°HÑ=Ô=€IØ”N€Mð ð 
˜YÔ4ð 
ÝŒØZØØÔ"ØÔ ØÔ"ØÔ$Øñ	
ô 	
ð 	
õ ØÝØØØØØØØ)Ø#Ø ð
ñ 
ô 
ð 	
õ ‘”Ô,Ð5°×<Ò<Ñ>Ô>×DÒDÑFÔF€IØ (Ò*€NÝ•,‘.”.Ô,Ñ-Ô-ÐM°)¸~Ð2M€Fð ð !$˜Ô0ð !$°Vð !$À	ÈUÒ@RÐ@Rð	(Ø4Ð4Ð4Ð4Ð4Ð4à�,Ø!Ø”{Ø!ðñ ô ˆCð
 Œ{ð ˜sœzð °#´.ð ÝØÝ,¨S¬ZÑ8Ô8ØØØØØØ%Ø#1Ø$+Ø$.ðñ ô ð ð Œ{ð ,˜sœzð ,¨c¬nð ,à'*¤zÐ$Ð$à'+Ð$øøÝð 	(ð 	(ð 	(ÝŒLÐ1°3Ñ7Ô7Ð7Ø#'Ð Ð Ð Ð Ð Ð øøøøð	(øøøð  $Ðàñ R˜Ô0ñ R°^ñ RàŒ>Ð1Ò1Ð1Õ6HÈÑ6SÔ6SÐ1Ý)¨)Ñ4Ô4ˆFØð  Ø$Ð$Ð$Ð$ð$Ø$Ÿ{š{¨6Ñ2Ô2�H�HøÝ ð $ð $ð $Ø#�H�H�Hð$øøøàð Ý 8¸Ñ CÔ C�IÝ5Ø#-Ø!)Ø!)Ø&-Ô&<Ø"+Ø!%Ø!)ðñ ô �Fð ð Ý&Ø$Ý4°VÑ<Ô<ØØØ&Ø!Ø Ø%-Ø(,Ø+=Ø,3Ø,7ð ñ  ô  ð õ .ØŒKØØØ&Ô/Ø Ô,Ø#Ô2Ø!Ô.ð
ñ 
ô 
ˆ
ð ð !	Ø&‰MˆD�'Ý&AØØØØ%Ø!Ø%Ø&œ~Ð1EÒEð  8Ø”>Ð%7Ò7ð	'ñ 	'ô 	'Ñ#ˆD�'˜8ð Œ~Ð!3Ò3Ð3Ø$Ð$Ð$Ð$å)ØØ—K’KÕ 6°wÀÑ IÔ IÐX]�KÑ^Ô^ñô ð õ ØÝ(¨Ñ.Ô.ØØØØØØ!Ø$Ø&œ~Ð?°ØØ 'Ø +ðñ ô ð ð" Œ>Ð1Ò1Ð1Ý,¨T¬[¸(ÑCÔCˆDØð Ý2°4¸´7¸HÑEÔE�Ý*EØØØØ)Ø%Ø)Ø#'ð+ñ +ô +Ñ'��g˜xð %Ð$Ð$Ð$å)ØØ—K’KÕ 6°wÀÑ IÔ IÐX]�KÑ^Ô^ñô ð õ ØÝ,¨TÑ2Ô2ØØØØØØ%Ø (Ø#5Ø#Ø$+Ø$/ðñ ô ð õ& )¨Ñ8Ô8ð	àÔ#Ð'AÐAÐAàÔ$¨Ò3Ð3ØÔ+ð 4å0Õ1HÈÔI`Ñ1aÔ1aÑbÔbð 4õ
 -¨T¬[¸(ÑCÔCˆDØð ðxð õ ØØØØØØØØ%Ø#1Ø$+ðñ ô ð ð €KàÔ Ò+Ð+ØÔ#ð 	,å�Ô!×'Ò'Ñ)Ô)Ñ*Ô*¨bÒ0Ð0à!Ô0ÐGÐG°HÔ4EÐGÐGˆà€DØÐØ€Fð Ôñ "(Øð 	#ØˆI�kÑ"Ô"Ð"Ý‘>”>ˆØÔ*Ð3¨e×:Ò:Ñ<Ô<×BÒBÑDÔDˆ	ÝÝŒIÐLÈhÈnÐZ\Ñ]Ô]ñ
ô 
ˆð 0;Ðk�Ô+Ð+ÅÀAÅsÈ1ÈhÔNiÑGjÔGjÑ@kÔ@kˆàˆØ˜Ò Ð ØÔ'Ð/¨4ˆEØŒ~Ð!2Ò2Ð2ØK�ØÔ%ð 	¨)°~Ð*EÐ*EØ6Ð6Ð6Ð6Ð6Ð6à'6 Ø”ØØØØ!ð(ñ (ô (Ñ$ˆFÐ$Ð$õ (=Ø”ØØØØ!ð(ñ (ô (Ñ$ˆFÐ$ð 	�ŠÐ*Ð* 6Ð*Ñ*Ô*Ñ+Ô+Ð+Ø'Ð' Ð'Ñ'Ô'ˆàð !
ÝŒØGØØØØñ	
ô 	
ð 	
ð Ô&ð 	ÝØÝ ØØØØ ØØ!Ø-Ø 'Ø $ðñ ô ð õ ØÝØØØØØØØ)Ø)ð
ñ 
ô 
ð 	
õ & d¸>ÐRXÐYÑYÔYÑ€GˆYØ�=Š=‰?Œ?ð 
ÝŒÐ]Ñ^Ô^Ð^ÝØÝØØØØØØØ)Ø)ð
ñ 
ô 
ð 	
ð Ð%Ð%Ð%¨)Ô*AÐ%Ý!‘^”^Ô0Ð9°E×@Ò@ÑBÔB×HÒHÑJÔJˆ	à˜Ò Ð Ý*¨4¬;¸ÑAÔAˆDØð ?à—L’LÐ!:Ð<UÑVÔVß’WÐ9Ð;QÑRÔRß’WÐKÈRÑPÔPð ð
 % }Ñ4°wÑ>�Øð 	àMØ&ñ'àñ ð ñð õ ˆt‰9Œ9�qŠ=ˆ=àðMñMð ð €GØ‡y‚y�ÑÔð <Ø; U¨=Ô%9Ð;Ð;ˆØÔ$Ð*¨€Gà&ØRØKØAð	ð ÷
 
‚cˆ(Ô
 Ñ/Ô/ð õ 	×ÒØ!Ø”]ØÝ!Ý!6Ô!:¸>È9Ñ!UÔ!UØØØð 	ñ 		
ô 		
ð ñ
	õ Ô
 hÔ&7Ð
8Ñ
8Ô
8ñ	9ð õ ÔØØØÐ)ˆvˆv TØð	ñ ô ð õ �<¨°À(ÐKÑKÔKÑLÔL€FÝ%Õ&>¸vÑ&FÔ&FÑGÔG€FÝØØØØ
ØØØØØØ%ØØ"ðñ ô ð s1   éAk ê2k ë
k=ëk8ë8k=í m ím%í$m%c                óz   — | s| S g d¢}| }|D ]\  }}t          j        |||¦  «        }Œ|                     ¦   «         S )zOLast-line defense against model leaking retrieval jargon / false review claims.))z(?i)\bextracted\s+payments?\bÚpayments)z&(?i)\bextracted\s+(?:line\s*)?items?\bz
line items)z%(?i)\bfrom\s+the\s+statement\s+text\bzon the statement)z*(?i)\b(?:vector|embedding|chunk|OCR|RAG)\brJ   )z(?i)\b\d+\s+chunks?\brJ   )zf(?i)\bi\s+reviewed\s+your\s+(?:uploaded\s+)?(?:documents?|financial\s+records?|records?|statements?)\bzLooking at your documents)z	[ \t]{2,}Ú )rS   Úsubry   )r»   ÚreplacementsÚoutÚpatÚrepls        rW   rV  rV  …  s]   € àð Øˆðð ð €Lð €CØ!ð %ð %‰	ˆˆTÝŒf�S˜$ Ñ$Ô$ˆˆØ�9Š9‰;Œ;ÐrY   rú   r	   c                ó6  — | r	| j         r|s| S | j        r<d| j                             ¦   «         v r!t          |d„ | j         D ¦   «         ¦  «         | S g }| j         D ]m}|j        rO|j        rHt          ||j        |j        ¦  «        r-t          j        d|j         	                    ¦   «         ¦  «        rŒX| 
                    |¦  «         Œn|t          | j         ¦  «        k    r|                      d|i¬¦  «        } t          |d„ | j         pg D ¦   «         ¦  «         | S )zODrop metric cards that were already shown this session (keep narrative + txns).Úbiggestc                óF   — g | ]}|j         ¯	|j        ¯|j         |j        f‘ŒS r  ©ÚlabelÚvalue©r¯   Úms     rW   r±   z+_dedupe_insight_metrics.<locals>.<listcomp>¦  s/   € ÐPÐPÐP A¸A¼GÐPÈÌÐPˆaŒg�q”wÐÐPÐPÐPrY   z}(?i)^(total spent|total received|net cashflow|payments made|payments received|transactions|account holder|period|date range)$Úmetrics©Úupdatec                óF   — g | ]}|j         ¯	|j        ¯|j         |j        f‘ŒS r  r�  r’  s     rW   r±   z+_dedupe_insight_metrics.<locals>.<listcomp>¹  s/   € ÐTÐTÐT ÀÄÐTÈAÌGÐTˆ!Œ'�1”7Ð	ÐTÐTÐTrY   )r”  ÚheadlinerR   r&   r�  r‘  r$   rS   rT   ry   r‚   ÚlistÚ
model_copy)rú   rÍ   Úkeptr“  s       rW   Ú_dedupe_insight_metricsrœ  ›  sV  € ð
 ð ˜'œ/ð °ð ØˆàÔð ˜I¨Ô)9×)?Ò)?Ñ)AÔ)AÐAÐAÝØØPÐP¨¬ÐPÑPÔPñ	
ô 	
ð 	
ð ˆà€DØŒ_ð 	ð 	ˆØŒ7ð 	�q”wð 	Õ#8¸ÀQÄWÈaÌgÑ#VÔ#Vð 	åŒyðUà”—’‘”ñô ð ð
 Ø�Š�A‰ŒˆˆØ�t�G”OÑ$Ô$Ò$Ð$Ø×$Ò$¨Y¸Ð,=Ð$Ñ>Ô>ˆÝØØTÐT g¤oÐ&;¸ÐTÑTÔTñô ð ð €NrY   ÚAlexr	  r
  ú#tuple[str, StructuredInsight, bool]c          	     óØ  ‡‡— d}t          |¦  «        rH| j        rA|s?t          | |¦  «        } t          | |¦  «        } t	          t          | ¦  «        ¦  «        | |fS |s| j        dk    r¢t          |¦  «        }t          | |¦  «        }	t          |||	‰j
        |d‰¬¦  «        }
t          | |¦  «        } |
r7|                      d|
i¬¦  «        } t	          |
¦  «        | t          ‰¦  «        fS t	          t          | ¦  «        ¦  «        | |fS t          |¦  «        p)| j        dk    o| j         ot          j        d|pd	¦  «        }|rwt          ||t!          | ¦  «        ‰j
        t          |¦  «        d‰¬¦  «        }|st#          | |dˆˆfd„	¬¦  «        }|r'|                      d|i¬¦  «        } t          ‰¦  «        }t          | |¦  «        } t	          t          | ¦  «        ¦  «        | |fS )z>Grounded facts first; optional LLM prose for natural phrasing.FrÖ   Tr   r  r•  Ústatement_summaryzJ(?i)\banaly[sz]e|overview|summar|tell\s+me\s+about|what\s+do\s+you\s+thinkrJ   Nc                ó*   •— t          ‰| |‰¬¦  «        S )NrÂ   )rÌ   )rÄ   rÃ   r¼   rÉ   s     €€rW   ú<lambda>z-_finalize_structured_answer.<locals>.<lambda>õ  s"   ø€ ½|Ø˜V°Àxð@ñ @ô @€ rY   )r  ©N)r3   Útransactionsr0   rœ  r,   r1   r1  r   r5   r-   rÈ   rš  r§   r4   rS   rT   r+   r2   )rú   rÏ   rÉ   rÍ   r¼   r¥   r
  rz  rí   r  rx  Úuse_llmÚpolisheds     ` `        rW   rM  rM  ¾  sl  øø€ ð €HÝ˜hÑ'Ô'ð \¨GÔ,@ð \Èð \Ý'¨°Ñ:Ô:ˆÝ)¨'°:Ñ>Ô>ˆÝ'Õ(>¸wÑ(GÔ(GÑHÔHÈ'ÐS[Ð[Ð[ð ð \˜œÐ+=Ò=Ð=Ý,¨ZÑ8Ô8ˆ	Ý)¨'°8Ñ<Ô<ˆÝ)Ø!ØØØ!Ô0ØØØð
ñ 
ô 
ˆõ *¨'°:Ñ>Ô>ˆØð 	MØ×(Ò(°¸FÐ0CÐ(ÑDÔDˆGÝ+¨FÑ3Ô3°W½dÀ8¹n¼nÐLÐLÝ'Õ(>¸wÑ(GÔ(GÑHÔHÈ'ÐS[Ð[Ð[å  Ñ*Ô*ð ØŒÐ-Ò-ð 	uØÔ$Ð$ð	uåŒIÐcÐemÐesÐqsÑtÔtð ð
 ð &Ý+Ø!ØÝ-¨gÑ6Ô6Ø!Ô0Ý.¨zÑ:Ô:ØØð
ñ 
ô 
ˆð ð 	Ý.ØØðð ð ð ð ð ðñ ô ˆHð ð 	&Ø×(Ò(°¸HÐ0EÐ(ÑFÔFˆGÝ˜H‘~”~ˆHå% g¨zÑ:Ô:€GÝ#Õ$:¸7Ñ$CÔ$CÑDÔDÀgÈxÐWÐWrY   c                óì  — t          d„ t          j        | |¦  «        D ¦   «         ¦  «        }|sd S d„ |d d…         D ¦   «         }d                     d„ |D ¦   «         ¦  «        }t	          |¦  «        dk    rdt	          |¦  «        dz
  › d�nd}t          d	„ |D ¦   «         ¦  «        }d
|› d|› |› d�g}|r|                     d¦  «         n|                     d¦  «         d                     |¦  «        S )Nc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rª   r­   r®   s     rW   r±   z#_kb_help_answer.<locals>.<listcomp>  s7   € ð 	
ð 	
ð 	
àØ�uŠu�X‰Œ 'Ò)Ð)ð à)Ð)Ð)rY   c                ó<   — g | ]}|                      d ¦  «        pd‘ŒS )r²   rÿ   r­   r®   s     rW   r±   z#_kb_help_answer.<locals>.<listcomp>  s)   € Ð?Ð?Ð?°ˆQ�UŠU�:ÑÔÐ, *Ð?Ð?Ð?rY   é   z, c              3  ó"   K  — | ]
}d |› d�V — ŒdS )u   â€œré   Nr  )r¯   r·   s     rW   ú	<genexpr>z"_kb_help_answer.<locals>.<genexpr>  s*   è è € Ð3Ð3¨�|˜Q�|�|�|Ð3Ð3Ð3Ð3Ð3Ð3rY   z and z morerJ   c              3  ó¨   K  — | ]M}t          |                     d ¦  «        pd¦  «                             ¦   «                              d¦  «        V — ŒNdS )r²   rJ   z.pdfN)rF   rU   rR   Úendswithr®   s     rW   r¬  z"_kb_help_answer.<locals>.<genexpr>  sV   è è € Ð\Ð\ÐRS�˜AŸEšE *Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<×EÒEÀfÑMÔMÐ\Ð\Ð\Ð\Ð\Ð\rY   zI'm z. I can answer from rë   ub   I can summarize the statement, totals, merchants, dates, or list payments â€” what would you like?z>Ask about those documents, or upload a statement in Knowledge.r†  )r@   rž   rµ   r„   r|   Úanyr‚   )	r�   r¦   r¥   r…   ÚnamesÚlistedÚextrarî   Úliness	            rW   Ú_kb_help_answerr´    s?  € Ýð	
ð 	
åÔ.¨v°xÑ@Ô@ð	
ñ 	
ô 	
ñô €Dð ð ØˆtØ?Ð?°d¸2¸A¸2´hÐ?Ñ?Ô?€EØ�YŠYÐ3Ð3¨UÐ3Ñ3Ô3Ñ3Ô3€FÝ,/°©I¬I¸ªM¨MÐ(•C˜‘I”I ‘MÐ(Ð(Ð(Ð(¸r€EåÐ\Ð\ÐW[Ð\Ñ\Ô\Ñ\Ô\€Mà?ˆzÐ?Ð?¨vÐ?°uÐ?Ð?Ð?ð€Eð ð WØ�ŠØpñ	
ô 	
ð 	
ð 	
ð 	�ŠÐUÑVÔVÐVØ�8Š8�E‰?Œ?ÐrY   )rG   rú   rÞ   ræ   r¼   rñ   rò   rH  r‡   úlist[Citation]rW  r�   r    úStructuredInsight | NonerÞ   ræ   rñ   rò   c               óÔ  — |r|st          ||¦  «         ddlm} t          t	          j        ¦   «         |z
  dz  ¦  «        }|p	d|j        › �}t          |¦  «         |€|dk    rd}n|dv s|�d}nd	}|	d
k    pt          |¦  «        }t          |o|j	        dv ¦  «        }t          |||p	|	d
k    o|dv |o|
 ¬¦  «        }|�|j        s|                     d|i¬¦  «        }d„ |D ¦   «         ||r|                     ¦   «         nd |	|dœ}t          j        |¦  «        }|                     | ||||¦  «        }t#          || |¦  «         t%          ||||pd |dv r|ndd d |||	|
||¬¦  «        S )Nr   )Údatabaseiè  rÔ   rý   rÿ   >   rø   Úpdf_overviewr  rZ   rÝ   >	   rM   rK   Úpayment_countÚperiod_coverageÚspending_summaryrL   Úmerchant_analysisr   Útransaction_search>   rø   rý   rÑ   )rG   rú   rî   Úhas_docsÚsuggestionsr•  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r  )Ú
model_dump)r¯   Úcs     rW   r±   z_finish.<locals>.<listcomp>U  s    € Ð8Ð8Ð8¨�a—l’l‘n”nÐ8Ð8Ð8rY   )r‡   rG   rú   rÞ   rÀ  >   rø   rý   rÜ   r¹  rÑ   )rH  r‡   rÍ   Úlog_idr    Ú
pdf_job_idÚpdf_summaryrG   rú   rÞ   ræ   rÀ  rò   )rÁ   Úappr¸  r   r+  r,  r�   r"   r§   r1  r   rÀ  rš  rÂ  rK  rN  Ú	log_queryr'   r   )rÏ   rH  r‡   rW  rÍ   r    r“   rG   rú   rÞ   ræ   r¼   rñ   rò   r¸  Úduration_msre  r¿  rî   rÀ  ÚpayloadÚcitations_jsonrÄ  s                          rW   r0  r0    s"  € ð" ð '˜ð 'Ý�V˜XÑ&Ô&Ð&ØÐÐÐÐÐå•t”~Ñ'Ô'¨"Ñ,°Ñ4Ñ5Ô5€KØ
Ð
,Ð,˜tœ{Ð,Ð,€CÝ˜CÑ Ô Ð ØÐØ�5Š=ˆ=Ø(ˆOˆOØÐ,Ð,Ð,°Ð0CØ)ˆOˆOà'ˆOØ 'Ò)Ð:­T°'©]¬]€HÝØð 	
ØŒNð

ð
ñô €Mõ $Ø%ØØ#ð UØ˜wÒ&ÐS¨4Ð3SÐ+SØÐ1 /Ð1ðñ ô €Kð Ð 7Ô#6ÐØ×$Ò$¨]¸KÐ,HÐ$ÑIÔIˆà8Ð8¨iÐ8Ñ8Ô8Ø(Ø+2Ð<�7×%Ò%Ñ'Ô'Ð'¸Ø*Ø"ðð €Gõ ”Z Ñ(Ô(€NØ×Ò ¨&°.À+ÈsÑSÔS€FÝ�#�x Ñ(Ô(Ð(ÝØØØØˆ~˜ØÐ[Ð[Ð[ˆTˆTÐafØØØ%ØØ'Ø'ØØ'ðñ ô ð rY   )rC   rD   rE   rF   rG   rF   rH   rF   )rG   rF   r\   r]   rH   r^   r£  )r“   rB   r”   rD   r•   r–   rH   rF   )r”   rD   r¥   rF   r�   rF   r¦   rF   r¤   r§   rH   rF   )r»   rF   r¼   r½   rH   r¾   )rÄ   rF   rÃ   rÅ   r¼   r½   rH   rF   )rÏ   rF   r“   rB   r¦   rF   rÍ   r–   r˜   r–   r¼   r½   rÎ   r½   rH   r   )r»   rF   rH   rF   )rú   r	   rÍ   r–   rH   r	   )rú   r	   rÏ   rF   rÍ   r–   r¼   r½   r¥   rF   r
  r§   rH   rž  )r�   rF   r¦   rF   r¥   rF   rH   r–   )rÏ   rF   rH  rF   r‡   rµ  rW  r�   rÍ   r–   r    rF   r“   rB   rG   r–   rú   r¶  rÞ   r–   ræ   r§   r¼   r½   rñ   r§   rò   r–   rH   r   )jÚ__doc__Ú
__future__r   rK  rS   r+  Úcollections.abcr   r   Ú
app.configr   Úapp.models.schemasr   r   r	   Úapp.rag.calculatorr
   r7  Úapp.rag.chainr   r   Úapp.rag.promptsr   r   Úapp.saasr   rž   Úapp.saas.assistant_policyr   r   Úapp.saas.intent_routerr   Úapp.saas.personalityr   r   r   r   r2  r   r   r   r   r   Úapp.saas.analyst_intentr   Úapp.saas.conversationr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Úapp.saas.reasonr+   r,   r-   Úapp.saas.finance_intentr.   r/   Úapp.saas.answer_styler0   r1   r2   r3   r4   r;  r5   r6   r7   r8   Úapp.saas.kbr9   r:   Úapp.saas.kb_answerr;   r<   Úapp.saas.knowledge_stater=   r>   r?   r@   rA   rz   Úapp.saas.securityrB   rT  rX   r’   r£   rº   rÁ   rÌ   rƒ  rV  rœ  rM  r´  r0  r  rY   rW   ú<module>rá     sk  ðØ [Ð [à "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð #Ð "Ð "Ð "Ð "Ð "Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ >Ð >Ð >Ð >Ð >Ð >Ø vÐ vÐ vÐ vÐ vÐ vÐ vÐ vÐ vÐ vÐ vÐ vðð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð
 SÐ RÐ RÐ RÐ RÐ RÐ RÐ Rðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð &Ð %Ð %Ð %Ð %Ð %Ø )Ð )Ð )Ð )Ð )Ð )ð€ð4$ð $ð $ð $ð$ 1:ÐX\ð +1ð +1ð +1ð +1ð +1ð +1ð\ð ð ð ð ð2 ð2ð 2ð 2ð 2ð 2ð 2ðjð ð ð ð #Ø-1ðCð Cð Cð Cð Cð Cð* "ØØ-1Ø.2ðtð tð tð tð tð tðnð ð ð ð, ð  ð  ð  ðP "Ø-1ØØ ð@Xð @Xð @Xð @Xð @Xð @XðFð ð ð ðH "&Ø(,Ø"&Ø!Ø-1ØØ"&ðPð Pð Pð Pð Pð Pð Pð PrY   