§
    ™Štjg,  ã                  óè   — 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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d¬¦  «         G d„ de¦  «        ¦   «         ZdS )zCChain that interprets a prompt and executes python code to do math.é    )ÚannotationsN)ÚAny)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRun)ÚBaseLanguageModel)ÚBasePromptTemplate)Ú
ConfigDictÚmodel_validator)ÚChain©ÚLLMChain)ÚPROMPTz0.2.13z2.0.0zlangchain.agents.create_agentz€Build new agents with `create_agent` and bind a calculator/math tool. See https://docs.langchain.com/oss/python/langchain/agents)ÚsinceÚremovalÚalternativeÚaddendumc                  óD  — 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d0d!„Zd1d#„Z	 d2d3d&„Z	 d2d4d(„Zed5d)„¦   «         Zeefd6d,„¦   «         ZdS )7Ú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:

        ```bash
        pip install -U langgraph
        ```

        ```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
                    )
                )

            model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
            tools = [calculator]
            model_with_tools = model.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 model_with_tools.ainvoke(state["messages"], config)
                return {"messages": [response]}

            async def acall_model(state: ChainState, config: RunnableConfig):
                response = await model.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()

        ```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()
        ```

        ```txt
        ================================ 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:
        ```python
        from langchain_classic.chains import LLMMathChain
        from langchain_openai import OpenAI

        llm_math = LLMMathChain.from_llm(OpenAI())
        ```
    r   Ú	llm_chainNzBaseLanguageModel | NoneÚllmr	   ÚpromptÚquestionÚstrÚ	input_keyÚanswerÚ
output_keyTÚforbid)Úarbitrary_types_allowedÚextraÚbefore)ÚmodeÚvaluesÚdictÚreturnr   c                ó  — 	 dd l }n$# t          $ r}d}t          |¦  «        |‚d }~ww xY wd|v rWt          j        dd¬¦  «         d|vr=|d         �5|                     dt
          ¦  «        }t          |d         |¬	¦  «        |d<   |S )
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   )Úclsr#   r*   ÚeÚmsgr   s         úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/chains/llm_math/base.pyÚ_raise_deprecationzLLMMathChain._raise_deprecation§   sÅ   € ð	*ØˆNˆNˆNˆNøÝð 	*ð 	*ð 	*ð@ð õ ˜cÑ"Ô"¨Ð)øøøøð	*øøøð �Fˆ?ˆ?ÝŒMð ð ð	ñ ô ð ð  &Ð(Ð(¨V°E¬]Ð-FØŸš H­fÑ5Ô5�Ý&.°6¸%´=ÈÐ&PÑ&PÔ&P��{Ñ#Øˆs   ‚ ‡
(‘#£(ú	list[str]c                ó   — | j         gS )zExpect input key.)r   ©Úselfs    r2   Ú
input_keyszLLMMathChain.input_keys¾   s   € ð ”ÐÐó    c                ó   — | j         gS )zExpect output key.)r   r6   s    r2   Úoutput_keyszLLMMathChain.output_keysÃ   s   € ð ”Ð Ð r9   Ú
expressionc                ó0  — dd l }	 t          j        t          j        dœ}t	          |                     |                     ¦   «         i |¬¦  «        ¦  «        }n+# t          $ r}d|› d|› d�}t          |¦  «        |‚d }~ww xY wt          j
        dd|¦  «        S )	Nr   )Úpir0   )Úglobal_dictÚ
