
    h<                    J   d Z ddlmZ ddl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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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Optional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/eduruby.in/venv/lib/python3.12/site-packages/langchain/chains/llm.pyis_lc_serializablezLLMChain.is_lc_serializableN   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:
        )r0   input_variablesr+   s    r-   
input_keyszLLMChain.input_keysh   s     {{***r/   c                P    | j                   r| j                  gS | j                  dgS )z=Will always return text key.

        :meta private:
        full_generation)r7   r4   r+   s    r-   output_keyszLLMChain.output_keysp   s*     !!OO$$!233r/   Nc                R    | j                  |g|      }| j                  |      d   S Nrun_managerr   )generatecreate_outputsr,   inputsrF   responses       r-   _callzLLMChain._callz   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        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.rE   N	callbacksstop)message)r2   )generationsr*   )prep_prompts	get_child
isinstancer1   r   generate_promptr9   bindbatchr   listr   appendr   r   r   	r,   
input_listrF   promptsrP   rO   resultsrR   ress	            r-   rG   zLLMChain.generate   s    ))*+)N/:K))+	dhh 12+488++ $ //	   $((--=T=T__=CCw)$
 /1 	;C#{+""N3$?#@A""JC$8#9:		;
 [11r/   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rN   )aprep_promptsrT   rU   r1   r   agenerate_promptr9   rW   abatchr   rY   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w)$
 
 /1 	;C#{+""N3$?#@A""JC$8#9:		;
 [11' 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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*   
lenr0   r>   format_promptr   	to_stringon_textrj   
ValueErrorrZ   r,   r\   rF   rP   r]   rJ   kselected_inputsr0   _colored_text_textmsgs               r-   rS   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r4   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   )rR   r4   r6   parse_resultr7   )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 )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")
        rO   r   r,   rO   kwargss      r-   predictzLLMChain.predict6  s     Fi0AAr/   c                ^   K   | j                  ||       d{   | j                     S 7 w)r   r   N)acallr4   r   s      r-   apredictzLLMChain.apredictG  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   r0   r6   parser,   rO   r   r   s       r-   predict_and_parsezLLMChain.predict_and_parseX  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   r0   r6   r   r   s       r-   apredict_and_parsezLLMChain.apredict_and_parseh  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_parsex  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   )r0   r6   r   r4   )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.)r1   r0   )r   from_template)clsr1   templateprompt_templates       r-   from_stringzLLMChain.from_string  s!     )66x@s?33r/   c                J    t        | j                        j                  |      S r   )_get_language_modelr1   get_num_tokens)r,   r2   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   $Optional[CallbackManagerForChainRun]r   dict[str, str])r\   list[dict[str, Any]]rF   r   r   r   )r\   r   rF   )Optional[AsyncCallbackManagerForChainRun]r   r   )r\   r   rF   r   r   -tuple[list[PromptValue], Optional[list[str]]])r\   r   rF   r   r   r   )r\   r   rO   r   r   list[dict[str, str]])r   r3   )r   r   r   r   )rJ   r   rF   r   r   r   )rO   r   r   r   r   r3   )rO   r   r   r   r   z%Union[str, list[str], dict[str, Any]])rO   r   r   r   r   z%Union[str, list[str], dict[str, str]])r\   r   rO   r   r   /Sequence[Union[str, list[str], dict[str, str]]])r   r   r   r   )r1   r   r   r3   r   r'   )r2   r3   r   int)'__name__
__module____qualname____doc__classmethodr.   __annotations__r4   r!   r   r6   r7   r8   r9   r    model_configpropertyr?   rB   rL   rG   rd   rS   ra   r   r   r   rH   r   r   r   r   r   r   r   r   r   r   r   r*   r/   r-   r'   r'   '   s   B   
  "J).)OM&O #t"PT2J2 $L
 + + 4 4 =A00 :0 
	0 =A2(2 :2 
	2< BF2(2 ?2 
	2< =A( : 
7	8 BF( ? 
7	8  $(  
	8  $(  
	2  " BF00 ?0 
	0B"P&  $  
/	$  $  
/	&  $.(. . 
9	.	(	 
9	  $.(. . 
9	.   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 )rU   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   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*   r/   r-   <module>r      s    8 "  $ - - *  0 N H H 4 E  B 7 & ' 
8
~Bu ~B
~BBr/   