
    3fi;                    N   d Z ddlmZ ddl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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+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1  e
ddd       G d de1             Z2ddZ3y)z2Chain that just formats a prompt and calls an LLM.    )annotationsN)Sequence)Any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)override)Chainz0.1.17z&RunnableSequence, e.g., `prompt | llm`z1.0)sincealternativeremovalc                  H   e Zd ZU dZe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:

        ```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)
        model = OpenAI()
        chain = prompt | model | StrOutputParser()

        chain.invoke("your adjective here")
        ```

    Example:
        ```python
        from langchain_classic.chains import LLMChain
        from langchain_openai import OpenAI
        from langchain_core.prompts import PromptTemplate

        prompt_template = "Tell me a {adjective} joke"
        prompt = PromptTemplate(input_variables=["adjective"], template=prompt_template)
        model = LLMChain(llm=OpenAI(), prompt=prompt)
        ```
    boolc                     y)NT )clss    Z/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/chains/llm.pyis_lc_serializablezLLMChain.is_lc_serializableL   s         r   promptzMRunnable[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 )z)Will be whatever keys the prompt expects.)r.   input_variablesselfs    r+   
input_keyszLLMChain.input_keysd   s     {{***r-   c                P    | j                   r| j                  gS | j                  dgS )zWill always return text key.full_generation)r5   r2   r=   s    r+   output_keyszLLMChain.output_keysi   s*     !!OO$$!233r-   Nc                R    | j                  |g|      }| j                  |      d   S Nrun_managerr   )generatecreate_outputsr>   inputsrF   responses       r+   _callzLLMChain._callp   s.    
 ==&{=C""8,Q//r-   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        d|      d|i      }g }|D ]K  }t        |t              r|j                  t        |      g       0|j                  t        |      g       M t        |      S 
z Generate LLM result from inputs.rE   N	callbacksstoplist)message)r0   )generationsr)   )prep_prompts	get_child
isinstancer/   r   generate_promptr7   bindbatchr   r   appendr   r   r   	r>   
input_listrF   promptsrP   rO   resultsrS   ress	            r+   rG   zLLMChain.generatex   s    ))*+)N/:K))+	dhh 12+488++ $ //	   $((--=T=T__=CC!)$
 /1 	;C#{+""N3$?#@A""JC$8#9:		;
 [11r-   c                h  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        d|      d|i       d{   }g }|D ]K  }t        |t              r|j                  t        |      g       0|j                  t        |      g       M t        |      S 7 7 7 gwrN   )aprep_promptsrU   rV   r/   r   agenerate_promptr7   rX   abatchr   r   rZ   r   r   r   r[   s	            r+   	ageneratezLLMChain.agenerate   s0     #000UU/:K))+	dhh 12222 $ //	   &C4C4??CJJ!)$
 
 /1 	;C#{+""N3$?#@A""JC$8#9:		;
 [11' V
s6   D2D+A"D2<D.=AD2D0	A#D2.D20D2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d}t        |      |j                  |        ||fS c c}w 
zPrepare prompts from inputs.Nr   rP   greenzPrompt after formatting:

)endverbosez=If `stop` is present in any inputs, should be present in all.r)   
lenr.   r<   format_promptr   	to_stringon_textrj   
ValueErrorrZ   r>   r\   rF   rP   r]   rJ   kselected_inputsr.   _colored_text_textmsgs               r+   rT   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$:U o%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d}t        |      |j                  |        ||fS c c}w 7 9wrf   rk   rq   s               r+   ra   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$:U o%NN6"
	# } R
 Qs   AC.C'A C.2C,3:C.c                Z   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\   )namerE   outputs)r
   	configurerO   rj   on_chain_startget_namerG   BaseExceptionon_chain_errorrH   on_chain_endr>   r\   rO   callback_managerrF   rK   er{   s           r+   applyzLLMChain.apply   s     +44NNLL

 '55:& 6 

	}}Z[}IH %%h/  )W!56  	&&q)	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 6wry   )r   r|   rO   rj   r}   r~   rd   r   r   rH   r   r   s           r+   aapplyzLLMChain.aapply   s      099NNLL

 -;;:& < 
 

	!^^JK^PPH %%h/&&	7';<<<
 Q 	,,Q///	 	=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r2   r=   s    r+   _run_output_keyzLLMChain._run_output_key  s    r-   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.rA   )rS   r2   r4   parse_resultr5   )r>   
