
    @h                     J    S r SSKrSSKJrJr  SSKJr  / SQr " S S\5      rg)z4Callback Handler streams to stdout on new llm token.    N)AnyOptional)StreamingStdOutCallbackHandler)FinalAnswer:c            	          ^  \ rS rSrSrS\SS4S jrS\4S jrSSS	S
.S\	\
\      S\S\SS4U 4S jjjrS\\\4   S\
\   S\SS4S jrS\S\SS4S jrSrU =r$ )#FinalStreamingStdOutCallbackHandler   zCallback 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   U R                   R                  U5        U R                  R                  UR                  5       5        [	        U R                   5      [	        U R
                  5      :  a7  U R                   R                  S5        U R                  R                  S5        g g )Nr   )last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selfr   s     g/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/callbacks/streaming_stdout_final_only.pyappend_to_last_tokens9FinalStreamingStdOutCallbackHandler.append_to_last_tokens   s|    &!!((7t 3t'@'@#AA  #%%))!, B    c                     U R                   (       a  U R                  U R                  :H  $ U R                  U R                  :H  $ )N)strip_tokensr   answer_prefix_tokens_strippedr   r   )r   s    r   check_if_answer_reached;FinalStreamingStdOutCallbackHandler.check_if_answer_reached   s9    ,,0R0RRR4#<#<<<r   TF)r   r   stream_prefixr   r   r    c                  > [         TU ]  5         Uc  [        U l        OXl        U(       a/  U R                   Vs/ sH  oDR	                  5       PM     snU l        OU R                  U l        S/[        U R                  5      -  U l        S/[        U R                  5      -  U l        X l	        X0l
        SU l        gs  snf )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?
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$   ,FinalStreamingStdOutCallbackHandler.__init__   s    " 	'(DD%(<%+/+D+D2+D%+D2D. 261J1JD.4#d&?&?"@@%'D3t/H/H+I$I!(*#2s   B<
serializedpromptskwargsc                     SU l         g)zRun when LLM starts running.FN)r&   )r   r)   r*   r+   s       r   on_llm_start0FinalStreamingStdOutCallbackHandler.on_llm_start@   s     $r   c                    U R                  U5        U R                  5       (       ai  SU l        U R                  (       aP  U R                   H"  n[
        R                  R                  U5        M$     [
        R                  R                  5         gU R                  (       a>  [
        R                  R                  U5        [
        R                  R                  5         gg)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_token4FinalStreamingStdOutCallbackHandler.on_llm_new_tokenI   s     	""5) ''))"&D!!))AJJ$$Q' *

  " JJU#JJ r   )r   r   r&   r   r   r    r   )__name__
__module____qualname____firstlineno____doc__strr   boolr   r   listr$   dictr   r-   r5   __static_attributes____classcell__)r'   s   @r   r
   r
      s    -3 -4 -= = 59!# $ 'tCy1 $ 	 $
  $ 
 $  $D$cN$ c$ 	$
 
$c S T  r   r
   )	r;   r0   typingr   r   langchain_core.callbacksr   r%   r
    r   r   <module>rE      s&    : 
   C7 P*H Pr   