
    Ng<                    b   d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZmZ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mZm Z  ddl!m"Z" ddl#m$Z$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/m0Z0m1Z1 ddl2m3Z3  eddd           G d de3                      Z4ddZ5dS )z2Chain that just formats a prompt and calls an LLM.    )annotationsN)AnyDictListOptionalSequenceTupleUnioncast)
deprecated)AsyncCallbackManagerAsyncCallbackManagerForChainRunCallbackManagerCallbackManagerForChainRun	Callbacks)BaseLanguageModelLanguageModelInput)BaseMessage)BaseLLMOutputParserStrOutputParser)ChatGeneration
Generation	LLMResult)PromptValue)BasePromptTemplatePromptTemplate)RunnableRunnableBindingRunnableBranchRunnableWithFallbacks)DynamicRunnable)get_colored_text)
ConfigDictField)Chainz0.1.17z&RunnableSequence, e.g., `prompt | llm`z1.0)sincealternativeremovalc                     e Zd ZU dZedDd            Zded<   	 ded<   	 d	Zd
ed<    ee	          Z
ded<   	 dZded<   	  ee          Zded<    edd          ZedEd            ZedEd            Z	 dFdGdZ	 dFdHd"Z	 dFdId$Z	 dFdJd&Z	 dFdKd'Z	 dFdLd+Z	 dFdLd,ZedMd-            ZdNd/Z	 dFdOd0ZdFdPd3ZdFdPd4Z	 dFdQd6Z	 dFdRd8Z 	 dFdSd:Z!dTd<Z"	 dFdSd=Z#edMd>            Z$edUdA            Z%dVdCZ&dS )WLLMChaina^  Chain to run queries against LLMs.

    This class is deprecated. See below for an example implementation using
    LangChain runnables:

        .. code-block:: python

            from langchain_core.output_parsers import StrOutputParser
            from langchain_core.prompts import PromptTemplate
            from langchain_openai import OpenAI

            prompt_template = "Tell me a {adjective} joke"
            prompt = PromptTemplate(
                input_variables=["adjective"], template=prompt_template
            )
            llm = OpenAI()
            chain = prompt | llm | StrOutputParser()

            chain.invoke("your adjective here")

    Example:
        .. code-block:: python

            from langchain.chains import LLMChain
            from langchain_community.llms import OpenAI
            from langchain_core.prompts import PromptTemplate
            prompt_template = "Tell me a {adjective} joke"
            prompt = PromptTemplate(
                input_variables=["adjective"], template=prompt_template
            )
            llm = LLMChain(llm=OpenAI(), prompt=prompt)
    returnboolc                    dS )NT selfs    P/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/llm.pyis_lc_serializablezLLMChain.is_lc_serializableM   s    t    r   promptzSUnion[Runnable[LanguageModelInput, str], Runnable[LanguageModelInput, BaseMessage]]llmtextstr
output_key)default_factoryr   output_parserTreturn_final_onlydict
llm_kwargsforbid)arbitrary_types_allowedextra	List[str]c                    | j         j        S )zJWill be whatever keys the prompt expects.

        :meta private:
        )r4   input_variablesr/   s    r1   
