§
    ‡ìNgR  ã                  ó:  — d Z ddlmZ ddlmZmZmZmZ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 dd	lmZ dd
lmZ ddl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! G d„ deee"e"f                  ¦  «        Z#dS )z+Base classes for LLM-powered router chains.é    )Úannotations)ÚAnyÚDictÚListÚOptionalÚTypeÚcast)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRun)ÚOutputParserException)ÚBaseLanguageModel)ÚBaseOutputParser)ÚBasePromptTemplate)Úparse_and_check_json_markdown)Úmodel_validator)ÚSelf©ÚLLMChain)ÚRouterChainz0.2.12z1.0zÃUse RunnableLambda to select from multiple prompt templates. See example in API reference: https://api.python.langchain.com/en/latest/chains/langchain.chains.router.llm_router.LLMRouterChain.html)ÚsinceÚremovalÚmessagec                  ó¦   ‡ — e Zd ZU dZded<   	  ed¬¦  «        dd„¦   «         Zedd
„¦   «         Zdˆ fd„Z		 d d!d„Z
	 d d"d„Zed#d„¦   «         Zˆ xZS )$ÚLLMRouterChaina
	  A router chain that uses an LLM chain to perform routing.

    This class is deprecated. See below for a replacement, which offers several
    benefits, including streaming and batch support.

    Below is an example implementation:

        .. code-block:: python

            from operator import itemgetter
            from typing import Literal
            from typing_extensions import TypedDict

            from langchain_core.output_parsers import StrOutputParser
            from langchain_core.prompts import ChatPromptTemplate
            from langchain_core.runnables import RunnableLambda, RunnablePassthrough
            from langchain_openai import ChatOpenAI

            llm = ChatOpenAI(model="gpt-4o-mini")

            prompt_1 = ChatPromptTemplate.from_messages(
                [
                    ("system", "You are an expert on animals."),
                    ("human", "{query}"),
                ]
            )
            prompt_2 = ChatPromptTemplate.from_messages(
                [
                    ("system", "You are an expert on vegetables."),
                    ("human", "{query}"),
                ]
            )

            chain_1 = prompt_1 | llm | StrOutputParser()
            chain_2 = prompt_2 | llm | StrOutputParser()

            route_system = "Route the user's query to either the animal or vegetable expert."
            route_prompt = ChatPromptTemplate.from_messages(
                [
                    ("system", route_system),
                    ("human", "{query}"),
                ]
            )


            class RouteQuery(TypedDict):
                """Route query to destination."""
                destination: Literal["animal", "vegetable"]


            route_chain = (
                route_prompt
                | llm.with_structured_output(RouteQuery)
                | itemgetter("destination")
            )

            chain = {
                "destination": route_chain,  # "animal" or "vegetable"
                "query": lambda x: x["query"],  # pass through input query
            } | RunnableLambda(
                # if animal, chain_1. otherwise, chain_2.
                lambda x: chain_1 if x["destination"] == "animal" else chain_2,
            )

            chain.invoke({"query": "what color are carrots"})
    r   Ú	llm_chainÚafter)ÚmodeÚreturnr   c                óJ   — | j         j        }|j        €t          d¦  «        ‚| S )NzÈLLMRouterChain requires base llm_chain prompt to have an output parser that converts LLM text output to a dictionary with keys 'destination' and 'next_inputs'. Received a prompt with no output parser.)r   ÚpromptÚoutput_parserÚ
ValueError)Úselfr!   s     ú^/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/router/llm_router.pyÚvalidate_promptzLLMRouterChain.validate_prompth   s3   € à”Ô&ˆØÔÐ'Ýðñô ð ð ˆó    ú	List[str]c                ó   — | j         j        S )zTWill be whatever keys the LLM chain prompt expects.

        :meta private:
        )r   Ú
input_keys)r$   s    r%   r*   zLLMRouterChain.input_keyst   s   € ð Œ~Ô(Ð(r'   ÚoutputsúDict[str, Any]ÚNonec                óŽ   •— t          ¦   «                              |¦  «         t          |d         t          ¦  «        st          ‚d S )NÚnext_inputs)ÚsuperÚ_validate_outputsÚ
isinstanceÚdictr#   )r$   r+   Ú	__class__s     €r%   r1   z LLMRouterChain._validate_outputs|   sB   ø€ Ý‰Œ×!Ò! 'Ñ*Ô*Ð*Ý˜' -Ô0µ$Ñ7Ô7ð 	ÝÐð	ð 	r'   NÚinputsÚrun_managerú$Optional[CallbackManagerForChainRun]c                ó  — |pt          j        ¦   «         }|                     ¦   «         } | j        j        dd|i|¤Ž}t          t          t          t          f         | j        j	        j
                             |¦  «        ¦  «        }|S ©NÚ	callbacks© )r   Úget_noop_managerÚ	get_childr   Úpredictr	   r   Ústrr   r!   r"   Úparse)r$   r5   r6   Ú_run_managerr:   Ú
