o
    Zh+                     @  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Zd$d	d
Zddddd% fddZd&ddZd'dd Zd(d!d"Z	  Z
S ))!AsyncFinalIteratorCallbackHandlerznCallback handler that returns an async iterator.
    Only the final output of the agent will be iterated.
    tokenstrreturnNonec                 C  sP   | j | | j|  t| j t| jkr&| j d | jd d S d S )Nr   )last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selfr    r   e/var/www/html/lang_env/lib/python3.10/site-packages/langchain/callbacks/streaming_aiter_final_only.pyappend_to_last_tokens   s   z7AsyncFinalIteratorCallbackHandler.append_to_last_tokensboolc                 C  s   | j r	| j| jkS | j| jk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_prefixr   Optional[List[str]]r   r    c                  sz   t    |du rt| _n|| _|rd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__
serializedDict[str, Any]prompts	List[str]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_startresponser   c                   s   | j r| j  d S d S r   )r(   r0   set)r   r3   r/   r   r   r   
on_llm_endG   s   z,AsyncFinalIteratorCallbackHandler.on_llm_endc                   sV   |  | |  rd| _| jr| jD ]}| j| qd S | jr)| j| d S 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)r   r   r   r   )r   r   )r   r!   r   r   r    r   r   r   )r+   r,   r-   r.   r/   r   r   r   )r3   r   r/   r   r   r   )r   r   r/   r   r   r   )__name__
__module____qualname____doc__r   r   r&   r2   r5   r9   __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    