input_keyszLLMChain.input_keysf   s     {**r3   c                2    | j         r| j        gS | j        dgS )z=Will always return text key.

        :meta private:
        full_generation)r;   r8   r/   s    r1   output_keyszLLMChain.output_keysn   s(     ! 	8O$$O%677r3   NinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]Dict[str, str]c                h    |                      |g|          }|                     |          d         S NrJ   r   )generatecreate_outputsr0   rH   rJ   responses       r1   _callzLLMChain._cally   s4    
 ==&{=CC""8,,Q//r3   
input_listList[Dict[str, Any]]r   c                >   |                      ||          \  }}|r|                                nd}t          | j        t                    r | j        j        ||fd|i| j        S  | j        j        dd|i| j                            t          t          |          d|i          }g }|D ]`}t          |t                    r%|                    t          |          g           <|                    t          |          g           at          |          S 	z Generate LLM result from inputs.rO   N	callbacksstop)message)r6   )generationsr.   )prep_prompts	get_child
isinstancer5   r   generate_promptr=   bindbatchr   r   r   appendr   r   r   	r0   rU   rJ   promptsrZ   rY   resultsr\   ress	            r1   rP   zLLMChain.generate   sS    ))*+)NN/:DK))+++	dh 122 	6+48+  $ /	   $dhmAAAAAGGT7##k9%= G 35K ? ?c;// ?&&s(C(C(C'DEEEE&&
(<(<(<'=>>>>5555r3   )Optional[AsyncCallbackManagerForChainRun]c                f  K   |                      ||           d{V \  }}|r|                                nd}t          | j        t                    r! | j        j        ||fd|i| j         d{V S  | j        j        dd|i| j                            t          t          |          d|i           d{V }g }|D ]`}t          |t                    r%|                    t          |          g           <|                    t          |          g           at          |          S rX   )aprep_promptsr^   r_   r5   r   agenerate_promptr=   ra   abatchr   r   r   rc   r   r   r   rd   s	            r1   	ageneratezLLMChain.agenerate   s      #000UUUUUUUU/:DK))+++	dh 122 	622  $ /	         *DHMGGtGtGGNNT7##k9%=       G 35K ? ?c;// ?&&s(C(C(C'DEEEE&&
(<(<(<'=>>>>5555r3   -Tuple[List[PromptValue], Optional[List[str]]]c                  	 d}t          |          dk    rg |fS d|d         v r|d         d         }g }|D ]		fd| j        j        D             } | j        j        d
i |}t	          |                                d          }d|z   }|r|                    |d| j                   d	v r	d         |k    rt          d	          |	                    |           ||fS )Prepare prompts from inputs.Nr   rZ   c                "    i | ]}||         S r.   r.   .0krH   s     r1   
<dictcomp>z)LLMChain.prep_prompts.<locals>.<dictcomp>       QQQq&)QQQr3   greenPrompt after formatting:

endverbose=If `stop` is present in any inputs, should be present in all.r.   
lenr4   rC   format_promptr"   	to_stringon_textr|   
ValueErrorrc   
r0   rU   rJ   rZ   re   selected_inputsr4   _colored_text_textrH   s
            @r1   r]   zLLMChain.prep_prompts   s'    z??at8OZ]""a=(D  	# 	#FQQQQT[5PQQQO.T[.AAAAF,V-=-=-?-?IIM0=@E K##EtT\#JJJF6Nd$:$: S   NN6""""}r3   c                  	K   d}t          |          dk    rg |fS d|d         v r|d         d         }g }|D ]		fd| j        j        D             } | j        j        d
i |}t	          |                                d          }d|z   }|r#|                    |d| j                   d{V  d	v r	d         |k    rt          d	          |	                    |           ||fS )rp   Nr   rZ   c                "    i | ]}||         S r.   r.   rr   s     r1   ru   z*LLMChain.aprep_prompts.<locals>.<dictcomp>   rv   r3   rw   rx   ry   rz   r}   r.   r~   r   s
            @r1   rj   zLLMChain.aprep_prompts   s=      z??at8OZ]""a=(D  	# 	#FQQQQT[5PQQQO.T[.AAAAF,V-=-=-?-?IIM0=@E Q!))%T4<)PPPPPPPPPF6Nd$:$: S   NN6""""}r3   rY   r   List[Dict[str, str]]c                z   t          j        || j        | j                  }|                    dd|i|                                           }	 |                     ||          }n)# t          $ r}|                    |           |d}~ww xY w| 	                    |          }|
                    d|i           |S z0Utilize the LLM generate method for speed gains.NrU   )namerO   outputs)r   	configurerY   r|   on_chain_startget_namerP   BaseExceptionon_chain_errorrQ   on_chain_endr0   rU   rY   callback_managerrJ   rS   er   s           r1   applyzLLMChain.apply   s     +4t~t|
 
 '55:& 6 
 

	}}Z[}IIHH 	 	 	&&q)))G	 %%h//  )W!5666s   A& &