local_dictzLLMMathChain._evaluate("z") raised error: z4. Please try again with a valid numerical expressionz^\[|\]$Ú )r*   Úmathr>   r0   r   ÚevaluateÚstripÚ	ExceptionÚ
ValueErrorÚreÚsub)r7   r<   r*   r@   Úoutputr0   r1   s          r2   Ú_evaluate_expressionz!LLMMathChain._evaluate_expressionÈ   sÓ   € Øˆˆˆð	)Ý $¤­d¬fÐ5Ð5ˆJÝØ× Ò Ø×$Ò$Ñ&Ô&Ø "Ø)ð !ñ ô ñô ˆFˆFøõ ð 	)ð 	)ð 	)ðF¨:ð Fð FÈð Fð Fð Fð õ ˜S‘/”/ qÐ(øøøøð	)øøøõ Œv�j " fÑ-Ô-Ð-s   †AA Á
A?Á!A:Á:A?Ú
llm_outputÚrun_managerr   údict[str, str]c                ó*  — |                      |d| j        ¬¦  «         |                     ¦   «         }t          j        d|t          j        ¦  «        }|ri|                     d¦  «        }|                      |¦  «        }|                      d| j        ¬¦  «         |                      |d| j        ¬¦  «         d|z   }nO|                     d	¦  «        r|}n7d	|v rd| 	                    d	¦  «        d
         z   }nd|› �}t          |¦  «        ‚| j        |iS ©NÚgreen)ÚcolorÚverbosez^```text(.*?)```é   z	
Answer: )rR   ÚyellowzAnswer: zAnswer:éÿÿÿÿzunknown format from LLM: ©Úon_textrR   rD   rG   ÚsearchÚDOTALLÚgrouprJ   Ú
startswithÚsplitrF   r   ©r7   rK   rL   Ú
text_matchr<   rI   r   r1   s           r2   Ú_process_llm_resultz LLMMathChain._process_llm_resultÞ   s'  € ð
 	×Ò˜J¨g¸t¼|ÐÑLÔLÐLØ×%Ò%Ñ'Ô'ˆ
Ý”YÐ2°JÅÄ	ÑJÔJˆ
Øð 	"Ø#×)Ò)¨!Ñ,Ô,ˆJØ×.Ò.¨zÑ:Ô:ˆFØ×Ò °d´lÐÑCÔCÐCØ×Ò ¨hÀÄÐÑMÔMÐMØ &Ñ(ˆFˆFØ×"Ò" 9Ñ-Ô-ð 	"ØˆFˆFØ˜*Ð$Ð$Ø *×"2Ò"2°9Ñ"=Ô"=¸bÔ"AÑAˆFˆFà:¨jÐ:Ð:ˆCÝ˜S‘/”/Ð!Ø” Ð(Ð(r9   r   c              ƒ  óR  K  — |                      |d| j        ¬¦  «        ƒ d {V —† |                     ¦   «         }t          j        d|t          j        ¦  «        }|ru|                     d¦  «        }|                      |¦  «        }|                      d| j        ¬¦  «        ƒ d {V —† |                      |d| j        ¬¦  «        ƒ d {V —† d|z   }nO|                     d	¦  «        r|}n7d	|v rd| 	                    d	¦  «        d
         z   }nd|› �}t          |¦  «        ‚| j        |iS rO   rV   r]   s           r2   Ú_aprocess_llm_resultz!LLMMathChain._aprocess_llm_resultõ   sa  è è € ð
 ×!Ò! *°GÀTÄ\Ð!ÑRÔRÐRÐRÐRÐRÐRÐRÐRØ×%Ò%Ñ'Ô'ˆ
Ý”YÐ2°JÅÄ	ÑJÔJˆ
Øð 	"Ø#×)Ò)¨!Ñ,Ô,ˆJØ×.Ò.¨zÑ:Ô:ˆFØ×%Ò% l¸D¼LÐ%ÑIÔIÐIÐIÐIÐIÐIÐIÐIØ×%Ò% f°HÀdÄlÐ%ÑSÔSÐSÐSÐSÐSÐSÐSÐSØ &Ñ(ˆFˆFØ×"Ò" 9Ñ-Ô-ð 	"ØˆFˆFØ˜*Ð$Ð$Ø *×"2Ò"2°9Ñ"=Ô"=¸bÔ"AÑAˆFˆFà:¨jÐ:Ð:ˆCÝ˜S‘/”/Ð!Ø” Ð(Ð(r9   Úinputsú!CallbackManagerForChainRun | Nonec                ó  — |pt          j        ¦   «         }|                     || j                 ¦  «         | j                             || j                 dg|                     ¦   «         ¬¦  «        }|                      ||¦  «        S ©Nz	```output)r   ÚstopÚ	callbacks)r   Úget_noop_managerrW   r   r   ÚpredictÚ	get_childr_   ©r7   rb   rL   Ú_run_managerrK   s        r2   Ú_callzLLMMathChain._call  s…   € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ×Ò˜V D¤NÔ3Ñ4Ô4Ð4Ø”^×+Ò+Ø˜DœNÔ+Ø�Ø"×,Ò,Ñ.Ô.ð ,ñ 
ô 
ˆ
ð
 ×'Ò'¨
