
    ihK                         d Z ddl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 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DictList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/dev/engine/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   }t               }d|v rp|d   k	 |d   j                  }t        |      j                  t        |            r8t        |      t        |      z  }t	        ddj                  |       d| d      t        ||z         }|D ]  }t        |j                        j                  |      }|j                  r%|j                  |j                  j                        }|rt	        d| d	|       |j                  |j                        }|rt	        d
|       |t        |j                        z  } d|vr:|j                  dd      r|j                  |      }	n|d   j                  }	|	|d<   |S t        |d         j                  |      }|rt	        d| d      |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: .)listmemory_variablessetintersection
ValueErrorjoinr   
differencer'   r!   get)
clsr%   r   r   memory_keysoverlapping_keysknown_variableschainmissing_varsr!   s
             r   validate_chainszSequentialChain.validate_chains-   s     ! !23fv&"2">F *;;K?#00[1AB#&#7#k:J#J  '0@(A'B C++6- 867  o;< 	6Eu//0;;OLL||+66u||7T7TU 3L> B  /02   /;;E<M<MN >?O>PQ  s5#4#455O!	6$ V+zz,.-88I$Rj44)4F%&  v&89:EEoVL El^STU  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   r:   r;   known_values_run_managerir7   r?   outputsks
             r   _callzSequentialChain._callb   s    
 {{}"S&@&Q&Q&S!$++. 	)HAu$..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   rA   rC   rB   r   acallrD   r   )
r   r:   r;   rE   rF   r?   rG   r7   rH   rI   s
             r   _acallzSequentialChain._acallo   s     
 {{}"X&E&V&V&X **,	!$++. 	)HAu!KK$) (  G (		)
 -1,A,ABq<?"BB	 Cs$   A+B*-B#.%B*B% B*%B*N)__name__
__module____qualname____doc__r   r   __annotations__strr   boolr
   model_configpropertyr   r!   r   classmethodr   r   r9   r   r   rJ   r   rM    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%t        d| dt        |j                         d      t        |j                        dk7  sYt        d| dt        |j                         d       | 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   r7   s     r   r9   z%SimpleSequentialChain.validate_chains   s     [[ 
	E5##$) SgVC(8(8$9#:(D  5$$%* TgVC(9(9$:#;9F 
	 r   Nr:   r;   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   rA   r^   r	   rangerf   r   rT   rB   runrC   r\   stripon_textrm   r`   r   r:   r;   rF   _inputrG   color_mappingr7   s           r   rJ   zSimpleSequentialChain._call   s    
 #S&@&Q&Q&S')5T[[AQ;R*Sa3q6*ST!$++. 	HAuYY,"8"85Q"I  F !!  mCF3t|| ! 	 (( +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   rA   r^   r	   rn   rf   r   rT   rB   arunrC   r\   rp   rq   rm   r`   rr   s           r   rM   zSimpleSequentialChain._acall   s
    
 #X&E&V&V&X')5T[[AQ;R*Sa3q6*ST!$++. 	HAu ::,"8"85Q"I &  F !!&&mCF3t|| '   	 (( +T
s2   ADD!AD.D/AD=D>DDrN   )rO   rP   rQ   rR   r   r   rS   r\   rU   r^   rT   r`   r
   rV   rW   r   r!   r   r   r9   r   r   r   rJ   r   r   rM   rY   r   r   r[   r[      s   MKM4IsJ $L
  DI     !T#Y ! ! '"  #$ =A)S#X) 89) 
c3h	), BF)S#X) =>) 
c3h	)r   r[   N)rR   typingr   r   r   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 " 'lCe lC^Q)E Q)r   