
    m
i;                    b   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Z3dS ) 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                     e Zd ZU dZe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:

        ```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)
        ```
    returnboolc                    dS )NT )clss    C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_classic/chains/llm.pyis_lc_serializablezLLMChain.is_lc_serializableL   s	     t    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extra	list[str]c                    | j         j        S )z)Will be whatever keys the prompt expects.)r/   input_variablesselfs    r,   
input_keyszLLMChain.input_keysd   s     {**r.   c                2    | j         r| j        gS | j        dgS )zWill always return text key.full_generation)r6   r3   r?   s    r,   output_keyszLLMChain.output_keysi   s(     ! 	%O$$!233r.   Ninputsdict[str, Any]run_manager!CallbackManagerForChainRun | Nonedict[str, str]c                h    |                      |g|          }|                     |          d         S NrG   r   )generatecreate_outputsr@   rE   rG   responses       r,   _callzLLMChain._callp   s4    
 ==&{=CC""8,,Q//r.   
input_listlist[dict[str, Any]]r   c                4   |                      ||          \  }}|r|                                nd}t          | j        t                    r | j        j        ||fd|i| j        S  | j        j        d	d|i| j                            t          d|          d|i          }g }|D ]`}t          |t                    r%|                    t          |          g           <|                    t          |          g           at          |          S 
z Generate LLM result from inputs.rL   N	callbacksstoplist)message)r1   )generationsr*   )prep_prompts	get_child
isinstancer0   r   generate_promptr8   bindbatchr   r   appendr   r   r   	r@   rR   rG   promptsrW   rV   resultsrZ   ress	            r,   rM   zLLMChain.generatex   sT    ))*+)NN/:DK))+++	dh 122 	+48+  $ /	    $(-==T=T_==CC!!)$
 
 /1 	; 	;C#{++ ;""N3$?$?$?#@AAAA""JC$8$8$8#9::::[1111r.   &AsyncCallbackManagerForChainRun | Nonec                \  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          d|          d|i           d{V }g }|D ]`}t          |t                    r%|                    t          |          g           <|                    t          |          g           at          |          S rU   )aprep_promptsr\   r]   r0   r   agenerate_promptr8   r_   abatchr   r   ra   r   r   r   rb   s	            r,   	ageneratezLLMChain.agenerate   s      #000UUUUUUUU/:DK))+++	dh 122 	22  $ /	         &CC4C4?CCJJ!!)$
 
 
 
 
 
 
 
 /1 	; 	;C#{++ ;""N3$?$?$?#@AAAA""JC$8$8$8#9::::[1111r.   *tuple[list[PromptValue], list[str] | None]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d	}	t          |	          |	                    |           ||fS )Prepare prompts from inputs.Nr   rW   c                "    i | ]}||         S r*   r*   .0krE   s     r,   
<dictcomp>z)LLMChain.prep_prompts.<locals>.<dictcomp>       QQQq&)QQQr.   greenPrompt after formatting:

endverbose=If `stop` is present in any inputs, should be present in all.r*   
lenr/   r>   format_promptr   	to_stringon_textrz   
ValueErrorra   r@   rR   rG   rW   rc   selected_inputsr/   _colored_text_textmsgrE   s             @r,   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$:$:U oo%NN6""""}r.   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d	}	t          |	          |	                    |           ||fS )rn   Nr   rW   c                "    i | ]}||         S r*   r*   rp   s     r,   rs   z*LLMChain.aprep_prompts.<locals>.<dictcomp>   rt   r.   ru   rv   rw   rx   r{   r*   r|   r   s             @r,   rh   zLLMChain.aprep_prompts   s7      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$:$:U oo%NN6""""}r.   rV   r   list[dict[str, str]]c                x   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.NrR   )namerL   outputs)r
   	configurerV   rz   on_chain_startget_namerM   BaseExceptionon_chain_errorrN   on_chain_endr@   rR   rV   callback_managerrG   rP   er   s           r,   applyzLLMChain.apply   s     +4NL
 

 '55:& 6 
 

	}}Z[}IIHH 	 	 	&&q)))	 %%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   rV   rz   r   r   rk   r   r   rN   r   r   s           r,   aapplyzLLMChain.aapply   s3      09NL
 

 -;;:& < 
 
 
 
 
 
 
 

	!^^JK^PPPPPPPPHH 	 	 	,,Q/////////	 %%h//&&	7';<<<<<<<<<s   A4 4
B>BBc                    | j         S Nr3   r?   s    r,   _run_output_keyzLLMChain._run_output_key  s
    r.   
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 )rC   )r3   r5   parse_result)rq   
generationr@   s     r,   
<listcomp>z+LLMChain.create_outputs.<locals>.<listcomp>  sJ     
 
 
  !3!@!@!L!L!:
 
 