B0BBc                  K   t          j        || j        | j                  }|                    dd|i|                                            d{V }	 |                     ||           d{V }n/# t          $ r"}|                    |           d{V  |d}~ww xY w| 	                    |          }|
                    d|i           d{V  |S r   )r   r   rY   r|   r   r   rm   r   r   rQ   r   r   s           r1   aapplyzLLMChain.aapply   s3      09t~t|
 
 -;;:& < 
 
 
 
 
 
 
 

	!^^JK^PPPPPPPPHH 	 	 	,,Q/////////G	 %%h//&&	7';<<<<<<<<<s   A4 4
B >BB c                    | j         S Nr8   r/   s    r1   _run_output_keyzLLMChain._run_output_key  s
    r3   
llm_resultc                X      fd|j         D             } j        r fd|D             }|S )zCreate outputs from response.c                V    g | ]%}j         j                            |          d |i&S )rF   )r8   r:   parse_result)rs   
generationr0   s     r1   
<listcomp>z+LLMChain.create_outputs.<locals>.<listcomp>  sJ     
 
 
  !3!@!@!L!L!:
 
 
r3   c                8    g | ]}j         |j                  iS r.   r   )rs   rr0   s     r1   r   z+LLMChain.create_outputs.<locals>.<listcomp>$  s'    LLLt$/(:;LLLr3   )r\   r;   )r0   r   results   `  r1   rQ   zLLMChain.create_outputs  s\    
 
 
 
 )4
 
 
 ! 	MLLLLVLLLFr3   c                x   K   |                      |g|           d {V }|                     |          d         S rN   )rm   rQ   rR   s       r1   _acallzLLMChain._acall'  sJ      
 kJJJJJJJJ""8,,Q//r3   kwargsr   c                2     | ||          | j                  S )S  Format prompt with kwargs and pass to LLM.

        Args:
            callbacks: Callbacks to pass to LLMChain
            **kwargs: Keys to pass to prompt template.

        Returns:
            Completion from LLM.

        Example:
            .. code-block:: python

                completion = llm.predict(adjective="funny")
        rY   r   r0   rY   r   s      r1   predictzLLMChain.predict/  s      tFi000AAr3   c                V   K   |                      ||           d{V | j                 S )r   r   N)acallr8   r   s      r1   apredictzLLMChain.apredict@  s7       jj9j========tOOr3   %Union[str, List[str], Dict[str, Any]]c                    t          j        d            | j        dd|i|}| j        j        | j        j                            |          S |S )z(Call predict and then parse the results.z_The predict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.rY   Nr.   )warningswarnr   r4   r:   parser0   rY   r   r   s       r1   predict_and_parsezLLMChain.predict_and_parseQ  se     	B	
 	
 	
 <<	<V<<;$0;,226:::Mr3   %Union[str, List[str], Dict[str, str]]c                   K   t          j        d            | j        dd|i| d{V }| j        j        | j        j                            |          S |S )z)Call apredict and then parse the results.z`The apredict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.rY   Nr.   )r   r   r   r4   r:   r   r   s       r1   apredict_and_parsezLLMChain.apredict_and_parse_  s{       	B	
 	
 	
 %t}CCyCFCCCCCCCC;$0;,226:::Mr3   /Sequence[Union[str, List[str], Dict[str, str]]]c                    t          j        d           |                     ||          }|                     |          S )&Call apply and then parse the results.z]The apply_and_parse method is deprecated, instead pass an output parser directly to LLMChain.r   )r   r   r   _parse_generationr0   rU   rY   r   s       r1   apply_and_parsezLLMChain.apply_and_parsem  sI     	B	
 	
 	
 J)<<%%f---r3   r   c                <      j         j         fd|D             S |S )Nc                d    g | ],}j         j                            |j                           -S r.   )r4   r:   r   r8   )rs   rg   r0   s     r1   r   z.LLMChain._parse_generation.<locals>.<listcomp>|  sC        )//DO0DEE  r3   )r4   r:   )r0   r   s   ` r1   r   zLLMChain._parse_generationx  sC     ;$0   %   
 r3   c                   K   t          j        d           |                     ||           d{V }|                     |          S )r   z^The aapply_and_parse method is deprecated, instead pass an output parser directly to LLMChain.r   N)r   r   r   r   r   s       r1   aapply_and_parsezLLMChain.aapply_and_parse  s_       	B	
 	
 	
 {{:{CCCCCCCC%%f---r3   c                    dS )N	llm_chainr.   r/   s    r1   _chain_typezLLMChain._chain_type  s    {r3   r   templatec                D    t          j        |          } | ||          S )z&Create LLMChain from LLM and template.)r5   r4   )r   from_template)clsr5   r   prompt_templates       r1   from_stringzLLMChain.from_string  s)     )6x@@ss?3333r3   intc                P    t          | j                                      |          S r   )_get_language_modelr5   get_num_tokens)r0   r6   s     r1   _get_num_tokenszLLMChain._get_num_tokens  s     "48,,;;DAAAr3   )r+   r,   )r+   rA   r   )rH   rI   rJ   rK   r+   rL   )rU   rV   rJ   rK   r+   r   )rU   rV   rJ   rh   r+   r   )rU   rV   rJ   rK   r+   rn   )rU   rV   rJ   rh   r+   rn   )rU   rV   rY   r   r+   r   )r+   r7   )r   r   r+   rV   )rH   rI   rJ   rh   r+   rL   )rY   r   r   r   r+   r7   )rY   r   r   r   r+   r   )rY   r   r   r   r+   r   )rU   rV   rY   r   r+   r   )r   r   r+   r   )r5   r   r   r7   r+   r*   )r6   r7   r+   r   )'__name__
