
    @'h                    V    d dl mZ d dlmZmZ d dlmZ d dlmZ g dZ	 G d de      Z
y)	    )annotations)AnyOptional)	LLMResult)AsyncIteratorCallbackHandler)FinalAnswer:c                  t     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.
    c                P   | j                   j                  |       | j                  j                  |j                                t	        | j                         t	        | j
                        kD  r7| j                   j                  d       | j                  j                  d       y y )Nr   )last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selftokens     u/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/langchain/callbacks/streaming_aiter_final_only.pyappend_to_last_tokensz7AsyncFinalIteratorCallbackHandler.append_to_last_tokens   s|    &!!((7t 3t'@'@#AA  #%%))!, B    c                ~    | 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   s9    ,,0R0RRR##t'@'@@@r   NTF)r   r   stream_prefixc               z   t         |           |t        | _        n|| _        |r.| j                  D cg c]  }|j	                          c}| _        n| j                  | _        dgt        | j                        z  | _        dgt        | j                        z  | _        || _	        || _
        d| _        yc c}w )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?
        N F)super__init__DEFAULT_ANSWER_PREFIX_TOKENSr   r   r   r   r   r   r   r   answer_reached)r   r   r   r   r   	__class__s        r   r#   z*AsyncFinalIteratorCallbackHandler.__init__   s    " 	'(DD%(<D%+/+D+D2"'2D. 261J1JD.4#d&?&?"@@%'D3t/H/H+I$I!(*#2s   B8c                N   K   | j                   j                          d| _        y w)NF)doneclearr%   )r   
serializedpromptskwargss       r   on_llm_startz.AsyncFinalIteratorCallbackHandler.on_llm_start@   s      			#s   #%c                Z   K   | j                   r| j                  j                          y y wr   )r%   r(   set)r   responser,   s      r   
on_llm_endz,AsyncFinalIteratorCallbackHandler.on_llm_endG   s!     IIMMO s   )+c                  K   | j                  |       | j                         r@d| _        | j                  r,| j                  D ]  }| j
                  j                  |        y | j                  r| j
                  j                  |       y y w)NT)r   r   r%   r   r   queue
put_nowait)r   r   r,   ts       r   on_llm_new_tokenz2AsyncFinalIteratorCallbackHandler.on_llm_new_tokenK   s     ""5) '')"&D!!)) -AJJ))!,- JJ!!%( s   BB)r   strreturnNone)r8   bool)r   zOptional[list[str]]r   r:   r   r:   r8   r9   )r*   zdict[str, Any]r+   z	list[str]r,   r   r8   r9   )r0   r   r,   r   r8   r9   )r   r7   r,   r   r8   r9   )__name__
__module____qualname____doc__r   r   r#   r-   r1   r6   __classcell__)r&   s   @r   r   r      s{    -A 59!# $ 2 $ 	 $
  $ 
 $D$($3<$HK$	$)r   r   N)
__future__r   typingr   r   langchain_core.outputsr   #langchain.callbacks.streaming_aiterr   r$   r    r   r   <module>rE      s&    "   , L7 M)(D M)r   