r.   c                8    g | ]}j         |j                  iS r*   r   )rq   rr@   s     r,   r   z+LLMChain.create_outputs.<locals>.<listcomp>!  s'    LLLt$/(:;LLLr.   )rZ   r6   )r@   r   results   `  r,   rN   zLLMChain.create_outputs  s\    
 
 
 
 )4
 
 
 ! 	MLLLLVLLLFr.   c                x   K   |                      |g|           d {V }|                     |          d         S rK   )rk   rN   rO   s       r,   _acallzLLMChain._acall$  sJ      
 kJJJJJJJJ""8,,Q//r.   kwargsr   c                2     | ||          | 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")
            ```
        rV   r   r@   rV   r   s      r,   predictzLLMChain.predict,  s      tFi000AAr.   c                V   K   |                      ||           d{V | j                 S )r   r   N)acallr3   r   s      r,   apredictzLLMChain.apredict=  s7       jj9j========tOOr.    str | list[str] | dict[str, Any]c                    t          j        d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.   
stacklevelrV   Nr*   )warningswarnr   r/   r5   parser@   rV   r   r   s       r,   predict_and_parsezLLMChain.predict_and_parseN  sm     	B	
 	
 	
 	

 <<	<V<<;$0;,226:::r.    str | list[str] | dict[str, str]c                   K   t          j        d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.r   r   rV   Nr*   )r   r   r   r/   r5   r   r   s       r,   apredict_and_parsezLLMChain.apredict_and_parse^  s       	B	
 	
 	
 	

 %t}CCyCFCCCCCCCC;$0;,226:::r.   *Sequence[str | list[str] | dict[str, str]]c                    t          j        d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   r   r   _parse_generationr@   rR   rV   r   s       r,   apply_and_parsezLLMChain.apply_and_parsen  sQ     	B	
 	
 	
 	

 J)<<%%f---r.   r   c                <      j         j         fd|D             S |S )Nc                d    g | ],}j         j                            |j                           -S r*   )r/   r5   r   r3   )rq   re   r@   s     r,   r   z.LLMChain._parse_generation.<locals>.<listcomp>  sC        )//DO0DEE  r.   )r/   r5   )r@   r   s   ` r,   r   zLLMChain._parse_generation|  sC     ;$0   %    r.   c                   K   t          j        dd           |                     ||           d{V }|                     |          S )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  sg       	B	
 	
 	
 	

 {{:{CCCCCCCC%%f---r.   c                    dS )N	llm_chainr*   r?   s    r,   _chain_typezLLMChain._chain_type  s    {r.   r   templatec                D    t          j        |          } | ||          S )z&Create LLMChain from LLM and template.)r0   r/   )r   from_template)r+   r0   r   prompt_templates       r,   from_stringzLLMChain.from_string  s)     )6x@@ss?3333r.   intc                P    t          | j                                      |          S r   )_get_language_modelr0   get_num_tokens)r@   r1   s     r,   _get_num_tokenszLLMChain._get_num_tokens  s     "48,,;;DAAAr.   )r'   r(   )r'   r<   r   )rE   rF   rG   rH   r'   rI   )rR   rS   rG   rH   r'   r   )rR   rS   rG   rf   r'   r   )rR   rS   rG   rH   r'   rl   )rR   rS   rG   rf   r'   rl   )rR   rS   rV   r   r'   r   )r'   r2   )r   r   r'   rS   )rE   rF   rG   rf   r'   rI   )rV   r   r   r   r'   r2   )rV   r   r   r   r'   r   )rV   r   r   r   r'   r   )rR   rS   rV   r   r'   r   )r   r   r'   r   )r0   r   r   r2   r'   r&   )r1   r2   r'   r   )(__name__
__module____qualname____doc__classmethodr    r-   __annotations__r3   r   r   r5   r6   r7   r8   r   model_configpropertyrA   rD   rQ   rM   rk   r[   rh   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r*   r.   r,   r&   r&   (   s{         <    X [ VVVV!J).)O)O)OMOOOO #""""RuT222J2222: $  L
 + + + X+ 4 4 4 X4 :>0 0 0 0 0 :>2 2 2 2 2< ?C2 2 2 2 2< :>    8 ?C    8  $    8  $    2    X   " ?C0 0 0 0 0B B B B B"P P P P P&  $    $  $    &  $. . . . .	 	 	 	  $. . . . .    X 4 4 4 [4
B B B B B Br.   r&   llm_liker   r'   r   c                v   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 )r]   r   r   r   boundr   runnabler   r   defaulttyper   )r   r   s     r,   r   r     s    (-.. (O,, 3"8>222(122 6"8#4555(^_=>> 5"8#3444	>>	 	  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      se   8 8 " " " " " "  $ $ $ $ $ $         * * * * * *                     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  
sB sB sB sB sBu sB sB 
sBl     r.   