__module____qualname____doc__classmethodr2   __annotations__r8   r$   r   r:   r;   r<   r=   r#   model_configpropertyrD   rG   rT   rP   rm   r]   rj   r   r   r   rQ   r   r   r   r   r   r   r   r   r   r   r   r.   r3   r1   r*   r*   &   s         B    [     "J).)O)O)OMOOOO #""""PuT222J2222: $  L
 + + + X+ 8 8 8 X8 =A0 0 0 0 0 =A6 6 6 6 6< BF6 6 6 6 6< =A    : BF    6 HL    , HL    *    X   " BF0 0 0 0 0B B B B B"P P P P P$ &*     &*     HL	. 	. 	. 	. 	.	 	 	 	 HL	. 	. 	. 	. 	.    X 4 4 4 [4
B B B B B Br3   r*   llm_liker   r+   r   c                r   t          | t                    r| S t          | t                    rt          | j                  S t          | t
                    rt          | j                  S t          | t          t          f          rt          | j	                  S t          dt          |                      )NzAUnable to extract BaseLanguageModel from llm_like object of type )r_   r   r   r   boundr    runnabler   r!   defaultr   type)r   s    r1   r   r     s    (-.. 
	Ho	.	. 

"8>222	H3	4	4 
"8#4555	H~?	@	@ 
"8#3444 H~~   
 
 	
r3   )r   r   r+   r   )6r   
__future__r   r   typingr   r   r   r   r   r	   r
   r   langchain_core._apir   langchain_core.callbacksr   r   r   r   r   langchain_core.language_modelsr   r   langchain_core.messagesr   langchain_core.output_parsersr   r   langchain_core.outputsr   r   r   langchain_core.prompt_valuesr   langchain_core.promptsr   r   langchain_core.runnablesr   r   r   r    %langchain_core.runnables.configurabler!   langchain_core.utils.inputr"   pydanticr#   r$   langchain.chains.baser%   r*   r   r.   r3   r1   <module>r      se   8 8 " " " " " "  J J J J J J J J J J J J J J J J J J J J * * * * * *                     0 / / / / / N N N N N N N N H H H H H H H H H H 4 4 4 4 4 4 E E E E E E E E            B A A A A A 7 7 7 7 7 7 & & & & & & & & ' ' ' ' ' ' 
8  
nB nB nB nB nBu nB nB 
nBb
 
 
 
 
 
r3   