§
    šŠtj,  ã                   ó
  — 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mZmZ dd	lmZmZ  ej        e¦  «        Zd
efd„Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )z.Tools for interacting with a Power BI dataset.é    N)Úperf_counter)ÚAnyÚDictÚOptionalÚTuple)ÚAsyncCallbackManagerForToolRunÚCallbackManagerForToolRun)ÚBaseTool)Ú
ConfigDictÚFieldÚmodel_validator)ÚBAD_REQUEST_RESPONSEÚDEFAULT_FEWSHOT_EXAMPLESÚRETRY_RESPONSE)ÚPowerBIDatasetÚ
json_to_mdÚreturnc                  óL   — 	 dd l } n# t          $ r t          d¦  «        ‚w xY w| S )Nr   zŒCould not import tiktoken python package. This is needed in order to calculate get_token_ids. Please install it with `pip install tiktoken`.)ÚtiktokenÚImportError)r   s    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/tools/powerbi/tool.pyÚ_import_tiktokenr      sK   € ð
ØˆˆˆˆøÝð 
ð 
ð 
Ýð=ñ
ô 
ð 	
ð
øøøð €Os   ‚ ‡!c            	       ó  — 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$dS )$Ú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Úvaluesr   c                 óp   — |d         }|j         j        D ] }|dvr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       r   Ú"validate_llm_chain_input_variablesz3QueryPowerBITool.validate_llm_chain_input_variables9   s]   € ð ˜;Ô'ˆ	ØÔ#Ô3ð 	ð 	ˆCØÐIÐIÐIÝ ð IØÔ$Ô4ñô ð ð Jð
 ˆó    r/   c                 ó2   — || j         vrdS | 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     r   Ú_check_cachezQueryPowerBITool._check_cacheH   s%   € ð
 ˜TÔ/Ð/Ð/Ø�4ØÔ! *Ô-Ð-r8   Úrun_managerÚkwargsc                 óš  — |                       |¦  «        x}rt                               d||¦  «         |S 	 t                               d|¦  «         | j                             || j                             ¦   «         | j                             ¦   «         | j	        |r| 
                    ¦   «         nd¬¦  «        }n1# t          $ r$}d|› �| j        |<   | j        |         cY d}~S d}~ww xY w|dk    r|| j        |<   | j        |         S t                               d|¦  «         t          ¦   «         }| j                             |¬¦  «        }t          ¦   «         }	t                               d	|¦  «         t                               d
