
    \ǻi!                    B   d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZmZ d dl m!Z! d dl"m#Z# 	 d dl$m%Z%  ed      Z(e)e)e*df   e+e*ef   f   Z,ddZ- G d dee%      Z.y# e&$ r e'Z%Y 3w xY w)    )annotations)AsyncIteratorCallableIteratorSequence)fieldsis_dataclass)AnyTypeVarcast)UUIDuuid4)BaseCallbackHandler)BaseMessage)ChatGenerationChatGenerationChunk	LLMResult)	BaseModel)NS_SEP)
TAG_HIDDENTAG_NOSTREAM)StreamChunk)Command)_StreamingCallbackHandlerT.c                t   t        | t              rt        | j                               S t        | t              r-t        |       j                  D cg c]  }t        | |       c}S t        |       r=t        | t
              s-t        |       D cg c]  }t        | |j                         c}S yc c}w c c}w )zSExtract top-level field values from a state object (dict, BaseModel, or dataclass). )
isinstancedictlistvaluesr   typemodel_fieldsgetattrr	   r   name)objkfs      X/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/langgraph/pregel/_messages.py_state_valuesr*      s    #tCJJL!!	C	#)-c)?)?@AQ@@	c	:c4#8.4Sk:QVV$:: A:s   B0B5c                  p   e Zd ZdZdZ	 dd	 	 	 	 	 	 	 ddZddddZdd	Z	 	 	 	 	 	 dd
ZddZ	dddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
dddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 ddZdddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 d dZdd	 	 	 	 	 	 	 	 	 ddZy)!StreamMessagesHandlerzA callback handler that implements stream_mode=messages.

    Collects messages from:
    (1) chat model stream events; and
    (2) node outputs.
    TN)	parent_nsc               Z    || _         || _        i | _        t               | _        || _        y)a  Configure the handler to stream messages from LLMs and nodes.

        Args:
            stream: A callable that takes a StreamChunk and emits it.
            subgraphs: Whether to emit messages from subgraphs.
            parent_ns: The namespace where the handler was created.
                We keep track of this namespace to allow calls to subgraphs that
                were explicitly requested as a stream with `messages` mode
                configured.

        Example:
            parent_ns is used to handle scenarios where the subgraph is explicitly
            streamed with `stream_mode="messages"`.

            ```python
            def parent_graph_node():
                # This node is in the parent graph.
                async for event in some_subgraph(..., stream_mode="messages"):
                    do something with event # <-- these events will be emitted
                return ...

            parent_graph.invoke(subgraphs=False)
            ```
        N)stream	subgraphsmetadatasetseenr-   )selfr/   r0   r-   s       r)   __init__zStreamMessagesHandler.__init__5   s)    > "*,$'E	"    Fdedupec                  |r|j                   | j                  v ry |j                   t        t                     |_         | j                  j	                  |j                          | j                  |d   d||d   ff       y )Nr   messages   )idr3   strr   addr/   )r4   metamessager8   s       r)   _emitzStreamMessagesHandler._emitZ   sb    gjjDII-zz! \
IIMM'**%KKa*wQ.@ABr6   c                   t        |t              r| j                  ||d       y t        |t              r-|D ]'  }t        |t              s| j                  ||d       ) y t	        |      D ]d  }t        |t              r| j                  ||d       (t        |t              s9|D ]'  }t        |t              s| j                  ||d       ) f y )NTr7   )r   r   rA   r   r*   )r4   r?   responsevalueitems        r)   _find_and_emit_messagesz-StreamMessagesHandler._find_and_emit_messagesc   s    h,JJtXdJ3(+! 9e[1JJtU4J89 'x0 @e[1JJtU4J8x0 % @%dK8 JJtT$J?@	@r6   c                    |S Nr   r4   run_idoutputs      r)   tap_output_aiterz&StreamMessagesHandler.tap_output_aiters   s	     r6   c                    |S rH   r   rI   s      r)   tap_output_iterz%StreamMessagesHandler.tap_output_iterx   s    r6   )parent_run_idtagsr1   c               Z   |r|rt         |vrt        t        t        |d         j	                  t
                    d d }| j                  st        |      dkD  r|| j                  k7  ry |r)|D 	cg c]  }	|	j                  d      r|	 c}	x}
