Ë
    õ¡Ÿj¦j ã                  óÜ  — U d Z ddlmZ ddl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 ddl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 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% 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/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z<  ejz                  e>«      Z? G d„ d«      Z@	 dY	 	 	 	 	 	 	 dZd„ZA	 	 	 	 	 	 	 	 d[d„ZBd\d„ZCd]d „ZD	 	 	 	 	 	 d^d!„ZEd_d"„ZFd`d#„ZGdad$„ZHdbd%„ZI	 	 	 	 	 	 dcd&„ZJddd'„ZKded(„ZLdfd)„ZMdgd*„ZNdhd+„ZO ePh d,£«      ZQ	 di	 	 	 	 	 	 	 djd.„ZRd-d/œ	 	 	 	 	 	 	 	 	 	 	 dkd0„ZSdld1„ZT	 dm	 	 	 	 	 	 	 dnd2„ZU	 	 	 	 	 	 dod3„ZV	 	 	 	 	 	 	 	 	 	 	 	 	 	 dpd4„ZWdqd5„ZX	 	 	 	 	 	 	 	 	 	 drd6„ZY	 	 	 	 	 	 	 	 	 	 dsd7„ZZdtd8„Z[dud9„Z\dvd:„Z]	 	 	 	 	 	 dwd;„Z^	 	 	 	 	 	 dxd<„Z_	 dy	 	 	 	 	 dzd=„Z`	 	 	 	 	 	 	 	 d{d>„Zad?Zbi Zcd@eddA<    e
«       Zei ZfdBeddC<    e
«       Zg	 	 	 	 	 	 	 	 d{dD„Zh	 	 	 	 	 	 dxdE„Zi	 	 	 	 	 	 	 	 	 	 	 	 d|dF„ZjdGZkdGZldHZm ePdIh«      ZndJdKœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d}dL„Zod~dM„ZpdIdNœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddO„Zq	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d€dP„Zr	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d�dQ„ZsdIdRdSœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d‚dT„ZtdRdUœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dƒdV„ZudddddWœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d„dX„Zvy)…zM
author: Yagnik Poshiya
organization: Webbrains Technologies Private Limited
é    )ÚannotationsN)ÚThreadPoolExecutor)ÚLock)ÚAny)ÚCallable)Úquote)ÚClient)Úcollection_names_from_snapshotÚ extract_table_names_from_sql_ddlÚshortlist_tablesÚtable_names_from_snapshot)Úfilter_templates_by_dialectÚload_active_query_templatesÚpick_query_template_index)Úgenerate_mongo_query)Úrun_query_mongo)Úverify_mongo_result)Úrun_select_mysql)Úgenerate_sql)Úrun_langchain_live_sql)Úrun_llamaindex_live_sql)Úverify_sql_result)Úload_tables_into_sqliteÚ
run_select)ÚSettings)ÚGeminiEmbedder)ÚGenerationConfigÚ	LLMClientÚLLMUsage)Úbuild_llm_client)Úresolve_model_for_project_agent)Úretrieve_similar_chunksc                  ó    — e Zd ZdZdd„Zdd„Zy)Ú_TokenCounterz3Accumulates token counts across multiple LLM calls.c                ó    — d| _         d| _        y )Nr   )ÚinputÚoutput)Úselfs    úJ/var/www/html/agent-engine/apps/agents/rag-agent/src/agent/orchestrator.pyÚ__init__z_TokenCounter.__init__4   s   € ØˆŒ
Øˆ�ó    c                ó€   — | xj                   |j                  z  c_         | xj                  |j                  z  c_        y ©N)r&   Úinput_tokensr'   Úoutput_tokens)r(   Úusages     r)   Úaddz_TokenCounter.add8   s*   € Ø�
Š
�e×(Ñ(Ñ(�
Ø�Š�u×*Ñ*Ñ*Žr+   N)ÚreturnÚNone)r0   r   r2   r3   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r1   © r+   r)   r$   r$   2   s   „ Ù=óô+r+   r$   c                óT   — | j                  |«      \  }}|r|j                  |«       |S r-   )Úgenerate_jsonr1   )ÚclientÚpromptÚtcÚdatar0   s        r)   Ú	_llm_jsonr?   =   s+   € ð ×&Ñ& vÓ.�K€Dˆ%Ù	Ø
�‰ˆuŒØ€Kr+   c                óÀ  — | j                  d«      }t        |t        «      sg S t        |j                  d«      xs d«      j	                  «       }|sg S t        |j                  d«      xs d«      j	                  «       xs d}t        |j                  d«      xs d«      j	                  «       }|j                  d«      xs g }t        |t
        «      sg }t        |j                  d«      xs d	«      }|d
k  rd	}| j                  d«      }	g }
|d| D �]F  }|j                  |«      }|€Œdt        |«      j	                  «       i}|r,|j                  |«      rt        t        ||   «      |«      |d<   g }|D ]�  }t        |«      j	                  «       }|sŒ|j                  |«      }|€Œ3t        |«      j	                  «       sŒM|j                  dd«      j	                  «       j                  «       }|j                  |› d|› �«       Œ’ |dd |d<   t        |	t        «      rt        |	|«      }|r||d<   |j                  d«      s�Œ6|
j                  |«       �ŒI |
S )z@Build carousel cards deterministically from card_config mapping.ÚcardMappingÚtitleColumnÚ ÚimageColumnNÚpublicBucketUrlÚdetailColumnsÚmaxCardsé
   é   ÚlinkÚtitleÚimageÚ_ú ú: é   Údetails)ÚgetÚ
isinstanceÚdictÚstrÚstripÚlistÚintÚ_build_card_image_urlÚreplacerK   ÚappendÚ_build_card_link)Úcard_configÚdb_colsÚdb_rowsÚmappingÚ	title_colÚ	image_colÚpublic_bucket_urlÚdetail_colsÚ	max_cardsÚlink_cfgÚcardsÚrowÚ	title_valÚcardrQ   ÚdcÚdc_nameÚvalÚlabelrJ   s                       r)   Ú_build_cards_from_configro   G   s,  € ð �o‰o˜mÓ,€GÜ�gœtÔ$Øˆ	Ü�G—K‘K Ó.Ò4°"Ó5×;Ñ;Ó=€IÙØˆ	Ü�G—K‘K Ó.Ò4°"Ó5×;Ñ;Ó=ÒEÀ€IÜ˜GŸK™KÐ(9Ó:Ò@¸bÓA×GÑGÓIÐØ—+‘+˜oÓ.Ò4°"€KÜ�k¤4Ô(ØˆÜ�G—K‘K 
Ó+Ò1¨rÓ2€IØ�1‚}Øˆ	à�‰˜vÓ&€HØ"$€EØ�z˜	Ð"ó ˆØ—G‘G˜IÓ&ˆ	ØÐØØ '¬¨Y«×)=Ñ)=Ó)?Ð@ˆÙ˜Ÿ™ Ô+Ü1´#°c¸)±nÓ2EÐGXÓYˆD�‰MØˆØò 	2ˆBÜ˜"“g—m‘m“oˆGÙØØ—'‘'˜'Ó"ˆCØ‰¤3 s£8§>¡>Õ#3ØŸ™¨¨SÓ1×7Ñ7Ó9×?Ñ?ÓA�Ø—‘ % ¨¨3¨%Ð0Õ1ð	2ð " " 1˜+ˆˆY‰Ü�h¤Ô%Ü# H¨cÓ2ˆDÙØ#��V‘Ø�8‰8�GÖØ�L‰L˜Öð-ð. €Lr+   c                ó  — t        | xs d«      j                  «       }|sy|j                  «       }|j                  d«      r|S t        |xs d«      j                  «       j	                  d«      }|s|S |› d|j                  d«      › �S )zFBuild a full image URL from bucket base + row image value when needed.rC   )zhttp://zhttps://z//zdata:zblob:ú/)rU   rV   ÚlowerÚ
startswithÚrstripÚlstrip)Ú	raw_imagerc   Úimage_valueÚloweredÚbuckets        r)   rY   rY   x   sŒ   € ä�i’o 2Ó&×,Ñ,Ó.€KÙØØ×ÑÓ!€Gà×ÑÐIÔJØÐÜÐ"Ò( bÓ)×/Ñ/Ó1×8Ñ8¸Ó=€FÙØÐØˆX�Q�{×)Ñ)¨#Ó.Ð/Ð0Ð0r+   c           
     ó¨  — t        | j                  d«      xs d«      j                  «       }|sy|j                  d«      g}| j                  d«      xs g D ]{  }t	        |t
        «      sŒt        |j                  d«      xs d«      j                  «       }|j                  |«      }|€ŒT|j                  t        |«      j                  «       «       Œ} dj                  |«      }| j                  d«      xs g }g }	|D ]·  }
t	        |
t
        «      sŒt        |
j                  d«      xs d«      j                  «       }t        |
j                  d«      xs d«      j                  «       }|j                  |«      }|sŒ€|€Œƒ|	j                  t        |d¬«      › d	t        t        |«      d¬«      › �«       Œ¹ |	r|d
dj                  |	«      z   z  }|S )zHConstruct a card link URL from base path + path segments + query params.ÚbasePathrC   rq   ÚpathSegmentsÚcolumnÚqueryParamsÚname)Úsafeú=ú?ú&)	rU   rR   rV   rt   rS   rT   r[   ÚjoinÚ
_url_quote)rf   rh   ÚbaseÚpartsÚsegÚcolrm   ÚurlÚqp_listÚqp_partsÚqpr   s               r)   r\   r\   ‡   s�  € äˆx�|‰|˜JÓ'Ò-¨2Ó.×4Ñ4Ó6€DÙØØ�[‰[˜ÓÐ€EØ—‘˜^Ó,Ò2°ò /ˆÜ�cœ4Õ Ü�c—g‘g˜hÓ'Ò-¨2Ó.×4Ñ4Ó6ˆCØ—'‘'˜#“,ˆCØ‰Ø—‘œS ›XŸ^™^Ó-Õ.ð/ð �(‰(�5‹/€CØ�l‰l˜=Ó)Ò/¨R€GØ€HØò `ˆÜ�bœ$ÕÜ�r—v‘v˜f“~Ò+¨Ó,×2Ñ2Ó4ˆDÜ�b—f‘f˜XÓ&Ò,¨"Ó-×3Ñ3Ó5ˆCØ—'‘'˜#“,ˆCÚ˜™Ø—‘¤:¨d¸Ô#<Ð"=¸Q¼zÌ#ÈcË(ÐY[Ô?\Ð>]Ð ^Õ_ð`ñ Øˆs�S—X‘X˜hÓ'Ñ'Ñ'ˆØ€Jr+   c           
     ó<  — |r| s| S 	 t        j                  | «      }|j                  d«      xs g }|j                  d«      xs g }t        |t        «      rt        |t        «      s| S |D �ch c])  }t        |«      j                  «       j                  «       ’Œ+ }}|D �cg c].  }t        |«      j                  «       j                  «       |vsŒ-|‘Œ0 }}g }|D ]�  }	t        |	t        «      r^|j                  |	j                  «       D �
�ci c]2  \  }
}t        |
«      j                  «       j                  «       |vsŒ0|
|“Œ4 c}}
«       Œq|j                  |	«       Œƒ t        j                  ||dœdt
        ¬«      S c c}w c c}w c c}}