|	|z
  d›�¦  «         |                      |¦  «        \  }
}|�d|v rd| j        |<   | j        |         S |                     dd¦  «        }|r;|| j        k     r0|                      t'          j        |||¬¦  «        ||dz   ¬¦  «        S |
r|
nt+          j        |¬¦  «        | j        |<   | j        |         S )ú:Execute the query, return the results or an error message.úFound cached result for %s: %sú%Running PBI Query Tool with input: %sN©r/   r0   r1   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/   r<   rL   ©rO   )r;   ÚloggerÚdebugÚinfor   Úpredictr!   Úget_table_namesÚget_schemasr"   Ú	get_childÚ	Exceptionr$   r   ÚrunÚ_parse_outputÚgetr&   Ú_runr   Úformatr   ©r:   r/   r<   r=   ÚcacherN   ÚexcÚ
start_timeÚ
pbi_resultÚend_timeÚresultrO   rL   s                r   r^   zQueryPowerBITool._runQ   s•  € ð ×%Ò% jÑ1Ô1Ð1ˆ5ð 	Ý�LŠLÐ9¸:ÀuÑMÔMÐMØˆLð	2Ý�KŠKÐ?ÀÑLÔLÐLØ”N×*Ò*Ø%Ø”|×3Ò3Ñ5Ô5Øœ×0Ò0Ñ2Ô2ØœØ5@ÐJ˜+×/Ò/Ñ1Ô1Ð1Àdð +ñ ô ˆEˆEøõ ð 	2ð 	2ð 	2Ø-KÀcÐ-KÐ-KˆDÔ˜zÑ*ØÔ% jÔ1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð	2øøøð Ð*Ò*Ð*Ø-2ˆDÔ˜zÑ*ØÔ% jÔ1Ð1Ý�ŠÐ$ eÑ,Ô,Ð,Ý!‘^”^ˆ
Ø”\×%Ò%¨eÐ%Ñ4Ô4ˆ
Ý‘>”>ˆÝ�ŠÐ% zÑ2Ô2Ð2Ý�ŠÐH¨H°zÑ,AÐHÐHÐHÑIÔIÐIØ×*Ò*¨:Ñ6Ô6‰ˆ�ØÐ °5Ð!8Ð!8àUð Ô˜zÑ*ð Ô% jÔ1Ð1à—Z’Z ¨aÑ0Ô0ˆ
Øð 	�Z $Ô"5Ò5Ð5Ø—9’9Ý)Ô0Ø)°¸eðñ ô ð (Ø%¨™>ð ñ ô ð ð ÐJˆFˆFÕ"6Ô"=ÀEÐ"JÑ"JÔ"Jð 	Ô˜:Ñ&ð Ô! *Ô-Ð-s   ·BB; Â;
C)ÃC$ÃC)Ã$C)c              ‹   óÐ  K  — |                       |¦  «        x}r!t                               d||¦  «         |› d�S 	 t                               d|¦  «         | j                             || j                             ¦   «         | j                             ¦   «         | j	        |r| 
                    ¦   «         nd¬¦  «        ƒ d{V —†}n1# t          $ r$}d|› �| j        |<   | j        |         cY d}~S d}~ww xY w|dk    r|| j        |<   | j        |         S t                               d|¦  «         t          ¦   «         }| j                             |¬	¦  «        ƒ d{V —†}t          ¦   «         }	t                               d
