
    Ng                     Z    d Z ddlZddlmZmZmZmZ ddlmZ g dZ	 G d de          Z
dS )z4Callback Handler streams to stdout on new llm token.    N)AnyDictListOptional)StreamingStdOutCallbackHandler)FinalAnswer:c            	            e Zd ZdZdeddfdZdefdZdddd	d
ee	e                  dededdf fdZ
deeef         de	e         deddfdZdededdfdZ xZS )#FinalStreamingStdOutCallbackHandlerzCallback handler for streaming in agents.
    Only works with agents using LLMs that support streaming.

    Only the final output of the agent will be streamed.
    tokenreturnNc                 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     k/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/callbacks/streaming_stdout_final_only.pyappend_to_last_tokensz9FinalStreamingStdOutCallbackHandler.append_to_last_tokens   s    &&&!((777t  3t'@#A#AAA  ###%))!,,,,, BA    c                 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_reachedz;FinalStreamingStdOutCallbackHandler.check_if_answer_reached   s0     	A,0RRR#t'@@@r   TF)r   r   stream_prefixr   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 FinalStreamingStdOutCallbackHandler.

        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@FinalStreamingStdOutCallbackHandler.__init__.<locals>.<listcomp>6   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,FinalStreamingStdOutCallbackHandler.__init__   s    " 	'(DD%%(<D% 	K2 2+/+D2 2 2D.. 261JD.4#d&?"@"@@%'D3t/H+I+I$I!(*#r   
serializedpromptskwargsc                     d| _         dS )zRun when LLM starts running.FN)r)   )r   r+   r,   r-   s       r   on_llm_startz0FinalStreamingStdOutCallbackHandler.on_llm_startA   s     $r   c                    |                      |           |                                 rWd| _        | j        rG| j        D ]!}t
          j                            |           "t
          j                                         dS | j        r?t
          j                            |           t
          j                                         dS dS )z?Run on new LLM token. Only available when streaming is enabled.TN)	r   r   r)   r   r   sysstdoutwriteflush)r   r   r-   ts       r   on_llm_new_tokenz4FinalStreamingStdOutCallbackHandler.on_llm_new_tokenG   s     	""5))) '')) 	"&D! #) ( (AJ$$Q''''
  """F  	JU###J	 	r   )__name__
__module____qualname____doc__strr   boolr   r   r   r'   r   r   r/   r6   __classcell__)r*   s   @r   r   r      s9        -3 -4 - - - -A A A A A 59!# $  $  $ 'tCy1 $ 	 $
  $ 
 $  $  $  $  $  $D$sCx.$379$HK$	$ $ $ $c S T        r   r   )r:   r1   typingr   r   r   r   langchain_core.callbacksr   r(   r   r"   r   r   <module>r@      s    : : 



 , , , , , , , , , , , , C C C C C C777 N N N N N*H N N N N Nr   