w # t        $ r | cY S w xY w)zDRemove excluded columns from a JSON db_answer before passing to LLM.ÚcolumnsÚrows©r�   r�   F©Úensure_asciiÚdefault)ÚjsonÚloadsrR   rS   rW   rU   rV   rr   rT   r[   ÚitemsÚdumpsÚ	Exception)Ú	db_answerÚexcluded_columnsÚparsedÚcolsr�   ÚcÚexclude_setÚfiltered_colsÚfiltered_rowsrh   ÚkÚvs               r)   Ú'_filter_excluded_columns_from_db_answerr¤   ¢   si  € ñ
 ¡9ØÐðÜ—‘˜IÓ&ˆØ�z‰z˜)Ó$Ò*¨ˆØ�z‰z˜&Ó!Ò' RˆÜ˜$¤Ô%¬Z¸¼dÔ-CØÐØ7GÖH°!”s˜1“v—|‘|“~×+Ñ+Õ-ÐHˆÐHØ$(ÖV˜q¬C°«F¯L©L«N×,@Ñ,@Ó,BÈ+Ò,UšÐVˆÐVØˆØò 	*ˆCÜ˜#œtÔ$Ø×$Ñ$Ø&)§i¡i£k×_™d˜a ´S¸³V·\±\³^×5IÑ5IÓ5KÐS^Ò5^�Q˜‘TÓ_õð ×$Ñ$ SÕ)ð	*ô �z‰z m¸]ÑKÐZ_ÔilÔmÐmùò IùÚVùó
 `øô
 ò ØÒðúsN   ˆA F Á)F Á-.E=ÂF Â!.FÃFÃ7F Ä1FÄ=FÅ:F Å=F ÆFÆFc           	     óh  — g }t        |«      D ]i  }	 | j                  d|› d�«      }|j                  «       }|D �cg c]  }|d   › d|d   › d�‘Œ }}|j                  d|› dd	j	                  |«      › �«       Œk dj	                  |«      S c c}w # t
        $ r |j                  d|› d
�«       Y Œ¢w xY w)NzPRAGMA table_info("z")rI   ú (é   ú)ú  rO   ú, ú: (unknown columns)ú
)ÚsortedÚexecuteÚfetchallr[   r„   r™   )ÚconnÚtable_namesÚhintsÚtnameÚcurr�   rh   Úcol_strss           r)   Ú_build_schema_hintr¶   ¾   sÊ   € Ø€EÜ˜Ó$ò :ˆð	:Ø—,‘,Ð!4°U°G¸2Ð>Ó?ˆCØ—<‘<“>ˆDØ:>Ö?°3˜3˜q™6˜( " S¨¡V H¨AÒ.Ð?ˆHÐ?Ø�L‰L˜2˜e˜W B t§y¡y°Ó':Ð&;Ð<Õ=ð:ð �9‰9�UÓÐùò	 @øäò 	:Ø�L‰L˜2˜e˜WÐ$7Ð8Ö9ð	:ús"   ’)B»BÁ(BÂBÂB1Â0B1c           
     óˆ  — g }t        | t        «      sy| j                  d«      }t        |t        «      sy|D �ch c]  }|j	                  «       ’Œ }}|D �]U  }t        |t        «      sŒt        |j                  d«      xs d«      j                  «       }|r|j	                  «       |vrŒV|j                  d«      }g }t        |t        «      r¡|D ]œ  }	t        |	t        «      sŒt        |	j                  d«      xs d«      j                  «       }
t        |	j                  d«      xs |	j                  d«      xs d«      j                  «       }|
sŒ‚|j                  |
› d|xs d› d	�«       Œž |j                  d
«      xs |j                  d«      xs g }g }t        |t        «      �rZ|D �]T  }t        |t        «      sŒt        |j                  d«      xs d«      j                  «       }t        |j                  d«      xs( |j                  d«      xs |j                  d«      xs d«      j                  «       }t        |j                  d«      xs( |j                  d«      xs |j                  d«      xs d«      j                  «       }t        |j                  d«      xs |j                  d«      xs d«      j                  «       }|s�Œ(|s�Œ,|s�Œ0|rd|› d	�nd}|j                  |› d|› d|› |› �«       �ŒW |s|s|j                  d|› d�«       �ŒÊg }|j                  d|› d�«       |j                  d|rdj                  |«      nd› �«       |r,|j                  d«       |D ]  }|j                  d|› �«       Œ |j                  d j                  |«      «       �ŒX d j                  |«      S c c}w )!NrC   Útablesr   r�   ÚdataTypeÚ	data_typer¦   Úunknownr¨   ÚforeignKeysÚforeign_keysr}   ÚreferencedTableÚreferenced_tableÚrefTableÚreferencedColumnÚreferenced_columnÚ	refColumnÚconstraintNameÚconstraint_namez (constraint: z -> ú.r©   r«   ú:z    columns: rª   z(unknown columns)z    foreign keys:z      - r¬   )	rS   rT   rR   rW   rr   rU   rV   r[   r„   )Úschema_snapshotr±   r²   r¸   ÚtÚwantedr³   r�   Úcol_defsrž   ÚcnameÚctypeÚfk_rawÚfk_linesÚfkr‰   Ú	ref_tableÚref_colÚ
constraintÚextraÚblockÚlines                         r)   Ú _build_schema_hint_from_snapshotr×   Ë   s…  € Ø€EÜ�o¤tÔ,ØØ× Ñ  Ó*€FÜ�fœdÔ#ØØ!,Ö-˜Aˆa�g‰g�iÐ-€FÐ-Øó 9'ˆÜ˜!œTÔ"ØÜ�A—E‘E˜&“MÒ' RÓ(×.Ñ.Ó0ˆÙ˜Ÿ™›¨VÑ3ØØ�u‰u�YÓˆØ ˆÜ�dœDÔ!Øò G�Ü! !¤TÔ*ØÜ˜AŸE™E &›MÒ/¨RÓ0×6Ñ6Ó8�Ü˜AŸE™E *Ó-ÒI°·±°{Ó1CÒIÀrÓJ×PÑPÓR�ÚØ—O‘O u g¨R°Ò0B¸Ð/CÀ1Ð$EÕFðGð —‘�}Ó%ÒD¨¯©¨~Ó)>ÒDÀ"ˆØ ˆÜ�fœdÕ#Øó N�Ü! "¤dÔ+ØÜ˜"Ÿ&™& Ó*Ò0¨bÓ1×7Ñ7Ó9�ÜØ—F‘FÐ,Ó-ò Ø—v‘vÐ0Ó1òà—v‘v˜jÓ)òð ó	÷
 ‘%“'ð ô Ø—F‘FÐ-Ó.ò Ø—v‘vÐ1Ó2òà—v‘v˜kÓ*òð ó	÷
 ‘%“'ð ô ! §¡Ð(8Ó!9Ò!\¸R¿V¹VÐDUÓ=VÒ!\ÐZ\Ó]×cÑcÓe�
Û›9«Ù>H˜n¨Z¨L¸Ñ:Èb�EØ—O‘O s e¨4°	¨{¸!¸G¸9ÀUÀGÐ$LÖMð'Nñ* ¡Ø�L‰L˜2˜e˜WÐ$7Ð8Ô9Ùð ˆØ�‰�r˜%˜ �]Ô#Ø�‰�}¹H T§Y¡Y¨xÔ%8ÐJ]Ð$^Ð_Ô`ÙØ�L‰LÐ,Ô-Ø ò 0�Ø—‘˜x¨ vÐ.Õ/ð0ð 	�‰�T—Y‘Y˜uÓ%Ö&ðs9'ðt �9‰9�UÓÐùòw .s   ºN?c                óþ  — g }t        | t        «      sy| j                  d«      }t        |t        «      sy|D �ch c]  }|j	                  «       ’Œ }}|D �]‹  }t        |t        «      sŒt        |j                  d«      xs d«      j                  «       }|r|j	                  «       |vrŒV|j                  d«      }g }t        |t        «      rÑ|D ]Ì  }	t        |	t        «      sŒt        |	j                  d«      xs d«      j                  «       }
|	j                  d«      }|
sŒTt        |t        «      rLdj                  t        |D �ch c]'  }t        |«      j                  «       sŒt        |«      ’Œ) c}«      «      }nd}|j                  |
› d|xs d	› d
�«       ŒÎ |r+|j                  d|› ddj                  |d d «      › �«       �Œw|j                  d|› d�«       �ŒŽ dj                  |«      S c c}w c c}w )NrC   Úcollectionsr   ÚfieldsÚpathÚtypesú|r¦   r»   r¨   r©   rO   rª   éP   z: (unknown fields)r¬   )
rS   rT   rR   rW   rr   rU   rV   r„   r­   r[   )rÈ   Úcollection_namesr²   rÙ   rž   rÊ   rÌ   rÚ   Ú
field_defsÚfrÛ   rÜ   rÉ   Útstrs                 r)   Ú&_build_mongo_schema_hint_from_snapshotrã     sÄ  € Ø€EÜ�o¤tÔ,ØØ!×%Ñ% mÓ4€KÜ�k¤4Ô(ØØ!1Ö2˜Aˆa�g‰g�iÐ2€FÐ2Øó 9ˆÜ˜!œTÔ"ØÜ�A—E‘E˜&“MÒ' RÓ(×.Ñ.Ó0ˆÙ˜Ÿ™›¨VÑ3ØØ—‘�x“ˆØ "ˆ
Ü�fœdÔ#Øò C�Ü! !¤TÔ*ØÜ˜1Ÿ5™5 ›=Ò.¨BÓ/×5Ñ5Ó7�ØŸ™˜g›�ÙØÜ˜e¤TÔ*ØŸ8™8¤F¸EÖ+T°qÄSÈÃVÇ\Á\Å^¬C°­FÒ+TÓ$UÓV‘Dà�DØ×!Ñ! T F¨"¨TÒ->°YÐ,?¸qÐ"AÕBðCñ Ø�L‰L˜2˜e˜W B t§y¡y°¸C¸R°Ó'AÐ&BÐCÖDà�L‰L˜2˜e˜WÐ$6Ð7Ö8ð19ð2 �9‰9�UÓÐùò5 3ùò$ ,Us   ºG5ÅG:Å'G:c                ó²  — i }t        | t        «      s|S | j                  d«      }t        |t        «      s|S |D �ch c]  }|j	                  «       ’Œ }}|D ]ø  }t        |t        «      sŒt        |j                  d«      xs d«      j                  «       }|r|j	                  «       |vrŒU|j                  d«      }t        «       }t        |t        «      rf|D ]a  }	t        |	t        «      sŒt        |	j                  d«      xs d«      j                  «       }
|
sŒC|j                  |
j	                  «       «       Œc |||j	                  «       <   Œú |S c c}w )z@Return canonical table->columns map from stored schema_snapshot.r¸   r   rC   r�   )	rS   rT   rR   rW   rr   rU   rV   Úsetr1   )rÈ   r±   Úoutr¸   rÉ   rÊ   r³   r�   Úcolsetrž   rÌ   s              r)   Ú_schema_columns_from_snapshotrè   4  s+  € à!€CÜ�o¤tÔ,Øˆ
Ø× Ñ  Ó*€FÜ�fœdÔ#Øˆ
Ø!,Ö-˜Aˆa�g‰g�iÐ-€FÐ-Øò $ˆÜ˜!œTÔ"ØÜ�A—E‘E˜&“MÒ' RÓ(×.Ñ.Ó0ˆÙ˜Ÿ™›¨VÑ3ØØ�u‰u�YÓˆÜ›5ˆÜ�dœDÔ!Øò .�Ü! !¤TÔ*ØÜ˜AŸE™E &›MÒ/¨RÓ0×6Ñ6Ó8�ÚØ—J‘J˜uŸ{™{›}Õ-ð.ð $ˆˆE�K‰K‹MÒð$ð  €Jùò# .s   ¼Ec                óæ  — |syi }|j                  «       D ]  }|||<   Œ	 t        j                  d| «      }|D ]°  \  }}t        |xs d«      j	                  «       j	                  d«      }|j                  d«      d   j	                  «       j	                  d«      j                  «       }|sŒt||vrŒy|||<   t        |xs d«      j	                  «       j                  «       }	|	sŒ¬|||	<   Œ² t        j                  d| «      }
|
D ]l  \  }}t        |«      j                  «       }t        |«      j                  «       }|j                  |«      }|€	dd	|› �fc S |d
k(  rŒZ|||   vsŒbdd|› d|› �fc S  y)z­
    Validate qualified refs like `table.column` against schema_snapshot columns.
    This supplements runner-level table validation with snapshot-backed column checks.
    )TrC   z‰(?i)\b(?:from|join)\s+((?:[`"]?[A-Za-z_][A-Za-z0-9_]*[`"]?\.)?[`"]?[A-Za-z_][A-Za-z0-9_]*[`"]?)(?:\s+(?:as\s+)?([A-Za-z_][A-Za-z0-9_]*))?rC   z`"rÆ   éÿÿÿÿzC(?<![A-Za-z0-9_])([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)Fz Unknown table reference in SQL: Ú*z!Unknown column reference in SQL: )ÚkeysÚreÚfindallrU   rV   Úsplitrr   rR   )ÚsqlÚschema_columnsÚ	alias_mapr³   Úalias_matchesÚ	raw_tableÚ	raw_aliasÚtable_tokenÚ
table_nameÚaliasÚrefsÚ	tname_rawÚ	cname_rawrÌ   Ú
base_tables                  r)   Ú-_validate_sql_qualified_refs_against_snapshotrý   P  s¥  € ñ ØØ "€IØ×$Ñ$Ó&ò !ˆØ ˆ	�%Òð!ô —J‘Jð	6àó€Mð
 !.ò 
*Ñˆ	�9Ü˜)š/ rÓ*×0Ñ0Ó2×8Ñ8¸Ó>ˆØ ×&Ñ& sÓ+¨BÑ/×5Ñ5Ó7×=Ñ=¸dÓC×IÑIÓKˆ
ÙØØ˜^Ñ+ØØ *ˆ	�*ÑÜ�I’O Ó$×*Ñ*Ó,×2Ñ2Ó4ˆÚØ)ˆI�eÒð
*ô �:‰:Ð\Ð^aÓb€DØ $ò 
VÑˆ	�9Ü�I“×$Ñ$Ó&ˆÜ�I“×$Ñ$Ó&ˆØ—]‘] 5Ó)ˆ
ØÐØÐ<¸Y¸KÐHÐHÒHà�CŠ<ØØ˜ zÑ2Ò2ØÐ=¸i¸[ÈÈ)ÈÐUÐUÒUð
Vð r+   c                ó:  — g }t        «       }t        j                  dt        | xs d«      «      D ]h  }t        |j	                  d«      xs d«      j                  «       }|j                  «       }|sŒB||vsŒG|j                  |«       |j                  |«       Œj |S )Nz!(^|[^:]):([A-Za-z_][A-Za-z0-9_]*)rC   r§   )	rå   rí   ÚfinditerrU   ÚgrouprV   rr   r1   r[   )rð   ÚfoundÚseenÚmr   Úkeys         r)   Ú_extract_sql_placeholdersr  ƒ  sƒ   € Ø€EÜ“U€DÜ�[‰[Ð=¼sÀ3Â9È"»~ÓNò ˆÜ�1—7‘7˜1“:Ò# Ó$×*Ñ*Ó,ˆØ�j‰j‹lˆÚ�C˜t’OØ�H‰H�SŒMØ�L‰L˜Õðð €Lr+   c                óØ  — t        | t        «      r#| j                  «       D ]  }t        |||«       Œ y t        | t        «      r| D ]  }t        |||«       Œ y t        | t
        «      r‚t        j                  d| «      D ]h  }t        |j                  d«      xs d«      j                  «       }|j                  «       }|sŒB||vsŒG|j                  |«       |j                  |«       Œj y y )Nú&\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}rI   rC   )rS   rT   ÚvaluesÚ_extract_mongo_placeholdersrW   rU   rí   rÿ   r   rV   rr   r1   r[   )Únoderæ   r  r£   Úitemr  r   r  s           r)   r	  r	  �  sÍ   € Ü�$œÔØ—‘“ò 	6ˆAÜ'¨¨3°Õ5ð	6àÜ�$œÔØò 	9ˆDÜ'¨¨c°4Õ8ð	9àÜ�$œÔÜ—‘ÐFÈÓMò 	!ˆAÜ�q—w‘w˜q“zÒ' RÓ(×.Ñ.Ó0ˆDØ—*‘*“,ˆCÚ˜ 4šØ—‘˜”Ø—
