
    h:                         d Z ddl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 ddlmZ  G d d	e      Z G d
 de      Zy)zEChain pipeline where the outputs of one step feed directly into next.    )AnyOptional)AsyncCallbackManagerForChainRunCallbackManagerForChainRun)get_color_mapping)
ConfigDictmodel_validator)Self)Chainc            	       2   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e   d
eeef   fdZ	 ddeeef   dee   d
eeef   fdZy)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 )zIReturn expected input keys to the chain.

        :meta private:
        )r   selfs    Y/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain/chains/sequential.py
input_keyszSequentialChain.input_keys   s     ###    c                     | j                   S z3Return output key.

        :meta private:
        )r   r   s    r   output_keyszSequentialChain.output_keys%   s     $$$r   beforemodevaluesc                 n   |d   }|d   }g }d|v rr|d   m	 |d   j                   }t        |      j                  t        |            r:t        |      t        |      z  }ddj                  |       d| d}t	        |      t        ||z         }|D ]  }t        |j
                        j                  |      }	|j                  r%|	j                  |j                  j                         }	|	rd|	 d	| }t	        |      |j                  |j                        }|rd
| }t	        |      |t        |j                        z  } d|vr:|j                  dd      r|j                  |      }
n|d   j                  }
|
|d<   |S t        |d         j                  |      }	|	rd|	 d}t	        |      |S )z6Validate that the correct inputs exist for all chains.r   r   memoryz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-   s    ! !23v&"2">F *;;K?#00[1AB#&#7#k:J#J '0@(A'B C++6- 867 
 !o%o;< 	6Eu//0;;OLL||+66u||7T7TU3L> B  /02  !o%.;;E<M<MN@AQ@RS o%s5#4#455O!	6$ V+zz,.-88I$Rj44)4F%&  v&89:EEoVLG~UVW o%r   Ninputsrun_managerc                 *   |j                         }|xs t        j                         }t        | j                        D ]1  \  }}|j                         } ||d|      }|j                  |       3 | j                  D 	ci c]  }	|	||	   
 c}	S c c}	w NT)return_only_outputs	callbacks)copyr   get_noop_manager	enumerater   	get_childupdater   )
r   r8   r9   known_values_run_manager_ir5   r=   outputsks
             r   _callzSequentialChain._callb   s    
 {{}"S&@&Q&Q&S"4;;/ 	)IB$..0ILdiXG(	) -1,A,ABq<?"BBBs    Bc                 X  K   |j                         }|xs t        j                         }|j                         }t	        | j
                        D ]2  \  }}|j                  |d|       d {   }|j                  |       4 | j                  D 	ci c]  }	|	||	   
 c}	S 7 5c c}	w wr;   )	r>   r   r?   rA   r@   r   acallrB   r   )
r   r8   r9   rC   rD   r=   rE   r5   rF   rG   s
             r   _acallzSequentialChain._acallo   s     
 {{}"X&E&V&V&X **,	"4;;/ 	)IB!KK$(# (  G
 (	) -1,A,ABq<?"BB Cs$   A+B*-B#.%B*B% B*%B*N)__name__
__module____qualname____doc__listr   __annotations__strr   boolr   model_configpropertyr   r   r	   classmethoddictr   r7   r   r   rH   r   rK    r   r   r   r      s.   GK#Y3iJ $L
 $DI $ $ %T#Y % % (#1T 1c 1  $1l =ACS#XC 89C 
c3h	C  BFCS#XC =>C 
c3h	Cr   r   c            	           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e   dee
e
f   fdZ	 ddee
ef   dee   dee
ef   fdZy)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 )z2Expect input key.

        :meta private:
        )r^   r   s    r   r   z SimpleSequentialChain.input_keys   s     r   c                     | j                   gS r   )r`   r   s    r   r   z!SimpleSequentialChain.output_keys   s       r   afterr!   c                 $   | j                   D ]  }t        |j                        dk7  r'd| dt        |j                         d}t        |      t        |j                        dk7  s[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   r5   r3   s      r   r7   z%SimpleSequentialChain.validate_chains   s     [[ 	&E5##$)SgVC(8(8$9#:(D  !o%5$$%*TgVC(9(9$:#;9F  !o%	& r   Nr8   r9   c           	      
   |xs t        j                         }|| j                     }t        t	        t        | j                              D cg c]  }t        |       c}      }t        | j                        D ]t  \  }}|j                  ||j                  d|dz                }| j                  r|j                         }|j                  ||t        |         d| j                         v | j                  |iS c c}w Nstep_re   )r=   
)colorendverbose)r   r?   r^   r   rangerf   r   rS   r@   runrA   r\   stripon_textrm   r`   r   r8   r9   rD   _inputicolor_mappingr5   s           r   rH   zSimpleSequentialChain._call   s    
 #S&@&Q&Q&S')5T[[AQ;R*Sa3q6*ST!$++. 	HAuYY&005QA  F !!  #CF+	 ! 	 (( +Ts   D c           	      :  K   |xs t        j                         }|| j                     }t        t	        t        | j                              D cg c]  }t        |       c}      }t        | j                        D ]  \  }}|j                  ||j                  d|dz                 d {   }| j                  r|j                         }|j                  ||t        |         d| j                         d {     | j                  |iS c c}w 7 h7 wrh   )r   r?   r^   r   rn   rf   r   rS   r@   arunrA   r\   rp   rq   rm   r`   rr   s           r   rK   zSimpleSequentialChain._acall   s    
 #X&E&V&V&X')5T[[AQ;R*Sa3q6*ST!$++. 	HAu ::&005QA &  F !!&&#CF+	 '   	 (( +Ts2   ADD!AD.D/AD=D>DDrL   )rM   rN   rO   rP   rQ   r   rR   r\   rT   r^   rS   r`   r   rU   rV   r   r   r	   r
   r7   rX   r   r   rH   r   r   rK   rY   r   r   r[   r[      s   MKM4IsJ $L
  DI     !T#Y ! ! '"  #( =A)S#X) 89) 
c3h	)4 BF)S#X) =>) 
c3h	)r   r[   N)rP   typingr   r   langchain_core.callbacksr   r   langchain_core.utils.inputr   pydanticr   r	   typing_extensionsr
   langchain.chains.baser   r   r[   rY   r   r   <module>r~      s=    K   9 0 " 'nCe nCb[)E [)r   