
    Ng)                         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dS )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            	          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    W/var/www/html/ai-engine/env/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  rA   .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   r:   r;   _run_managerir7   r?   outputsrE   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 rA   rA   rB   s     r   rF   z*SequentialChain._acall.<locals>.<dictcomp>|   rG   r   )	rH   r   rI   rK   rJ   r   acallrL   r   )	r   r:   r;   rM   r?   rN   r7   rO   rE   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   classmethodr   r   r9   r   r   rP   r   rT   rA   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:
        )rd   r   s    r   r   z SimpleSequentialChain.input_keys   s     r   c                     | j         gS r    )rf   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   r7   s     r   r9   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   Nr:   r;   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 rA   r[   rC   rN   s     r   
<listcomp>z/SimpleSequentialChain._call.<locals>.<listcomp>       *S*S*Sa3q66*S*S*Sr   step_rk   r?   
colorendverbose)r   rI   rd   r	   rangerl   r   rJ   runrK   rb   stripon_textr[   ry   rf   r   r:   r;   rM   _inputcolor_mappingrN   r7   s           r   rP   zSimpleSequentialChain._call   s    
 #S&@&Q&S&S')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAuYYv1G1GPQRSPS1V1VYWWF! (  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 rA   ro   rp   s     r   rq   z0SimpleSequentialChain._acall.<locals>.<listcomp>   rr   r   rs   rk   rt   ru   rv   )r   rI   rd   r	   rz   rl   r   rJ   arunrK   rb   r|   r}   r[   ry   rf   r~   s           r   rT   zSimpleSequentialChain._acall   sE     
 #X&E&V&X&X')*S*S5T[AQAQ;R;R*S*S*STT!$+.. 	 	HAu ::,"8"81"G"G &        F ! (&&mCFF3t| '           ((r   rU   )rV   rW   rX   rY   r   r   rZ   rb   r\   rd   r[   rf   r
   r]   r^   r   r!   r   r   r9   r   r   r   rP   r   r   rT   rA   r   r   ra   ra      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   ra   N)rY   typingr   r   r   r   langchain_core.callbacksr   r   langchain_core.utils.inputr	   pydanticr
   r   typing_extensionsr   langchain.chains.baser   r   ra   rA   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^O) O) O) O) O)E O) O) O) O) O)r   