r|
|d<   ||f| j                  |<   y y y c c}	w )Nlanggraph_checkpoint_nsr   zseq:steprP   )r   tupler   r=   splitr   r0   lenr-   
startswithr1   )r4   
serializedr:   rJ   rO   rP   r1   kwargsnstfiltered_tagss              r)   on_chat_model_startz)StreamMessagesHandler.on_chat_model_start{   s     Tl$&>tC*C!DEKKFSTB >>c"gkbDNN6J04$U1ALL<TQ$UU=U'4HV$%'NDMM&! '?8 %Vs   /B(B()chunkrO   rP   c                   t        |t              sy | j                  j                  |      x}r| j	                  ||j
                         y y rH   )r   r   r1   getrA   r@   )r4   tokenr^   rJ   rO   rP   rY   r?   s           r)   on_llm_new_tokenz&StreamMessagesHandler.on_llm_new_token   sC     %!45==$$V,,4,JJtU]]+ -r6   )rO   c               ,   | j                   j                  |      x}r[|j                  rO|j                  d   r@|j                  d   d   }t        |t              r| j                  ||j                  d       | j                   j                  |d        y )Nr   Tr7   )r1   r`   generationsr   r   rA   r@   pop)r4   rC   rJ   rO   rY   r?   gens          r)   
on_llm_endz StreamMessagesHandler.on_llm_end   s}     ==$$V,,4,##(<(<Q(?**1-a0c>2JJtS[[J>&$'r6   c               <    | j                   j                  |d        y rH   r1   re   r4   errorrJ   rO   rY   s        r)   on_llm_errorz"StreamMessagesHandler.on_llm_error        	&$'r6   c                  |rO|j                  d      |j                  d      k(  r*|r	t        |vrt        t        t        |d         j                  t                    d d }| j                  st        |      dkD  ry ||f| j                  |<   t        |      D ]  }	t        |	t              r3|	j                   | j                  j                  |	j                         Ft        |	t               sWt        |	t              rh|	D ]E  }
t        |
t              s|
j                  !| j                  j                  |
j                         G  y y y y )Nr%   langgraph_noderR   rS   r   )r`   r   rT   r   r=   rU   r   r0   rV   r1   r*   r   r   r<   r3   r>   r   )r4   rX   inputsrJ   rO   rP   r1   rY   rZ   rD   rE   s              r)   on_chain_startz$StreamMessagesHandler.on_chain_start   s    

6"hll3C&DDZt3tC*C!DEKKFSTB >>c"gk%'NDMM&!&v. 7e[1xx+		ehh/x0E39O % 7%dK8#ww2 $		dgg 677 4 E r6   c                  | j                   j                  |d       x}rt        |t              r| j	                  ||j
                         y t        |t              rYt        d |D              rG|D ]A  }t        |t              r| j	                  ||j
                         0| j	                  ||       C y | j	                  ||       y y )Nc              3  <   K   | ]  }t        |t                y wrH   )r   r   ).0rD   s     r)   	<genexpr>z5StreamMessagesHandler.on_chain_end.<locals>.<genexpr>   s      8/4
5'*8s   )r1   re   r   r   rF   updater   any)r4   rC   rJ   rO   rY   r?   rD   s          r)   on_chain_endz"StreamMessagesHandler.on_chain_end   s     ==$$VT2242(G,,,T8??CHh/C 88@8 5 & BE!%144T5<<H44T5A	B ,,T8< 3r6   c               <    | j                   j                  |d        y rH   ri   rj   s        r)   on_chain_errorz$StreamMessagesHandler.on_chain_error   rm   r6   )r/   zCallable[[StreamChunk], None]r0   boolr-   ztuple[str, ...] | NonereturnNone)r?   Metar@   r   r8   r{   r|   r}   )r?   r~   rC   r
   r|   r}   )rJ   r   rK   AsyncIterator[T]r|   r   )rJ   r   rK   Iterator[T]r|   r   )rX   dict[str, Any]r:   zlist[list[BaseMessage]]rJ   r   rO   UUID | NonerP   list[str] | Noner1   dict[str, Any] | NonerY   r
   r|   r
   )ra   r=   r^   zChatGenerationChunk | NonerJ   r   rO   r   rP   r   rY   r
   r|   r
   )
rC   r   rJ   r   rO   r   rY   r
   r|   r
   )
rk   BaseExceptionrJ   r   rO   r   rY   r
   r|   r
   )rX   r   rp   r   rJ   r   rO   r   rP   r   r1   r   rY   r
   r|   r
   )
rC   r
   rJ   r   rO   r   rY   r
   r|   r
   )__name__
__module____qualname____doc__
run_inliner5   rA   rF   rL   rN   r]   rb   rg   rl   rq   rx   rz   r   r6   r)   r,   r,   *   sp    JX -1##-## ##
 *## 
##J IN C@ $4	
 &*!%*.3"3 *3
 3 #3 3 (3 3 
34 -1%)!%,, *	,
 , #, , , 
,( &*(( 	(
 #( ( 
(( &*(( 	(
 #( ( 
(  &*!%*.7"7 7
 7 #7 7 (7 7 
7J &*== 	=
 #= = 
=< &*(( 	(
 #( ( 
(r6   r,   N)r&   r
   r|   zSequence[Any])/
__future__r   collections.abcr   r   r   r   dataclassesr   r	   typingr
   r   r   uuidr   r   langchain_core.callbacksr   langchain_core.messagesr   langchain_core.outputsr   r   r   pydanticr   langgraph._internal._constantsr   langgraph.constantsr   r   langgraph.pregel.protocolr   langgraph.typesr   !langchain_core.tracers._streamingr   ImportErrorobjectr   rT   r=   r   r~   r*   r,   r   r6   r)   <module>r      s    " G G , 
  8 / Q Q  1 8 1 #'K CLU38_d38n,-P(/1J P(%  ' &'s   $B BB