|¦  «         t                               d|	|z
  d›�¦  «         |                      |¦  «        \  }
}|�d|v sd|v rd| j        |<   | j        |         S |                     dd¦  «        }|rA|| j        k     r6|                      t'          j        |||¬¦  «        ||dz   ¬¦  «        ƒ d{V —†S |
r|
nt+          j        |¬¦  «        | j        |<   | j        |         S )r?   r@   z3, from cache, you have already asked this question.rA   NrB   rD   rE   zPBI Query: %srF   rH   rI   rJ   rK   Ú
TokenErrorzkAuthentication token expired or invalid, please try to reauthenticate or check the scope of the credential.rL   r   rM   rP   rQ   rR   )r;   rS   rT   rU   r   Úapredictr!   rW   rX   r"   rY   rZ   r$   r   Úarunr\   r]   r&   Ú_arunr   r_   r   r`   s                r   rk   zQueryPowerBITool._arun‡   sû  è è € ð ×%Ò% jÑ1Ô1Ð1ˆ5ð 	QÝ�LŠLÐ9¸:ÀuÑMÔMÐMØÐPÐPÐPÐPð	2Ý�KŠKÐ?ÀÑLÔLÐLØœ.×1Ò1Ø%Ø”|×3Ò3Ñ5Ô5Øœ×0Ò0Ñ2Ô2ØœØ5@ÐJ˜+×/Ò/Ñ1Ô1Ð1Àdð 2ñ ô ð ð ð ð ð ð ˆEˆEøõ ð 	2ð 	2ð 	2Ø-KÀcÐ-KÐ-KˆDÔ˜zÑ*ØÔ% jÔ1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð	2øøøð Ð*Ò*Ð*Ø-2ˆDÔ˜zÑ*ØÔ% jÔ1Ð1Ý�Š�O UÑ+Ô+Ð+Ý!‘^”^ˆ
Øœ<×,Ò,°UÐ,Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;ˆ
Ý‘>”>ˆÝ�ŠÐ% zÑ2Ô2Ð2Ý�ŠÐH¨H°zÑ,AÐHÐHÐHÑIÔIÐIØ×*Ò*¨:Ñ6Ô6‰ˆ�ØÐ .°EÐ"9Ð"9¸\ÈUÐ=RÐ=Rà}ð Ô˜zÑ*ð Ô% jÔ1Ð1à—Z’Z ¨aÑ0Ô0ˆ
Øð 	�Z $Ô"5Ò5Ð5ØŸšÝ)Ô0Ø)°¸eðñ ô ð (Ø%¨™>ð $ñ ô ð ð ð ð ð ð ð ð ÐJˆFˆFÕ"6Ô"=ÀEÐ"JÑ"JÔ"Jð 	Ô˜:Ñ&ð Ô! *Ô-Ð-s   ¼B	C Ã
C4ÃC/Ã)C4Ã/C4rd   c                 ó¾  — d|v rŒ|d         d         d         d         d         }t          |¦  «        dk    rt                               d¦  «         dS t          |¦  «        }|                      |¦  «        \  }}|rd|› d| j        › d	�d
fS |d
fS d|v rFd|d         v r2d|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   r0   Ú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.NrO   z	pbi.errorÚdetailsÚdetail)ÚlenrS   rU   r   Ú_result_too_larger'   )r:   rd   rn   rf   Útoo_longÚlengths         r   r\   zQueryPowerBITool._parse_output½   sE  € ð ˜
Ð"Ð"Ø˜iÔ(¨Ô+¨HÔ5°aÔ8¸Ô@ˆDÝ�4‰yŒy˜AŠ~ˆ~Ý—’ÐCÑDÔDÐDðð õ   Ñ%Ô%ˆFØ#×5Ò5°fÑ=Ô=ÑˆH�fØð ð wÐrxð  wð  wð  VZô  Vmð  wð  wð  wØðð ð ˜4�<Ðà�jÐ Ð à˜z¨'Ô2Ð2Ð2Ø ¨GÔ!4°[Ô!AÐAÐAà˜Z¨Ô0°Ô=¸iÔHÈÔKÈHÔUÐUÐUØ˜ GÔ,Ð,Ð,Ø�ZÐÐr8   rf   c                 óø   — | j         rrt          ¦   «         }|                     | j         ¦  «        }t          |                     |¦  «        ¦  «        }t
                               d|¦  «         || j        k    |fS dS )z!Tokenize the output of the query.zResult length: %s)Fr   )r(   r   Úencoding_for_modelrq   ÚencoderS   rU   r'   )r:   rf   Ú	tiktoken_Úencodingrt   s        r   rr   z"QueryPowerBITool._result_too_largeÛ   st   € àÔ#ð 	<Ý(Ñ*Ô*ˆIØ ×3Ò3°DÔ4LÑMÔMˆHÝ˜Ÿš¨Ñ0Ô0Ñ1Ô1ˆFÝ�KŠKÐ+¨VÑ4Ô4Ð4Ø˜DÔ3Ò3°VÐ;Ð;Øˆxr8   ©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   Úclassmethodr7   r;   r	   r^   r   rk   r   r\   Úboolrr   © r8   r   r   r   $   sm  € € € € € € Ø/Ð/à€Dˆ#ÐÐÑð€K�ð ð ñ ð
 €IˆsÐÐÑØ#˜e¨DÐ1Ñ1Ô1€Gˆ^Ð1Ð1Ñ1Ø6€Hˆh�sŒmÐ6Ð6Ñ6Ø$) E¸$ÈÐ$MÑ$MÔ$M€M�4˜˜S˜”>ÐMÐMÑMØ€N�CÐÐÑØ"Ð˜Ð"Ð"Ñ"Ø)-Ð˜ #œÐ-Ð-Ñ-à�:Ø $ðñ ô €Lð €_˜(Ð#Ñ#Ô#ØðØðà	ðð ð ñ „[ñ $Ô#ðð. sð .¨x¸¬}ð .ð .ð .ð .ð <@ð4.ð 4.àð4.ð Ð7Ô8ð4.ð ð	4.ð
 
ð4.ð 4.ð 4.ð 4.ðr AEð4.ð 4.àð4.ð Ð<Ô=ð4.ð ð	4.ð
 
ð4.ð 4.ð 4.ð 4.ðl Ø˜s C˜xœ.ð à	ˆx˜Œ}˜h sœmÐ+Ô	,ð ð  ð  ð  ð<¨ð °°d¸C°iÔ0@ð ð ð ð ð ð r8   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d
S )Ú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/   r<   r   c                 ó\   — | j                              |                     d¦  «        ¦  «        S )z4Get the schema for tables in a comma-separated list.ú, )r!   Úget_table_infoÚsplit©r:   r/   r<   s      r   r^   zInfoPowerBITool._runö   s(   € ð Œ|×*Ò*¨:×+;Ò+;¸DÑ+AÔ+AÑBÔBÐBr8   c              ƒ   ól   K  — | j                              |                     d¦  «        ¦  «        ƒ d {V —†S )Nr‹   )r!   Úaget_table_infor�   rŽ   s      r   rk   zInfoPowerBITool._arunþ   s>   è è € ð
 ”\×1Ò1°*×2BÒ2BÀ4Ñ2HÔ2HÑIÔIÐIÐIÐIÐIÐIÐIÐIr8   rz   ©r{   r|   r}   r~   r   r   r€   r   r   r!   r   r   rƒ   r   r	   r^   r   rk   r†   r8   r   rˆ   rˆ   æ   s  € € € € € € Ø<Ð<à €Dˆ#Ð Ð Ñ ð€K�ð ð ñ ð $˜e¨DÐ1Ñ1Ô1€Gˆ^Ð1Ð1Ñ1à�:Ø $ðñ ô €Lð <@ðCð CàðCð Ð7Ô8ðCð 
