Ë
    µŒj+  ã                   óú   — d Z ddlZddlmZ ddlmZmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZ  ej6                  e«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z y)z.Tools for interacting with a Power BI dataset.é    N)Úperf_counter)ÚAnyÚDictÚOptionalÚTuple)ÚAsyncCallbackManagerForToolRunÚCallbackManagerForToolRun)ÚBaseTool)Ú
ConfigDictÚFieldÚmodel_validator)Ú_import_tiktoken)ÚBAD_REQUEST_RESPONSEÚDEFAULT_FEWSHOT_EXAMPLESÚRETRY_RESPONSE)ÚPowerBIDatasetÚ
json_to_mdc            	       ó¬  — e Zd ZU dZdZeed<   dZeed<   dZe	ed<    e
d¬	«      Zeed
<   eZee   ed<    e
ed¬«      Zeee	f   ed<   dZeed<   dZeed<   dZee   ed<    ed¬«      Z ed¬«      ededefd„«       «       Zdedee   fd„Z	 d#dedee   de	defd„Z	 d#dedee   de	defd„Z deee	f   de!ee   ee	   f   fd „Z"d!ede!e#ef   fd"„Z$y)$ÚQueryPowerBIToolz%Tool for querying a Power BI Dataset.Úquery_powerbiÚnamea  
    Input to this tool is a detailed question about the dataset, output is a result from the dataset. It will try to answer the question using the dataset, and if it cannot, it will ask for clarification.

    Example Input: "How many rows are in table1?"
    ÚdescriptionNÚ	llm_chainT©ÚexcludeÚpowerbiÚexamples)Údefault_factoryr   Úsession_cacheé   Úmax_iterationsi   Úoutput_token_limitÚtiktoken_model_name©Úarbitrary_types_allowedÚbefore)ÚmodeÚvaluesÚreturnc                 óŽ   — |d   }|j                   j                  D ]&  }|dvsŒt        d|j                   j                  «      ‚ |S )z8Make sure the LLM chain has the correct input variables.r   )Ú
tool_inputÚtablesÚschemasr   zrLLM chain for QueryPowerBITool must have input variables ['tool_input', 'tables', 'schemas', 'examples'], found %s)ÚpromptÚinput_variablesÚ
ValueError)Úclsr(   r   Úvars       úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/tools/powerbi/tool.pyÚ"validate_llm_chain_input_variablesz3QueryPowerBITool.validate_llm_chain_input_variables.   sV   € ð ˜;Ñ'ˆ	Ø×#Ñ#×3Ô3ˆCØÐIÒIÜ ð IØ×$Ñ$×4Ñ4óð ð 4ð ˆó    r+   c                 ó>   — || j                   vry| j                   |   S )z�Check if the input is present in the cache.

        If the value is a bad request, overwrite with the escalated version,
        if not present return None.N)r   )Úselfr+   s     r3   Ú_check_cachezQueryPowerBITool._check_cache=   s&   € ð
 ˜T×/Ñ/Ñ/ØØ×!Ñ! *Ñ-Ð-r5   Úrun_managerÚkwargsc                 ó€  — | j                  |«      x}rt        j                  d||«       |S 	 t        j                  d|«       | j                  j                  || j                  j                  «       | j                  j                  «       | j                  |r|j                  «       nd¬«      }|dk(  r|| j                  |<   | j                  |   S t        j                  d|«       t        «       }| j                  j                  |¬«      }t        «       }	t        j                  d	|«       t        j                  d