‘
˜4Õ ñ	!ð r+   c                ó®   — |dk(  r*g }t        «       }t        | j                  d«      ||«       |S t        t	        | j                  d«      xs d«      «      S )NÚmongodbÚ
query_bodyÚsql_textrC   )rå   r	  rR   r  rU   )ÚtemplateÚdialectræ   r  s       r)   Ú_extract_template_placeholdersr  ¡  sN   € Ø�)ÒØˆÜ›ˆÜ# H§L¡L°Ó$>ÀÀTÔJØˆ
Ü$¤S¨¯©°jÓ)AÒ)GÀRÓ%HÓIÐIr+   c                óž   — t        | xs d«      j                  «       j                  «       }h d£}||v r|S |dk(  ry|dk(  ry|dk(  ry|d	k(  ry
y)NrC   >   ÚboolÚdateÚint2Úint4Úint8r•   ÚtextÚtimeÚuuidÚbytesÚjsonbÚfloat4Úfloat8ÚtimetzÚnumericÚvarcharÚ	timestampÚtimestamptzÚstringr  Únumberr!  Úintegerr  Úbooleanr  )rU   rV   rr   )ÚrawrÉ   Úalloweds      r)   Ú_normalize_param_typer+  ª  sa   € ÜˆCŠI�2‹×ÑÓ×$Ñ$Ó&€Aò€Gð 	ˆG�|ØˆàˆH‚}ØØˆH‚}ØØˆI‚~ØØˆI‚~ØØr+   c                ó®  — |€yt        |«      }|dv r	 t        |«      }d|dfS |dv r!	 t        |«      }||k(  st	        d	«      ‚d|dfS |dk(  rOt        |t        «      rd|dfS t        |«      j                  «       j                  «       }|dv ry|dv rydd d| › d�fS |dv r`t        |t        t        t        t        t        f«      s|€d|dfS t        |«      j                  «       }	 t        j                  |«      }d|dfS dt        |«      dfS # t        $ r dd d| › d�fcY S w xY w# t        $ r dd d| › d
�fcY S w xY w# t        $ r dd d| › d�fcY S w xY w)N)TNrC   >   r  r  r  TrC   FúParameter "z" must be an integer.>   r  r  r!  Únanz" must be a number.r  >   Ú1ÚyesÚtrue)TTrC   >   Ú0ÚnoÚfalse)TFrC   z" must be true or false.>   r•   r  z" must be valid JSON.)r+  rX   r™   ÚfloatÚ
ValueErrorrS   r  rU   rV   rr   rT   rW   r•   r–   )r   ÚtypÚvaluerÉ   ÚnÚsrœ   s          r)   Ú_coerce_param_valuer;  ¾  sÈ  € Ø€}ØÜ˜cÓ"€AØÐ$Ñ$ð	JÜ�E“
ˆAØ˜˜B�;Ðð 	Ð+Ñ+ð	HÜ�e“ˆAØ˜’FÜ  Ó'Ð'Ø˜˜B�;Ðð 	ˆF‚{Ü�eœTÔ"Ø˜ �?Ð"Ü�‹J×ÑÓ×$Ñ$Ó&ˆØÐ$Ñ$Ø!ØÐ$Ñ$Ø"Ø�d˜k¨$¨Ð/GÐHÐHÐHØÐÑÜ�eœd¤D¬#¬u´dÐ;Ô<ÀÀØ˜ �?Ð"Ü�‹J×ÑÓˆð	JÜ—Z‘Z “]ˆFØ˜ Ð#Ð#ð ”�U“˜RÐÐøô; ò 	JØ˜$ +¨d¨VÐ3HÐ IÐIÒIð	Jûô ò 	HØ˜$ +¨d¨VÐ3FÐ GÐGÒGð	Hûô$ ò 	JØ˜$ +¨d¨VÐ3HÐ IÐIÒIð	Jús4   ”D ©D' Ã'D? ÄD$Ä#D$Ä'D<Ä;D<Ä?EÅE>   úplease provideúfeel free to sayúcould you tell meúa few more detailsúcould you let me knowúto help find the bestúcould you please shareúto answer this, please provideé   c           
     óº  — t        t        j                  dt        |xs d«      j	                  «       «      «      }g }t        | «      D ]÷  \  }}t        |j                  d«      xs d«      j                  «       }|sŒ5dj                  t        |j                  d«      xs d«      |t        |j                  d«      xs d«      g«      j	                  «       }t        t        j                  d|«      «      }	|rt        |j                  |	«      «      nd}
|j                  d«      r|n|› d�}|j                  |
||f«       Œù |sg S |j                  d	„ ¬
«       g }t        «       }|D ]q  \  }}}|j                  «       j	                  «       }|r||v rŒ,|j                  |«       |j                  |«       t        |«      t        dt!        |«      «      k\  sŒp |S  |S )zABuild deterministic suggestions from query template descriptions.z
[a-z0-9_]+rC   ÚdescriptionrN   r   r  r   r‚   c                ó   — | d    | d   fS )Nr   rI   r8   )Úxs    r)   ú<lambda>z9_build_template_description_suggestions.<locals>.<lambda>  s   €   !¡˜u a¨¡d˜m€ r+   )r  rI   )rå   rí   rî   rU   rr   Ú	enumeraterR   rV   r„   ÚlenÚintersectionÚendswithr[   Úsortr1   ÚmaxrX   )Ú	templatesÚuser_messageÚ	max_itemsÚtokensÚscoredÚidxrÉ   ÚdescÚhayÚ
hay_tokensÚscoreÚ
suggestionræ   r  rM   r:  r¢   s                    r)   Ú'_build_template_description_suggestionsr[  ò  s¬  € ô ”—‘˜M¬3¨|Ò/A¸rÓ+B×+HÑ+HÓ+JÓKÓL€FØ)+€FÜ˜IÓ&ò 0‰ˆˆQÜ�1—5‘5˜Ó'Ò-¨2Ó.×4Ñ4Ó6ˆÙØØ�h‰hÜ�—‘�f“Ò# Ó$ØÜ�—‘�jÓ!Ò' RÓ(ð
ó ÷ ‰5‹7ð	 	ô
 œŸ™ M°3Ó7Ó8ˆ
Ù8>”�F×'Ñ'¨
Ó3Ô4ÀAˆØ!Ÿ]™]¨3Ô/‘T¸°v¸Q°Zˆ
Ø�‰�u˜c :Ð.Õ/ð0ñ Øˆ	à
‡K�KÑ+€KÔ,Ø€CÜ“U€DØò ‰ˆˆ1ˆaØ�G‰G‹I�O‰OÓˆÙ�A˜‘IØØ�‰�ŒØ�
‰
�1ŒÜˆs‹8”s˜1œc )›nÓ-Ó-ØØ€Jðð €Jr+   ©rR  c           	     óÈ  — |D �cg c]5  }t        |«      j                  «       sŒt        |«      j                  «       ‘Œ7 }}|sg S |dt        dt        |«      «       }dt	        |«      › d|› dt        j                  |d¬«      › d�}	 t        | ||«      }	t        |	t        «      r|	j                  d	«      ng }
t        |
t        «      s|S |
D �cg c]5  }t        |«      j                  «       sŒt        |«      j                  «       ‘Œ7 }}t	        |«      t	        |«      k  r|S g }t        «       }|D ]z  }|j                  d
«      r|n|› d
�}|j                  «       j                  «       }|r||v rŒ@|j                  |«       |j!                  |«       t	        |«      t	        |«      k\  sŒz n t	        |«      t	        |«      k  r|S |S c c}w c c}w # t"        $ r |cY S w xY w)zš
    Lightly rewrite ranked template-description suggestions for visitor readability.
    Keeps semantic intent and ordering from ranked_suggestions.
    NrI   a  You are rewriting suggested follow-up questions for a website visitor.

Given ranked candidate questions, rewrite each to sound natural and visitor-friendly.

Rules:
- Keep the SAME intent as each candidate.
- Keep the SAME order as candidates.
- Return exactly z’ suggestions.
- Each suggestion must be a question under 80 characters.
- Avoid technical wording and avoid SQL/database terms.

Visitor message:
z

Ranked candidates:
F©r“   z;

Respond with JSON only:
{"suggestions":["q1","q2","q3"]}
Úsuggestionsr‚   )rU   rV   rO  rX   rK  r•   r˜   r?   rS   rT   rR   rW   rå   rM  rr   r1   r[   r™   )Ú
llm_clientr=   rQ  Úranked_suggestionsrR  r:  Ú
candidatesÚcappedr<   ræ   r)  Ú	rewrittenÚuniqr  Úqr  s                   r)   Ú$_rewrite_ranked_template_suggestionsrg    s¾  € ð +=ÖO QÄÀAÃÇÁÅ”#�a“&—,‘,•.ÐO€JÐOÙØˆ	àÐ0œ#˜a¤ Y£Ó0Ð1€Fðô �f“+�ð ð
 €ð ô ‡�ˆF Ô'Ð (ð )ð€Fð(Ü˜
 F¨BÓ/ˆÜ(2°3¼Ô(=ˆc�g‰g�mÔ$À2ˆÜ˜#œtÔ$ØˆMØ-0ÖC¨´C¸³F·L±LµN”S˜“V—\‘\•^ÐCˆ	ÐCÜˆy‹>œC ›KÒ'ØˆMØˆÜ›ˆØò 	ˆAØ—Z‘Z ”_‘¨Q¨C¨q¨'ˆAØ—'‘'“)—/‘/Ó#ˆCÙ˜# ™+ØØ�H‰H�SŒMØ�K‰K˜ŒNÜ�4‹yœC ›KÓ'Ùð	ô ˆt‹9”s˜6“{Ò"ØˆMØˆùò] Pùò< Døô" ò ØŠðúsN   …G	¤G	ÂAG Ã
G ÃGÃ-GÄG Ä#BG Æ+G ÇG ÇG ÇG!Ç G!c                óP  ‡— d}| dd D ]š  }t        |j                  d«      xs d«      j                  «       j                  «       }|dk7  rŒCt        |j                  d«      xs d«      j                  «       j                  «       Št	        ˆfd„t
        D «       «      sŒ–|d	z  }Œœ |S )
zICount how many recent assistant turns were parameter follow-up questions.r   iôÿÿÿNÚrolerC   Ú	assistantÚcontentc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr-   r8   )Ú.0Úmarkerrk  s     €r)   ú	<genexpr>z,_count_param_ask_attempts.<locals>.<genexpr>`  s   øè ø€ ÒG Vˆv˜Ô ÑGùs   ƒrI   )rU   rR   rV   rr   ÚanyÚ_PARAM_FOLLOWUP_MARKERS)ÚhistoryÚcountÚhri  rk  s       @r)   Ú_count_param_ask_attemptsru  X  sš   ø€ à€EØ�S�Tˆ]ò ˆÜ�1—5‘5˜“=Ò& BÓ'×-Ñ-Ó/×5Ñ5Ó7ˆØ�;ÒØÜ�a—e‘e˜IÓ&Ò,¨"Ó-×3Ñ3Ó5×;Ñ;Ó=ˆÜÓGÔ/FÔGÕGØ�Q‰J‰Eðð €Lr+   c                óˆ  — g }| |dz   d D ]‰  }t        |j                  d«      xs d«      j                  «       }t        |j                  d«      xs d«      j                  «       }|sŒ^t        |«      dkD  r|dd dz   }|j	                  |› d|› �«       Œ‹ |j	                  d	|› �«       |rd
j                  |«      S d	|› �S )a#  Build a concise conversation context string from recent history.

    Includes the last ``max_turns`` messages so the extraction LLM can see
    parameter values mentioned in earlier turns (e.g. "below 30 lakhs" in
    turn 1 should still be visible when the visitor refines in turn 2).
    r§   Nri  rC   rk  i�  z...rO   zuser: r¬   )rU   rR   rV   rK  r[   r„   )rr  rQ  Ú	max_turnsÚlinesrt  ri  rk  s          r)   Ú_build_conversation_contextry  e  sÓ   € ð €EØ�y 1‘}Ð%Ð&Ð'ò +ˆÜ�1—5‘5˜“=Ò& BÓ'×-Ñ-Ó/ˆÜ�a—e‘e˜IÓ&Ò,¨"Ó-×3Ñ3Ó5ˆÙØÜˆw‹<˜#ÒØ˜d˜s�m eÑ+ˆGØ�‰˜�v˜R ˜yÐ)Õ*ð+ð 
‡L�L�6˜,˜Ð(Ô)Ù$ˆ4�9‰9�UÓÐA¨F°<°.Ð*AÐAr+   c                ó�  — g }| dd D ]‚  }t        |j                  d«      xs d«      j                  «       j                  «       }t        |j                  d«      xs d«      j                  «       }|dk(  sŒo|sŒr|j	                  |«       Œ„ |j                  «       r|j	                  |j                  «       «       dj                  |«      }d}d}d}	t        j                  d|«      }
|
rt        |
d	   «      j                  «       }t        j                  d
|«      }t        |«      D ]9  }t        j                  dd|«      }t        |«      dk\  sŒ)|j                  «       } n g d¢}|D ]Ð  }t        j                  ||t        j                  ¬«      }|sŒ,t        |d	   «      j                  «       }t        j                  d|«      d   j                  «       }t        j                  dd|«      }|j                  d«      D �cg c]  }|sŒ|‘Œ	 }}dt        |«      cxk  rdk  sŒ¼n Œ¿t        |«      dk\  sŒÎ|}	 n |	||dœS c c}w )z<Extract best-effort visitor contact details from user turns.iìÿÿÿNri  rC   rk  Úuserr¬   z2\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\brê   z(?:\+?\d[\d\-\s().]{7,}\d)z\DrH   )z+\bmy name is\s+([A-Za-z][A-Za-z .'-]{1,60})z%\bi am\s+([A-Za-z][A-Za-z .'-]{1,60})z(\bthis is\s+([A-Za-z][A-Za-z .'-]{1,60}))Úflagsz[,.;\n]r   z\s+rN   rI   é   r§   ©r   ÚemailÚphone)rU   rR   rV   rr   r[   r„   rí   rî   ÚreversedÚsubrK  Ú
IGNORECASErï   )rr  rQ  Ú
user_linesrt  ri  rk  r  r  r€  r   Úemail_matchesÚphone_matchesÚpÚdigitsÚname_patternsÚpatÚmatchesr)  Úwr‡   s                       r)   Ú_extract_contact_snapshotr�  }  s  € ð
 €JØ�S�Tˆ]ò 'ˆÜ�1—5‘5˜“=Ò& BÓ'×-Ñ-Ó/×5Ñ5Ó7ˆÜ�a—e‘e˜IÓ&Ò,¨"Ó-×3Ñ3Ó5ˆØ�6‹>šgØ×Ñ˜gÕ&ð	'ð
 ×ÑÔØ×Ñ˜,×,Ñ,Ó.Ô/Ø�9‰9�ZÓ €Dà€EØ€EØ€Dä—J‘JØ=Øó€Mñ Ü�M "Ñ%Ó&×,Ñ,Ó.ˆä—J‘JÐ<¸dÓC€MÜ�mÓ$ò ˆÜ—‘˜˜r 1Ó%ˆÜˆv‹;˜"ÓØ—G‘G“IˆEÙð	ò€Mð
 ò 	ˆÜ—*‘*˜S $¬b¯m©mÔ<ˆÚÜ�g˜b‘kÓ"×(Ñ(Ó*ˆCÜ—(‘(˜: sÓ+¨AÑ.×4Ñ4Ó6ˆCÜ—&‘&˜  cÓ*ˆCØ #§	¡	¨#£Ö4˜1²!’QÐ4ˆEÐ4Ø”C˜“JÔ# !Ö#¬¨C«°A«Ø�Ùð	ð ØØñð ùò 5s   ÈIÈIc                ó¦
  — t        ||«      }|si d fS |j                  d«      }g }t        |t        «      rJ|j                  d«      }	t        |	t        «      r)|	D ]$  }
t        |
t        «      sŒ|j                  |
«       Œ& i }|D ]D  }t        |j                  d«      xs d«      j                  «       }|sŒ2|||j                  «       <   ŒF g }|D ]Õ  }|j                  |j                  «       «      xs i }|j                  |t        |j                  d«      «      t        |j                  d«      «      |j                  d«      €dnt        |j                  d«      «      |j                  d	d «      |j                  d
g «      t        |j                  d«      xs d«      dœ«       Œ× t        ||«      }t        j                  |dt        ¬«      }d|› d|› d�}t        | ||«      }t        |t        «      r|j                  d«      ni }t        |t        «      si }t        |«      }d}i }g }g }|D �]ñ  }t        |d   «      }|j                  «       }|j                  |«      }|€||v r|j                  |«      }d	|v xr |j                  d	«      d u}|€#|r|j                  d	«      }n|dk(  rd}n|dk(  rd}|€]||k  r*|j                  d«      r|s|j                  |«       d ||<   Œ¹|j                  d«      r|j                  |«       d ||<   Œád ||<   Œçt!        |t        |j                  d«      xs d«      |«      \  }}}|sd |fc S |dk(  r#	 t#        |«      } t%        dt'        | d«      «      }n'|dk(  r"	 t#        |«      } t%        dt'        | d«      «      }|j                  d
«      }!t        |!t        «      rat+        |!«      dkD  rS|!D �"ch c]  }"t        j                  |"dt        ¬«      ’Œ  }#}"t        j                  |dt        ¬«      }$|$|#vr
d d|› d�fc S |||<   �Œô |r—g }%|D ]w  }t        |j                  d«      xs d«      j                  «       }&t        |d   «      j-                  dd«      }'|&r|%j                  d|&› �«       Œd|%j                  d|'› �«       Œy dj/                  |%«      }(d d |(› d!�fS |rd"j/                  |«      })d d#|)› d$�fS t0        j3                  d%t        |j                  d«      xs d«      |t        j                  |dt        ¬«      «       |d fS # t(        $ r d}Y �Œžw xY w# t(        $ r d}Y �Œ°w xY wc c}"w )&NÚparameter_schemaÚ
parametersr   rC   ÚtypeÚrequiredÚnullableTr”   ÚenumrF  )r   r‘  r’  r“  r”   r”  rF  Fr’   uö  Extract template parameter values from the visitor's full conversation.

Return JSON only with this shape:
{
  "params": {
    "<parameter_name>": <value or null>
  }
}

Rules:
- Look at the ENTIRE conversation history, not only the latest message.
  Values mentioned in earlier turns are still valid unless the visitor
  explicitly changed or cancelled them.
- Use null ONLY when a value is truly absent from the full conversation.
- Do not invent values that were never mentioned or implied.
- Preserve type intent when obvious (number/bool).

Semantic interpretation:
- "any <X>", "all <X>", "doesn't matter", "no preference" â†’ null
  (the visitor wants no filter on that parameter).
- If the visitor mentions only a maximum (e.g. "below 30 lakhs",
  "under 50000"), set the max parameter to that value.  If there is a
  corresponding min parameter and the visitor did NOT mention a minimum,
  set min to 0 (zero) â€” not null.
- If the visitor mentions only a minimum (e.g. "above 10 lakhs"),
  set the min parameter to that value and leave max as null.
- Interpret common unit words:
    lakh = 100000, crore = 10000000, thousand = 1000, k = 1000, m/million = 1000000.
- Preserve original numeric values when no unit conversion is needed.

Parameter definitions:
z

Conversation:
r¬   Úparamsr§   Úlimité2   Úoffsetr   r  rI   i'  r-  z" must be one of enum values.rM   rN   ú  - zRTo help find the best matches for you, could you please share a few more details?
zL

Feel free to say "any" or "doesn't matter" for filters you'd like to skip.rª   zKI need a bit more information to run this query. Could you please provide: r‚   zJtemplate parameter resolution template_name=%s placeholders=%s resolved=%s)r  rR   rS   rT   rW   r[   rU   rV   rr   r+  r  ry  r•   r˜   r?   ru  r;  rX   rO  Úminr™   rK  rZ   r„   ÚloggerÚinfo)*r`  r=   rQ  rr  r  r  ÚplaceholdersÚ
schema_objÚschema_paramsr)  r  Úby_keyr‡  ÚpnameÚ	effectiver   Úconversation_contextÚ	defs_jsonÚextract_promptr>   Ú
raw_paramsÚask_attemptsÚmax_ask_attemptsÚresolvedÚmissing_requiredÚmissing_to_askr  r8  Úhas_defaultÚokÚcoercedÚerrr9  Ú	enum_valsr£   Ú	enum_keysÚval_keyÚbulletsrV  Úpretty_nameÚbullet_textÚprettys*                                             r)   Ú_resolve_template_parametersr·  µ  su  € ô 2°(¸GÓD€LÙØ�4ˆxˆà—‘Ð0Ó1€JØ€MÜ�*œdÔ#Ø�n‰n˜\Ó*ˆÜ�cœ4Ô Øò /�Ü˜d¤DÕ)Ø!×(Ñ(¨Õ.ð/ð )+€FØò &ˆÜ�A—E‘E˜&“MÒ' RÓ(×.Ñ.Ó0ˆÚØ$%ˆF�5—;‘;“=Ò!ð&ð
 ')€IØò 
ˆØ�J‰J�t—z‘z“|Ó$Ò*¨ˆØ×ÑàÜ-¨a¯e©e°F«mÓ<Ü  §¡ zÓ!2Ó3Ø$%§E¡E¨*Ó$5Ð$=™DÄ4ÈÏÉÈjÓHYÓCZØŸ5™5 ¨DÓ1ØŸ™˜f bÓ)Ü" 1§5¡5¨Ó#7Ò#=¸2Ó>ñõ
	
ð
ô 7°wÀÓMÐÜ—
‘
˜9°5Ä#ÔF€Iðð> €ð ð Ð ð ðE#€NôH �Z °Ó4€DÜ'1°$¼Ô'=�—‘˜(Ô#À2€JÜ�j¤$Ô'Øˆ
ä,¨WÓ5€LØÐà!€HØ"$ÐØ+-€NØó 6!ˆÜ�1�V‘9‹~ˆØ�j‰j‹lˆØ—‘˜tÓ$ˆØˆ=˜S JÑ.Ø—N‘N 3Ó'ˆEØ  A�~ÒI¨A¯E©E°)Ó,<ÀDÐ,Hˆàˆ=ÙØŸ™˜iÓ(‘Ø˜’Ø‘Ø˜’Ø�àˆ=ØÐ.Ò.Ø—5‘5˜Ô$©[Ø"×)Ñ)¨!Ô,Ø%)�H˜T‘NØà�u‰u�ZÔ Ø ×'Ñ'¨Ô-Ø!%�˜‘Øà!%�˜‘Øä.¨t´S¸¿¹¸v»Ò9PÈ&Ó5QÐSXÓYÑˆˆG�SÙØ˜�9Òà�'Š>ðÜ˜“L�Ü˜a¤ Q¨£Ó,‘ð �HŠ_ðÜ˜“L�Ü˜a¤ Q¨£Ó/�ð —E‘E˜&“Mˆ	Ü�i¤Ô&¬3¨y«>¸AÒ+=ØQZÖ[ÈAœŸ™ A°EÄ3ÖGÐ[ˆIÐ[Ü—j‘j °uÄcÔJˆGØ˜iÑ'Ø˜{¨4¨&Ð0MÐNÐNÒNØ ˆ�‹ðm6!ñp ØˆØò 	5ˆAÜ�q—u‘u˜]Ó+Ò1¨rÓ2×8Ñ8Ó:ˆDÜ˜a ™i›.×0Ñ0°°cÓ:ˆKÙØ—‘  d V˜}Õ-à—‘  k ]Ð3Õ4ð	5ð —i‘i Ó(ˆØØaØˆmð ]ð^ð
ð 	
ñ Ø—‘Ð+Ó,ˆØð)Ø)/¨°ð3ð
ð 	
ô
 ‡K�KØTÜˆH�L‰L˜Ó Ò& BÓ'ØÜ�
