Ë
    ´ŒjÁ,  ã                  óÖ   — d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	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 dd
lmZ ddlmZ ddlmZ  e
ddd¬«       G d„ de«      «       Zy)zCChain that interprets a prompt and executes python code to do math.é    )ÚannotationsN)ÚAnyÚOptional)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRun)ÚBaseLanguageModel)ÚBasePromptTemplate)Ú
ConfigDictÚmodel_validator)ÚChain©ÚLLMChain)ÚPROMPTz0.2.13zÄThis class is deprecated and will be removed in langchain 1.0. See API reference for replacement: https://api.python.langchain.com/en/latest/chains/langchain.chains.llm_math.base.LLMMathChain.htmlz1.0)ÚsinceÚmessageÚremovalc                  óL  — e Zd ZU dZded<   dZded<   	 eZded<   	 d	Zd
ed<   dZ	d
ed<    e
dd¬«      Z ed¬«      edd„«       «       Zedd„«       Zedd„«       Zdd„Z	 	 	 	 	 	 d d„Z	 	 	 	 	 	 d!d„Z	 d"	 	 	 	 	 d#d„Z	 d"	 	 	 	 	 d$d„Zed%d„«       Zeef	 	 	 	 	 	 	 d&d„«       Zy)'ÚLLMMathChaina½  Chain that interprets a prompt and executes python code to do math.

    Note: this class is deprecated. See below for a replacement implementation
        using LangGraph. The benefits of this implementation are:

        - Uses LLM tool calling features;
        - Support for both token-by-token and step-by-step streaming;
        - Support for checkpointing and memory of chat history;
        - Easier to modify or extend (e.g., with additional tools, structured responses, etc.)

        Install LangGraph with:

        .. code-block:: bash

            pip install -U langgraph

        .. code-block:: python

            import math
            from typing import Annotated, Sequence

            from langchain_core.messages import BaseMessage
            from langchain_core.runnables import RunnableConfig
            from langchain_core.tools import tool
            from langchain_openai import ChatOpenAI
            from langgraph.graph import END, StateGraph
            from langgraph.graph.message import add_messages
            from langgraph.prebuilt.tool_node import ToolNode
            import numexpr
            from typing_extensions import TypedDict

            @tool
            def calculator(expression: str) -> str:
                """Calculate expression using Python's numexpr library.

                Expression should be a single line mathematical expression
                that solves the problem.

                Examples:
                    "37593 * 67" for "37593 times 67"
                    "37593**(1/5)" for "37593^(1/5)"
                """
                local_dict = {"pi": math.pi, "e": math.e}
                return str(
                    numexpr.evaluate(
                        expression.strip(),
                        global_dict={},  # restrict access to globals
                        local_dict=local_dict,  # add common mathematical functions
                    )
                )

            llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
            tools = [calculator]
            llm_with_tools = llm.bind_tools(tools, tool_choice="any")

            class ChainState(TypedDict):
                """LangGraph state."""

                messages: Annotated[Sequence[BaseMessage], add_messages]

            async def acall_chain(state: ChainState, config: RunnableConfig):
                last_message = state["messages"][-1]
                response = await llm_with_tools.ainvoke(state["messages"], config)
                return {"messages": [response]}

            async def acall_model(state: ChainState, config: RunnableConfig):
                response = await llm.ainvoke(state["messages"], config)
                return {"messages": [response]}

            graph_builder = StateGraph(ChainState)
            graph_builder.add_node("call_tool", acall_chain)
            graph_builder.add_node("execute_tool", ToolNode(tools))
            graph_builder.add_node("call_model", acall_model)
            graph_builder.set_entry_point("call_tool")
            graph_builder.add_edge("call_tool", "execute_tool")
            graph_builder.add_edge("execute_tool", "call_model")
            graph_builder.add_edge("call_model", END)
            chain = graph_builder.compile()

        .. code-block:: python

            example_query = "What is 551368 divided by 82"

            events = chain.astream(
                {"messages": [("user", example_query)]},
                stream_mode="values",
            )
            async for event in events:
                event["messages"][-1].pretty_print()

        .. code-block:: none

            ================================ Human Message =================================

            What is 551368 divided by 82
            ================================== Ai Message ==================================
            Tool Calls:
            calculator (call_MEiGXuJjJ7wGU4aOT86QuGJS)
            Call ID: call_MEiGXuJjJ7wGU4aOT86QuGJS
            Args:
                expression: 551368 / 82
            ================================= Tool Message =================================
            Name: calculator

            6724.0
            ================================== Ai Message ==================================

            551368 divided by 82 equals 6724.

    Example:
        .. code-block:: python

            from langchain.chains import LLMMathChain
            from langchain_community.llms import OpenAI
            llm_math = LLMMathChain.from_llm(OpenAI())
    r   Ú	llm_chainNzOptional[BaseLanguageModel]Úllmr
   ÚpromptÚquestionÚstrÚ	input_keyÚanswerÚ
