a
    aŠÝg+  ã                   @  sX   d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
 g d¢ZG dd„ de
ƒZdS )	é    )Úannotations)ÚAnyÚDictÚListÚOptional)Ú	LLMResult)ÚAsyncIteratorCallbackHandler)ÚFinalZAnswerú:c                      sŒ   e Zd ZdZdddœdd„Zddœd	d
„Zddddœdddddœ‡ fdd„Zdddddœdd„Zddddœdd„Zddddœdd„Z	‡  Z
S ) Ú!AsyncFinalIteratorCallbackHandlerznCallback handler that returns an async iterator.
    Only the final output of the agent will be iterated.
    ÚstrÚNone)ÚtokenÚreturnc                 C  sL   | j  |¡ | j | ¡ ¡ t| j ƒt| jƒkrH| j  d¡ | j d¡ d S )Nr   )Úlast_tokensÚappendÚlast_tokens_strippedÚstripÚlenÚanswer_prefix_tokensÚpop)Úselfr   © r   ú|/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/callbacks/streaming_aiter_final_only.pyÚappend_to_last_tokens   s
    z7AsyncFinalIteratorCallbackHandler.append_to_last_tokensÚbool)r   c                 C  s"   | j r| j| jkS | j| jkS d S ©N)Ústrip_tokensr   Úanswer_prefix_tokens_strippedr   r   )r   r   r   r   Úcheck_if_answer_reached   s    z9AsyncFinalIteratorCallbackHandler.check_if_answer_reachedNTF)r   r   Ústream_prefixzOptional[List[str]])r   r   r    r   c                  sz   t ƒ  ¡  |du rt| _n|| _|r8dd„ | jD ƒ| _n| j| _dgt| jƒ | _dgt| jƒ | _|| _|| _	d| _
dS )aÈ  Instantiate AsyncFinalIteratorCallbackHandler.

        Args:
            answer_prefix_tokens: Token sequence that prefixes the answer.
                Default is ["Final", "Answer", ":"]
            strip_tokens: Ignore white spaces and new lines when comparing
                answer_prefix_tokens to last tokens? (to determine if answer has been
                reached)
            stream_prefix: Should answer prefix itself also be streamed?
        Nc                 S  s   g | ]}|  ¡ ‘qS r   )r   )Ú.0r   r   r   r   Ú
<listcomp>5   s   z>AsyncFinalIteratorCallbackHandler.__init__.<locals>.<listcomp>Ú F)ÚsuperÚ__init__ÚDEFAULT_ANSWER_PREFIX_TOKENSr   r   r   r   r   r   r    Úanswer_reached)r   r   r   r    ©Ú	__class__r   r   r%      s    
ÿ
z*AsyncFinalIteratorCallbackHandler.__init__zDict[str, Any]z	List[str]r   )Ú
serializedÚpromptsÚkwargsr   c                 Ë  s   | j  ¡  d| _d S )NF)ÚdoneÚclearr'   )r   r*   r+   r,   r   r   r   Úon_llm_start@   s    
z.AsyncFinalIteratorCallbackHandler.on_llm_startr   )Úresponser,   r   c                 Ë  s   | j r| j ¡  d S r   )r'   r-   Úset)r   r0   r,   r   r   r   Ú
on_llm_endG   s    z,AsyncFinalIteratorCallbackHandler.on_llm_end)r   r,   r   c                 Ë  sP   |   |¡ |  ¡ r:d| _| jr6| jD ]}| j |¡ q$d S | jrL| j |¡ d S )NT)r   r   r'   r    r   ÚqueueÚ
put_nowait)r   r   r,   Útr   r   r   Úon_llm_new_tokenK   s    

z2AsyncFinalIteratorCallbackHandler.on_llm_new_token)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r/   r2   r6   Ú__classcell__r   r   r(   r   r      s   	û"r   N)Ú
__future__r   Útypingr   r   r   r   Zlangchain_core.outputsr   Z#langchain.callbacks.streaming_aiterr   r&   r   r   r   r   r   Ú<module>   s
   