
    g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dS )zEChain pipeline where the outputs of one step feed directly into next.    )AnyOptional)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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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 )zIReturn expected input keys to the chain.

        :meta private:
        )r   selfs    X/var/www/FlaskApp/flask-venv/lib/python3.11/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                    |d         }|d         }t                      }d|v r|d         	 |d         j        }t          |                              t          |                    rHt          |          t          |          z  }t	          dd                    |           d| d          t          ||z             }|D ]}t          |j                                      |          }|j        r|                    |j        j                  }|rt	          d	| d
|           |                    |j	                  }|rt	          d|           |t          |j	                  z  }d|vr?|
                    dd          r|                    |          }	n|d         j	        }	|	|d<   n=t          |d                                       |          }|rt	          d| d          |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: .)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ff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   o;<< 	6 	6Eu/00;;OLLL| V+66u|7TUU  2L 2 2 /2 2    /;;E<MNN  Q?OQQ   s5#4555OOV++zz,.. 5-88II$Rj4)4F%&&v&89::EEoVVL  UlUUU   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>m       BBBq<?BBBr   )copyr   get_noop_manager	enumerater   	get_childupdater   )	r   r8   r9   _run_managerir5   r=   outputsrC   s	           @r   _callzSequentialChain._callb   s    
 {{}}"S&@&Q&S&S!$+.. 	) 	)HAu$..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   rD   z*SequentialChain._acall.<locals>.<dictcomp>|   rE   r   )	rF   r   rG   rI   rH   r   acallrJ   r   )	r   r8   r9   rK   r=   rL   r5   rM   rC   s	           @r   _acallzSequentialChain._acallo   s      
 {{}}"X&E&V&X&X **,,	!$+.. 	) 	)HAu!KK$) (        G ((((BBBBD,ABBBBr   N)__name__
__module____qualname____doc__r)   r   __annotations__strr   boolr   model_configpropertyr   r   r	   classmethoddictr   r7   r   r   rN   r   rR   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 =AC CS#XC 89C 
c3h	C C C C  BFC CS#XC =>C 
c3h	C C C C C Cr   r   c            	       v   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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 )z2Expect input key.

        :meta private:
        )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(t          d| dt          |j                   d          t          |j                  dk    r(t          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   r5   s     r   r7   z%SimpleSequentialChain.validate_chains   s     [ 
	 
	E5#$$)) DD D$'(8$9$9D D D   5$%%** FF F$'(9$:$:F F F   +
 r   Nr8   r9   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   rA   rL   s     r   
<listcomp>z/SimpleSequentialChain._call.<locals>.<listcomp>       *S*S*Sa3q66*S*S*Sr   step_rj   r=   
colorendverbose)r   rG   rc   r   rangerk   r   rH   runrI   ra   stripon_textrY   rx   re   r   r8   r9   rK   _inputcolor_mappingrL   r5   s           r   rN   zSimpleSequentialChain._call   s   
 #S&@&Q&S&S')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAuYY,"8"8Q"I"I   F ! (  mCFF3t| !     ((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   rp   z0SimpleSequentialChain._acall.<locals>.<listcomp>   rq   r   rr   rj   rs   rt   ru   )r   rG   rc   r   ry   rk   r   rH   arunrI   ra   r{   r|   rY   rx   re   r}   s           r   rR   zSimpleSequentialChain._acall   sE     
 #X&E&V&X&X')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAu ::,"8"8Q"I"I &        F ! (&&mCFF3t| '           ((r   rS   )rT   rU   rV   rW   r)   r   rX   ra   rZ   rc   rY   re   r   r[   r\   r   r   r	   r
   r7   r^   r   r   rN   r   r   rR   r?   r   r   r`   r`      s        MMKM4IsJ: $  L
  DI       X  !T#Y ! ! ! X! _'"""    #"$ =A) )S#X) 89) 
c3h	) ) ) ), BF) )S#X) =>) 
c3h	) ) ) ) ) )r   r`   N)rW   typingr   r   langchain_core.callbacksr   r   langchain_core.utils.inputr   pydanticr   r	   typing_extensionsr
   langchain.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 " " " " " " ' ' ' ' ' 'lC lC lC lC lCe lC lC lC^Q) Q) Q) Q) Q)E Q) Q) Q) Q) Q)r   