output_keyTÚforbid)Úarbitrary_types_allowedÚextraÚbefore)Úmodec                óè   — 	 dd l }d|v rIt        j                  dd¬«       d|vr.|d   �)|j	                  dt
        «      }t        |d   |¬	«      |d<   |S # t        $ r}d}t        |«      |‚d }~ww xY w)
Nr   zXLLMMathChain requires the numexpr package. Please install it with `pip install numexpr`.r   z�Directly instantiating an LLMMathChain with an llm is deprecated. Please instantiate with llm_chain argument or using the from_llm class method.é   )Ú
stacklevelr   r   ©r   r   )ÚnumexprÚImportErrorÚwarningsÚwarnÚgetr   r   )ÚclsÚvaluesr'   ÚeÚmsgr   s         úh/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/llm_math/base.pyÚraise_deprecationzLLMMathChain.raise_deprecation¤   s’   € ð	*Ûð �F‰?Ü�M‰Mð ð õ	ð  &Ñ(¨V°E©]Ð-FØŸ™ H¬fÓ5�Ü&.°6¸%±=ÈÔ&P��{Ñ#Øˆøô! ò 	*ð@ð ô ˜cÓ"¨Ð)ûð	*ús   ‚A Á	A1ÁA,Á,A1c                ó   — | j                   gS )z2Expect input key.

        :meta private:
        )r   ©Úselfs    r0   Ú
input_keyszLLMMathChain.input_keys»   s   € ð —‘ÐÐó    c                ó   — | j                   gS )z3Expect output key.

        :meta private:
        )r   r3   s    r0   Úoutput_keyszLLMMathChain.output_keysÃ   s   € ð —‘Ð Ð r6   c                ó  — dd l }	 t        j                  t        j                  dœ}t	        |j                  |j                  «       i |¬«      «      }t        j                  dd|«      S # t        $ r}d|› d|› d�}t        |«      |‚d }~ww xY w)	Nr   )Úpir.   )Úglobal_dictÚ
local_dictzLLMMathChain._evaluate("z") raised error: z4. Please try again with a valid numerical expressionz^\[|\]$Ú )r'   Úmathr:   r.   r   ÚevaluateÚstripÚ	ExceptionÚ
ValueErrorÚreÚsub)r4   Ú
expressionr'   r<   Úoutputr.   r/   s          r0   Ú_evaluate_expressionz!LLMMathChain._evaluate_expressionË   s    € Ûð	)Ü $§¡¬d¯f©fÑ5ˆJÜØ× Ñ Ø×$Ñ$Ó&Ø "Ø)ð !ó óˆFô �v‰v�j " fÓ-Ð-øô ò 	)à*¨:¨,Ð6GÈÀsð KFð Fð ô ˜S“/ qÐ(ûð	)ús   †AA) Á)	BÁ2BÂBc                ó  — |j                  |d| j                  ¬«       |j                  «       }t        j                  d|t        j
                  «      }|rc|j                  d«      }| j                  |«      }|j                  d| j                  ¬«       |j                  |d| j                  ¬«       d|z   }n@|j                  d	«      r|}n,d	|v rd|j                  d	«      d
   z   }nd|› �}t        |«      ‚| j                  |iS ©NÚgreen)ÚcolorÚverbosez^```text(.*?)```é   z	
Answer: )rL   ÚyellowzAnswer: zAnswer:éÿÿÿÿzunknown format from LLM: ©Úon_textrL   r@   rC   ÚsearchÚDOTALLÚgrouprG   Ú
startswithÚsplitrB   r   ©r4   Ú
llm_outputÚrun_managerÚ
text_matchrE   rF   r   r/   s           r0   Ú_process_llm_resultz LLMMathChain._process_llm_resultá   sù   € ð
 	×Ñ˜J¨g¸t¿|¹|ÐÔLØ×%Ñ%Ó'ˆ
Ü—Y‘YÐ2°JÄÇ	Á	ÓJˆ
ÙØ#×)Ñ)¨!Ó,ˆJØ×.Ñ.¨zÓ:ˆFØ×Ñ °d·l±lÐÔCØ×Ñ ¨hÀÇÁÐÔMØ &Ñ(‰FØ×"Ñ" 9Ô-Ø‰FØ˜*Ñ$Ø *×"2Ñ"2°9Ó"=¸bÑ"AÑA‰Fà-¨j¨\Ð:ˆCÜ˜S“/Ð!Ø—‘ Ð(Ð(r6   c              ƒ  óR  K  — |j                  |d| j                  ¬«      ƒ d {  –—†  |j                  «       }t        j                  d|t        j
                  «      }|rs|j                  d«      }| j                  |«      }|j                  d| j                  ¬«      ƒ d {  –—†  |j                  |d| j                  ¬«      ƒ d {  –—†  d|z   }n@|j                  d	«      r|}n,d	|v rd|j                  d	«      d
   z   }nd|› �}t        |«      ‚| j                  |iS 7 Œü7 Œ€7 Œ\­wrI   rP   rW   s           r0   Ú_aprocess_llm_resultz!LLMMathChain._aprocess_llm_resultø   s   è ø€ ð
 ×!Ñ! *°GÀTÇ\Á\Ð!ÓR×RÐRØ×%Ñ%Ó'ˆ
