§
    ™ŠtjŸ  ã                  ó0  — d Z ddlm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 dd	l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  ed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Úcast)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRun)ÚOutputParserException)ÚBaseLanguageModel)ÚBaseOutputParser)ÚBasePromptTemplate)Úparse_and_check_json_markdown)Úmodel_validator)ÚSelfÚoverride©ÚLLMChain)ÚRouterChainz0.2.12z2.0.0zlangchain.agents.create_agentz˜Build routing logic with `create_agent` (e.g. with subagents or prompt-selection middleware). See https://docs.langchain.com/oss/python/langchain/agents)ÚsinceÚremovalÚalternativeÚaddendumc                  ó¦   ‡ — 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 )$ÚLLMRouterChainah  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:

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

        model = 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 | model | StrOutputParser()
        chain_2 = prompt_2 | model | 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
            | model.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                óN   — | j         j        }|j        €d}t          |¦  «        ‚| 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   Úmsgs      úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/chains/router/llm_router.pyÚ_validate_promptzLLMRouterChain._validate_promptk   s2   € à”Ô&ˆØÔÐ'ðð õ ˜S‘/”/Ð!Øˆó    ú	list[str]c                ó   — | j         j        S )z3Will be whatever keys the LLM chain prompt expects.)r   Ú
input_keys)r"   s    r$   r)   zLLMRouterChain.input_keysx   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$   r0   z LLMRouterChain._validate_outputs}   sB   ø€ Ý‰Œ×!Ò! 'Ñ*Ô*Ð*Ý˜' -Ô0µ$Ñ7Ô7ð 	ÝÐð	ð 	r&   NÚinputsÚrun_managerú!CallbackManagerForChainRun | Nonec                óà   — |pt          j        ¦   «         }|                     ¦   «         } | j        j        dd|i|¤Ž}t          d| j        j        j                             |¦  «        ¦  «        S )NÚ	callbacksr+   © )	r   Úget_noop_managerÚ	get_childr   Úpredictr   r   r    Úparse)r"   r4   r5   Ú_run_managerr8   Ú
predictions         r$   Ú_callzLLMRouterChain._call‚   sv   € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ ×*Ò*Ñ,Ô,ˆ	à+�T”^Ô+ÐJÐJ°iÐJÀ6ÐJÐJˆ
ÝØØŒNÔ!Ô/×5Ò5°jÑAÔAñ
ô 
ð 	
r&   ú&AsyncCallbackManagerForChainRun | Nonec              ƒ  ó¨   K  — |pt          j        ¦   «         }|                     ¦   «         }t          d | j        j        dd|i|¤Žƒ d {V —†¦  «        S )Nr+   r8   r9   )r   r:   r;   r   r   Úapredict_and_parse)r"   r4   r5   r>   r8   s        r$   Ú_acallzLLMRouterChain._acall�   sq   è è € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ ×*Ò*Ñ,Ô,ˆ	ÝØØ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.)rE   r   r   r9   r   )ÚclsrE   r   rF   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)r4   r+   r5   r6   r   r+   )r4   r+   r5   rA   r   r+   )rE   r
   r   r   rF   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r%   Úpropertyr)   r0   r@   rD   ÚclassmethodrI   Ú__classcell__)r3   s   @r$   r   r      s  ø€ € € € € € ðCð CðJ ÐÐÑØ+à€_˜'Ð"Ñ"Ô"ð
ð 
ð 
ñ #Ô"ð
ð ð)ð )ð )ñ „Xð)ðð ð ð ð ð ð :>ð
ð 
ð 
ð 
ð 
ð" ?Cð

ð 

ð 

ð 

ð 

ð ð2ð 2ð 2ñ „[ð2ð 2ð 2ð 2ð 2r&   r   c                  óV   — e Zd ZU dZdZded<   eZded<   dZded<   e	dd„¦   «         Z
dS )ÚRouterOutputParserz<Parser for output of router chain in the multi-prompt chain.ÚDEFAULTÚstrÚdefault_destinationÚtypeÚnext_inputs_typeÚinputÚnext_inputs_inner_keyÚtextr   r+   c                ó@  — 	 ddg}t          ||¦  «        }t          |d         t          ¦  «        sd}t          |¦  «        ‚t          |d         | j        ¦  «        sd| j        › d�}t          |¦  «        ‚| j        |d         i|d<   |d                              ¦   «                              ¦   «         | j                             ¦   «         k    rd |d<   n|d                              ¦   «         |d<   n*# t          $ r}d|› d|› �}t          |¦  «        |‚d }~ww xY w|S )NÚdestinationr.   z&Expected 'destination' to be a string.zExpected 'next_inputs' to be ú.zParsing text
z
 raised following error:
)r   r1   rU   Ú	TypeErrorrX   rZ   ÚstripÚlowerrV   Ú	Exceptionr	   )r"   r[   Úexpected_keysÚparsedr#   Úes         r$   r=   zRouterOutputParser.parse¯   sJ  € ð	4Ø*¨MÐ:ˆMÝ2°4¸ÑGÔGˆFÝ˜f ]Ô3µSÑ9Ô9ð %Ø>�Ý ‘n”nÐ$Ý˜f ]Ô3°TÔ5JÑKÔKð %ØN°dÔ6KÐNÐNÐN�Ý ‘n”nÐ$Ø%)Ô%?ÀÈÔAVÐ$WˆF�=Ñ!à�}Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ØÔ+×1Ò1Ñ3Ô3ò4ð 4ð )-��}Ñ%Ð%à(.¨}Ô(=×(CÒ(CÑ(EÔ(E��}Ñ%øøÝð 	4ð 	4ð 	4ØH 4ÐHÐHÀQÐHÐHˆCÝ'¨Ñ,Ô,°!Ð3øøøøð	4øøøð ˆs   ‚C1C4 Ã4
DÃ>DÄDN)r[   rU   r   r+   )rJ   rK   rL   rM   rV   rN   rU   rX   rZ   r   r=   r9   r&   r$   rS   rS   ¨   sp   € € € € € € ØFÐFà(ÐÐ(Ð(Ð(Ñ(Ø ÐÐ Ð Ð Ñ Ø!(ÐÐ(Ð(Ð(Ñ(àðð ð ñ „Xðð ð r&   rS   N)"rM   Ú
__future__r   Útypingr   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   r   Úlangchain_classic.chainsr   Ú$langchain_classic.chains.router.baser   r   r2   rU   rS   r9   r&   r$   ú<module>rs      s½  ðØ 1Ð 1à "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø CÐ CÐ CÐ CÐ CÐ CØ $Ð $Ð $Ð $Ð $Ð $Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à -Ð -Ð -Ð -Ð -Ð -Ø <Ð <Ð <Ð <Ð <Ð <ð €Ø
ØØ/ð	Að	ñ 	ô 	ðC2ð C2ð C2ð C2ð C2�[ñ C2ô C2ñ	ô 	ðC2ðLð ð ð ð Ð)¨$¨s°C¨x¬.Ô9ñ ô ð ð ð r&   