|	|z
  d›�«       | j                  |«      \  }
}|�"d|v rd| j                  |<   | j                  |   S |j!                  dd«      }|r<|| j"                  k  r-| j%                  t'        j(                  |||¬«      ||dz   ¬«      S |
r|
nt+        j(                  |¬«      | j                  |<   | j                  |   S # t        $ r+}d|› �| j                  |<   | j                  |   cY d}~S d}~ww xY w)ú:Execute the query, return the results or an error message.úFound cached result for %s: %sú%Running PBI Query Tool with input: %sN©r+   r,   r-   r   Ú	callbacksúError on call to LLM: úI cannot answer thiszPBI Query:
%s©ÚcommandúPBI Result: %súPBI Query duration: ú0.6fÚTokenExpiredzCAuthentication token expired or invalid, please try reauthenticate.Ú
iterationsr   ©r+   ÚqueryÚerroré   ©r+   r9   rI   ©rL   )r8   ÚloggerÚdebugÚinfor   Úpredictr   Úget_table_namesÚget_schemasr   Ú	get_childÚ	Exceptionr   r   ÚrunÚ_parse_outputÚgetr!   Ú_runr   Úformatr   ©r7   r+   r9   r:   ÚcacherK   ÚexcÚ
start_timeÚ
pbi_resultÚend_timeÚresultrL   rI   s                r3   r[   zQueryPowerBITool._runF   s3  € ð ×%Ñ% jÓ1Ð1ˆ5Ð1Ü�L‰LÐ9¸:ÀuÔMØˆLð	2Ü�K‰KÐ?ÀÔLØ—N‘N×*Ñ*Ø%Ø—|‘|×3Ñ3Ó5ØŸ™×0Ñ0Ó2ØŸ™Ù5@˜+×/Ñ/Ô1Àdð +ó ˆEð Ð*Ò*Ø-2ˆD×Ñ˜zÑ*Ø×%Ñ% jÑ1Ð1Ü�‰Ð$ eÔ,Ü!“^ˆ
Ø—\‘\×%Ñ%¨eÐ%Ó4ˆ
Ü“>ˆÜ�‰Ð% zÔ2Ü�‰Ð+¨H°zÑ,AÀ$Ð+GÐHÔIØ×*Ñ*¨:Ó6‰ˆ�ØÐ °5Ñ!8àUð ×Ñ˜zÑ*ð ×%Ñ% jÑ1Ð1à—Z‘Z ¨aÓ0ˆ
Ù�Z $×"5Ñ"5Ò5Ø—9‘9Ü)×0Ñ0Ø)°¸eôð (Ø%¨™>ð ó ð ñ ‰FÔ"6×"=Ñ"=ÀEÔ"Jð 	×Ñ˜:Ñ&ð ×!Ñ! *Ñ-Ð-øôA ò 	2Ø/EÀcÀUÐ-KˆD×Ñ˜zÑ*Ø×%Ñ% jÑ1Õ1ûð	2ús   ®BH	 È		H=È H8È2H=È8H=c              ‹   óÖ  K  — | j                  |«      x}rt        j                  d||«       |› d�S 	 t        j                  d|«       | j                  j                  || j                  j                  «       | j                  j                  «       | j                  |r|j                  «       nd¬«      ƒ d{  –—† }|dk(  r|| j                  |<   | j                  |   S t        j                  d|«       t        «       }| j                  j                  |¬	«      ƒ d{  –—† }t        «       }	t        j                  d
|«       t        j                  d|	|z
  d›�«       | j                  |«      \  }
}|�&d|v sd|v rd| j                  |<   | j                  |   S |j!                  dd«      }|rD|| j"                  k  r5| j%                  t'        j(                  |||¬«      ||dz   ¬«      ƒ d{  –—† S |
r|
nt+        j(                  |¬«      | j                  |<   | j                  |   S 7 �Œr# t        $ r+}d|› �| j                  |<   | j                  |   cY d}~S d}~ww xY w7 �ŒE7 Œw­w)r<   r=   z3, from cache, you have already asked this question.r>   Nr?   rA   rB   zPBI Query: %srC   rE   rF   rG   rH   Ú
TokenErrorzkAuthentication token expired or invalid, please try to reauthenticate or check the scope of the credential.rI   r   rJ   rM   rN   rO   )r8   rP   rQ   rR   r   Úapredictr   rT   rU   r   rV   rW   r   r   ÚarunrY   rZ   r!   Ú_arunr   r\   r   r]   s                r3   rh   zQueryPowerBITool._arun|   sc  è ø€ ð ×%Ñ% jÓ1Ð1ˆ5Ð1Ü�L‰LÐ9¸:ÀuÔMØ�WÐOÐPÐPð	2Ü�K‰KÐ?ÀÔLØŸ.™.×1Ñ1Ø%Ø—|‘|×3Ñ3Ó5ØŸ™×0Ñ0Ó2ØŸ™Ù5@˜+×/Ñ/Ô1Àdð 2ó ÷ ˆEð Ð*Ò*Ø-2ˆD×Ñ˜zÑ*Ø×%Ñ% jÑ1Ð1Ü�‰�O UÔ+Ü!“^ˆ
ØŸ<™<×,Ñ,°UÐ,Ó;×;ˆ
Ü“>ˆÜ�‰Ð% zÔ2Ü�‰Ð+¨H°zÑ,AÀ$Ð+GÐHÔIØ×*Ñ*¨:Ó6‰ˆ�ØÐ .°EÑ"9¸\ÈUÑ=Rà}ð ×Ñ˜zÑ*ð ×%Ñ% jÑ1Ð1à—Z‘Z ¨aÓ0ˆ
Ù�Z $×"5Ñ"5Ò5ØŸ™Ü)×0Ñ0Ø)°¸eôð (Ø%¨™>ð $ó ÷ ð ñ ‰FÔ"6×"=Ñ"=ÀEÔ"Jð 	×Ñ˜:Ñ&ð ×!Ñ! *Ñ-Ð-ðQúô ò 	2Ø/EÀcÀUÐ-KˆD×Ñ˜zÑ*Ø×%Ñ% jÑ1Õ1ûð	2úð <ùðúsg   ‚0I)³BH- Â8H*Â9H- Â=A"I)ÄI$Ä CI)Ç/I'Ç0:I)È*H- È-	I!È6 IÉI!ÉI)ÉI!É!I)É'I)ra   c                 óN  — d|v ro|d   d   d   d   d   }t        |«      dk(  rt        j                  d«       yt        |«      }| j	                  |«      \  }}|rd|› d| j
                  › d	�d
