§
    ‡ìNg  ã                  óâ   — d Z ddlmZ ddlmZmZ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mZ ddlmZ  e	ddd¬¦  «         G d„ de¦  «        ¦   «         ZdS )zCUse a single chain to route an input to one of multiple llm chains.é    )Úannotations)ÚAnyÚDictÚListÚOptional)Ú
deprecated)ÚBaseLanguageModel)ÚPromptTemplate)ÚConversationChain)ÚChain)ÚLLMChain)ÚMultiRouteChain)ÚLLMRouterChainÚRouterOutputParser)ÚMULTI_PROMPT_ROUTER_TEMPLATEz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.multi_prompt.MultiPromptChain.html)ÚsinceÚremovalÚmessagec                  óF   — e Zd ZdZedd„¦   «         Ze	 ddd„¦   «         ZdS )ÚMultiPromptChaina	  A multi-route chain that uses an LLM router chain to choose amongst prompts.

    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"})
    Úreturnú	List[str]c                ó   — dgS )NÚtext© )Úselfs    ú`/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/router/multi_prompt.pyÚoutput_keyszMultiPromptChain.output_keys`   s	   € àˆxˆó    NÚllmr	   Úprompt_infosúList[Dict[str, str]]Údefault_chainúOptional[Chain]Úkwargsr   c                ó’  — d„ |D ¦   «         }d                      |¦  «        }t          j        |¬¦  «        }t          |dgt	          ¦   «         ¬¦  «        }t          j        ||¦  «        }	i }
|D ]:}|d         }|d         }t          |dg¬¦  «        }t          ||¬	¦  «        }||
|<   Œ;|pt          |d
¬¦  «        } | d|	|
|dœ|¤ŽS )zCConvenience constructor for instantiating from destination prompts.c                ó4   — g | ]}|d          › d|d         › ‘ŒS )Únamez: Údescriptionr   )Ú.0Úps     r   ú
<listcomp>z1MultiPromptChain.from_prompts.<locals>.<listcomp>m   s/   € ÐQÐQÐQ¸q˜1˜Vœ9Ð:Ð:¨¨-Ô(8Ð:Ð:ÐQÐQÐQr   ú
)ÚdestinationsÚinput)ÚtemplateÚinput_variablesÚoutput_parserr(   Úprompt_template)r0   r1   )r    Úpromptr   )r    Ú
output_key)Úrouter_chainÚdestination_chainsr#   r   )	Újoinr   Úformatr
   r   r   Úfrom_llmr   r   )Úclsr    r!   r#   r%   r.   Údestinations_strÚrouter_templateÚrouter_promptr6   r7   Úp_infor(   r3   r4   ÚchainÚ_default_chains                    r   Úfrom_promptszMultiPromptChain.from_promptsd   s&  € ð RÐQÀLÐQÑQÔQˆØŸ9š9 \Ñ2Ô2ÐÝ6Ô=Ø)ð
ñ 
ô 
ˆõ 'Ø$Ø$˜IÝ,Ñ.Ô.ð
ñ 
ô 
ˆõ
 &Ô.¨s°MÑBÔBˆØÐØ"ð 	-ð 	-ˆFØ˜&”>ˆDØ$Ð%6Ô7ˆOÝ#¨_ÈwÈiÐXÑXÔXˆFÝ ¨VÐ4Ñ4Ô4ˆEØ',Ð˜tÑ$Ð$Ø&ÐWÕ*;ÀÐPVÐ*WÑ*WÔ*WˆØˆsð 
Ø%Ø1Ø(ð
ð 
ð ð	
ð 
ð 	
r   )r   r   )N)
r    r	   r!   r"   r#   r$   r%   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   ÚclassmethodrB   r   r   r   r   r      sk   € € € € € ðAð AðF ðð ð ñ „Xðð ð
 *.ð	 
ð  
ð  
ð  
ñ „[ð 
ð  
ð  
r   r   N)rF   Ú
__future__r   Útypingr   r   r   r   Úlangchain_core._apir   Úlangchain_core.language_modelsr	   Úlangchain_core.promptsr
   Úlangchain.chainsr   Úlangchain.chains.baser   Úlangchain.chains.llmr   Úlangchain.chains.router.baser   Ú"langchain.chains.router.llm_routerr   r   Ú+langchain.chains.router.multi_prompt_promptr   r   r   r   r   ú<module>rT      sS  ðØ IÐ Ià "Ð "Ð "Ð "Ð "Ð "à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à *Ð *Ð *Ð *Ð *Ð *Ø <Ð <Ð <Ð <Ð <Ð <Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1à .Ð .Ð .Ð .Ð .Ð .Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø )Ð )Ð )Ð )Ð )Ð )Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ TÐ TÐ TÐ TÐ TÐ Tð €Ø
Øð	wð	ñ ô ði
ð i
ð i
ð i
ð i
ñ i
ô i
ñô ði
ð i
ð i
r   