
    m
io                         d 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
 ddlmZ ddlmZ  G d d	e          Z G d
 de          ZdS )zEChain pipeline where the outputs of one step feed directly into next.    )Any)AsyncCallbackManagerForChainRunCallbackManagerForChainRun)get_color_mapping)
ConfigDictmodel_validator)Self)Chainc            	          e Zd ZU dZee         ed<   ee         ed<   ee         ed<   dZe	ed<    e
dd	          Zed
ee         fd            Zed
ee         fd            Z ed          eded
efd                        Z	 ddeeef         dedz  d
eeef         fdZ	 ddeeef         dedz  d
eeef         fdZdS )SequentialChainz=Chain where the outputs of one chain feed directly into next.chainsinput_variablesoutput_variablesF
return_allTforbidarbitrary_types_allowedextrareturnc                     | j         S )z(Return expected input keys to the chain.)r   selfs    C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_classic/chains/sequential.py
input_keyszSequentialChain.input_keys   s     ##    c                     | j         S zReturn output key.)r   r   s    r   output_keyszSequentialChain.output_keys"   s     $$r   beforemodevaluesc                    |d         }|d         }g }d|v r|d         	 |d         j         }t          |                              t          |                    rJt          |          t          |          z  }dd                    |           d| d}t	          |          t          ||z             }|D ]}t          |j                                      |          }	|j        r|	                    |j        j                   }	|	rd	|	 d
| }t	          |          |                    |j                  }|rd| }t	          |          |t          |j                  z  }d|vr?|	                    dd          r|                    |          }
n|d         j        }
|
|d<   n?t          |d                                       |          }	|	rd|	 d}t	          |          |S )z6Validate that the correct inputs exist for all chains.r   r   memoryNzThe input key(s)  z are found in the Memory keys (z8) - please use input and memory keys that don't overlap.zMissing required input keys: z, only had z(Chain returned keys that already exist: r   r   Fz/Expected output variables that were not found: .)
memory_variablessetintersectionjoin
ValueErrorr   
differencer$   r   get)clsr"   r   r   memory_keysoverlapping_keysmsgknown_variableschainmissing_varsr   s              r   validate_chainszSequentialChain.validate_chains'   sL    ! !23v&"2">F *;K?##00[1A1ABB &#&#7#7#k:J:J#J 70@(A(A 7 7+67 7 7 
 !oo%o;<< 	6 	6Eu/00;;OLLL| V+66u|7TUU &2L 2 2 /2 2  !oo%.;;E<MNN &SAQSS oo%s5#4555OOV++zz,.. 5-88II$Rj4)4F%&&v&89::EEoVVL &WWWW oo%r   Ninputsrun_managerc                    |                                 |pt          j                    }t          | j                  D ]<\  }}|                                } |d|          }                    |           =fd| j        D             S )NTreturn_only_outputs	callbacksc                 "    i | ]}||         S  r>   .0kknown_valuess     r   