fS |d
fS d|v r+d|d   v rd|d   d   v rd
|d   d   d   d   d   fS d
|d   fS d
|fS )z2Parse the output of the query to a markdown table.Úresultsr   r,   Úrowsz%0 records in result, query was valid.)Nz^0 rows returned, this might be correct, but please validate if all filter values were correct?z[Result too large, please try to be more specific or use the `TOPN` function. The result is z tokens long, the limit is z tokens.NrL   z	pbi.errorÚdetailsÚdetail)ÚlenrP   rR   r   Ú_result_too_larger"   )r7   ra   rk   rc   Útoo_longÚlengths         r3   rY   zQueryPowerBITool._parse_output²   s#  € ð ˜
Ñ"Ø˜iÑ(¨Ñ+¨HÑ5°aÑ8¸Ñ@ˆDÜ�4‹y˜AŠ~Ü—‘ÐCÔDðô   Ó%ˆFØ#×5Ñ5°fÓ=ÑˆH�fÙàqÐrxÐqyð  zUð  VZ÷  Vmñ  Vmð  Unð  nvð  wØðð ð ˜4�<Ðà�jÑ à˜z¨'Ñ2Ñ2Ø ¨GÑ!4°[Ñ!AÑAà˜Z¨Ñ0°Ñ=¸iÑHÈÑKÈHÑUÐUÐUØ˜ GÑ,Ð,Ð,Ø�ZÐÐr5   rc   c                 óè   — | j                   rft        «       }|j                  | j                   «      }t        |j	                  |«      «      }t
        j                  d|«       || j                  kD  |fS y)z!Tokenize the output of the query.zResult length: %s)Fr   )r#   r   Úencoding_for_modelrn   ÚencoderP   rR   r"   )r7   rc   Ú	tiktoken_Úencodingrq   s        r3   ro   z"QueryPowerBITool._result_too_largeÐ   sd   € à×#Ò#Ü(Ó*ˆIØ ×3Ñ3°D×4LÑ4LÓMˆHÜ˜Ÿ™¨Ó0Ó1ˆFÜ�K‰KÐ+¨VÔ4Ø˜D×3Ñ3Ñ3°VÐ;Ð;Ør5   ©N)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚ__annotations__r   r   r   r   r   r   r   r   r   Údictr   r   r!   Úintr"   r#   r   Úmodel_configr   Úclassmethodr4   r8   r	   r[   r   rh   r   rY   Úboolro   © r5   r3   r   r      s”  … Ù/à€Dˆ#Óð€K�ó ð
 €IˆsÓÙ#¨DÔ1€Gˆ^Ó1Ø6€Hˆh�s‰mÓ6Ù$)¸$ÈÔ$M€M�4˜˜S˜‘>ÓMØ€N�CÓØ"Ð˜Ó"Ø)-Ð˜ #™Ó-áØ $ô€Lñ ˜(Ô#ØðØðà	òó ó $ðð. sð .¨x¸©}ó .ð <@ñ4.àð4.ð Ð7Ñ8ð4.ð ð	4.ð
 