°LÑAÔAÐAr9   ú&AsyncCallbackManagerForChainRun | Nonec              ƒ  ó6  K  — |pt          j        ¦   «         }|                     || j                 ¦  «        ƒ d {V —† | j                             || j                 dg|                     ¦   «         ¬¦  «        ƒ d {V —†}|                      ||¦  «        ƒ d {V —†S re   )r   rh   rW   r   r   Úapredictrj   ra   rk   s        r2   Ú_acallzLLMMathChain._acall  sË   è è € ð
 #ÐXÕ&EÔ&VÑ&XÔ&XˆØ×"Ò" 6¨$¬.Ô#9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Øœ>×2Ò2Ø˜DœNÔ+Ø�Ø"×,Ò,Ñ.Ô.ð 3ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ
ð
 ×.Ò.¨z¸<ÑHÔHÐHÐHÐHÐHÐHÐHÐHr9   c                ó   — dS )NÚllm_math_chain© r6   s    r2   Ú_chain_typezLLMMathChain._chain_type(  s   € àÐr9   r   Úkwargsc                ó8   — t          ||¬¦  «        } | dd|i|¤ŽS )z·Create a LLMMathChain from a language model.

        Args:
            llm: a language model
            prompt: a prompt template
            **kwargs: additional arguments
        r)   r   rt   r   )r/   r   r   rv   r   s        r2   Úfrom_llmzLLMMathChain.from_llm,  s1   € õ  ¨VÐ4Ñ4Ô4ˆ	ØˆsÐ1Ð1˜YÐ1¨&Ð1Ð1Ð1r9   )r#   r$   r%   r   )r%   r4   )r<   r   r%   r   )rK   r   rL   r   r%   rM   )rK   r   rL   r   r%   rM   )N)rb   rM   rL   rc   r%   rM   )rb   rM   rL   rn   r%   rM   )r%   r   )r   r   r   r	   rv   r   r%   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r
   Úmodel_configr   Úclassmethodr3   Úpropertyr8   r;   rJ   r_   ra   rm   rq   ru   rx   rt   r9   r2   r   r      sÜ  € € € € € € ðvð vðp ÐÐÑØ$(€CÐ(Ð(Ð(Ñ(Ø*Ø!'€FÐ'Ð'Ð'Ñ'ØIØ€IÐÐÐÑØ€JÐÐÐÑà�:Ø $Øðñ ô €Lð
 €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð* ð ð  ð  ñ „Xð ð ð!ð !ð !ñ „Xð!ð.ð .ð .ð .ð,)ð )ð )ð )ð.)ð )ð )ð )ð4 :>ðBð Bð Bð Bð Bð" ?CðIð Ið Ið Ið Ið ð ð  ð  ñ „Xð ð ð &,ð2ð 2ð 2ð 2ñ „[ð2ð 2ð 2r9   r   )r|   Ú
__future__r   rB   rG   r,   Útypingr   Úlangchain_core._apir   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr	   Úpydanticr
   r   Úlangchain_classic.chains.baser   Úlangchain_classic.chains.llmr   Ú(langchain_classic.chains.llm_math.promptr   r   rt   r9   r2   ú<module>r‹      se  ðØ IÐ Ià "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð =Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à /Ð /Ð /Ð /Ð /Ð /Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;ð €Ø
ØØ/ð	Eðñ ô ðZ2ð Z2ð Z2ð Z2ð Z2�5ñ Z2ô Z2ñô ðZ2ð Z2ð Z2r9   