<dictcomp>z)SequentialChain._call.<locals>.<dictcomp>g       BBBq<?BBBr   )copyr   get_noop_manager	enumerater   	get_childupdater   )	r   r7   r8   _run_manager_ir4   r<   outputsrB   s	           @r   _callzSequentialChain._call\   s    
 {{}}"S&@&Q&S&S"4;// 	) 	)IB$..00IeLdiXXXG((((BBBBD,ABBBBr   c                 B  K   |                                 |pt          j                    }|                                }t	          | j                  D ]8\  }}|                    d|           d {V }                    |           9fd| j        D             S )NTr:   c                 "    i | ]}||         S r>   r>   r?   s     r   rC   z*SequentialChain._acall.<locals>.<dictcomp>x   rD   r   )	rE   r   rF   rH   rG   r   acallrI   r   )	r   r7   r8   rJ   r<   rK   r4   rL   rB   s	           @r   _acallzSequentialChain._acalli   s      
 {{}}"X&E&V&X&X **,,	"4;// 	) 	)IB!KK$(# (        G
 ((((BBBBD,ABBBBr   N)__name__
__module____qualname____doc__listr
   __annotations__strr   boolr   model_configpropertyr   r   r   classmethoddictr   r6   r   rM   r   rQ   r>   r   r   r   r      s        GGK#Y3iJ: $  L
 $DI $ $ $ X$ %T#Y % % % X% _(###1T 1c 1 1 1 [ $#1l :>C CS#XC 0$6C 
c3h	C C C C  ?CC CS#XC 5t;C 
c3h	C C C C C Cr   r   c            	       j   e Zd ZU dZee         ed<   dZeed<   dZ	e
ed<   dZe
ed<    ed	d
          Zedee
         fd            Zedee
         fd            Z ed          defd            Z	 ddee
e
f         dedz  dee
e
f         fdZ	 ddee
ef         dedz  dee
ef         fdZdS )SimpleSequentialChainzCSimple chain where the outputs of one step feed directly into next.r   Fstrip_outputsinput	input_keyoutput
output_keyTr   r   r   c                     | j         gS )zExpect input key.)rc   r   s    r   r   z SimpleSequentialChain.input_keys   s     r   c                     | j         gS r   )re   r   s    r   r   z!SimpleSequentialChain.output_keys   s       r   afterr    c                 "   | j         D ]}t          |j                  dk    r*d| dt          |j                   d}t          |          t          |j                  dk    r*d| dt          |j                   d}t          |          | S )z1Validate that chains are all single input/output.   z=Chains used in SimplePipeline should all have one input, got z with z inputs.z>Chains used in SimplePipeline should all have one output, got z	 outputs.)r   lenr   r,   r   )r   r4   r2   s      r   r6   z%SimpleSequentialChain.validate_chains   s     [ 	& 	&E5#$$))DD D$'(8$9$9D D D  !oo%5$%%**FF F$'(9$:$:F F F  !oo% + r   Nr7   r8   c           	         |pt          j                    }|| j                 }t          d t	          t          | j                            D                       }t          | j                  D ]\  }}|                    ||	                    d|dz                        }| j
        r|                                }|                    ||t          |                   d| j                   | j        |iS )Nc                 ,    g | ]}t          |          S r>   rY   r@   is     r   
<listcomp>z/SimpleSequentialChain._call.<locals>.<listcomp>       *S*S*Sa3q66*S*S*Sr   step_rj   r<   
colorendverbose)r   rF   rc   r   rangerk   r   rG   runrH   ra   stripon_textrY   ry   re   r   r7   r8   rJ   _inputcolor_mappingrp   r4   s           r   rM   zSimpleSequentialChain._call   s	   
 #S&@&Q&S&S')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAuYY&00QAA   F ! (  #CFF+	 !     ((r   c           	        K   |pt          j                    }|| j                 }t          d t	          t          | j                            D                       }t          | j                  D ]\  }}|                    ||	                    d|dz                         d {V }| j
        r|                                }|                    ||t          |                   d| j                   d {V  | j        |iS )Nc                 ,    g | ]}t          |          S r>   rn   ro   s     r   rq   z0SimpleSequentialChain._acall.<locals>.<listcomp>   rr   r   rs   rj   rt   ru   rv   )r   rF   rc   r   rz   rk   r   rG   arunrH   ra   r|   r}   rY   ry   re   r~   s           r   rQ   zSimpleSequentialChain._acall   sI     
 #X&E&V&X&X')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAu ::&00QAA &        F ! (&&#CFF+	 '           ((r   rR   )rS   rT   rU   rV   rW   r
   rX   ra   rZ   rc   rY   re   r   r[   r\   r   r   r   r	   r6   r^   r   rM   r   r   rQ   r>   r   r   r`   r`   {   s        MMKM4IsJ: $  L
  DI       X  !T#Y ! ! ! X! _'"""    #"( :>) )S#X) 0$6) 
c3h	) ) ) )4 ?C) )S#X) 5t;) 
c3h	) ) ) ) ) )r   r`   N)rV   typingr   langchain_core.callbacksr   r   langchain_core.utils.inputr   pydanticr   r   typing_extensionsr	   langchain_classic.chains.baser
   r   r`   r>   r   r   <module>r      s   K K              9 8 8 8 8 8 0 0 0 0 0 0 0 0 " " " " " " / / / / / /hC hC hC hC hCe hC hC hCVU) U) U) U) U)E U) U) U) U) U)r   