ó4.ðr AEñ4.àð4.ð Ð<Ñ=ð4.ð ð	4.ð
 
ó4.ðl Ø˜s C˜x™.ð à	ˆx˜‰}˜h s™mÐ+Ñ	,ó ð<¨ð °°d¸C°iÑ0@ô r5   r   c                   ó˜   — e Zd ZU dZdZeed<   dZeed<    ed¬«      Z	e
ed<    ed¬	«      Z	 ddedee   defd„Z	 ddedee   defd„Zy
)ÚInfoPowerBIToolz2Tool for getting metadata about a PowerBI Dataset.Úschema_powerbir   zö
    Input to this tool is a comma-separated list of tables, output is the schema and sample rows for those tables.
    Be sure that the tables actually exist by calling list_tables_powerbi first!

    Example Input: "table1, table2, table3"
    r   Tr   r   r$   Nr+   r9   r)   c                 óV   — | j                   j                  |j                  d«      «      S )z4Get the schema for tables in a comma-separated list.ú, )r   Úget_table_infoÚsplit©r7   r+   r9   s      r3   r[   zInfoPowerBITool._runë   s$   € ð �|‰|×*Ñ*¨:×+;Ñ+;¸DÓ+AÓBÐBr5   c              ƒ   ór   K  — | j                   j                  |j                  d«      «      ƒ d {  –—† S 7 Œ­w)Nrˆ   )r   Úaget_table_inforŠ   r‹   s      r3   rh   zInfoPowerBITool._arunó   s.   è ø€ ð
 —\‘\×1Ñ1°*×2BÑ2BÀ4Ó2HÓI×IÐIÐIús   ‚.7°5±7rw   ©rx   ry   rz   r{   r   r|   r}   r   r   r   r   r   r€   r   r	   r[   r   rh   rƒ   r5   r3   r…   r…   Û   sž   … Ù<à €Dˆ#Ó ð€K�ó ñ $¨DÔ1€Gˆ^Ó1áØ $ô€Lð <@ñCàðCð Ð7Ñ8ðCð 
ó	Cð AEñJàðJð Ð<Ñ=ðJð 
ô	Jr5   r…   c                   ó¨   — e Zd ZU dZdZeed<   dZeed<    ed¬«      Z	e
ed<    ed¬	«      Z	 	 ddee   dee   defd„Z	 	 ddee   dee   defd„Zy
)ÚListPowerBIToolzTool for getting tables names.Úlist_tables_powerbir   zUInput is an empty string, output is a comma separated list of tables in the database.r   Tr   r   r$   Nr+   r9   r)   c                 óT   — dj                  | j                  j                  «       «      S ©zGet the names of the tables.rˆ   ©Újoinr   rT   r‹   s      r3   r[   zListPowerBITool._run  s    € ð �y‰y˜Ÿ™×5Ñ5Ó7Ó8Ð8r5   c              ƒ   ó\   K  — dj                  | j                  j                  «       «      S ­wr“   r”   r‹   s      r3   rh   zListPowerBITool._arun  s$   è ø€ ð �y‰y˜Ÿ™×5Ñ5Ó7Ó8Ð8ùs   ‚*,)NNrŽ   rƒ   r5   r3   r�   r�   û   s›   … Ù(à%€Dˆ#Ó%Øn€K�ÓnÙ#¨DÔ1€Gˆ^Ó1áØ $ô€Lð %)Ø;?ñ9à˜S‘Mð9ð Ð7Ñ8ð9ð 
ó	9ð %)Ø@Dñ9à˜S‘Mð9ð Ð<Ñ=ð9ð 
ô	9r5   r�   )!r{   ÚloggingÚtimer   Útypingr   r   r   r   Úlangchain_core.callbacksr   r	   Úlangchain_core.toolsr
   Úpydanticr   r   r   Ú&langchain_community.chat_models.openair   Ú(langchain_community.tools.powerbi.promptr   r   r   Ú%langchain_community.utilities.powerbir   r   Ú	getLoggerrx   rP   r   r…   r�   rƒ   r5   r3   Ú<module>r¡      ss   ðÙ 4ã Ý ß -Ó -÷õ *ß 7Ñ 7å C÷ñ ÷
 Mà	ˆ×	Ñ	˜8Ó	$€ô�xô ôDJ�hô Jô@9�hõ 9r5   