Ë
    õ¡Ÿj9"  ã                  óB  — U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ  ej                   e«      Zd	Z ed
h«      ZddddœZded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zd
dœ	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd
dœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy)z 
author: Yagnik Poshiya
organization: Webbrains Technologies Private Limited

Optional LlamaIndex SQL path (kept separate from custom 3-LLM SQL orchestration).
é    )ÚannotationsN)ÚAny)Ú
quote_plus)Úverify_sql_result)ÚSettings)ÚLLMUsageé   Úmysqlzmysql+pymysqlzpostgresql+psycopg2)r
   Ú
postgresqlÚpostgreszdict[str, str]Ú_SQLALCHEMY_DRIVERSc                ó†   — t         j                  | t         d   «      }|› dt        |«      › dt        |«      › d|› d|› d|› �S )Nr
   z://ú:ú@ú/)r   Úgetr   )ÚdialectÚuserÚpasswordÚhostÚportÚdatabaseÚdrivers          úL/var/www/html/agent-engine/apps/agents/rag-agent/src/agent/sql_llamaindex.pyÚ_build_connection_urir   !   sS   € ô !×$Ñ$ WÔ.AÀ'Ñ.JÓK€FØˆX�Sœ DÓ)Ð*¨!¬J°xÓ,@Ð+AÀÀ4À&ÈÈ$ÈÈqÐQYÐPZÐ[Ð[ó    c                ó   — | dv ryy)N)r   r   Ú
PostgreSQLÚMySQL© ©r   s    r   Ú_dialect_labelr"   (   s   € ØÐ,Ñ,ØØr   c                óÎ  — t        | dd «      }t        |t        «      rZdD ]U  }|j                  |«      }t        |t        «      sŒ%|j                  «       sŒ6|j                  «       j                  d«      c S  t	        t        | d| «      xs d«      j                  «       }t        j                  d|«      }|r.|j                  d«      j                  «       j                  d«      S y)NÚmetadata)Ú	sql_queryÚsqlÚqueryú;ÚresponseÚ z(?is)\bselect\b.+r   )
ÚgetattrÚ
isinstanceÚdictr   ÚstrÚstripÚrstripÚreÚsearchÚgroup)Úrespr$   ÚkeyÚvalÚtextÚms         r   Ú%_extract_sql_from_llamaindex_responser9   .   s¼   € Ü�t˜Z¨Ó.€HÜ�(œDÔ!Ø0ò 	/ˆCØ—,‘,˜sÓ#ˆCÜ˜#œsÕ#¨¯	©	­Ø—y‘y“{×)Ñ)¨#Ó.Ò.ð	/ô
 Œw�t˜Z¨Ó.Ò4°"Ó5×;Ñ;Ó=€Dä
�	‰	Ð&¨Ó-€AÙØ�w‰w�q‹z×ÑÓ!×(Ñ(¨Ó-Ð-Ør   r!   c          	     óØ  — t        | j                  xs d«      j                  «       j                  «       }t	        |«      }	 ddlm} ddlm}	m	}
 ddl
m} 	 ddlm}  |d¬	«      |
_        |d
k(  rRt        | j$                  xs d«      j                  «       }|st        d«      ‚	 ddlm}  || j*                  |d¬«      }�n|dk(  rQt        | j,                  xs d«      j                  «       }|st        d«      ‚	 ddlm}  || j*                  |d¬«      }n¹|dk(  rQt        | j2                  xs d«      j                  «       }|st        d«      ‚	 ddlm}  || j*                  |d¬«      }nc|dk(  rSt        | j8                  xs d«      j                  «       }|st        d«      ‚	 ddlm}  || j*                  |ddd¬«      }nt        d«      ‚ ||«      } |	|t?        |«      ¬ «      } ||t?        |«      |d!¬"«      }d#|› d$d%jA                  t?        |«      «      › d&|› d'|› d(�	}|jC                  |«      }tE        |«      S # t        $ r}t        d«      |‚d }~ww xY w# t"        $ r d |
_        Y �Œ	w xY w# t        $ r}t        d«      |‚d }~ww xY w# t        $ r}t        d«      |‚d }~ww xY w# t        $ r}t        d«      |‚d }~ww xY w# t        $ r}t        d«      |‚d }~ww xY w))Nr*   r   )Úcreate_engine)ÚSQLDatabaser   )ÚNLSQLTableQueryEnginezULlamaIndex dependencies are not installed. Install llama-index + sqlalchemy packages.)ÚMockEmbeddingé   )Ú	embed_dimÚopenaizBOPENAI_LLM_API_KEY is required for LLAMAINDEX_SQL_PROVIDER=openai.)ÚOpenAIz,Missing dependency: llama-index-llms-openai.g        )ÚmodelÚapi_keyÚtemperatureÚgooglezBGOOGLE_LLM_API_KEY is required for LLAMAINDEX_SQL_PROVIDER=google.)ÚGoogleGenAIz2Missing dependency: llama-index-llms-google-genai.Ú	anthropiczHANTHROPIC_LLM_API_KEY is required for LLAMAINDEX_SQL_PROVIDER=anthropic.)Ú	Anthropicz/Missing dependency: llama-index-llms-anthropic.Ú
openrouterzJOPENROUTER_LLM_API_KEY is required for LLAMAINDEX_SQL_PROVIDER=openrouter.)Ú
OpenAILikez1Missing dependency: llama-index-llms-openai-like.zhttps://openrouter.ai/api/v1T)rC   rD   Úapi_baseÚis_chat_modelrE   zVUnsupported LLAMAINDEX_SQL_PROVIDER. Supported: google, openai, anthropic, openrouter.)ÚengineÚinclude_tablesF)Úsql_databaseÚtablesÚllmÚsynthesize_responsezGenerate exactly one z5 SELECT query.
Use ONLY tables from this allow-list: ú, z
Schema details:
z

