
    ih<                    N   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Z5y)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d+d       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d,d       Zed,d       Z	 d-	 	 	 	 	 d.dZ	 d-	 	 	 	 	 d/dZ	 d-	 	 	 	 	 d0dZ	 d-	 	 	 	 	 d1dZ	 d-	 	 	 	 	 d2dZ	 d-	 	 	 	 	 d3dZ	 d-	 	 	 	 	 d3dZed4d       Zd5dZ	 d-	 	 	 	 	 d6d Zd-d7d!Zd-d7d"Z	 d-	 	 	 	 	 d8d#Z	 d-	 	 	 	 	 d9d$Z 	 d-	 	 	 	 	 d:d%Z!	 	 	 	 d;d&Z"	 d-	 	 	 	 	 d:d'Z#ed4d(       Z$ed<d)       Z%d=d*Z&y)>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)
    boolc                     y)NT selfs    R/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain/chains/llm.pyis_lc_serializablezLLMChain.is_lc_serializableM   s        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extrac                .    | j                   j                  S )zJWill be whatever keys the prompt expects.

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

        :meta private:
        full_generation)r:   r7   r.   s    r0   output_keyszLLMChain.output_keysn   s*     !!OO$$OO%677r2   Nc                R    | j                  |g|      }| j                  |      d   S Nrun_managerr   )generatecreate_outputsr/   inputsrI   responses       r0   _callzLLMChain._cally   s.    
 ==&{=C""8,Q//r2   c                *   | j                  ||      \  }}|r|j                         nd}t        | j                  t              r* | j                  j
                  ||fd|i| j                  S  | j                  j                  dd|i| j                  j                  t        t        |      d|i      }g }|D ]K  }t        |t              r|j                  t        |      g       0|j                  t        |      g       M t        |      S 	z Generate LLM result from inputs.rH   N	callbacksstop)message)r5   )generationsr-   )prep_prompts	get_child
isinstancer4   r   generate_promptr<   bindbatchr   r   r   appendr   r   r   	r/   
input_listrI   promptsrS   rR   resultsrU   ress	            r0   rJ   zLLMChain.generate   s    ))*+)N/:K))+	dhh 12+488++ $ //	  $dhhmmAAAGGT7#k9%=G 35K ?c;/&&s(C'DE&&
(<'=>	?
 55r2   c                p  K   | j                  ||       d{   \  }}|r|j                         nd}t        | j                  t              r2 | j                  j
                  ||fd|i| j                   d{   S  | j                  j                  dd|i| j                  j                  t        t        |      d|i       d{   }g }|D ]K  }t        |t              r|j                  t        |      g       0|j                  t        |      g       M t        |      S 7 7 7 gwrQ   )aprep_promptsrW   rX   r4   r   agenerate_promptr<   rZ   abatchr   r   r   r\   r   r   r   r]   s	            r0   	ageneratezLLMChain.agenerate   s/     #000UU/:K))+	dhh 12222 $ //	   *DHHMMGtGtGNNT7#k9%= G 35K ?c;/&&s(C'DE&&
(<'=>	?
 55' Vs6   D6D/A"D6<D2=AD6D4A#D62D64D6c                   d}t        |      dk(  rg |fS d|d   v r|d   d   }g }|D ]  }| j                  j                  D ci c]  }|||   
 }} | j                  j                  d	i |}t	        |j                         d      }	d|	z   }
|r|j                  |
d| j                         d|v r|d   |k7  rt        d      |j                  |        ||fS c c}w 
zPrepare prompts from inputs.Nr   rS   greenzPrompt after formatting:

)endverbosez=If `stop` is present in any inputs, should be present in all.r-   
lenr3   rA   format_promptr"   	to_stringon_textrl   
ValueErrorr\   r/   r^   rI   rS   r_   rM   kselected_inputsr3   _colored_text_texts              r0   rV   zLLMChain.prep_prompts   s    z?at8OZ]"a=(D  	#F59[[5P5PQq&)|QOQ.T[[..AAF,V-=-=-?IM0=@E##EtT\\#JF6Nd$: S  NN6"	# } Rs   Cc                  K   d}t        |      dk(  rg |fS d|d   v r|d   d   }g }|D ]  }| j                  j                  D ci c]  }|||   
 }} | j                  j                  d	i |}t	        |j                         d      }	d|	z   }
