
    Ng+                    f    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e
          ZdS )	    )annotations)AnyDictListOptional)	LLMResult)AsyncIteratorCallbackHandler)FinalAnswer:c                  V     e Zd ZdZddZddZd	d
ddd fdZd dZd!dZd"dZ	 xZ
S )#!AsyncFinalIteratorCallbackHandlerznCallback handler that returns an async iterator.
    Only the final output of the agent will be iterated.
    tokenstrreturnNonec                R   | j                             |           | j                            |                                           t	          | j                   t	          | j                  k    r6| j                             d           | j                            d           d S d S )Nr   )last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selfr   s     j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/callbacks/streaming_aiter_final_only.pyappend_to_last_tokensz7AsyncFinalIteratorCallbackHandler.append_to_last_tokens   s    &&&!((777t  3t'@#A#AAA  ###%))!,,,,, BA    boolc                P    | j         r| j        | j        k    S | j        | j        k    S N)strip_tokensr   answer_prefix_tokens_strippedr   r   )r   s    r   check_if_answer_reachedz9AsyncFinalIteratorCallbackHandler.check_if_answer_reached   s0     	A,0RRR#t'@@@r   NTF)r   r"   stream_prefixr   Optional[List[str]]r"   r%   c               \   t                                                       |t          | _        n|| _        |rd | j        D             | _        n| j        | _        dgt          | j                  z  | _        dgt          | j                  z  | _        || _        || _	        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                6    g | ]}|                                 S  )r   ).0r   s     r   
<listcomp>z>AsyncFinalIteratorCallbackHandler.__init__.<locals>.<listcomp>5   s-     2 2 2"'2 2 2r    F)super__init__DEFAULT_ANSWER_PREFIX_TOKENSr   r#   r   r   r   r"   r%   answer_reached)r   r   r"   r%   	__class__s       r   r.   z*AsyncFinalIteratorCallbackHandler.__init__   s    " 	'(DD%%(<D% 	K2 2+/+D2 2 2D.. 261JD.4#d&?"@"@@%'D3t/H+I+I$I!(*#r   
serializedDict[str, Any]prompts	List[str]kwargsr   c                J   K   | j                                          d| _        d S )NF)doneclearr0   )r   r2   r4   r6   s       r   on_llm_startz.AsyncFinalIteratorCallbackHandler.on_llm_start@   s(       		#r   responser   c                N   K   | j         r| j                                         d S d S r!   )r0   r8   set)r   r;   r6   s      r   
on_llm_endz,AsyncFinalIteratorCallbackHandler.on_llm_endG   s.       	IMMOOOOO	 	r   c                
  K   |                      |           |                                 r4d| _        | j        r$| j        D ]}| j                            |           d S | j        r| j                            |           d S d S )NT)r   r$   r0   r%   r   queue
put_nowait)r   r   r6   ts       r   on_llm_new_tokenz2AsyncFinalIteratorCallbackHandler.on_llm_new_tokenK   s      ""5))) '')) 	"&D! -) - -AJ))!,,,,F  	)J!!%(((((	) 	)r   )r   r   r   r   )r   r   )r   r&   r"   r   r%   r   r   r   )r2   r3   r4   r5   r6   r   r   r   )r;   r   r6   r   r   r   )r   r   r6   r   r   r   )__name__
__module____qualname____doc__r   r$   r.   r:   r>   rC   __classcell__)r1   s   @r   r   r      s         - - - -A A A A 59!# $  $  $  $  $  $  $  $D$ $ $ $   ) ) ) ) ) ) ) )r   r   N)
__future__r   typingr   r   r   r   langchain_core.outputsr   #langchain.callbacks.streaming_aiterr	   r/   r   r)   r   r   <module>rM      s    " " " " " " , , , , , , , , , , , , , , , , , , L L L L L L777 M) M) M) M) M)(D M) M) M) M) M)r   