predictionÚoutputs          r%   Ú_callzLLMRouterChain._call   s‚   € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ ×*Ò*Ñ,Ô,ˆ	à+T”^Ô+ÐJÐJ°iÐJÀ6ÐJÐJˆ
ÝÝ••cŒNØŒNÔ!Ô/×5Ò5°jÑAÔAñ
ô 
ˆð ˆr'   ú)Optional[AsyncCallbackManagerForChainRun]c              ƒ  óÚ   K  — |pt          j        ¦   «         }|                     ¦   «         }t          t          t
          t          f          | j        j        dd|i|¤Žƒ d {V —†¦  «        }|S r9   )	r   r<   r=   r	   r   r?   r   r   Úapredict_and_parse)r$   r5   r6   rA   r:   rC   s         r%   Ú_acallzLLMRouterChain._acall   s}   è è € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ ×*Ò*Ñ,Ô,ˆ	ÝÝ••cŒNØ3$”.Ô3ÐRÐR¸iÐRÈ6ÐRÐRÐRÐRÐRÐRÐRÐRñ
ô 
ˆð ˆr'   Úllmr   r!   r   Úkwargsr   c                ó8   — t          ||¬¦  «        } | dd|i|¤ŽS )zConvenience constructor.)rI   r!   r   r;   r   )ÚclsrI   r!   rJ   r   s        r%   Úfrom_llmzLLMRouterChain.from_llm   s1   € õ
  ¨VÐ4Ñ4Ô4ˆ	ØˆsÐ1Ð1˜YÐ1¨&Ð1Ð1Ð1r'   )r   r   )r   r(   )r+   r,   r   r-   )N)r5   r,   r6   r7   r   r,   )r5   r,   r6   rE   r   r,   )rI   r   r!   r   rJ   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r&   Úpropertyr*   r1   rD   rH   ÚclassmethodrM   Ú__classcell__)r4   s   @r%   r   r      s  ø€ € € € € € ðAð AðF ÐÐÑØ+à€_˜'Ð"Ñ"Ô"ð	ð 	ð 	ñ #Ô"ð	ð ð)ð )ð )ñ „Xð)ðð ð ð ð ð ð =Aðð ð ð ð ð$ BFðð ð ð ð ð ð2ð 2ð 2ñ „[ð2ð 2ð 2ð 2ð 2r'   r   c                  óF   — e Zd ZU dZdZded<   eZded<   dZded<   dd„Z	dS )ÚRouterOutputParserz<Parser for output of router chain in the multi-prompt chain.ÚDEFAULTr?   Údefault_destinationr   Únext_inputs_typeÚinputÚnext_inputs_inner_keyÚtextr   r,   c                ó0  — 	 ddg}t          ||¦  «        }t          |d         t          ¦  «        st          d¦  «        ‚t          |d         | j        ¦  «        st          d| j        › d¦  «        ‚| j        |d         i|d<   |d                              ¦   «                              ¦   «         | j                             ¦   «         k    rd |d<   n|d                              ¦   «         |d<   |S # t          $ r}t          d|› d|› ¦  «        ‚d }~ww xY w)NÚdestinationr/   z&Expected 'destination' to be a string.zExpected 'next_inputs' to be ú.zParsing text
z
 raised following error:
)r   r2   r?   r#   rZ   r\   ÚstripÚlowerrY   Ú	Exceptionr   )r$   r]   Úexpected_keysÚparsedÚes        r%   r@   zRouterOutputParser.parse­   sL  € ð	Ø*¨MÐ:ˆMÝ2°4¸ÑGÔGˆFÝ˜f ]Ô3µSÑ9Ô9ð KÝ Ð!IÑJÔJÐJÝ˜f ]Ô3°TÔ5JÑKÔKð Ý ØL°DÔ4IÐLÐLÐLñô ð ð &*Ô%?ÀÈÔAVÐ$WˆF=Ñ!à}Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ØÔ+×1Ò1Ñ3Ô3ò4ð 4ð )-}Ñ%Ð%à(.¨}Ô(=×(CÒ(CÑ(EÔ(E}Ñ%ØˆMøÝð 	ð 	ð 	Ý'ØF ÐFÐFÀ1ÐFÐFñô ð øøøøð	øøøs   ‚C.C1 Ã1
DÃ;DÄDN)r]   r?   r   r,   )
rN   rO   rP   rQ   rY   rR   r?   rZ   r\   r@   r;   r'   r%   rW   rW   ¦   sf   € € € € € € ØFÐFà(ÐÐ(Ð(Ð(Ñ(Ø ÐÐ Ð Ð Ñ Ø!(ÐÐ(Ð(Ð(Ñ(ðð ð ð ð ð r'   rW   N)$rQ   Ú
__future__r   Útypingr   r   r   r   r   r	   Úlangchain_core._apir
   Úlangchain_core.callbacksr   r   Úlangchain_core.exceptionsr   Úlangchain_core.language_modelsr   Úlangchain_core.output_parsersr   Úlangchain_core.promptsr   Úlangchain_core.utils.jsonr   Úpydanticr   Útyping_extensionsr   Úlangchain.chainsr   Úlangchain.chains.router.baser   r   r?   rW   r;   r'   r%   ú<module>rt      sÌ  ðØ 1Ð 1à "Ð "Ð "Ð "Ð "Ð "à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø CÐ CÐ CÐ CÐ CÐ CØ $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "à %Ð %Ð %Ð %Ð %Ð %Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð €Ø
Øð	sð	ñ ô ðB2ð B2ð B2ð B2ð B2[ñ B2ô B2ñô ðB2ðJð ð ð ð Ð)¨$¨s°C¨x¬.Ô9ñ ô ð ð ð r'   