‰
�8¨%¼Ô=ô	ð �Tˆ>Ðøô] ò Ø“ðûô ò Ø“ðüò
 \s*   Í!T*Í9!T<Ï#UÔ*T9Ô8T9Ô<UÕ
Uc                óâ   — 	 t        j                  t        | xs d«      «      }t	        |t
        «      sy|j                  d«      }t	        |t        «      syt        |«      S # t        $ r Y yw xY w)NrC   r   r�   )	r•   r–   rU   r™   rS   rT   rR   rW   rK  )rš   rœ   r�   s      r)   Ú_row_count_from_db_answerr¹  i  sf   € ðÜ—‘œC 	¢¨RÓ0Ó1ˆô �fœdÔ#ØØ�:‰:�fÓ€DÜ�dœDÔ!ØÜˆt‹9Ðøô ò Ùðús   ‚"A" Á"	A.Á-A.c                óü  — t        | |«      }| j                  d«      }i }t        |t        «      r{|j                  d«      }t        |t        «      rZ|D ]U  }t        |t        «      sŒt        |j                  d«      xs d«      j                  «       j                  «       }	|	sŒQ|||	<   ŒW g }
t        «       }|D �]  }t        |«      j                  «       j                  «       }|r|dv rŒ2|j                  |«      }|€||v r|j                  |«      }|�t        |«      j                  «       rŒv|j                  |«      xs i }t        |j                  d«      xs d«      j                  «       }|xs t        |«      j                  dd«      }|j                  «       j                  «       }|r||v rŒû|j                  |«       |
j                  d	|› �«       �Œ" |
rd
j                  |
«      }d|› d|› d�S d|› d�S )Nr�  r�  r   rC   >   r–  r˜  rF  rM   rN   r™  r¬   zI found zy matching records, which is too many to show at once. To narrow this down, could you share one or more of these details?
zJ

You can also say "any" or "doesn't matter" for filters you want to skip.z§ matching records, which is too many to show at once. Could you please narrow it down with additional filters (for example city, area, budget range, or property type)?)r  rR   rS   rT   rW   rU   rV   rr   rå   rZ   r1   r[   r„   )r  Úresolved_paramsr  Ú	row_countr�  rž  Úschema_by_keyr¦  r  r¡  r³  r  r   r  r8  Úschema_itemrV  rn   Únormrµ  s                       r)   Ú$_build_large_result_followup_messagerÀ  v  sÿ  € ô 2°(¸GÓD€LØ—‘Ð0Ó1€JØ/1€MÜ�*œdÔ#Ø—^‘^ LÓ1ˆ
Ü�j¤$Ô'Ø"ò 0�Ü! $¬Ô-ØÜ˜DŸH™H VÓ,Ò2°Ó3×9Ñ9Ó;×AÑAÓC�ÚØ+/�M %Ò(ð0ð €GÜ“U€DØó 'ˆÜ�$‹i�o‰oÓ×%Ñ%Ó'ˆÙ�cÐ0Ñ0ØØ×#Ñ# DÓ)ˆØˆ=˜S OÑ3Ø#×'Ñ'¨Ó,ˆEØÐ¤ U£×!1Ñ!1Ô!3Øà#×'Ñ'¨Ó,Ò2°ˆÜ�;—?‘? =Ó1Ò7°RÓ8×>Ñ>Ó@ˆØÒ3œ˜D›	×)Ñ)¨#¨sÓ3ˆØ�{‰{‹}×"Ñ"Ó$ˆÙ�t˜t‘|ØØ�‰�ŒØ�‰˜˜e˜W�~Ö&ð#'ñ& Ø—i‘i Ó(ˆà�y�kð "Sàˆmð [ð[ð	
ð �9�+ð Dð 	Dðr+   c                óJ   — t        |«      }|t        k  ry t        | |||¬«      S )N)r  r»  r  r¼  )r¹  Ú(MAX_TEMPLATE_RESULT_ROWS_BEFORE_FOLLOWUPrÀ  )r  r»  r  rš   r¼  s        r)   Ú#_followup_for_large_template_resultrÃ  ¯  s3   € ô *¨)Ó4€IØÔ<Ò<ØÜ/ØØ'ØØô	ð r+   c                óB  — | €yt        | t        «      r| rdS dS t        | t        t        f«      rt	        | «      S t        | t
        t        f«      rt        j                  | dt        ¬«      }nt	        | «      }|j                  dd«      j                  dd	«      }d|› d�S )
NÚNULLÚTRUEÚFALSEFr’   ú\z\\ú'z'')
rS   r  rX   r5  rU   rT   rW   r•   r˜   rZ   )r£   r:  s     r)   Ú_sql_literalrÊ  Á  s‹   € Ø€yØÜ�!”TÔÙˆvÐ' Ð'Ü�!”cœ5�\Ô"Ü�1‹vˆÜ�!”dœD�\Ô"Ü�J‰J�q u´cÔ:‰ä�‹FˆØ	�	‰	�$˜Ó×'Ñ'¨¨TÓ2€AØˆqˆc�ˆ8€Or+   c                óf  ‡— t        | xs d«      }t        |«      }|D ]k  }||vr
|d|› d�fc S t        |j                  |«      «      Št	        j
                  dt	        j                  |«      › d�«      }|j                  ˆfd„|«      }Œm t        |«      }|r|ddj                  |«      › �fS |d fS )	NrC   z Missing SQL template parameter "z".z	(^|[^:]):z\bc                ó.   •— | j                  d«      › ‰› �S )NrI   )r   )r  Úlits    €r)   rI  z+_bind_sql_template_params.<locals>.<lambda>Ø  s   ø€  q§w¡w¨q£z l°3°%Ð$8€ r+   z$Unresolved SQL template parameters: rª   )	rU   r  rÊ  rR   rí   ÚcompileÚescaper‚  r„   )rð   r•  ræ   r�  r   ÚpatternÚleftoverrÍ  s          @r)   Ú_bind_sql_template_paramsrÒ  Ð  sÀ   ø€ Ü
ˆcŠi�R‹.€CÜ,¨SÓ1€LØò ?ˆØ�vÑØÐ:¸4¸&ÀÐCÐCÒCÜ˜6Ÿ:™: dÓ+Ó,ˆÜ—*‘* 	¬"¯)©)°D«/Ð):¸"Ð=Ó>ˆØ�k‰kÓ8¸#Ó>‰ð?ô )¨Ó-€HÙØÐ:¸4¿9¹9ÀXÓ;NÐ:OÐPÐPÐPØ�ˆ9Ðr+   c           	     óò  ‡— t        | t        «      r.| j                  «       D ��ci c]  \  }}|t        |‰«      “Œ c}}S t        | t        «      r| D �cg c]  }t        |‰«      ‘Œ c}S t        | t
        «      rrt        j                  d| «      }|r=t        |j                  d«      xs d«      j                  «       }‰j                  |«      S dˆfd„}t        j                  d|| «      S | S c c}}w c c}w )Nr  rI   rC   c                óœ   •— t        | j                  d«      xs d«      j                  «       }‰j                  |«      }|€dS t        |«      S )NrI   rC   )rU   r   rV   rR   )r  r  rm   r•  s      €r)   Ú_replacez._apply_mongo_template_params.<locals>._replaceê  sC   ø€ Ü�a—g‘g˜a“jÒ& BÓ'×-Ñ-Ó/ˆCØ—*‘*˜S“/ˆCØ˜�2Ð2¬#¨c«(Ð2r+   )r  zre.Match[str]r2   rU   )rS   rT   r—   Ú_apply_mongo_template_paramsrW   rU   rí   Ú	fullmatchr   rV   rR   r‚  )r
  r•  r¢   r£   Úexactr  rÕ  s    `     r)   rÖ  rÖ  ß  sÍ   ø€ Ü�$œÔØGKÇzÁzÃ|×T¹t¸qÀ!�Ô/°°6Ó:Ñ:ÓTÐTÜ�$œÔØAEÖF¸AÔ,¨Q°Õ7ÒFÐFÜ�$œÔÜ—‘ÐFÈÓMˆÙÜ�e—k‘k !“nÒ*¨Ó+×1Ñ1Ó3ˆCØ—:‘:˜c“?Ð"õ	3ô
 �v‰vÐ?ÀÈ4ÓPÐPØ€Kùó UùâFs   ¥C.ÁC4c               ó,  — | j                  d«      j                  d«      j                  d|«      j                  dd«      j                  «       }t	        |j
                  xs g «      }|sg g dfS t        |d   d   «      }t        |d   j                  d	«      xs d
«      }|d   j                  d«      }t        |d   j                  d«      xs d«      }g }|j                  t        |«      «       |j                  t        |«      «       t	        t        j                  |«      «      }| j                  d«      j                  d«      j                  d|«      j                  d|«      j                  «       }	t	        |	j
                  xs g «      }
|
||fS )NÚdocument_database_schemasz.id, schema_sql, schema_snapshot, database_nameÚproject_agent_idÚ
is_deletedFrC   r   ÚidÚdatabase_nameÚdatabaserÈ   Ú
schema_sqlÚdocument_database_table_dataz#schema_name, table_name, table_dataÚ	schema_id)ÚtableÚselectÚeqr®   rW   r>   rU   rR   Úextendr   r   rT   Úfromkeys)ÚsupabaserÛ  ÚschÚschema_rowsrâ  Údb_nameÚsnaprð   ÚnamesÚtrowsÚ
table_rowss              r)   Ú_load_db_contextrð  ó  sg  € ð 	�‰Ð2Ó3ß	‰Ð@Ó	Aß	‰ÐÐ 0Ó	1ß	‰ˆL˜%Ó	 ß	‰‹ð ô �s—x‘x’~ 2Ó&€KÙØ�2�rˆzÐä�K ‘N 4Ñ(Ó)€IÜ�+˜a‘.×$Ñ$ _Ó5ÒC¸ÓD€Gà�q‰>×ÑÐ/Ó0€DÜ
ˆk˜!‰n× Ñ  Ó.Ò4°"Ó
5€Cà€EØ	‡L�LÔ*¨4Ó0Ô1Ø	‡L�LÔ1°#Ó6Ô7Ü”—‘˜uÓ%Ó&€Eð 	�‰Ð5Ó6ß	‰Ð5Ó	6ß	‰ˆK˜Ó	#ß	‰ÐÐ 0Ó	1ß	‰‹ð 
ô �e—j‘jÒ& BÓ'€JØ�u˜gÐ%Ð%r+   c               óÆ  ‡ ‡‡— t         j                  d|«       ‰ j                  d«      j                  d«      j	                  d|«      j	                  dd«      j	                  dd«      j                  d	d
¬«      j                  d«      j                  «       }t        |j                  xs g «      }|st         j                  d|«       y |d   }t        |j                  d«      xs d«      Št         j                  d‰t        |j                  d«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      «       d0ˆˆ fd„}d1ˆˆ fd„}t        |j                  d«      xs d«      j                  «       Šd2ˆˆ fd„}t        d¬«      5 }|j                  |«      }	|j                  |«      }
|j                  |«      }|	j                  «       }|
j                  «       }|j                  «       }d d d «       st         j!                  d‰«       y |d   }t        |j                  d«      xs d«      }|st         j!                  d‰«       y st         j!                  d‰«       y t        |j                  d«      xs d«      j                  «       j#                  «       }|s	dk(  rdnd }t%        |«      }t'        |«      }t         j                  d!‰|t)        |«      t)        |«      «       |dk(  r|st         j!                  d"‰«       y |dk7  r|st         j!                  d#‰|«       y t        |j                  d$«      xs d%«      j                  «       j#                  «       }|d&vrd%}t         j                  d'‰||«       ‰|t        |j                  d«      xs d(«      t        |j                  d«      xs d«      t+        |j                  d)«      xs d*«      t        |j                  d+«      xs d«      |t        |j                  d,«      xs d-«      t        |j                  d.«      xs d«      |||||d/œS # 1 sw Y   �ŒMxY w)3Nz.live_db_context_load start project_agent_id=%sÚdatabase_connectionszRid, database_id, database_name, host, port, username, ssl_mode, status, query_moderÛ  rÜ  FÚstatusÚ	connectedÚ
created_atT©rV  rI   zOlive_db_context_load no connected database_connection found project_agent_id=%sr   rÝ  rC   zSlive_db_context_load connection found connection_id=%s db_name=%s host=%s status=%srÞ  Úhostc                 óÐ   •— ‰j                  d«      j                  d«      j                  d‰«      j                  d«      j	                  «       } t        | j                  xs g «      S )NÚdatabase_connection_secretszpassword_value, ssl_ca_pemÚconnection_idrI   )rã  rä  rå  r–  r®   rW   r>   )ÚresÚconn_idrè  s    €€r)   Ú_load_secret_rowsz0_load_live_db_context.<locals>._load_secret_rows7  sQ   ø€ à�N‰NÐ8Ó9ß‰VÐ0Ó1ß‰R� Ó)ß‰U�1‹Xß‰W‹Yð 	ô �C—H‘H’N Ó#Ð#r+   c                 óJ  •— ‰j                  d«      j                  d«      j                  d‰«      j                  dd¬«      j	                  d«      j                  «       } t        | j                  xs g «      }|r|d   j                  d«      nd }t        |t        «      r|S d S )	NÚdatabase_connection_schemasrÈ   rú  rõ  Trö  rI   r   )rã  rä  rå  Úorderr–  r®   rW   r>   rR   rS   rT   )rû  r�   rì  rü  rè  s      €€r)   Ú_load_schema_snapshotz4_load_live_db_context.<locals>._load_schema_snapshotA  s‰   ø€ à�N‰NÐ8Ó9ß‰VÐ%Ó&ß‰R� Ó)ß‰U�< dˆUÓ+ß‰U�1‹Xß‰W‹Yð 	ô �C—H‘H’N Ó#ˆÙ15ˆt�A‰w�{‰{Ð,Ô-¸4ˆÜ! $¬Ô-ˆtÐ7°4Ð7r+   Údatabase_idc                 óV  •— ‰sy‰j                  d«      j                  d«      j                  d‰«      j                  d«      j	                  «       } t        | j                  xs g «      }|syt        |d   j                  d«      xs d«      j                  «       j                  «       S )NÚmysqlÚ	databasesÚ
identifierrÝ  rI   r   )rã  rä  rå  r–  r®   rW   r>   rU   rR   rV   rr   )rû  r�   Údbidrè  s     €€r)   Ú_load_db_identifierz2_load_live_db_context.<locals>._load_db_identifierP  sˆ   ø€ ÙØà�N‰N˜;Ó'ß‰V�LÓ!ß‰R��d‹^ß‰U�1‹Xß‰W‹Yð 	ô �C—H‘H’N Ó#ˆÙØÜ�4˜‘7—;‘;˜|Ó,Ò7°Ó8×>Ñ>Ó@×FÑFÓHÐHr+   rD  )Úmax_workersz6live_db_context_load no secrets found connection_id=%sÚpassword_valuez4live_db_context_load empty password connection_id=%sz>live_db_context_load no schema_snapshot found connection_id=%sr  r  r  zclive_db_context_load resolved connection_id=%s dialect=%s db_identifier=%s tables=%d collections=%dzHlive_db_context_load mongodb dialect but no collections connection_id=%szJlive_db_context_load sql dialect but no tables connection_id=%s dialect=%sÚ
query_modeÚtemplate_only©Ú	generatedÚtemplate_preferredr  zFlive_db_context_load success connection_id=%s dialect=%s query_mode=%srß  Úportéê  ÚusernameÚssl_moder’  Ú
ssl_ca_pem)rú  r  rÞ  r÷  r  r  Úpasswordr  r  r  Údatabase_identifierr±   rß   rÈ   )r2   úlist[dict[str, Any]])r2   údict[str, Any] | None)r2   rU   )r›  rœ  rã  rä  rå  r   r–  r®   rW   r>   rU   rR   rV   r   ÚsubmitÚresultÚwarningrr   r   r
   rK  rX   )rè  rÛ  Úconn_qÚ	conn_rowsÚconn_rowrý  r  r  ÚexÚ
fut_secretÚ
fut_schemaÚfut_identifierÚsecret_rowsrÈ   Údb_identifierÚ
secret_rowr  r  r±   rß   Úqm_rawrü  r  s   `                    @@r)   Ú_load_live_db_contextr'    sÔ  ú€ ô
 ‡K�KÐ@ÐBRÔSà�‰Ð-Ó.ß	‰ÐdÓ	eß	‰ÐÐ 0Ó	1ß	‰ˆL˜%Ó	 ß	‰ˆH�kÓ	"ß	‰ˆ| $ˆÓ	'ß	‰ˆq‹ß	‰‹ð ô �V—[‘[Ò& BÓ'€IÙÜ�‰ÐeÐgwÔxØØ˜‰|€HÜ�(—,‘,˜tÓ$Ò*¨Ó+€GÜ