llm_result
generationresultrs        r+   rH   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rD   )rd   rH   rI   s       r+   _acallzLLMChain._acall$  s;     
 kJJ""8,Q// Ks   535c                0     | ||      | j                      S )Q  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:
            ```python
            completion = llm.predict(adjective="funny")
            ```
        rO   r   r>   rO   kwargss      r+   predictzLLMChain.predict,  s     Fi0AAr-   c                ^   K   | j                  ||       d{   | j                     S 7 w)r   r   N)acallr2   r   s      r+   apredictzLLMChain.apredict=  s*      jj9j==tOO=s   -+-c                    t        j                  d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.   
stacklevelrO   r)   )warningswarnr   r.   r4   parser>   rO   r   r   s       r+   predict_and_parsezLLMChain.predict_and_parseN  sc     	B	

 <	<V<;;$$0;;,,226::r-   c                   K   t        j                  d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.r   r   rO   Nr)   )r   r   r   r.   r4   r   r   s       r+   apredict_and_parsezLLMChain.apredict_and_parse^  sp      	B	

 %t}}CyCFCC;;$$0;;,,226:: Ds   /A5A3AA5c                x    t        j                  d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   r   r   _parse_generationr>   r\   rO   r   s       r+   apply_and_parsezLLMChain.apply_and_parsen  s>     	B	

 J)<%%f--r-   c                    | j                   j                  @|D cg c]4  }| j                   j                  j                  || j                           6 c}S |S c c}w r   )r.   r4   r   r2   )r>   r   r_   s      r+   r   zLLMChain._parse_generation|  s\     ;;$$0 & ))//DOO0DE  	s   9Ac                   K   t        j                  d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   r   r   N)r   r   r   r   r   s       r+   aapply_and_parsezLLMChain.aapply_and_parse  sK      	B	

 {{:{CC%%f-- Ds   .AAAc                     y)N	llm_chainr)   r=   s    r+   _chain_typezLLMChain._chain_type  s    r-   c                @    t        j                  |      } | ||      S )z&Create LLMChain from LLM and template.)r/   r.   )r   from_template)r*   r/   templateprompt_templates       r+   from_stringzLLMChain.from_string  s!     )66x@s?33r-   c                J    t        | j                        j                  |      S r   )_get_language_modelr/   get_num_tokens)r>   r0   s     r+   _get_num_tokenszLLMChain._get_num_tokens  s    "488,;;DAAr-   )returnr'   )r   z	list[str]r   )rJ   dict[str, Any]rF   !CallbackManagerForChainRun | Noner   dict[str, str])r\   list[dict[str, Any]]rF   r   r   r   )r\   r   rF   &AsyncCallbackManagerForChainRun | Noner   r   )r\   r   rF   r   r   *tuple[list[PromptValue], list[str] | None])r\   r   rF   r   r   r   )r\   r   rO   r   r   list[dict[str, str]])r   r1   )r   r   r   r   )rJ   r   rF   r   r   r   )rO   r   r   r   r   r1   )rO   r   r   r   r   z str | list[str] | dict[str, Any])rO   r   r   r   r   z str | list[str] | dict[str, str])r\   r   rO   r   r   *Sequence[str | list[str] | dict[str, str]])r   r   r   r   )r/   r   r   r1   r   r&   )r0   r1   r   int)(__name__
__module____qualname____doc__classmethodr    r,   __annotations__r2   r   r   r4   r5   r6   r7   r   model_configpropertyr?   rB   rL   rG   rd   rT   ra   r   r   r   rH   r   r   r   r   r   r   r   r   r   r   r   r)   r-   r+   r&   r&   (   s   <    	VV!J).)OM&O #t"RT2J2 $L
 + + 4 4 :>00 70 
	0 :>2(2 72 
	2< ?C2(2 <2 
	2< :>( 7 
4	8 ?C( < 
4	8  $(  
	8  $(  
	2  " ?C00 <0 
	0B"P&  $  
*	$  $  
*	&  $.(. . 
4	.	(	 
4	  $.(. . 
4	.   4 4
Br-   r&   c                B   t        | t              r| S t        | t              rt        | j                        S t        | t
              rt        | j                        S t        | t        t        f      rt        | j                        S dt        |        }t        |      )NzAUnable to extract BaseLanguageModel from llm_like object of type )rV   r   r   r   boundr   runnabler   r   defaulttyperp   )llm_likerv   s     r+   r   r     s    (-.(O,"8>>22(12"8#4#455(^_=>"8#3#344
K>
	  S/r-   )r   r   r   r   )4r   
__future__r   r   collections.abcr   typingr   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   typing_extensionsr    langchain_classic.chains.baser!   r&   r   r)   r-   r+   <module>r      s    8 "  $  *  0 N H H 4 E  B 7 & & / 
8
sBu sB
sBlr-   