|r&|j                  |
d| j                         d{    d|v r|d   |k7  rt        d      |j                  |        ||fS c c}w 7 7wrh   rm   rs   s              r0   rc   zLLMChain.aprep_prompts   s     z?at8OZ]"a=(D  	#F59[[5P5PQq&)|QOQ.T[[..AAF,V-=-=-?IM0=@E!))%T4<<)PPPF6Nd$: S  NN6"	# } R
 Qs   AC,C%A C,2C*38C,c                \   t        j                  || j                  | j                        }|j	                  dd|i| j                               }	 | j                  ||      }| j                  |      }|j                  d|i       |S # t        $ r}|j                  |       |d}~ww xY wz0Utilize the LLM generate method for speed gains.Nr^   )namerH   outputs)r   	configurerR   rl   on_chain_startget_namerJ   BaseExceptionon_chain_errorrK   on_chain_endr/   r^   rR   callback_managerrI   rN   er|   s           r0   applyzLLMChain.apply   s     +44t~~t||
 '55:& 6 

	}}Z[}IH %%h/  )W!56  	&&q)G	s   B
 
	B+B&&B+c                  K   t        j                  || j                  | j                        }|j	                  dd|i| j                                d{   }	 | j                  ||       d{   }| j                  |      }|j                  d|i       d{    |S 7 N7 4# t        $ r!}|j                  |       d{  7   |d}~ww xY w7 7wrz   )r   r}   rR   rl   r~   r   rf   r   r   rK   r   r   s           r0   aapplyzLLMChain.aapply   s      099t~~t||
 -;;:& < 
 

	!^^JK^PPH %%h/&&	7';<<<
 Q 	,,Q///G	 	=s`   ACB$CB( 1B&2B( 6'CCC&B( (	C1CCCCCc                    | j                   S Nr7   r.   s    r0   _run_output_keyzLLMChain._run_output_key  s    r2   c                   |j                   D cg c]+  }| j                  | j                  j                  |      d|i- }}| j                  r(|D cg c]  }| j                  || j                     i }}|S c c}w c c}w )zCreate outputs from response.rD   )rU   r7   r9   parse_resultr:   )r/   
llm_result
generationresultrs        r0   rK   zLLMChain.create_outputs  s     )44
  !3!3!@!@!L!:
 
 !!EKLt$//(:;LFL
 Ms   0A7"A<c                n   K   | j                  |g|       d {   }| j                  |      d   S 7 wrG   )rf   rK   rL   s       r0   _acallzLLMChain._acall'  s;     
 kJJ""8,Q// Ks   535c                0     | ||      | 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")
        rR   r   r/   rR   kwargss      r0   predictzLLMChain.predict/  s     Fi0AAr2   c                ^   K   | j                  ||       d{   | j                     S 7 w)r   r   N)acallr7   r   s      r0   apredictzLLMChain.apredict@  s*      jj9j==tOO=s   -+-c                    t        j                  d        | j                  dd|i|}| j                  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.rR   r-   )warningswarnr   r3   r9   parser/   rR   r   r   s       r0   predict_and_parsezLLMChain.predict_and_parseQ  s`     	B	
 <	<V<;;$$0;;,,226::Mr2   c                   K   t        j                  d        | j                  dd|i| d{   }| j                  j                  %| j                  j                  j                  |      S |S 7 Aw)z)Call apredict and then parse the results.z`The apredict_and_parse method is deprecated, instead pass an output parser directly to LLMChain.rR   Nr-   )r   r   r   r3   r9   r   r   s       r0   apredict_and_parsezLLMChain.apredict_and_parse_  sm      	B	
 %t}}CyCFCC;;$$0;;,,226::M	 Ds   -A3A1AA3c                t    t        j                  d       | j                  ||      }| j                  |      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r/   r^   rR   r   s       r0   apply_and_parsezLLMChain.apply_and_parsem  s;     	B	
 J)<%%f--r2   c                    | j                   j                  @|D cg c]4  }| j                   j                  j                  || j                           6 c}S |S c c}w r   )r3   r9   r   r7   )r/   r   ra   s      r0   r   zLLMChain._parse_generationx  s\     ;;$$0 & ))//DOO0DE 
 s   9Ac                   K   t        j                  d       | j                  ||       d{   }| j                  |      S 7 w)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       r0   aapply_and_parsezLLMChain.aapply_and_parse  sH      	B	
 {{:{CC%%f-- Ds   ,AAAc                     y)N	llm_chainr-   r.   s    r0   _chain_typezLLMChain._chain_type  s    r2   c                @    t        j                  |      } | ||      S )z&Create LLMChain from LLM and template.)r4   r3   )r   from_template)clsr4   templateprompt_templates       r0   from_stringzLLMChain.from_string  s!     )66x@s?33r2   c                J    t        | j                        j                  |      S r   )_get_language_modelr4   get_num_tokens)r/   r5   s     r0   _get_num_tokenszLLMChain._get_num_tokens  s    "488,;;DAAr2   )returnr+   )r   z	List[str]r   )rM   Dict[str, Any]rI   $Optional[CallbackManagerForChainRun]r   Dict[str, str])r^   List[Dict[str, Any]]rI   r   r   r   )r^   r   rI   )Optional[AsyncCallbackManagerForChainRun]r   r   )r^   r   rI   r   r   -Tuple[List[PromptValue], Optional[List[str]]])r^   r   rI   r   r   r   )r^   r   rR   r   r   List[Dict[str, str]])r   r6   )r   r   r   r   )rM   r   rI   r   r   r   )rR   r   r   r   r   r6   )rR   r   r   r   r   z%Union[str, List[str], Dict[str, Any]])rR   r   r   r   r   z%Union[str, List[str], Dict[str, str]])r^   r   rR   r   r   /Sequence[Union[str, List[str], Dict[str, str]]])r   r   r   r   )r4   r   r   r6   r   r*   )r5   r6   r   int)'__name__
__module____qualname____doc__classmethodr1   __annotations__r7   r$   r   r9   r:   r;   r<   r#   model_configpropertyrB   rE   rO   rJ   rf   rV   rc   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r-   r2   r0   r*   r*   &   s   B   
  "J).)OM&O #t"PT2J2 $L
 + + 8 8 =A00 :0 
	0 =A6(6 :6 
	6< BF6(6 ?6 
	6< =A( : 
7	: BF( ? 
7	6 HL.;D	, HL.;D	*  " BF00 ?0 
	0B"P$ &*"58	. &*"58	. HL	..	.;D	.	8	.	.		8	 HL	..	.;D	.	8	.   4 4
Br2   r*   c                >   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 )rX   r   r   r   boundr    runnabler   r!   defaultrr   type)llm_likes    r0   r   r     s    (-.	Ho	."8>>22	H3	4"8#4#455	H~?	@"8#3#344OH~ 
 	
r2   )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-   r2   r0   <module>r      s    8 "  J J J *  0 N H H 4 E  B 7 & ' 
8
nBu nB
nBb
r2   