‡K�KØ]ØÜˆH�L‰L˜Ó)Ò/¨RÓ0ÜˆH�L‰L˜Ó Ò& BÓ'ÜˆH�L‰L˜Ó"Ò( bÓ)ôö$ö8ô ˆx�|‰|˜MÓ*Ò0¨bÓ1×7Ñ7Ó9€DöIô  
¨Ô	*ð 0¨bØ—Y‘YÐ0Ó1ˆ
Ø—Y‘YÐ4Ó5ˆ
ØŸ™Ð#6Ó7ˆØ ×'Ñ'Ó)ˆØ$×+Ñ+Ó-ˆØ&×-Ñ-Ó/ˆ÷0ñ Ü�‰ÐOÐQXÔYØØ˜Q‘€JÜ�:—>‘>Ð"2Ó3Ò9°rÓ:€HÙÜ�‰ÐMÈwÔWØáÜ�‰ÐWÐY`ÔaØä�/×%Ñ% iÓ0Ò6°BÓ7×=Ñ=Ó?×EÑEÓG€GÙØ,°	Ò9‘)¸wˆä+¨OÓ<€KÜ5°oÓFÐÜ
‡K�KØmØ�˜-¬¨[Ó)9¼3Ð?OÓ;Pôð �)ÒÑ$4Ü�‰ÐaÐcjÔkØØ�)Ò¡KÜ�‰ÐcÐelÐnuÔvØä�—‘˜lÓ+Ò>¨Ó?×EÑEÓG×MÑMÓO€FØÐIÑIØ ˆä
‡K�KØPØ�˜&ôð
 !ØÜ˜XŸ\™\¨/Ó:ÒH¸jÓIÜ�H—L‘L Ó(Ò.¨BÓ/Ü�H—L‘L Ó(Ò0¨DÓ1Ü˜Ÿ™ ZÓ0Ò6°BÓ7ØÜ˜Ÿ™ ZÓ0Ò>°JÓ?Ü˜*Ÿ.™.¨Ó6Ò<¸"Ó=ØØ,Ø"Ø,Ø*ñð ÷]0ñ 0ús   Æ'A$QÑQ c                ó”  — |}d }d }d }| r\t        | t        «      rLd| v r	 t        | d   «      }d| v r	 t        | d   «      }d| v r	 t        | d   «      }d| v r	 t        | d   «      }t        ||||¬«      S # t        t        f$ r Y ŒYw xY w# t        t        f$ r Y Œ[w xY w# t        t        f$ r Y Œ]w xY w# t        t        f$ r Y Œ_w xY w)NÚtemperatureÚtop_pÚtop_kÚmax_output_tokens)r)  r*  r+  r,  )rS   rT   r5  r6  Ú	TypeErrorrX   r   )Úmodel_config_overridesÚdefault_temperatureÚtempr*  r+  Ú
max_tokenss         r)   Ú_resolve_generation_configr2     s   € ð €DØ€EØ€EØ!€Já¤*Ð-CÄTÔ"JØÐ2Ñ2ðÜÐ3°MÑBÓC�ð Ð,Ñ,ðÜÐ4°WÑ=Ó>�ð Ð,Ñ,ðÜÐ2°7Ñ;Ó<�ð Ð"8Ñ8ðÜ Ð!7Ð8KÑ!LÓM�
ô ØØØØ$ô	ð øô% ¤	Ð*ò Ùðûô
 ¤	Ð*ò Ùðûô
 ¤	Ð*ò Ùðûô
 ¤	Ð*ò ÙðúsF    A6 ³B ÁB  ÁB5 Á6BÂBÂBÂBÂ B2Â1B2Â5CÃCc                óœ  — t        ||«      }|ret        j                  d|j                  |j                  |j
                  |«       t        |j                  |j                  «      }||j                  fS t        j                  d| j                  | j                  |«       t        | j                  | j                  «      }|| j                  fS )NzALLM resolved: provider=%s model=%s display=%s project_agent_id=%sz6LLM fallback: provider=%s model=%s project_agent_id=%s)	r!   r›  rœ  Úprovider_nameÚmodel_identifierÚdisplay_namer    Úfallback_providerÚfallback_chat_model)Úsettingsrè  rÛ  r©  r;   s        r)   Ú_build_llm_client_for_agentr:  Ç  s¹   € ô
 /¨xÐ9IÓJ€HÙÜ�‰ØOØ×"Ñ" H×$=Ñ$=Ø×!Ñ!Ð#3ô	
ô
 " (×"8Ñ"8¸(×:SÑ:SÓTˆØ�x×0Ñ0Ð0Ð0ä
‡K�KØ@Ø×"Ñ" H×$@Ñ$@ÐBRôô ˜h×8Ñ8¸(×:VÑ:VÓW€FØ�8×/Ñ/Ð/Ð/r+   g      N@z'dict[str, tuple[float, LLMClient, str]]Ú_LLM_CLIENT_CACHEz.dict[str, tuple[float, dict[str, Any] | None]]Ú_LIVE_CTX_CACHEc                ór  — t        j                  «       }t        5  t        j	                  |«      }|r"||d   z
  t
        k  r|d   |d   fcd d d «       S d d d «       t        | ||«      \  }}t        5  t        j                  «       ||ft        |<   d d d «       ||fS # 1 sw Y   ŒJxY w# 1 sw Y   ||fS xY w)Nr   rI   r§   )r  Ú	monotonicÚ_LLM_CLIENT_CACHE_LOCKr;  rR   Ú_PREP_CACHE_TTL_Sr:  )r9  rè  rÛ  ÚnowÚhitr;   Ú
model_names          r)   Ú"_build_llm_client_for_agent_cachedrD  ê  sÁ   € ô
 �.‰.Ó
€CÜ	ñ "Ü×#Ñ#Ð$4Ó5ˆÙ�C˜#˜a™&‘LÔ$5Ò5Ø�q‘6˜3˜q™6�>÷"÷ "ñ "ô 5°X¸xÐIYÓZÑ€FˆJÜ	ñ UÜ/3¯~©~Ó/?ÀÈÐ.TÔÐ*Ñ+÷Uà�:ÐÐ÷"ð "ú÷
Uà�:ÐÐús   ›0BÁ3B*ÂB'Â*B6c               óX  — t        j                  «       }t        5  t        j	                  |«      }|r||d   z
  t
        k  r|d   cd d d «       S d d d «       t        | |¬«      }t        5  t        j                  «       |ft        |<   d d d «       |S # 1 sw Y   ŒDxY w# 1 sw Y   |S xY w)Nr   rI   ©rÛ  )r  r>  Ú_LIVE_CTX_CACHE_LOCKr<  rR   r@  r'  )rè  rÛ  rA  rB  Úctxs        r)   Ú_load_live_db_context_cachedrI  ú  s£   € ô
 �.‰.Ó
€CÜ	ñ Ü×!Ñ!Ð"2Ó3ˆÙ�C˜#˜a™&‘LÔ$5Ò5Ø�q‘6÷÷ ñ ô   Ð;KÔ
L€CÜ	ñ DÜ-1¯^©^Ó-=¸sÐ,CŒÐ(Ñ)÷Dà€J÷ð ú÷
Dà€Jús   ›+BÁ+BÂBÂB)c                óè   — 	 | j                  |«      }	 t        ||||¬«      }t        |xs g «      dfS # t        $ r}g d|› �fcY d}~S d}~ww xY w# t        $ r}g t	        |«      fcY d}~S d}~ww xY w)zCRun embedding + similarity search. Returns (chunks, error_message).zembedding_failed: N)Úquery_embeddingrÛ  r–  )Úembed_queryr™   r"   rW   rU   )Úembedderrè  rQ  rÛ  Úmatch_chunk_limitÚqvecÚeÚchunkss           r)   Ú_run_rag_retrievalrR  
  sŒ   € ð,Ø×#Ñ# LÓ1ˆð	Ü(ØØ Ø-Ø#ô	
ˆô �F’L˜bÓ! 4Ð'Ð'øô ò ,ØÐ'¨ sÐ+Ð+Õ+ûð,ûô ò Ø”3�q“6ˆzÕûðús7   ‚4 ”A ´	A½A	ÁAÁ	AÁ	A1ÁA,Á&A1Á,A1r§   r—  r  éÈ   )Úmax_rowsc                ó˜   — | t         vr.t        d| › ddj                  t        t         «      «      › d�«      ‚t	        |||||||||	|
¬«
      S )zÍDispatch live SQL execution to the dialect-specific runner.

    Currently only MySQL is implemented.  When PostgreSQL (or another
    relational DB) is added, import its runner here and add a branch.
    z5Live SQL execution is not yet supported for dialect 'ú'. Supported: rª   rÆ   )
r÷  r  r{  r  rß  rð   Úallowed_tablesr  r  rT  )Ú_SUPPORTED_LIVE_SQL_DIALECTSr6  r„   r­   r   ©r  r÷  r  r{  r  rß  rð   rW  r  r  rT  s              r)   Ú_run_select_live_sqlrZ  +  sq   € ð& Ô2Ñ2ÜØCÀGÀ9ð MØŸ)™)¤FÔ+GÓ$HÓIÐJÈ!ðMó
ð 	
ô ØØØØØØØ%ØØØôð r+   c                ó   — | dv ryy)N)Ú
postgresqlÚpostgresi8  r  r8   ©r  s    r)   Ú_default_port_for_dialectr_  Q  s   € ØÐ,Ñ,ØØr+   r^  c        	        óÐ  — |t         vr'd|› ddj                  t        t         «      «      › d�dfS d}	d}
d}t        |«      }t	        t
        «      D �]Y  }t        | |||||dkD  r|
