§
    æ˜ºhC+  ã                   ó  — 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mZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZmZ  ej        e¦  «        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)ÚFieldÚ	validator)ÚBaseTool)Ú_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<   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<    G d„ d¦  «        Z ed¦  «        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?"
    ÚdescriptionÚ	llm_chainT©ÚexcludeÚpowerbiÚexamples)Údefault_factoryr   Úsession_cacheé   Úmax_iterationsi   Úoutput_token_limitNÚtiktoken_model_namec                   ó   — e Zd ZdZdZdS )úQueryPowerBITool.Configú'Configuration for this pydantic object.TN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úarbitrary_types_allowed© ó    ún/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/tools/powerbi/tool.pyÚConfigr$   )   ó   € € € € € Ø5Ð5à"&ÐÐÐr-   r/   Úreturnc                 ó`   — |j         j        D ] }|dvrt          d|j         j        ¦  «        ‚Œ!|S )z8Make sure the LLM chain has the correct input variables.)Ú
tool_inputÚtablesÚschemasr   zrLLM chain for QueryPowerBITool must have input variables ['tool_input', 'tables', 'schemas', 'examples'], found %s)ÚpromptÚinput_variablesÚ
ValueError)Úclsr   Úvars      r.   Ú"validate_llm_chain_input_variablesz3QueryPowerBITool.validate_llm_chain_input_variables.   sT   € ð
 Ô#Ô3ð 	ð 	ˆCØÐIÐIÐIÝ ð IØÔ$Ô4ñô ð ð Jð
 Ðr-   r3   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   )Úselfr3   s     r.   Ú_check_cachezQueryPowerBITool._check_cache;   s%   € ð
 ˜TÔ/Ð/Ð/Ø�4ØÔ! *Ô-Ð-r-   Ú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©r3   r4   r5   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   ©r3   ÚqueryÚerroré   ©r3   r?   rO   ©rR   )r>   ÚloggerÚdebugÚinfor   Úpredictr   Úget_table_namesÚget_schemasr   Ú	get_childÚ	Exceptionr   r   ÚrunÚ_parse_outputÚgetr    Ú_runr   Úformatr   ©r=   r3   r?   r@   ÚcacherQ   ÚexcÚ