Visitor question:
ú
)#r.   Úllamaindex_sql_providerr/   Úlowerr"   Ú
sqlalchemyr;   Úllama_index.corer<   r   Úllama_index.core.query_enginer=   Ú	ExceptionÚ
ValueErrorÚllama_index.core.embeddingsr>   Úembed_modelÚImportErrorÚopenai_llm_api_keyÚllama_index.llms.openairB   Úllamaindex_sql_modelÚgoogle_llm_api_keyÚllama_index.llms.google_genairG   Úanthropic_llm_api_keyÚllama_index.llms.anthropicrI   Úopenrouter_llm_api_keyÚllama_index.llms.openai_likerK   ÚsortedÚjoinr'   r9   )ÚsettingsÚuser_messageÚschema_detailÚallowÚconnection_urir   ÚproviderÚlabelr;   r<   ÚLlamaSettingsr=   Úer>   rD   rB   rR   rG   rI   rK   rN   Úsql_dbÚquery_engineÚpromptr4   s                            r   Ú_llamaindex_generate_sqlrw   >   s+  € ô �8×3Ñ3Ò9°rÓ:×@Ñ@ÓB×HÑHÓJ€HÜ˜7Ó#€EðÝ,ßKÝGð)Ý=Ù$1¸AÔ$>ˆÔ!ð
 �8ÒÜ�h×1Ñ1Ò7°RÓ8×>Ñ>Ó@ˆÙÜÐaÓbÐbð	TÝ6ñ ˜8×8Ñ8À'ÐWZÔ[ŠØ	�XÒ	Ü�h×1Ñ1Ò7°RÓ8×>Ñ>Ó@ˆÙÜÐaÓbÐbð	ZÝAñ  × =Ñ =ÀwÐ\_Ô`‰Ø	�[Ò	 Ü�h×4Ñ4Ò:¸Ó;×AÑAÓCˆÙÜÐgÓhÐhð	WÝ<ñ ˜h×;Ñ;ÀWÐZ]Ô^‰Ø	�\Ò	!Ü�h×5Ñ5Ò;¸Ó<×BÑBÓDˆÙÜÐiÓjÐjð	YÝ?ñ Ø×/Ñ/ØØ3ØØô
‰ô Ødó
ð 	
ñ ˜>Ó*€FÙ ´v¸e³}ÔE€Fá(ØÜ�e‹}ØØ!ô	€Lð ' u gð .'Ø'+§y¡y´¸³Ó'?Ð&@ð Aà€ð ð €ð ð€Fð ×Ñ˜fÓ%€DÜ0°Ó6Ð6øô_ ò Üð9ó
ð ð	ûðûô ò )Ø$(ˆ×!ð)ûô ò 	TÜÐKÓLÐRSÐSûð	Tûô ò 	ZÜÐQÓRÐXYÐYûð	Zûô ò 	WÜÐNÓOÐUVÐVûð	Wûô ò 	YÜÐPÓQÐWXÐXûð	YúsŠ   ÁI ÁI! Â%I8 Ã<J ÅJ2 Æ(K É	IÉIÉIÉ!I5É4I5É8	JÊJÊJÊ	J/ÊJ*Ê*J/Ê2	KÊ;KËKË	K)ËK$Ë$K)c               ól  — |t         vr.t        d|› ddj                  t        t         «      «      › d�«      ‚ddlm} d}d}	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        ||||||«      }t        t        «      D �]  }t        | |||||¬«      }	|	st        j                  d||«        nét        j!                  d||	|«       	  |||||||	|t        |j                  d«      xs d«      t        |j                  d«      xs d«      d¬«
      \  }}|r t#        j$                  ||dœdt        ¬«      }nd}t'        | |||	|¬«      \  }}|j                  d«      dk(  r n6|j                  d «      xs |j                  d!«      xs |}