nd|¬«      \  }}|j                  |«       |st        j                  d	||«        |	|
fS |}
t        j                  d
|||
«       t        |
|«      \  }}|s!t        j                  d|||«       d|› d�}	|}Œ›	 t        j                  d||||
«       t        |t        |j                  d«      xs d«      t        |j                  d«      xs |«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      ||
|t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«      \  }}|r t!        j"                  ||dœdt        ¬«      }	nd}	t'        | |||
|	¬«      \  }}|j                  |«       t        j                  d|||j                  d«      |j                  d «      «       |j                  d«      d!k(  r |	|
fS |j                  d"«      xs |j                  d «      xs |	}|t
        d#z
  k(  s�ŒDt        j                  d$|«       �Œ\ |	|
fS # t$        $ r+}t        j                  d|||||
|«       d|› d�}	Y d}~Œöd}~ww xY w)%u†   3-LLM pipeline for live SQL (dialect-aware): generate â†’ execute â†’ verify â†’ maybe retry.

    Returns (db_answer, sql_used).
    z5[Live SQL pipeline is not yet supported for dialect 'rV  rª   ú.]rC   Nr   ©rQ  Úschema_detailÚdb_labelr  Úprevious_sqlÚprevious_errorzFDB pipeline source=live_%s sql_generator returned empty SQL attempt=%dz:DB pipeline source=live_%s sql_generator attempt=%d sql=%sz@DB pipeline source=live_%s schema_validation_error=%s attempt=%dú[SQL error: ú]zJDB pipeline source=live_%s executing attempt=%d visitor_question=%s sql=%sr÷  r  r  r  r  r’  r  rS  rY  r‘   Fr’   ú[Query returned 0 rows]z[DB pipeline source=live_%s exec_error=%s attempt=%d visitor_question=%s sql=%s raw_error=%r©rQ  rc  rð   Úquery_resultzCDB pipeline source=live_%s verifier attempt=%d verdict=%s reason=%sÚverdictÚreasonÚpassÚfeedbackrI   zGDB pipeline source=live_%s max attempts reached, forwarding last result)rX  r„   r­   r_  ÚrangeÚMAX_SQL_PIPELINE_ATTEMPTSr   r1   r›  r  rœ  rý   rZ  rU   rR   rX   r•   r˜   r6  r   )r9  r=   rQ  rc  rd  Úlive_ctxÚallowrñ   r  rš   Úsql_usedÚ
prev_errorÚdefault_portÚattemptÚsql_used_newÚ	gen_usager­  Ú
schema_errr�   r�   rP  rl  Ú	ver_usages                          r)   Ú_run_db_pipeline_live_sqlr|  W  s1  € ð  Ô2Ñ2àCÀGÀ9ð MØŸ)™)¤FÔ+GÓ$HÓIÐJÈ"ðNàð
ð 	
ð €IØ€HØ!€JÜ,¨WÓ5€LäÔ2Ó3ó SlˆÜ".ØØ%Ø'ØØØ%,¨q¢[™°dØ%ô#
Ñˆ�ið 	�‰ˆyÔÙÜ�N‰NÐcÐelÐnuÔvØðP �hÐÐðO  ˆÜ�‰ÐPÐRYÐ[bÐdlÔmäFÀxÐQ_Ó`‰ˆˆJÙÜ�N‰NÐ]Ð_fÐhrÐt{Ô|Ø& z l°!Ð4ˆIØ#ˆJØð'	,Ü�K‰KØ\ØØØØôô .ØÜ˜Ÿ™ fÓ-Ò3°Ó4Ü˜Ÿ™ fÓ-Ò=°Ó>Ü˜Ÿ™ jÓ1Ò7°RÓ8Ü˜XŸ\™\¨*Ó5Ò;¸Ó<Ø!ØØ$Ü˜XŸ\™\¨*Ó5ÒC¸ÓDÜ˜xŸ|™|¨LÓ9Ò?¸RÓ@Øô‰JˆD�$ñ Ü ŸJ™JØ $¨dÑ3Ø!&Üô‘	ð 6�	ô /ØØ%Ø'ØØ"ô
Ñˆ�ð 	�‰ˆyÔÜ�‰ØQØ�W˜gŸk™k¨)Ó4°g·k±kÀ(Ó6Kô	
ð
 �;‰;�yÓ! VÒ+Øð �hÐÐð	 —[‘[ Ó,ÒR°·±¸HÓ0EÒRÈˆ
ØÔ/°!Ñ3Ô3Ü�K‰KÐaÐcjÖkðgSlðj �hÐÐøôA ò 
	,Ü�N‰NØmØØØØØØôð ' q c¨Ð+�Iûð
	,ús   Ã,C>J1Ê1	K%Ê:!K Ë K%c           
     óV  — d}d}d}	t        t        «      D �]Z  }
t        | |||d|
dkD  r|nd|	¬«      \  }}|j                  |«       |st        j                  d|
«        ||fS |}t        j                  d|
|«       	 t        |||¬«      \  }}|r t        j                  ||d	œd
t        ¬«      }nd}t        | ||||¬«      \  }}|j                  |«       t        j                  d|
|j                  d«      |j                  d«      «       |j                  d«      dk(  r ||fS |j                  d«      xs |j                  d«      xs |}	|
t        dz
  k(  s�ŒFt        j                  d«       �Œ] ||fS # t        $ r'}t        j                  d||
«       d|› d�}Y d}~Œðd}~ww xY w)u�   3-LLM pipeline for uploaded SQLite: generate SQL â†’ execute â†’ verify â†’ maybe retry.

    Returns (db_answer, sql_used).
    rC   NÚsqliter   rb  zLDB pipeline source=upload_sqlite sql_generator returned empty SQL attempt=%dz@DB pipeline source=upload_sqlite sql_generator attempt=%d sql=%s)rW  r‘   Fr’   ri  z9DB pipeline source=upload_sqlite exec_error=%s attempt=%drg  rh  rj  zIDB pipeline source=upload_sqlite verifier attempt=%d verdict=%s reason=%srl  rm  rn  ro  rI   zMDB pipeline source=upload_sqlite max attempts reached, forwarding last result)rp  rq  r   r1   r›  r  rœ  r   r•   r˜   rU   r6  r   rR   )r9  r=   rQ  rc  rd  r°   rs  rš   rt  ru  rw  rx  ry  r�   r�   rP  rl  r{  s                     r)   Ú_run_db_pipeline_sqliter  Ë  sÙ  € ð €IØ€HØ!€JäÔ2Ó3ó 4iˆä".ØØ%Ø'ØØØ%,¨q¢[™°dØ%ô#
Ñˆ�ið 	�‰ˆyÔÙÜ�N‰NÐiÐkrÔsØðP �hÐÐðO  ˆÜ�‰ÐVÐX_ÐaiÔjð	,Ü# D¨(À5ÔI‰JˆD�$ÙÜ ŸJ™JØ $¨dÑ3Ø!&Üô‘	ð 6�	ô /ØØ%Ø'ØØ"ô
Ñˆ�ð 	�‰ˆyÔÜ�‰ØWØ�W—[‘[ Ó+¨W¯[©[¸Ó-Bô	
ð
 �;‰;�yÓ! VÒ+Øð �hÐÐð	 —[‘[ Ó,ÒR°·±¸HÓ0EÒRÈˆ
ØÔ/°!Ñ3Ô3Ü�K‰KÐgÖhði4iðl �hÐÐøô3 ò 	,Ü�N‰NÐVÐXYÐ[bÔcØ& q c¨Ð+�Iûð	,ús   Á>5E8Å8	F(ÆF#Æ#F(c                óÖ  — d}d}d }	t        t        «      D �]  }
t        | ||||
dkD  r|nd |	¬«      \  }}}|j                  |«       |st        j                  d|
«        ||fS |xs t        j                  |d¬«      }t        j                  d|
|«       	 t        j                  d|
||«       t        t        |j                  d	«      xs d«      t        |j                  d
«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      |||t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«
      \  }}|r t        j                  ||dœdt        ¬«      }nd}t        | ||||¬«      \  }}|j                  |«       t        j                  d|
|j                  d«      |j                  d«      «       |j                  d«      dk(  r ||fS |j                  d«      xs |j                  d«      xs |}	�Œ ||fS # t        $ r*}t        j                  d||
|||«       d|› d�}Y d }~ŒÐd }~ww xY w)NrC   r   )rQ  rc  rd  Úprevious_specrf  zLDB pipeline source=live_mongo query_generator returned empty spec attempt=%dFr^  z@DB pipeline source=live_mongo query_generator attempt=%d spec=%szTDB pipeline source=live_mongo executing attempt=%d visitor_question=%s query_spec=%sr÷  r  é‰i  r  r  r  r’  r  rS  ©
r÷  r  r{  r  rß  Ú
query_specÚallowed_collectionsr  r  rT  r‘   r’   ri  zeDB pipeline source=live_mongo exec_error=%s attempt=%d visitor_question=%s query_spec=%s raw_error=%rú[Mongo error: rh  ©rQ  rc  Úquery_spec_jsonrk  zFDB pipeline source=live_mongo verifier attempt=%d verdict=%s reason=%srl  rm  rn  ro  )rp  ÚMAX_MONGO_PIPELINE_ATTEMPTSr   r1   r›  r  r•   r˜   rœ  r   rU   rR   rX   r6  r   )r9  r=   rQ  rc  rd  rr  rs  rš   Ú
mongo_usedru  rw  ÚspecÚspec_rawry  r�   r�   rP  rl  r{  s                      r)   Ú_run_db_pipeline_live_mongor�    s  € ð €IØ€JØ!€JäÔ4Ó5ó BSˆÜ$8ØØ%Ø'ØØ(/°!ª™*¸Ø%ô%
Ñ!ˆˆh˜	ð 	�‰ˆyÔÙÜ�N‰NÐiÐkrÔsØðp �jÐ Ð ðo ÒE¤§¡¨D¸uÔ!Eˆ
Ü�‰ÐVÐX_ÐakÔlð 	.Ü�K‰KØfØØØô	ô )Ü˜Ÿ™ fÓ-Ò3°Ó4Ü˜Ÿ™ fÓ-Ò6°Ó7Ü˜Ÿ™ jÓ1Ò7°RÓ8Ü˜XŸ\™\¨*Ó5Ò;¸Ó<Ø!ØØ$)Ü˜XŸ\™\¨*Ó5ÒC¸ÓDÜ˜xŸ|™|¨LÓ9Ò?¸RÓ@Øô‰JˆD�$ñ Ü ŸJ™J°4ÀÑ'FÐUZÔdgÔh‘	à5�	ô 1ØØ%Ø'Ø&Ø"ô
Ñˆ�ð 	�‰ˆyÔÜ�‰ØTØ�W—[‘[ Ó+¨W¯[©[¸Ó-Bô	
ð
 �;‰;�yÓ! VÒ+Øð �jÐ Ð ð —[‘[ Ó,ÒR°·±¸HÓ0EÒRÈŠ
ðEBSðH �jÐ Ð øô; ò 		.Ü�N‰NØwØØØØØôð )¨¨¨1Ð-�Iûð		.ús   ÂC<H5È5	I(È> I#É#I(r  )r  r  c                ó¤  — t        |j                  d«      xs d«      j                  «       }|syt        ||	«      \  }}|rd|› d�|fS t	        ||«      \  }}|sd|› d�|fS |
t
        vr'd|
› ddj                  t        t
        «      «      › d	�|fS t        |
«      }d}	 t        j                  d
|
t        |j                  d«      xs d«      ||t        j                  |	dt         ¬«      «       t        |
t        |j                  d«      xs d«      t        |j                  d«      xs |«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      |||t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«      \  }}|r t        j                  ||dœdt         ¬«      }nd}|dk7  r(t#        | ||||¬«      \  }}|j%                  |«       ||fS t        j                  d«       ||fS # t        $ r,}t        j!                  d||
|||«       d|› d�|fcY d}~S d}~ww xY w)zDRun a stored SQL template (read-only, dialect-aware), then verifier.r  rC   )z![Query template has no SQL text.]rC   rg  rh  z:[SQL template execution is not yet supported for dialect 'rV  rª   ra  zZlive_sql_template_execute dialect=%s template_name=%s visitor_question=%s sql=%s params=%sr   Fr’   r÷  r  r  r  r  r’  r  rS  rY  r‘   ri  zRlive SQL template exec_error=%s dialect=%s visitor_question=%s sql=%s raw_error=%rNr  rj  z,Skipping SQL verifier for template_only mode)rU   rR   rV   rÒ  rý   rX  r„   r­   r_  r›  rœ  r•   r˜   rZ  rX   r6  r  r   r1   )r9  r=   rQ  rc  rd  rr  rW  rñ   r  r»  r  r  Útemplate_sqlrt  Úbind_errr­  rz  rv  rš   r�   r�   rP  rl  r{  s                           r)   Ú_execute_live_sql_templater‘  k  s|  € ô  �x—|‘| JÓ/Ò5°2Ó6×<Ñ<Ó>€LÙØ6Ü2°<ÀÓQÑ€HˆhÙØ˜h˜Z qÐ)¨<Ð7Ð7ÜBÀ8È^Ó\�N€Bˆ
ÙØ˜j˜\¨Ð+¨XÐ5Ð5àÔ2Ñ2àHÈÈ	ð RØŸ)™)¤FÔ+GÓ$HÓIÐJÈ"ðNàð
ð 	
ô -¨WÓ5€LØ€Ið'-Ü�‰ØhØÜ�—‘˜VÓ$Ò*¨Ó+ØØÜ�J‰J�°UÄCÔHô	
ô *ØÜ�X—\‘\ &Ó)Ò/¨RÓ0Ü�X—\‘\ &Ó)Ò9¨\Ó:Ü�X—\‘\ *Ó-Ò3°Ó4Ü˜Ÿ™ jÓ1Ò7°RÓ8ØØØ)Ü˜Ÿ™ jÓ1Ò?°ZÓ@Ü˜8Ÿ<™<¨Ó5Ò;¸Ó<Øô
‰
ˆˆdñ ÜŸ
™
Ø ¨$Ñ/Ø"Üô‰Ið 2ˆIð �_Ò$Ü.ØØ%Ø'ØØ"ô
Ñˆ�ð 	�‰ˆyÔð �hÐÐô 	�‰ÐBÔCØ�hÐÐøô- ò 	-Ü�‰Ø`ØØØØØô	
ð ˜a˜S Ð" HÐ,Õ,ûð	-ús   ÂD5H È	IÈ#!I
ÉIÉ
I)r  c        
        óú  — t        |j                  d«      xs d«      }
|j                  d«      }t        |t        «      st        j                  d|
«       yt        ||«      }t        |t        «      st        j                  d|
«       yt        j                  |d¬	«      }	 t        j                  d
t        |j                  d«      xs d«      ||t        j                  |dt         ¬«      «       t        t        |j                  d«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      |||t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«
      \  }}|rUt        j                  ||dœdt         ¬«      }t        j                  d|
t        |«      |rdj                  |«      nd«       �nøt        |j                  d«      xs d«      j                  «       j                  «       }|j                  d«      }d}|dk(  �r‹t        |t        «      �rzd|v �rut        |«      }|j!                  dd«       t        |«      }||d<   t        j                  d|
«       t        t        |j                  d«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      t        |j                  d«      xs d«      |||t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«
      \  }}|rpd }t        j                  |d¬	«      }|}|}t        j                  ||dœdt         ¬«      }t        j                  d!|
t        |«      |rdj                  |«      nd«       |sd"}t        j                  d#|
«       |	d'k7  r(t%        | |||¬(«      \  }}|j'                  |«       ||fS t        j                  d)«       |fS # t"        $ r+}t        j                  d$||||«       d%|› d&�|fcY d}~S d}~ww xY w)*zLRun a stored mongo_json template, then verifier (skipped for template_only).r   rC   r  z=mongo template invalid query_body (not dict) template_name=%s)zA[Invalid Mongo query template: query_body must be a JSON object.]rC   z;mongo template invalid after param binding template_name=%s)z7[Invalid Mongo query template after parameter binding.]rC   Fr^  zXlive_mongo_template_execute template_name=%s visitor_question=%s query_spec=%s params=%sr’   r÷  r  r‚  r  r  r  r’  r  rS  rƒ  r‘   z>live_mongo_template_result template_name=%s rows=%d columns=%sú,z(empty)Ú	operationÚfilterÚfindró  NzVlive_mongo_template_retry_relaxed_filter template_name=%s reason=0_rows removed=statusTzTlive_mongo_template_retry_relaxed_filter_success template_name=%s rows=%d columns=%sri  z2live_mongo_template_result template_name=%s rows=0zPlive Mongo template exec_error=%s visitor_question=%s query_spec=%s raw_error=%rr†  rh  r  r‡  z.Skipping Mongo verifier for template_only mode)rU   rR   rS   rT   r›  r  rÖ  r•   r˜   rœ  r   rX   rK  r„   rV   rr   Úpopr6  r   r1   )r9  r=   rQ  rc  rd  rr  r…  r  r»  r  Útpl_nameÚbody_srcÚbodyrŠ  r�   r�   rš   ÚopÚfiltÚdid_relaxed_retryÚrelaxed_filterÚrelaxed_bodyÚr_colsÚr_rowsrP  rl  r{  s                              r)   Ú_execute_live_mongo_templater¢  Å  sø  € ô �8—<‘< Ó'Ò-¨2Ó.€HØ�|‰|˜LÓ)€HÜ�h¤Ô%Ü�‰ÐVÐX`ÔaØVÜ'¨°/ÓB€DÜ�dœDÔ!Ü�‰ÐTÐV^Ô_ØLÜ—‘˜D¨uÔ5€JðH1Ü�‰ØfÜ�—‘˜VÓ$Ò*¨Ó+ØØÜ�J‰J�°UÄCÔHô	
ô %Ü�X—\‘\ &Ó)Ò/¨RÓ0Ü�X—\‘\ &Ó)Ò2¨UÓ3Ü�X—\‘\ *Ó-Ò3°Ó4Ü˜Ÿ™ jÓ1Ò7°RÓ8ØØØ 3Ü˜Ÿ™ jÓ1Ò?°ZÓ@Ü˜8Ÿ<™<¨Ó5Ò;¸Ó<Øô
‰
ˆˆdñ ÜŸ
™
¨t¸TÑ#BÐQVÔ`cÔdˆIÜ�K‰KØPØœ#˜d›)±t S§X¡X¨d¤^Àöô
 �T—X‘X˜kÓ*Ò0¨bÓ1×7Ñ7Ó9×?Ñ?ÓAˆBØ—8‘8˜HÓ%ˆDØ %ÐØ�V‹|¤
¨4´Õ 6¸8ÀtÒ;KÜ!% d£�Ø×"Ñ" 8¨TÔ2Ü# D›z�Ø)7�˜XÑ&Ü—‘ØlØôô "1Ü˜XŸ\™\¨&Ó1Ò7°RÓ8Ü˜XŸ\™\¨&Ó1Ò:°UÓ;Ü˜XŸ\™\¨*Ó5Ò;¸Ó<Ü  §¡¨jÓ!9Ò!?¸RÓ@Ø%Ø+Ø(;Ü  §¡¨jÓ!9Ò!G¸ZÓHÜ" 8§<¡<°Ó#=Ò#CÀÓDØ ô"‘�˜ñ Ø(,Ð%Ü!%§¡¨LÀuÔ!M�JØ!�DØ!�DÜ $§
¡
°tÀTÑ+JÐY^ÔhkÔ l�IÜ—K‘KØnØ ¤# d£)¹t¨S¯X©X°d¬^Èôñ %Ø5�	Ü—‘ÐPÐRZÔ[ð �_Ò$Ü0ØØ%Ø'Ø&Ø"ô
Ñˆ�ð 	�‰ˆyÔð �jÐ Ð ô 	�‰ÐDÔEØ�jÐ Ð øô+ ò 1Ü�‰Ø^ØØØØô	
ð   ˜s !Ð$ jÐ0Õ0ûð1ús   Â"MQ Ñ	Q:Ñ Q5Ñ/Q:Ñ5Q:)Úsystem_instructionr.  Úon_reply_deltaÚon_phasec                ó"  ‡‡d‡e— ||f}dˆˆfd„}t        j                  «       }t        «       }d}g }dj                  d„ |dd  D «       «      }d|› d|› d	�Šet	        d
d¬«      }	 |j                  t        | ||«      }|j                  t        ||¬«      }|j                  t        ||||| j                  ¬«      }|j                  «       \  Šd}d‰ˆdˆefd„}|j                  |«      }|j                  «       \  }}|j                  «       }|j                  «       \  }}|j                  |«       |j                  d¬«       t        |j                  d«      xs d«      j                  «       }|dvrd}t         j#                  d|t%        t        j                  «       |z
  dz  «      |«       |dv r†|r	|d|› d�z  }|D ]v  } t        | j                  d«      xs d«      }!| j                  d«      }"|j'                  t        | j                  d«      «      | j                  d«      |"dœ«       |d|!› d�z  }Œx d}#d}$g }%d}&d}'d }(d })g }*|d!v �rp|st         j#                  d"|«       |�r
t        |j                  d#«      xs d$«      j                  «       }+t        |j                  d%«      xs d&«      }&t        |j                  d'«      xs d(«      j)                  «       j                  «       },|,d)vrd(},|,})t         j#                  d*|+t        |j                  d+«      xs d«      |&|,|«       d}-|,d k7  �r t        |j                  d,«      xs d«      j)                  «       }.|.rt+        ||.«      ng }/t-        |/|+«      }0|,d(k(  r|0}*t         j#                  d-|.t/        |/«      t/        |0«      |+|,«       |,d(k(  rœ|0sd.}-�nt1        ‰d||0«      \  }1}2|j                  |2«       |1€t         j#                  d/«       d0}-nßt         j#                  d1t        |0|1   j                  d«      xs d«      t        |0|1   j                  d«      xs d«      «       |0|1   }(n„|,d2k(  r|0r}t1        ‰d||0«      \  }1}2|j                  |2«       |1�Zt         j#                  d1t        |0|1   j                  d«      xs d«      t        |0|1   j                  d«      xs d«      «       |0|1   }(|(��jt3        ‰d||||(|+¬3«      \  }3}4|4r7t         j#                  d4t        |(j                  d«      xs d«      |4«       |4}'�n°|3€d5}'�nª|+d6k(  �r|j                  d7«      xs g D �5cg c]  }5t        |5«      sŒt        |5«      ‘Œ }%}5t5        |%«      }6t         j#                  d8t        |(j                  d«      xs d«      d9j                  t7        |6«      «      |&«       t9        |j                  d:«      |6«      }7t;        | |||7|&||6|(|3|,¬;«
      \  }#}$t         j#                  d<t        |(j                  d«      xs d«      t=        |#«      |#r|#j?                  d=«      nd«       n’|j                  d>«      xs g D �5cg c]  }5t        |5«      sŒt        |5«      ‘Œ }%}5t5        |%«      }6tA        |j                  d:«      |6«      }7tC        |j                  d:«      |6«      }8tE        | |||7|&||6|8|(|3|+|,¬?«      \  }#}$|'�s�|3��š|#�r—|#j?                  d=«      �s…tG        |(|3|+|#¬@«      }9|9�rst         j#                  dAt        |(j                  d«      xs d«      tI        |#«      «       |9}'�n3|-r|-}#d}$�n+|,dBv �r&|+d6k(  rÊ|j                  d7«      xs g D �5cg c]  }5t        |5«      sŒt        |5«      ‘Œ }%}5tK        ||%«      }:|:rt5        |:«      n
