a
    agK                     @   s   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	 d	eZG d
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                   @   s   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d	Zeee d
ddZeee d
ddZeddeeedddZdeeef ee eeef dddZdeeef ee eeef dddZdS )SequentialChainz=Chain where the outputs of one chain feed directly into next.chainsinput_variablesoutput_variablesF
return_allTforbidZarbitrary_types_allowedextrareturnc                 C   s   | j S )zIReturn expected input keys to the chain.

        :meta private:
        )r   self r   i/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/sequential.py
input_keys   s    zSequentialChain.input_keysc                 C   s   | j S z3Return output key.

        :meta private:
        )r   r   r   r   r   output_keys%   s    zSequentialChain.output_keysbeforemode)valuesr   c           
      C   sT  |d }|d }t  }d|v rr|d durr|d j}t|t|rrt|t|@ }tdd| d| dt|| }|D ]l}t|j|}|jr||jj}|rtd	| d
| ||j	}|rtd| |t|j	O }qd|vr(|
ddr||}	n
|d j	}	|	|d< n(t|d |}|rPt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: .)listZmemory_variablessetintersection
ValueErrorjoinr   
differencer"   r   get)
clsr!   r   r   Zmemory_keysZoverlapping_keysZknown_variableschainZmissing_varsr   r   r   r   validate_chains-   sP    




zSequentialChain.validate_chainsNinputsrun_managerr   c                    s\   |   |pt }t| jD ](\}}| }| d|d} | q fdd| jD S )NTZreturn_only_outputs	callbacksc                    s   i | ]}| | qS r   r   .0kZknown_valuesr   r   
<dictcomp>m       z)SequentialChain._call.<locals>.<dictcomp>)copyr   get_noop_manager	enumerater   	get_childupdater   )r   r1   r2   _run_managerir.   r4   outputsr   r8   r   _callb   s    zSequentialChain._callc                    sd   |   |pt }| }t| jD ](\}}|j d|dI d H } | q& fdd| jD S )NTr3   c                    s   i | ]}| | qS r   r   r5   r8   r   r   r9   |   r:   z*SequentialChain._acall.<locals>.<dictcomp>)	r;   r   r<   r>   r=   r   Zacallr?   r   )r   r1   r2   r@   r4   rA   r.   rB   r   r8   r   _acallo   s    zSequentialChain._acall)N)N)__name__
__module____qualname____doc__r   r   __annotations__strr   boolr	   model_configpropertyr   r   r
   classmethodr   r   r/   r   r   rC   r   rD   r   r   r   r   r      s8   
6 

 

r   c                   @   s   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
dZeee
 dddZeee
 dddZeddedddZdee
e
f ee ee
e
f dddZdee
ef ee ee
ef dd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                 C   s   | j gS )z2Expect input key.

        :meta private:
        )rR   r   r   r   r   r      s    z SimpleSequentialChain.input_keysc                 C   s   | j gS r   )rT   r   r   r   r   r      s    z!SimpleSequentialChain.output_keysafterr   c                 C   sd   | j D ]X}t|jdkr4td| dt|j dt|jdkrtd| dt|j dq| 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   r.   r   r   r   r/      s$    
z%SimpleSequentialChain.validate_chainsNr0   c                 C   s   |p
t  }|| j }tdd tt| jD }t| jD ]P\}}|j||	d|d  d}| j
rp| }|j||t| d| jd q<| j|iS )Nc                 S   s   g | ]}t |qS r   rJ   r6   rA   r   r   r   
<listcomp>   r:   z/SimpleSequentialChain._call.<locals>.<listcomp>step_rV   r4   
colorendverbose)r   r<   rR   r   rangerW   r   r=   runr>   rP   stripon_textrJ   ra   rT   r   r1   r2   r@   _inputZcolor_mappingrA   r.   r   r   r   rC      s    
zSimpleSequentialChain._callc                    s   |p
t  }|| j }tdd tt| jD }t| jD ]\\}}|j||	d|d  dI d H }| j
rv| }|j||t| d| jdI d H  q<| j|iS )Nc                 S   s   g | ]}t |qS r   rX   rY   r   r   r   rZ      r:   z0SimpleSequentialChain._acall.<locals>.<listcomp>r[   rV   r\   r]   r^   )r   r<   rR   r   rb   rW   r   r=   Zarunr>   rP   rd   re   rJ   ra   rT   rf   r   r   r   rD      s    
zSimpleSequentialChain._acall)N)N)rE   rF   rG   rH   r   r   rI   rP   rK   rR   rJ   rT   r	   rL   rM   r   r   r
   r   r/   r   r   r   rC   r   r   rD   r   r   r   r   rO      s6   
 

 

rO   N)rH   typingr   r   r   r   Zlangchain_core.callbacksr   r   Zlangchain_core.utils.inputr   Zpydanticr	   r
   Ztyping_extensionsr   Zlangchain.chains.baser   r   rO   r   r   r   r   <module>   s   o