|
s�Œ|› d"|
› �}�Œ ||	|fS # t        $ r(}t        j                  d|||«       d|› d�}Y d}~Œ�d}~ww xY w)#zÆ
    LlamaIndex SQL pipeline for live databases (dialect-aware).
    Returns (db_answer, sql_used, usage).
    Usage is currently zero-filled since provider usage extraction differs by backend.
    z6LlamaIndex SQL pipeline does not yet support dialect 'z'. Supported: rT   ú.r   )Úrun_select_mysqlr*   NÚusernamer   r   r   iê  )rl   rm   rn   ro   r   zGDB pipeline source=llamaindex dialect=%s generated empty SQL attempt=%dzDDB pipeline source=llamaindex dialect=%s generated_sql=%s attempt=%dÚssl_modeÚrequiredÚ
ssl_ca_peméÈ   )
r   r   r   r   r   r&   Úallowed_tablesr|   r~   Úmax_rows)ÚcolumnsÚrowsF)Úensure_asciiÚdefaultz[Query returned 0 rows]zADB pipeline source=llamaindex dialect=%s exec_error=%s attempt=%dz[SQL error: ú])rl   rm   r&   Úquery_resultÚverdictÚpassÚfeedbackÚreasonz

Previous issue: )Ú_SUPPORTED_DIALECTSr\   rj   ri   Úagent.mysql_runnerrz   r   r.   r   Úintr   ÚrangeÚMAX_LLAMAINDEX_ATTEMPTSrw   ÚloggerÚwarningÚinfoÚjsonÚdumpsr   )rk   rl   rm   Údb_labelÚlive_ctxrn   r   rz   Ú	db_answerÚsql_usedÚ
prev_errorÚusager   r   r   r   ro   ÚattemptÚcolsrƒ   rs   rˆ   Ú_s                          r   Úrun_llamaindex_live_sqlrŸ       sh  € ð Ô)Ñ)ÜØDÀWÀIð NØŸ)™)¤FÔ+>Ó$?Ó@ÐAÀðDó
ð 	
õ
 4à€IØ€HØ!€JÜ‹J€Eäˆx�|‰|˜JÓ'Ò-¨2Ó.€DÜ�8—<‘< 
Ó+Ò1¨rÓ2€HÜˆx�|‰|˜FÓ#Ò) rÓ*€DÜˆx�|‰|˜FÓ#Ò+ tÓ,€DÜ*¨7°D¸(ÀDÈ$ÐPXÓY€NäÔ0Ó1ó 3MˆÜ+ØØ%Ø'ØØ)Øô
ˆñ Ü�N‰NÐdÐfmÐovÔwÙÜ�‰ÐZÐ\cÐemÐovÔwð	,Ù)ØØØØ!Ø!ØØ$Ü˜XŸ\™\¨*Ó5ÒC¸ÓDÜ˜xŸ|™|¨LÓ9Ò?¸RÓ@Øô‰JˆD�$ñ Ü ŸJ™JØ $¨dÑ3Ø!&Üô‘	ð 6�	ô
 'ØØ%Ø'ØØ"ô
‰
ˆ�ð �;‰;�yÓ! VÒ+Ùà—[‘[ Ó,ÒR°·±¸HÓ0EÒRÈˆ
ÛØ*˜^Ð+?À
¸|ÐLŠLðg3Mðj �h Ð%Ð%øô% ò 	,Ü�N‰NÐ^Ð`gÐijÐlsÔtØ& q c¨Ð+�Iûð	,ús   Ä-A1HÈ	H3ÈH.È.H3)r   r.   r   r.   r   r.   r   r.   r   rŽ   r   r.   Úreturnr.   )r   r.   r    r.   )r4   r   r    r.   )rk   r   rl   r.   rm   r.   rn   úset[str]ro   r.   r   r.   r    r.   )rk   r   rl   r.   rm   r.   r–   r.   r—   zdict[str, Any]rn   r¡   r   r.   r    ztuple[str, str, LLMUsage])Ú__doc__Ú
__future__r   r”   Úloggingr1   Útypingr   Úurllib.parser   Úagent.sql_verifierr   Úconfig.settingsr   Úllm.baser   Ú	getLoggerÚ__name__r‘   r�   Ú	frozensetrŒ   r   Ú__annotations__r   r"   r9   rw   rŸ   r    r   r   ú<module>r®      sm  ðòõ #ã Û Û 	Ý Ý #å 0Ý $Ý à	ˆ×	Ñ	˜8Ó	$€àÐ á  	Ó*Ð ð Ø'Ø%ñ'Ð �^ó ð\Øð\Øð\Ø'*ð\Ø25ð\Ø=@ð\ØLOð\àó\óóð. ñ_7Øð_7ð ð_7ð ð	_7ð
 ð_7ð ð_7ð ð_7ð 	ó_7ðT ñW&ØðW&ð ðW&ð ð	W&ð
 ðW&ð ðW&ð ðW&ð ðW&ð ôW&r   