Ü—Y‘YÐ2°JÄÇ	Á	ÓJˆ
ÙØ#×)Ñ)¨!Ó,ˆJØ×.Ñ.¨zÓ:ˆFØ×%Ñ% l¸D¿L¹LÐ%ÓI×IÐIØ×%Ñ% f°HÀdÇlÁlÐ%ÓS×SÐSØ &Ñ(‰FØ×"Ñ" 9Ô-Ø‰FØ˜*Ñ$Ø *×"2Ñ"2°9Ó"=¸bÑ"AÑA‰Fà-¨j¨\Ð:ˆCÜ˜S“/Ð!Ø—‘ Ð(Ð(ð! 	Søð JøØSús5   ‚"D'¤D!¥A=D'Â"D#Â#%D'ÃD%Ã	AD'Ä#D'Ä%D'c                ó  — |xs t        j                  «       }|j                  || j                     «       | j                  j                  || j                     dg|j                  «       ¬«      }| j                  ||«      S ©Nz	```output)r   ÚstopÚ	callbacks)r   Úget_noop_managerrQ   r   r   ÚpredictÚ	get_childr[   ©r4   ÚinputsrY   Ú_run_managerrX   s        r0   Ú_callzLLMMathChain._call  sz   € ð
 #ÒSÔ&@×&QÑ&QÓ&SˆØ×Ñ˜V D§N¡NÑ3Ô4Ø—^‘^×+Ñ+Ø˜DŸN™NÑ+Ø�Ø"×,Ñ,Ó.ð ,ó 
ˆ
ð
 ×'Ñ'¨
°LÓAÐAr6   c              ƒ  óJ  K  — |xs t        j                  «       }|j                  || j                     «      ƒ d {  –—†  | j                  j                  || j                     dg|j                  «       ¬«      ƒ d {  –—† }| j                  ||«      ƒ d {  –—† S 7 Œ`7 Œ 7 Œ­wr_   )r   rb   rQ   r   r   Úapredictrd   r]   re   s        r0   Ú_acallzLLMMathChain._acall  sž   è ø€ ð
 #ÒXÔ&E×&VÑ&VÓ&XˆØ×"Ñ" 6¨$¯.©.Ñ#9Ó:×:Ð:ØŸ>™>×2Ñ2Ø˜DŸN™NÑ+Ø�Ø"×,Ñ,Ó.ð 3ó 
÷ 
ˆ
ð
 ×.Ñ.¨z¸<ÓH×HÐHð 	;øð
øð
 Iús4   ‚:B#¼B½AB#Á>BÁ?B#ÂB!ÂB#ÂB#Â!B#c                 ó   — y)NÚllm_math_chain© r3   s    r0   Ú_chain_typezLLMMathChain._chain_type+  s   € àr6   c                ó0   — t        ||¬«      } | dd|i|¤ŽS )Nr&   r   rn   r   )r,   r   r   Úkwargsr   s        r0   Úfrom_llmzLLMMathChain.from_llm/  s#   € ô  ¨VÔ4ˆ	ÙÑ1˜YÐ1¨&Ñ1Ð1r6   )r-   ÚdictÚreturnr   )rt   z	list[str])rE   r   rt   r   )rX   r   rY   r   rt   údict[str, str])rX   r   rY   r   rt   ru   )N)rf   ru   rY   z$Optional[CallbackManagerForChainRun]rt   ru   )rf   ru   rY   z)Optional[AsyncCallbackManagerForChainRun]rt   ru   )rt   r   )r   r	   r   r
   rq   r   rt   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   Úmodel_configr   Úclassmethodr1   Úpropertyr5   r8   rG   r[   r]   rh   rk   ro   rr   rn   r6   r0   r   r      s‹  … ñsðj ÓØ'+€CÐ	$Ó+Ø*Ø!'€FÐÓ'ØIØ€IˆsÓØ€J�ÓáØ $Øô€Lñ
 ˜(Ô#Øòó ó $ðð* ò ó ð ð ò!ó ð!ó.ð,)àð)ð 0ð)ð 
ó	)ð.)àð)ð 5ð)ð 
ó	)ð4 =AðBàðBð :ðBð 
ó	Bð" BFðIàðIð ?ðIð 
ó	Ið ò ó ð ð ð &,ð2àð2ð #ð2ð ð	2ð
 
ò2ó ñ2r6   r   )ry   Ú
__future__r   r>   rC   r)   Útypingr   r   Úlangchain_core._apir   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr	   Úlangchain_core.promptsr
   Úpydanticr   r   Úlangchain.chains.baser   Úlangchain.chains.llmr   Ú langchain.chains.llm_math.promptr   r   rn   r6   r0   Ú<module>rˆ      sd   ðÙ Iå "ã Û 	Û ß  å *÷õ =Ý 5ß 0å 'Ý )Ý 3ñ Ø
ð	mð ôôV2�5ó V2óñV2r6   