
    3fi                    ^    d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 g dZ
 G d de	      Zy	)
    )annotations)Any)	LLMResult)override)AsyncIteratorCallbackHandler)FinalAnswer:c                       e Zd ZdZddZddZdddd	 	 	 	 	 	 	 d fdZe	 	 	 	 	 	 	 	 dd	       Zedd
       Z	edd       Z
 xZS )!AsyncFinalIteratorCallbackHandlerzoCallback 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)z Append token to the last tokens.r   N)last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selftokens     t/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/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 )z%Check if the answer has been reached.)strip_tokensr   answer_prefix_tokens_strippedr   r   )r   s    r   check_if_answer_reachedz9AsyncFinalIteratorCallbackHandler.check_if_answer_reached   s9    ,,0R0RRR4#<#<<<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_startC   s      			#s   #%c                Z   K   | j                   r| j                  j                          y y w)N)r$   r'   set)r   responser+   s      r   
on_llm_endz,AsyncFinalIteratorCallbackHandler.on_llm_endN   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_tokenS   s      	""5) '')"&D!!)) -AJJ))!,- JJ!!%( s   BB)r   strreturnNone)r7   bool)r   zlist[str] | Noner   r9   r   r9   r7   r8   )r)   zdict[str, Any]r*   z	list[str]r+   r   r7   r8   )r/   r   r+   r   r7   r8   )r   r6   r+   r   r7   r8   )__name__
__module____qualname____doc__r   r   r"   r   r,   r0   r5   __classcell__)r%   s   @r   r   r      s    
-= 26!# $ / $ 	 $
  $ 
 $D $"$ $ 	$
 
$ $   ) )r   r   N)
__future__r   typingr   langchain_core.outputsr   typing_extensionsr   +langchain_classic.callbacks.streaming_aiterr   r#   r    r   r   <module>rE      s)    "  , & T7 U)(D U)r   