t5        |%«      }6|6st5        |%«      }6t         j#                  dCd9j                  t7        |6«      «      |&|,«       t9        |j                  d:«      |6«      }7tM        | |||7|&||6¬D«      \  }#}$�nW|j                  d>«      xs g D �5cg c]  }5t        |5«      sŒt        |5«      ‘Œ }%}5tK        ||%«      };|;rt5        |;«      n
t5        |%«      }6|6st5        |%«      }6tA        |j                  d:«      |6«      }7tC        |j                  d:«      |6«      }8d}<| jN                  rC|<sA	 tQ        | ||7|&||6|+¬E«      \  }#}$}=|j                  |=«       dF}<t         j#                  dG|+|«       | jV                  rC|<sA	 tY        | ||7|&||6|+¬E«      \  }#}$}?|j                  |?«       dF}<t         j#                  dI|+|«       |<st[        | |||7|&||6|8|+¬K«	      \  }#}$|�sHt]        ||¬«      \  }@}%}&|@�r|%�rt         j#                  dLt/        |%«      |&|«       tK        ||%«      }:|:rt5        |:«      n
t5        |%«      }6@D �Acg c]!  }At        |Aj                  dM«      «      |6v sŒ A‘Œ# }B}A|Bs)@}B|BD �Ach c]  }At        |Aj                  dM«      «      ’Œ }6}At_        B«      }Ct5        «       }D	 Cja                  dN«      }E|Ejc                  «       D �Fch c]  }F|FdO   ’Œ	 }D}F|6Dz  }6|6r!te        C|6«      }7tg        | |||7|&|C|6¬P«      \  }#}$Cji                  «        nt         j#                  dQ«       |)d(k(  rtk        |*|dR¬S«      ng }G|Grtm        ‰d||GdR¬T«      ng }H|'rF|'j)                  «       }I|I|||j                  dU«      dVœ|$xs d Hg ||jn                  |jp                  dWœ	S |#xs dj)                  «       js                  ddX«      }Jt/        |J«      dYkD  rJd dY › dZ�}Jt         j#                  d[||d!v rt=        |«      nd|&t=        |$«      JrJnd\«       d }K|(�#|(j                  d]«      }Ltu        |Ltv        «      rL}K|#}MKr@Kj                  d^«      s/Kj                  d_«      }Ntu        |Ntx        «      rNrt{        |#N«      }Md}O|r$|j)                  «       rd`|j)                  «       › d�}Ot}        ||da¬b«      }Pt        ||«      }QdcD �Rcg c]0  }Rt        Qj                  |R«      xs d«      j)                  «       sR‘Œ2 }S}Rt         j#                  ddt        Qj                  d«      xs d«      t=        Qj                  de«      «      t=        |Qj                  df«      «      Srd9j                  S«      nd\«       dgO› dhP› di|r|nd\› djMrMnd\› dkQj                  d«      xs dl› dmQj                  de«      xs dl› dnQj                  df«      xs dl› do|› dpSrdqj                  S«      ndr› ds�}Tt�        |	«      }U|
€M‰djƒ                  TU¬t«      }V|j                  |Vj„                  «       |Vj†                  j)                  «       xs du}InYg }W‰dj‰                  TU¬t«      D ]  }X|XsŒWj'                  X«        |
|X«       Œ  dj                  W«      j)                  «       xs du}I |dv«       g }Yg }Zd}[|%rdwdqj                  |%«      › dx�}[HrH}Yn†	 dy[› dz|› d{Id d| › d}�}\t‹        ‰d|\|«      }]|]j                  d~«      xs g }^tu        |^tx        «      rD^D �_cg c]5  }_t        |_«      j)                  «       sŒt        _«      j)                  «       ‘Œ7 c}_d dR }Y|#�r.|#j?                  d«      �s|#j?                  d€«      �s
	 t�        jŽ                  |#«      }`|`j                  d�«      xs g }a`j                  d‚«      xs g }btu        atx        «      rºt/        a«      dƒk\  r¬tu        btx        «      rœt/        b«      dƒk\  rŽKrŒKj                  d^«      r{t‘        Kba«      }Z|Kj                  d„«      xs i }ct         j#                  d…t/        Z«      t        |cj                  d†«      xs d«      t        cj                  d‡«      xs d«      «       I|||j                  dU«      dVœ|$xs d YZ||jn                  |jp                  dWœ	S # |j                  d¬«       w xY wc c}5w c c}5w c c}5w c c}5w # tR        $ r"}>t         jU                  dH|+|>«       Y d }>~>�Œ�d }>~>ww xY w# tR        $ r"}>t         jU                  dJ|+|>«       Y d }>~>�Œ`d }>~>ww xY wc c}Aw c c}Aw c c}Fw # tR        $ r |6}DY �Œow xY wc c}Rw c c}_w # tR        $ r Y �Œ%w xY w# tR        $ r Y �Œw xY w)ŠNr   c                ój   •— ‰€y	  ‰| «       y# t         $ r t        j                  dd¬«       Y yw xY w)z@Best-effort phase signal; never let UI callbacks break the turn.Nz$on_phase callback raised; continuingT)Úexc_info)r™   r›  Údebug)r   r¥  s    €r)   Ú_phasez"run_rag_agent_turn.<locals>._phaseF  s;   ø€ àÐØð	PÙ�T�NøÜò 	PÜ�L‰LÐ?È$ˆLÖOð	Pús   † � 2±2rC   r¬   c              3  ój   K  — | ]+  }|j                  d d«      › d|j                  dd«      › �–— Œ- y­w)ri  r{  rO   rk  rC   N)rR   )rm  r  s     r)   ro  z%run_rag_agent_turn.<locals>.<genexpr>_  s4   è ø€ ÒdÐRS˜aŸe™e F¨FÓ3Ð4°B°q·u±u¸YÈÓ7KÐ6LÔMÑdùs   ‚13iøÿÿÿuH  You are a router for a support agent.
Classify the latest user message into one of:
- "rag" â€” needs document knowledge, policies, explanations, semantic search
- "db" â€” needs structured data: counts, lists, filters, joins, aggregations, SQL-style questions over exported data
- "both" â€” needs both

Conversation (recent):
z

Latest user message:
zE

Respond with JSON only: {"mode":"rag"|"db"|"both","reason":"short"}é   zrag-prep)r	  Úthread_name_prefixrF  )rM  rè  rQ  rÛ  rN  c                 ó4   •— ‰j                  ‰«      \  } }| |fS r-   )r:   )r>   r0   r`  Úroute_prompts     €€r)   Ú_route_workerz)run_rag_agent_turn.<locals>._route_workerƒ  s!   ø€ Ø$×2Ñ2°<Ó@‰KˆD�%Ø˜�;Ðr+   F)ÚwaitÚmodeÚrag)r³  ÚdbÚbothz6RAG turn routed mode=%s prep_ms=%d project_agent_id=%siè  )r³  rµ  z
[Retrieval error: z]
rk  ÚmetadatarÝ  Ú
similarity)Úchunk_idr·  r¶  z
---
r  )r´  rµ  zPlive_db_context returned None, falling back to upload_sqlite project_agent_id=%sr  r  rÞ  rß  r  r  r  zHDB branch source=live_%s host=%s db=%s query_mode=%s project_agent_id=%sr÷  rú  zGquery templates: connection_id=%s raw=%d filtered=%d dialect=%s mode=%sz‡[No active query templates are configured for this connection. Ask an administrator to add templates in the project database settings.]z:query templates: no template matched in template_only modezf[No query template matched this question. Try rephrasing or ask an administrator to adjust templates.]z9query templates: selected template_name=%s template_id=%sr  )r`  r=   rQ  rr  r  r  z?query template parameters unresolved template_name=%s reason=%sz7I could not resolve template parameters for this query.r  rß   zDmongo template execution start template_name=%s collections=%s db=%sr“  rÈ   )
r9  r=   rQ  rc  rd  rr  r…  r  r»  r  zOmongo template execution done template_name=%s has_answer=%s answer_is_error=%sú[r±   )r9  r=   rQ  rc  rd  rr  rW  rñ   r  r»  r  r  )r  r»  r  rš   zAquery template refinement requested template_name=%s row_count=%s)r  r  zTmongo generated/template_preferred pipeline start collections=%s db=%s query_mode=%s)r9  r=   rQ  rc  rd  rr  rs  )rQ  rc  rd  rr  rs  r  TzCDB branch source=langchain dialect=%s completed project_agent_id=%szFDB branch source=langchain dialect=%s failed; trying next pipeline: %szDDB branch source=llamaindex dialect=%s completed project_agent_id=%szRDB branch source=llamaindex dialect=%s failed; falling back to custom pipeline: %s)	r9  r=   rQ  rc  rd  rr  rs  rñ   r  zBDB branch source=upload_sqlite tables=%s db=%s project_agent_id=%sr÷   z1SELECT name FROM sqlite_master WHERE type='table'r   )r9  r=   rQ  rc  rd  r°   rs  z=DB branch source=upload_sqlite unavailable (no tables/schema)rD  r\  )r`  r=   rQ  ra  rR  rm  )r²  rm  )	ÚreplyÚsourcesÚrouterð   r_  rg   rC  Útokens_inputÚtokens_outputrN   i°  z...(truncated)zMDB final context mode=%s has_live_ctx=%s db_label=%s sql_used=%s db_answer=%sz(none)r]   ÚcarouselEnabledÚconversationExcludedColumnsuF   
System instruction (from the project owner â€” follow this closely):
é   )rw  r~  zYfinal_reply_context contact_snapshot name=%s email_present=%s phone_present=%s missing=%sr  r€  z2You are a helpful assistant for website visitors.
zP
Use the following context when relevant.

Conversation history (recent turns):
z

Retrieved document excerpts:
z)

Database query result (JSON or error):
z:

Known visitor contact details already provided:
- name: z	(missing)z

- email: z

- phone: z

User message:
aþ  

RESPONSE GUIDELINES:
- Write a clear, natural-language answer. Do NOT dump raw data or JSON.
- If database results contain a list, present the key highlights conversationally (e.g. name, price, location). Do not repeat every column or ID.
- Cite numbers and counts accurately from the data.
- If the data is empty or an error occurred, say so honestly and suggest the visitor rephrase.
- If context is insufficient, say so.
- If contact info is requested by project instruction, ask ONLY for missing fields (rª   Únoneu  ). Never ask again for details already provided above.
- For product/data questions, do not ask for contact details unless explicitly required by project instruction and still missing.
- Keep it concise â€” a few sentences or a short bulleted summary, not a wall of text.)ÚconfigzI could not generate a reply.Ú
finalizingzThe database has these tables: z8. Suggest questions that can be answered from this data.zFYou are suggesting follow-up questions for a website visitor chatbot.
a  

Based on the conversation, suggest exactly 3 short follow-up questions the visitor might ask next.
Each must be under 60 characters and MUST be answerable from the available data or documents.
Do NOT suggest questions about data that does not exist.

Visitor asked: z
Assistant replied: iX  z:

Respond with JSON only: {"suggestions":["q1","q2","q3"]}r_  z
[SQL errorz[Mongo errorr�   r�   r§   rA   z?carousel_cards_built count=%d image_col=%s public_bucket_url=%srD   rE   )r   rU   r2   r3   )r2   ztuple[dict[str, Any], LLMUsage])Ir  r>  r$   r„   r   r  rD  rI  rR  rN  r  r1   ÚshutdownrU   rR   rr   r›  rœ  rX   r[   rV   r   r   rK  r   r·  rå   r­   rã   r¢  r  rs   r×   rè   r‘  rÃ  r¹  r   r�  Úuse_langchain_sqlr   r™   r  Úuse_llamaindex_sqlr   r|  rð  r   r®   r¯   r¶   r  Úcloser[  rg  r&   r'   rZ   rS   rT   rW   r¤   ry  r�  r2  Úgenerater0   r  Ústream_generater?   r•   r–   ro   )fr9  rè  rM  Úorganization_idÚ
project_idrÛ  rQ  rr  r£  r.  r¤  r¥  rM   rª  Úturn_startedr=   rH  r»  Ú
hist_linesÚprep_executorÚfut_llmÚfut_live_ctxÚfut_retrievalrC  r°  Ú	fut_routeÚretrieval_chunksÚretrieval_errrr  r¼  Úroute_usager²  rž   rk  Úmetarš   rt  Ú	all_namesrd  Úforced_replyÚpicked_templateÚselected_query_modeÚ"template_only_suggestion_templatesÚlive_dialectr  Údb_answer_errrü  Úraw_templatesrP  rU  Ú
pick_usager»  Ú	param_errrH  rs  rc  rñ   Úlarge_result_followupÚpickedÚ
picked_tblÚ_db_resolvedÚlc_usagerP  Úli_usagerï  ÚrÚfilteredr°   Úloaded_tablesr´   rh   Ú ranked_template_only_suggestionsÚtemplate_only_suggestionsrº  Údb_answer_previewÚtemplate_card_configÚraw_ccÚdb_answer_for_llmÚexcludedÚ	sys_blockr£  Úcontact_snapshotr¢   Úmissing_contact_fieldsÚfinal_promptÚ
gen_configÚ
final_respÚreply_partsÚdeltar_  rg   Údata_context_hintÚfollowup_promptÚfuÚraw_suggestionsr:  Ú	db_parsedr_   r^   Úmapping_dbgr`  r¯  sf              `                                                                                        @@r)   Úrun_rag_agent_turnr   5  sF  ú€ ð 	˜Ð#€AõPô —>‘>Ó#€LÜ	‹€BØ
€CØ$&€Gð —‘ÑdÐW^Ð_aÐ_bÐWcÔdÓd€Jðð €ð ð €ð FðI€Lô '°1ÈÔT€Mð +Ø×&Ñ&Ü.°¸(ÐDTó
ˆð %×+Ñ+Ü(¨(ÐEUð ,ó 
ˆð &×,Ñ,ÜØØØ%Ø-Ø&×8Ñ8ð -ó 
ˆð ")§¡Ó!1Ñˆ
�Jö	ð "×(Ñ(¨Ó7ˆ	ð +8×*>Ñ*>Ó*@Ñ'Ð˜-Ø×&Ñ&Ó(ˆØ&×-Ñ-Ó/Ñˆˆ{Ø
�‰ˆ{Ôà×Ñ EÐÔ*äˆu�y‰y˜Ó Ò) EÓ*×0Ñ0Ó2€DØÐ(Ñ(ØˆÜ
‡K�KØ@ØÜŒT�^‰^Ó Ñ,°Ñ4Ó5Øô	ð ˆÑÙØÐ)¨-¨¸Ð<Ñ<ˆCØ!ò 
	)ˆAÜ˜!Ÿ%™% 	Ó*Ò0¨bÓ1ˆGØ—5‘5˜Ó$ˆDØ�N‰Nä # A§E¡E¨$£KÓ 0Ø"#§%¡%¨Ó"5Ø $ñôð �W˜W˜I RÐ(Ñ(‰Cð
	)ð €IØ€HØ€IØ€HØ€LØ-1€OØ*ÐØ?AÐ&Øˆ~ÒáÜ�K‰KÐjÐl|Ô}ÚÜ˜xŸ|™|¨IÓ6ÒA¸'ÓB×HÑHÓJˆLÜ˜8Ÿ<™<¨Ó8ÒF¸JÓGˆHÜ˜XŸ\™\¨,Ó7ÒJ¸?ÓK×QÑQÓS×YÑYÓ[ˆJØÐ!UÑUØ,�
Ø",Ðä�K‰KØZØÜ�H—L‘L Ó(Ò.¨BÓ/ØØØ ôð ˆMà˜[Ó(Ü˜hŸl™l¨?Ó;ÒA¸rÓB×HÑHÓJ�ÙRYÔ ;¸HÀgÔ NÐ_a�Ü7¸À|ÓT�	Ø Ò0Ø9BÐ6Ü—‘Ø]ØÜ˜Ó&Ü˜	“NØ Øôð  Ò0Ù$ðgò &ô
 +DØ&Ø(Ø%ó+™˜˜Zð
 Ÿ™˜zÔ*Ø˜;Ü"ŸK™KÐ(dÔeð!_ñ *ô
 #ŸK™KØ [Ü # I¨c¡N×$6Ñ$6°vÓ$>Ò$DÀ"Ó EÜ # I¨c¡N×$6Ñ$6°tÓ$<Ò$BÀÓ Côð
 /8¸©n™OØÐ#7Ò7¹IÜ&?Ø"Ø$Ø!ó'‘O�C˜ð
 —F‘F˜:Ô&Ø�ÜŸ™ØWÜ 	¨#¡× 2Ñ 2°6Ó :Ò @¸bÓAÜ 	¨#¡× 2Ñ 2°4Ó 8Ò >¸BÓ?ôð
 +4°C©.˜àÑ*Ü-IØ)ØØ!-Ø#Ø,Ø(ô.Ñ*� ñ Ü—K‘KØYÜ˜O×/Ñ/°Ó7Ò=¸2Ó>Ø!ôð
 $-’LØ$Ð,Ø#\’LØ! YÓ.Ø2:·,±,Ð?QÓ2RÒ2XÐVXÖ d¨AÔ]`ÐabÕ]c¤ Q¥Ð d�IÐ dÜ 	›N�EÜ—K‘KØ^Ü˜O×/Ñ/°Ó7Ò=¸2Ó>ØŸ™¤¨£Ó/Ø ô	ô %KØ Ÿ™Ð%6Ó7Øó%�Mô +GØ!)ØØ%1Ø&3Ø!)Ø!)Ø,1Ø!0Ø(7Ø#-ô+Ñ'�I˜xô —K‘KØiÜ˜O×/Ñ/°Ó7Ò=¸2Ó>Ü˜Y›Ù5>˜	×,Ñ,¨SÔ1ÀEõ	ð 3;·,±,¸}Ó2MÒ2SÐQSÖ _¨AÔX[Ð\]ÕX^¤ Q¥Ð _�IÐ _Ü 	›N�EÜ$DÀXÇ\Á\ÐRcÓEdÐfkÓ$l�MÜ%BÀ8Ç<Á<ÐPaÓCbÐdiÓ%j�NÜ*DØ!)ØØ%1Ø&3Ø!)Ø!)Ø',Ø'5Ø!0Ø(7Ø ,Ø#-ô+Ñ'�I˜xò $¨Ñ(CÊ	ÐZc×ZnÑZnÐorÕZsÜ,OØ!0Ø(7Ø ,Ø"+ô	-Ð)ò -ÜŸ™Ø_Ü × 3Ñ 3°FÓ ;Ò A¸rÓBÜ5°iÓ@ôð
 (=šÙØ)�	Ø’ØÐBÒBØ 9Ò,Ø2:·,±,Ð?QÓ2RÒ2XÐVXÖ d¨AÔ]`ÐabÕ]c¤ Q¥Ð d�IÐ dÜ-¨l¸IÓF�FÙ+1œC œK´s¸9³~�EÙ Ü # I£˜Ü—K‘KØnØŸ™¤¨£Ó/Ø Ø"ô	ô %KØ Ÿ™Ð%6Ó7Øó%�Mô +FØ!)ØØ%1Ø&3Ø!)Ø!)Ø#ô+Ñ'�Išxð 3;·,±,¸}Ó2MÒ2SÐQSÖ _¨AÔX[Ð\]ÕX^¤ Q¥Ð _�IÐ _Ü!1°,À	Ó!J�JÙ/9œC 
œO¼sÀ9»~�EÙ Ü # I£˜ä$DÀXÇ\Á\ÐRcÓEdÐfkÓ$l�MÜ%BÀ8Ç<Á<ÐPaÓCbÐdiÓ%j�NØ#(�Là×1Ò1¹,ðÜ<RØ (Ø-9Ø.;Ø)1Ø)1Ø&+Ø(4ô=Ñ9˜I x°ð ŸF™F 8Ô,Ø+/˜LÜ"ŸK™KÐ(mÐo{ð  ~Nô  Oð  ×2Ò2¹<ðÜ<SØ (Ø-9Ø.;Ø)1Ø)1Ø&+Ø(4ô=Ñ9˜I x°ð ŸF™F 8Ô,Ø+/˜LÜ"ŸK™KÐ(nÐp|ð  Oô  Pñ (Ü.GØ%-Ø!Ø)5Ø*7Ø%-Ø%-Ø"'Ø+9Ø$0ô
/Ñ+˜	 8ò Ü.>¸xÐZjÔ.kÑ+ˆJ˜	 8ÚšiÜ—‘ØXÜ˜	“NØØ$ô	ô *¨,¸	ÓB�Ù'-œ˜Fœ´3°y³>�Ø'1ÖW !´S¸¿¹¸|Ó9LÓ5MÐQVÒ5VšAÐW�ÐWÙØ)�HØ?GÖH¸!œS §¡ |Ó!4Õ5ÐH�EÐHä.¨xÓ8�Ü*-«%�ð*ØŸ,™,Ð'ZÓ[�CØ7:·|±|³~Ö$F° S¨£VÐ$F�MÐ$Fð  Ñ-�áÜ$6°t¸UÓ$C�MÜ*AØ!)ØØ%1Ø&3Ø!)Ø!Ø#ô+Ñ'�I˜xð —
‘
•ä—‘Ð[Ô\ð  /Ò1ô 	0Ð0RÐT`ÐlmÕnàð %ñ ,ô 	-Ø!ØØ%Ø?Øõ	
ð ð ñ Ø×"Ñ"Ó$ˆàØàØŸ)™) HÓ-ñð Ò#˜tØ4ØØ$ØŸH™HØŸY™Yñ
ð 	
ð #š b×/Ñ/Ó1×9Ñ9¸$ÀÓDÐÜ
ÐÓ Ò$Ø0°°$Ð7Ð8¸ÐGÐÜ
‡K�KØWØØ .Ñ0ŒˆXŒ°eØÜˆX‹Ù.Ñ°Hôð 37ÐØÐ"Ø ×$Ñ$ ]Ó3ˆÜ�fœdÔ#Ø#)Ð à!ÐÙÐ$8×$<Ñ$<Ð=NÔ$OØ'×+Ñ+Ð,IÓJˆÜ�h¤Ô%©(Ü GÈ	ÐS[Ó \Ðà€IÙÐ0×6Ñ6Ô8ðà×ÑÓÐ ð ðˆ	ô
 7°wÀÐXYÔZÐÜ0°¸,ÓGÐð ,öàÜÐ#×'Ñ'¨Ó*Ò0¨bÓ1×7Ñ7Ô9ò 	