ð	Cð Cð Cð Cð AEðJð JàðJð Ð<Ô=ðJð 
ð	Jð Jð Jð Jð Jð Jr8   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d
S )Ú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/   r<   r   c                 óZ   — d                      | j                             ¦   «         ¦  «        S ©zGet the names of the tables.r‹   ©Újoinr!   rW   rŽ   s      r   r^   zListPowerBITool._run  s$   € ð �yŠy˜œ×5Ò5Ñ7Ô7Ñ8Ô8Ð8r8   c              ƒ   ó^   K  — d                      | j                             ¦   «         ¦  «        S r–   r—   rŽ   s      r   rk   zListPowerBITool._arun  s(   è è € ð �yŠy˜œ×5Ò5Ñ7Ô7Ñ8Ô8Ð8r8   )NNr‘   r†   r8   r   r“   r“     s   € € € € € € Ø(Ð(à%€Dˆ#Ð%Ð%Ñ%Øn€K�ÐnÐnÑnØ#˜e¨DÐ1Ñ1Ô1€Gˆ^Ð1Ð1Ñ1à�:Ø $ðñ ô €Lð %)Ø;?ð9ð 9à˜S”Mð9ð Ð7Ô8ð9ð 
ð	9ð 9ð 9ð 9ð %)Ø@Dð9ð 9à˜S”Mð9ð Ð<Ô=ð9ð 
ð	9ð 9ð 9ð 9ð 9ð 9r8   r“   ) r~   ÚloggingÚtimer   Útypingr   r   r   r   Úlangchain_core.callbacksr   r	   Úlangchain_core.toolsr
   Úpydanticr   r   r   Ú(langchain_community.tools.powerbi.promptr   r   r   Ú%langchain_community.utilities.powerbir   r   Ú	getLoggerr{   rS   r   r   rˆ   r“   r†   r8   r   ú<module>r£      s¸  ðØ 4Ð 4à €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð *Ð )Ð )Ð )Ð )Ð )Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ð ð ð
 MÐ LÐ LÐ LÐ LÐ LÐ LÐ Là	ˆÔ	˜8Ñ	$Ô	$€ð	˜#ð 	ð 	ð 	ð 	ðð ð ð ð �xñ ô ð ðDJð Jð Jð Jð J�hñ Jô Jð Jð@9ð 9ð 9ð 9ð 9�hñ 9ô 9ð 9ð 9ð 9r8   