start_timeÚ
pbi_resultÚend_timeÚresultrR   rO   s                r.   ra   zQueryPowerBITool._runD   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ð Vð ÔØñð Ô% 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 )rB   rC   z3, from cache, you have already asked this question.rD   NrE   rG   rH   zPBI Query: %srI   rK   rL   rM   rN   Ú
TokenErrorzkAuthentication token expired or invalid, please try to reauthenticate or check the scope of the credential.rO   r   rP   rS   rT   rU   )r>   rV   rW   rX   r   Úapredictr   rZ   r[   r   r\   r]   r   r   Úarunr_   r`   r    Ú_arunr   rb   r   rc   s                r.   rn   zQueryPowerBITool._arunz   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ð ~ð ÔØñð Ô% 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rg   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   r4   Ú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.NrR   z	pbi.errorÚdetailsÚdetail)ÚlenrV   rX   r   Ú_result_too_larger!   )r=   rg   rq   ri   Ú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ÐÐr-   ri   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_modelrt   ÚencoderV   rX   r!   )r=   ri   Ú	tiktoken_Úencodingrw   s        r.   ru   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Ð;Ð;Øˆxr-   ©N)"r'   r(   r)   r*   r   ÚstrÚ__annotations__r   r   r
   r   r   r   r   r   Údictr   r   r    Úintr!   r"   r/   r   r;   r>   r	   ra   r   rn   r   r_   Úboolru   r,   r-   r.   r   r      sh  € € € € € € Ø/Ð/à€Dˆ#ÐÐÑð€K�ð ð ñ ð
 €N€N�NØ#˜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ÐÐÑØ"Ð˜Ð"Ð"Ñ"Ø)-Ð˜ #œÐ-Ð-Ñ-ð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð
 €Yˆ{ÑÔð
Øð
à	ð
ð 
ð 
ñ Ôð
ð. 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@ð ð ð ð ð ð r-   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<    G d	„ 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   c                   ó   — e Zd ZdZdZdS )úInfoPowerBITool.Configr%   TNr&   r,   r-   r.   r/   r‡   å   r0   r-   r/   Nr3   r?   r1   c                 ó\   — | j                              |                     d¦  «        ¦  «        S )z4Get the schema for tables in a comma-separated list.ú, )r   Úget_table_infoÚsplit©r=   r3   r?   s      r.   ra   zInfoPowerBITool._runê   s(   € ð Œ|×*Ò*¨:×+;Ò+;¸DÑ+AÔ+AÑBÔBÐBr-   c              ƒ   ól   K  — | j                              |                     d¦  «        ¦  «        ƒ d {V —†S )Nr‰   )r   Úaget_table_infor‹   rŒ   s      r.   rn   zInfoPowerBITool._arunò   s>   è è € ð
 ”\×1Ò1°*×2BÒ2BÀ4Ñ2HÔ2HÑIÔIÐIÐIÐIÐIÐIÐIÐIr-   r}   ©r'   r(   r)   r*   r   r~   r   r   r
   r   r   r/   r   r	   ra   r   rn   r,   r-   r.   r„   r„   Ù   s   € € € € € € Ø<Ð<à €Dˆ#Ð Ð Ñ ð€K�ð ð ñ ð $˜e¨DÐ1Ñ1Ô1€Gˆ^Ð1Ð1Ñ1ð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð <@ðCð CàðCð Ð7Ô8ðCð 
ð	Cð Cð Cð Cð AEðJð JàðJð Ð<Ô=ðJð 
ð	Jð Jð Jð Jð Jð Jr-   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<    G d	„ 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   c                   ó   — e Zd ZdZdZdS )úListPowerBITool.Configr%   TNr&   r,   r-   r.   r/   r”     r0   r-   r/   Nr3   r?   r1   c                 óZ   — d                      | j                             ¦   «         ¦  «        S ©zGet the names of the tables.r‰   ©Újoinr   rZ   rŒ   s      r.   ra   zListPowerBITool._run  s$   € ð �yŠy˜œ×5Ò5Ñ7Ô7Ñ8Ô8Ð8r-   c              ƒ   ó^   K  — d                      | j                             ¦   «         ¦  «        S r–   r—   rŒ   s      r.   rn   zListPowerBITool._arun  s(   è è € ð �yŠy˜œ×5Ò5Ñ7Ô7Ñ8Ô8Ð8r-   )NNr�   r,   r-   r.   r‘   r‘   ú   s  € € € € € € Ø(Ð(à%€Dˆ#Ð%Ð%Ñ%Øn€K�ÐnÐnÑnØ#˜e¨DÐ1Ñ1Ô1€Gˆ^Ð1Ð1Ñ1ð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð %)Ø;?ð9ð 9à˜S”Mð9ð Ð7Ô8ð9ð 
ð	9ð 9ð 9ð 9ð %)Ø@Dð9ð 9à˜S”Mð9ð Ð<Ô=ð9ð 
ð	9ð 9ð 9ð 9ð 9ð 9r-   r‘   ) r*   ÚloggingÚtimer   Útypingr   r   r   r   Úlangchain_core.callbacksr   r	   Úlangchain_core.pydantic_v1r
   r   Úlangchain_core.toolsr   Ú&langchain_community.chat_models.openair   Ú(langchain_community.tools.powerbi.promptr   r   r   Ú%langchain_community.utilities.powerbir   r   Ú	getLoggerr'   rV   r   r„   r‘   r,   r-   r.   ú<module>r¤      s©  ðØ 4Ð 4Ø €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð 8Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø )Ð )Ð )Ð )Ð )Ð )à CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð ð ð ð ð
 MÐ LÐ LÐ LÐ LÐ LÐ LÐ Là	ˆÔ	˜8Ñ	$Ô	$€ð~ð ~ð ~ð ~ð ~�xñ ~ô ~ð ~ðBJð Jð Jð Jð J�hñ Jô Jð JðB9ð 9ð 9ð 9ð 9�hñ 9ô 9ð 9ð 9ð 9r-   