ðÐð ô
 ‡K�KØcÜÐ× Ñ  Ó(Ò.¨BÓ/ÜÐ×!Ñ! 'Ó*Ó+ÜÐ×!Ñ! 'Ó*Ó+Ù,Bˆ�‰Ð'Ô(ÈôðØ
€ð ð Ð ð ñ 	��Ð ð ñ (Ñ¨XÐ 6ð 7	ð 
×	Ñ	˜fÓ	%Ò	4¨Ð5ð 6
Ø
×
Ñ
˜wÓ
'Ò
6¨;Ð	7ð 8
Ø
×
Ñ
˜wÓ
'Ò
6¨;Ð	7ð 8ð €ð Uñ {QÐUY×U^ÑU^Ð_uÔUvð  W]ð  U^ð ^Wð7Z€Lô> ,Ð,BÓC€JàÐØ×(Ñ(¨¸jÐ(ÓIˆ
Ø
�‰ˆz×ÑÔ Ø—‘×%Ñ%Ó'ÒJÐ+J‰à!#ˆØ×/Ñ/°ÀZÐ/ÓPò 	"ˆEÙØØ×Ñ˜uÔ%Ù˜5Õ!ð		"ð
 —‘˜Ó$×*Ñ*Ó,ÒOÐ0Oˆñ ˆ<Ôð  €KØ"$€EàÐÙà-¨d¯i©i¸	Ó.BÐ-Cð DEð Eð 	ñ
 !Ø/‰ð	ð#ØÐ ð ð ˆ~ð Ø˜$˜3�K�=ð !;ð
>ˆOô ˜: ¸Ó;ˆBØ Ÿf™f ]Ó3Ò9°rˆOÜ˜/¬4Ô0Ø7FÖY°!Ì#ÈaË&Ï,É,Í.œs 1›vŸ|™|�~ÒYÐZ\Ð[\Ð]�ò ˜×-Ñ-¨lÕ;ÀI×DXÑDXÐYgÕDhð	ÜŸ
™
 9Ó-ˆIØ—m‘m FÓ+Ò1¨rˆGØ—m‘m IÓ.Ò4°"ˆGä˜'¤4Ô(¬S°«\¸QÒ->Ä:ÈgÔW[ÔC\ÔadÐelÓamÐqrÒarÙ'Ð,@×,DÑ,DÐEVÔ,WÜ4Ð5IÈ7ÐT[Ó\�EØ"6×":Ñ":¸=Ó"IÒ"OÈR�KÜ—K‘KØYÜ˜E›
Ü˜KŸO™O¨MÓ:Ò@¸bÓAÜ˜KŸO™OÐ,=Ó>ÒDÀ"ÓEô	ð ØàØ—i‘i Ó)ñ
ð Ò˜4Ø"ØØ ØŸ™ØŸ™ñð øðO 	×Ñ EÐÕ*üòL !eùò> !`ùòJ !eùò2 !`øô0  )ò Ü"ŸN™NØ hØ ,Ø !÷ò ûðûô*  )ò Ü"ŸN™NØ tØ ,Ø !÷ò ûðüò> Xùò Iùò %GøÜ ò *Ø$)“Mð*üòrùò| ZøÜò 	Úð	ûô& ò 	Úð	ús  Á"CA@2 Ô=AA	ÕAA	ÙAAÙ AAÝ AAÝ1AAà*AAà;AAãA AA äA AB ç!AB9ç/AB9ç=!AB>è6#AC éACé%AC ñ5ACùAAC$ úACú*ACûAC$ û3D	AC4 Á@2AAÁA	ABÁA&ABÁBABÁB	AB6ÁBAB1ÁB1AB6ÁCAC ÁCACÁCACÁCAC$ ÁC$	AC1ÁC0AC1ÁC4	ADÁD ADr-   )r;   r   r<   rU   r=   z_TokenCounter | Noner2   údict[str, Any])r]   r  r^   ú	list[str]r_   r  r2   r  )rv   rU   rc   rU   r2   rU   )rf   r  rh   r  r2   rU   )rš   rU   r›   r  r2   rU   )r±   úset[str]r2   rU   )rÈ   r   r±   r  r2   rU   )rÈ   r   rß   r  r2   rU   )rÈ   r   r±   r  r2   údict[str, set[str]])rð   rU   rñ   r  r2   ztuple[bool, str])rð   rU   r2   r  )r
  r   ræ   r  r  r  r2   r3   )r  r  r  rU   r2   r  )r)  r   r2   rU   )r   rU   r7  rU   r8  r   r2   ztuple[bool, Any, str])rD  )rP  r  rQ  rU   rR  rX   r2   r  )r`  r   r=   r$   rQ  rU   ra  r  rR  rX   r2   r  )rr  úlist[dict[str, str]]r2   rX   )rP   )rr  r  rQ  rU   rw  rX   r2   rU   )rr  r  rQ  rU   r2   zdict[str, str])r`  r   r=   r$   rQ  rU   rr  r  r  r  r  rU   r2   z(tuple[dict[str, Any] | None, str | None])rš   rU   r2   rX   )
r  r  r»  r  r  rU   r¼  rX   r2   rU   )
r  r  r»  r  r  rU   rš   rU   r2   ú
str | None)r£   r   r2   rU   )rð   rU   r•  r  r2   ztuple[str, str | None])r
  r   r•  r  r2   r   )rè  r	   rÛ  rU   r2   z+tuple[list[dict[str, Any]], list[str], str])rè  r	   rÛ  rU   r2   r  )gš™™™™™Ù?)r.  r  r/  r5  r2   r   )r9  r   rè  r	   rÛ  rU   r2   ztuple[LLMClient, str])rM  r   rè  r	   rQ  rU   rÛ  rU   rN  rX   r2   z'tuple[list[dict[str, Any]], str | None])r  rU   r÷  rU   r  rX   r{  rU   r  rU   rß  rU   rð   rU   rW  r  r  rU   r  rU   rT  rX   r2   z&tuple[list[str], list[dict[str, Any]]])r  rU   r2   rX   )r9  r   r=   r$   rQ  rU   rc  rU   rd  rU   rr  r  rs  r  rñ   r  r  rU   r2   útuple[str, str])r9  r   r=   r$   rQ  rU   rc  rU   rd  rU   r°   r   rs  r  r2   r  )r9  r   r=   r$   rQ  rU   rc  rU   rd  rU   rr  r  rs  r  r2   r  )r9  r   r=   r$   rQ  rU   rc  rU   rd  rU   rr  r  rW  r  rñ   r  r  r  r»  r  r  rU   r  rU   r2   r  )r9  r   r=   r$   rQ  rU   rc  rU   rd  rU   rr  r  r…  r  r  r  r»  r  r  rU   r2   r  )r9  r   rè  r	   rM  r   rË  rU   rÌ  rU   rÛ  rU   rQ  rU   rr  r  r£  r  r.  r  r¤  úCallable[[str], None] | Noner¥  r  r2   r  )wr7   Ú
__future__r   r•   Úloggingrí   r  Úconcurrent.futuresr   Ú	threadingr   Útypingr   r   Úurllib.parser   r…   rè  r	   Úagent.schema_catalogr
   r   r   r   Úagent.live_query_templatesr   r   r   Úagent.mongo_generatorr   Úagent.mongo_runnerr   Úagent.mongo_verifierr   Úagent.mysql_runnerr   Úagent.sql_generatorr   Úagent.sql_langchainr   Úagent.sql_llamaindexr   Úagent.sql_verifierr   Úagent.sqlite_runnerr   r   Úconfig.settingsr   Úembeddings.gemini_embedr   Úllm.baser   r   r   Úllm.factoryr    Úllm.model_resolverr!   Úretrieval.chunk_retrievalr"   Ú	getLoggerr4   r›  r$   r?   ro   rY   r\   r¤   r¶   r×   rã   rè   rý   r  r	  r  r+  r;  Ú	frozensetrq  r[  rg  ru  ry  r�  r·  r¹  rÀ  rÃ  rÊ  rÒ  rÖ  rð  r'  r2  r:  r@  r;  Ú__annotations__r?  r<  rG  rD  rI  rR  rq  r‰  rÂ  rX  rZ  r_  r|  r  r�  r‘  r¢  r   r8   r+   r)   ú<module>r#     sø  ðòõ
 #ã Û Û 	Û Ý 1Ý Ý Ý Ý ,å ÷ó ÷ñ õ
 7Ý .Ý 4Ý /Ý ,Ý 6Ý 8Ý 0ß CÝ $Ý 2ß :Ñ :Ý (Ý >Ý =à	ˆ×	Ñ	˜8Ó	$€÷+ñ +ð  $ðØðØ"ðàðð óð.Øð.àð.ð "ð.ð ó	.ób1óð6Øðàðð 	óó8
óBóJ!óHð80Ø	ð0à'ð0ð ó0óf	ó!ó$Jóó(% ñP $ò 	%ó 	Ð ð ð$Ø#ð$àð$ð ð$ð ó	$ðZ ñ<àð<ð 	ð<ð ð	<ð
 "ð<ð ð<ð ó<ó~
ð  ðBØ!ðBàðBð ðBð 	ó	Bð05Ø!ð5àð5ð ó5ðpqàðqð 	ðqð ð	qð
 "ðqð ðqð ðqð .óqóh
ð6àð6ð $ð6ð ð	6ð
 ð6ð 	ó6ðràðð $ðð ð	ð
 ðð óó$óóð(#&Øð#&ð ð#&ð 1ó	#&ðLDØðDð ðDð ó	DðR "%ð$Ø1ð$àð$ð ó$ðN0Øð0àð0ð ð0ð ó	0ð8 Ð Ø=?Ð Ð:Ó ?Ù›Ð ØBD€Ð?Ó DÙ“vÐ ðØðàðð ðð ó	ð Øðð ðð ó	ð àðð ðð ð	ð
 ðð ðð -óð2 Ð ØÐ Ø+-Ð (ñ  )¨'¨Ó3Ð ð ñ#àð#ð ð#ð ð	#ð
 ð#ð ð#ð ð#ð 
ð#ð ð#ð ð#ð ð#ð ð#ð ,ó#óLð  ñqàðqð 	ðqð ð	qð
 ðqð ðqð ðqð ðqð (ðqð ðqð óqðhHàðHð 	ðHð ð	Hð
 ðHð ðHð ðHð ðHð óHðVR!àðR!ð 	ðR!ð ð	R!ð
 ðR!ð ðR!ð ðR!ð ðR!ð óR!ðB Ø%ñWàðWð 	ðWð ð	Wð
 ðWð ðWð ðWð ðWð (ðWð ðWð $ðWð ðWð ðWð óWðJ &ñm!àðm!ð 	ðm!ð ð	m!ð
 ðm!ð ðm!ð ðm!ð "ðm!ð ðm!ð $ðm!ð ðm!ð óm!ðt &*Ø48Ø37Ø-1ñn	àðn	ð ðn	ð ð	n	ð
 ðn	ð ðn	ð ðn	ð ðn	ð "ðn	ð #ðn	ð 2ðn	ð 1ðn	ð +ðn	ð ôn	r+   