§
    šŠtj&D  ã                  ó"  — U 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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! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( 	 d dl)m*Z* n# e+$ r e,Z*Y nw xY w	 d dl)m-Z- n# e+$ r e,Z-Y nw xY w ed¦  «        Z.e/e/e0df         e1e0ef         f         Z2d*d„Z3 G d„ dee*¦  «        Z4 G d„ de4e-¦  «        Z5 e6h d£¦  «        Z7de8d<    e6h d £¦  «        Z9de8d!<   d+d%„Z:d,d(„Z;d)S )-é    )Úannotations)ÚAsyncIteratorÚCallableÚIteratorÚSequence)ÚfieldsÚis_dataclass)ÚAnyÚTypeVarÚcast)ÚUUIDÚuuid4)ÚBaseCallbackHandler)ÚBaseMessageÚToolMessage)Úconvert_to_messages)ÚChatGenerationÚChatGenerationChunkÚ	LLMResult)Ú	BaseModel)Úfilter_to_user_tags)ÚNS_SEP)Ú
TAG_HIDDENÚTAG_NOSTREAM)ÚStreamChunk)ÚCommand)Ú_StreamingCallbackHandler)Ú_V2StreamingCallbackHandlerÚT.Úobjr
   ÚreturnúSequence[Any]c                ó\  ‡ — t          ‰ t          ¦  «        r!t          ‰                      ¦   «         ¦  «        S t          ‰ t          ¦  «        r ˆ fd„t          ‰ ¦  «        j        D ¦   «         S t          ‰ ¦  «        r0t          ‰ t
          ¦  «        sˆ fd„t          ‰ ¦  «        D ¦   «         S dS )zSExtract top-level field values from a state object (dict, BaseModel, or dataclass).c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS © )Úgetattr)Ú.0Úkr    s     €úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph/pregel/_messages.pyú
<listcomp>z!_state_values.<locals>.<listcomp>+   s!   ø€ Ð@Ð@Ð@ A•˜˜Q‘”Ð@Ð@Ð@ó    c                ó:   •— g | ]}t          ‰|j        ¦  «        ‘ŒS r%   )r&   Úname)r'   Úfr    s     €r)   r*   z!_state_values.<locals>.<listcomp>-   s%   ø€ Ð:Ð:Ð:¨•˜˜QœVÑ$Ô$Ð:Ð:Ð:r+   r%   )	Ú
isinstanceÚdictÚlistÚvaluesr   ÚtypeÚmodel_fieldsr	   r   )r    s   `r)   Ú_state_valuesr5   &   s¦   ø€ å�#•tÑÔð ;Ý�C—J’J‘L”LÑ!Ô!Ð!Ý	�C�Ñ	#Ô	#ð ;Ø@Ð@Ð@Ð@­¨c©¬Ô)?Ð@Ñ@Ô@Ð@Ý	�cÑ	Ô	ð ;¥:¨cµ4Ñ#8Ô#8ð ;Ø:Ð:Ð:Ð:­f°S©k¬kÐ:Ñ:Ô:Ð:Øˆ2r+   c                  óº   — e Zd ZdZdZ	 ddœd=d„Zddœd>d„Zd?d„Zd@d„ZdAd„Z	dddd œdBd,„Z
dddd-œdCd2„Zdd3œdDd5„Zdd3œdEd8„Zdddd œdFd:„Zdd3œdGd;„Zdd3œdEd<„ZdS )HÚStreamMessagesHandlerz–A callback handler that implements stream_mode=messages.

    Collects messages from:
    (1) chat model stream events; and
    (2) node outputs.
    TN©Ú	parent_nsÚstreamúCallable[[StreamChunk], None]Ú	subgraphsÚboolr9   útuple[str, ...] | Noner!   ÚNonec               ód   — || _         || _        i | _        t          ¦   «         | _        || _        dS )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)r:   r<   ÚmetadataÚsetÚseenr9   )Úselfr:   r<   r9   s       r)   Ú__init__zStreamMessagesHandler.__init__<   s/   € ð> ˆŒØ"ˆŒØ*,ˆŒÝ$'¡E¤EˆŒ	Ø"ˆŒˆˆr+   F©ÚdedupeÚmetaÚMetaÚmessager   rG   c               ó  — |r|j         | j        v rd S |j         € t          t          ¦   «         ¦  «        |_         | j                             |j         ¦  «         |                      |d         d||d         ff¦  «         d S )Nr   Úmessagesé   )ÚidrC   Ústrr   Úaddr:   )rD   rH   rJ   rG   s       r)   Ú_emitzStreamMessagesHandler._emita   sy   € Øð 	C�g”j D¤IÐ-Ð-ØˆFàŒzÐ!Ý ¥¡¤™\œ\�”
ØŒI�MŠM˜'œ*Ñ%Ô%Ð%Ø�KŠK˜˜aœ *¨w¸¸Q¼Ð.@ÐAÑBÔBÐBÐBÐBr+   Úresponser
   c                ó  — t          |t          ¦  «        r|                      ||d¬¦  «         d S t          |t          ¦  «        r4|D ]/}t          |t          ¦  «        r|                      ||d¬¦  «         Œ0d S t	          |¦  «        D ]w}t          |t          ¦  «        r|                      ||d¬¦  «         Œ0t          |t          ¦  «        r2|D ]/}t          |t          ¦  «        r|                      ||d¬¦  «         Œ0Œxd S )NTrF   )r/   r   rQ   r   r5   ©rD   rH   rR   ÚvalueÚitems        r)   Ú_find_and_emit_messagesz-StreamMessagesHandler._find_and_emit_messagesj   s0  € Ý�h¥Ñ,Ô,ð 	@Ø�JŠJ�t˜X¨dˆJÑ3Ô3Ð3Ð3Ð3Ý˜¥(Ñ+Ô+ð 	@Ø!ð 9ð 9�Ý˜e¥[Ñ1Ô1ð 9Ø—J’J˜t U°4�JÑ8Ô8Ð8øð9ð 9õ ' xÑ0Ô0ð @ð @�Ý˜e¥[Ñ1Ô1ð @Ø—J’J˜t U°4�JÑ8Ô8Ð8Ð8Ý ¥xÑ0Ô0ð @Ø %ð @ð @˜Ý% d­KÑ8Ô8ð @Ø ŸJšJ t¨T¸$˜JÑ?Ô?Ð?øøð@ð @r+   Úrun_idr   ÚoutputúAsyncIterator[T]c                ó   — |S ©Nr%   ©rD   rX   rY   s      r)   Útap_output_aiterz&StreamMessagesHandler.tap_output_aiterz   s	   € ð ˆr+   úIterator[T]c                ó   — |S r\   r%   r]   s      r)   Útap_output_iterz%StreamMessagesHandler.tap_output_iter   s   € Øˆr+   )Úparent_run_idÚtagsrA   Ú
serializedúdict[str, Any]rL   úlist[list[BaseMessage]]rb   úUUID | Nonerc   úlist[str] | NonerA   údict[str, Any] | NoneÚkwargsc               óJ  — |rž|r	t           |vr•t          t          t          |d         ¦  «                             t
          ¦  «        ¦  «        d d…         }| j        s t          |¦  «        dk    r|| j        k    rd S t          |¦  «        x}	�|	|d<   ||f| j
        |<   d S d S d S )NÚlanggraph_checkpoint_nséÿÿÿÿr   rc   )r   Útupler   rO   Úsplitr   r<   Úlenr9   r   rA   )
rD   rd   rL   rX   rb   rc   rA   rj   ÚnsÚfiltered_tagss
             r)   Úon_chat_model_startz)StreamMessagesHandler.on_chat_model_start‚   sÂ   € ð ð 	3˜Tð 	3¥l¸$Ð&>Ð&>Ý•t�C Ð*CÔ!DÑEÔE×KÒKÍFÑSÔSÑTÔTØ��ôˆBð ”>ð ¥c¨"¡g¤g°¢k k°b¸D¼NÒ6JÐ6JØ�Ý!4°TÑ!:Ô!:Ð:�ÐGØ#0�˜Ñ Ø%'¨ NˆDŒM˜&Ñ!Ð!Ð!ð	3ð 	3Ð&>Ð&>r+   ©Úchunkrb   rc   ÚtokenrO   ru   úChatGenerationChunk | Nonec               ó¦   — t          |t          ¦  «        sd S | j                             |¦  «        x}r|                      ||j        ¦  «         d S d S r\   )r/   r   rA   ÚgetrQ   rJ   )rD   rv   ru   rX   rb   rc   rj   rH   s           r)   Úon_llm_new_tokenz&StreamMessagesHandler.on_llm_new_token—   s_   € õ ˜%Õ!4Ñ5Ô5ð 	ØˆFØ”=×$Ò$ VÑ,Ô,Ð,ˆ4ð 	,Ø�JŠJ�t˜Uœ]Ñ+Ô+Ð+Ð+Ð+ð	,ð 	,r+   ©rb   r   c               ó&  — | j                              |¦  «        x}rY|j        rR|j        d         rE|j        d         d         }t          |t          ¦  «        r|                      ||j        d¬¦  «         | j                              |d ¦  «         d S ©Nr   TrF   )rA   ry   Úgenerationsr/   r   rQ   rJ   Úpop©rD   rR   rX   rb   rj   rH   Úgens          r)   Ú
on_llm_endz StreamMessagesHandler.on_llm_end¦   s—   € ð ”=×$Ò$ VÑ,Ô,Ð,ˆ4ð 	?ØÔ#ð ?¨Ô(<¸QÔ(?ð ?ØÔ*¨1Ô-¨aÔ0�Ý˜c¥>Ñ2Ô2ð ?Ø—J’J˜t S¤[¸�JÑ>Ô>Ð>ØŒ×Ò˜& $Ñ'Ô'Ð'Ð'Ð'r+   ÚerrorÚBaseExceptionc               ó<   — | j                              |d ¦  «         d S r\   ©rA   r   ©rD   rƒ   rX   rb   rj   s        r)   Úon_llm_errorz"StreamMessagesHandler.on_llm_errorµ   ó"   € ð 	Œ×Ò˜& $Ñ'Ô'Ð'Ð'Ð'r+   Úinputsc               óÚ  — |�ra|                      d¦  «        |                      d¦  «        k    �r6|r
t          |v�r,t          t          t          |d         ¦  «                             t          ¦  «        ¦  «        d d…         }| j        st          |¦  «        dk    rd S ||f| j	        |<   t          |¦  «        D ]®}	t          |	t          ¦  «        r'|	j        �| j                             |	j        ¦  «         Œ>t          |	t           ¦  «        rUt          |	t          ¦  «        s@|	D ]=}
t          |
t          ¦  «        r&|
j        �| j                             |
j        ¦  «         Œ>Œ©d S d S d S d S )Nr-   Úlanggraph_noderl   rm   r   )ry   r   rn   r   rO   ro   r   r<   rp   rA   r5   r/   r   rN   rC   rP   r   )rD   rd   rŠ   rX   rb   rc   rA   rj   rq   rU   rV   s              r)   Úon_chain_startz$StreamMessagesHandler.on_chain_start¿   sv  € ð ñ	7à—
’
˜6Ñ"Ô" h§l¢lÐ3CÑ&DÔ&DÒDÑDØð EÝ'¨tÐ3Ñ3å•t�C Ð*CÔ!DÑEÔE×KÒKÍFÑSÔSÑTÔTØ��ôˆBð ”>ð ¥c¨"¡g¤g°¢k kØ�Ø%'¨ NˆDŒM˜&Ñ!Ý& vÑ.Ô.ð 7ð 7�Ý˜e¥[Ñ1Ô1ð 7Ø”xÐ+Øœ	Ÿš e¤hÑ/Ô/Ð/øÝ ¥xÑ0Ô0ð 7½ÀEÍ3Ñ9OÔ9Oð 7Ø %ð 7ð 7˜Ý% d­KÑ8Ô8ð 7Ø#œwÐ2Ø $¤	§¢¨d¬gÑ 6Ô 6Ð 6øøð'	7ð 	7àDÐDØ3Ð3ð7ð 7r+   c               óÌ  — | j                              |d ¦  «        x}rÆt          |t          ¦  «        r|                      ||j        ¦  «         d S t          |t          ¦  «        rgt          d„ |D ¦   «         ¦  «        rN|D ]I}t          |t          ¦  «        r|                      ||j        ¦  «         Œ3|                      ||¦  «         ŒJd S |                      ||¦  «         d S d S )Nc              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r\   )r/   r   )r'   rU   s     r)   ú	<genexpr>z5StreamMessagesHandler.on_chain_end.<locals>.<genexpr>ì   s=   è è € ð 8ð 8Ø/4•
˜5¥'Ñ*Ô*ð8ð 8ð 8ð 8ð 8ð 8r+   )rA   r   r/   r   rW   Úupdater   Úany)rD   rR   rX   rb   rj   rH   rU   s          r)   Úon_chain_endz"StreamMessagesHandler.on_chain_endß   s   € ð ”=×$Ò$ V¨TÑ2Ô2Ð2ˆ4ð 	=å˜(¥GÑ,Ô,ð =Ø×,Ò,¨T°8´?ÑCÔCÐCÐCÐCå˜H¥hÑ/Ô/ð 
=µCð 8ð 8Ø8@ð8ñ 8ô 8ñ 5ô 5ð 
=ð &ð Bð B�EÝ! %­Ñ1Ô1ð BØ×4Ò4°T¸5¼<ÑHÔHÐHÐHà×4Ò4°T¸5ÑAÔAÐAÐAð	Bð Bð ×,Ò,¨T°8Ñ<Ô<Ð<Ð<Ð<ð	=ð 	=r+   c               ó<   — | j                              |d ¦  «         d S r\   r†   r‡   s        r)   Úon_chain_errorz$StreamMessagesHandler.on_chain_errorø   r‰   r+   ©r:   r;   r<   r=   r9   r>   r!   r?   )rH   rI   rJ   r   rG   r=   r!   r?   ©rH   rI   rR   r
   r!   r?   )rX   r   rY   rZ   r!   rZ   )rX   r   rY   r_   r!   r_   )rd   re   rL   rf   rX   r   rb   rg   rc   rh   rA   ri   rj   r
   r!   r
   ©rv   rO   ru   rw   rX   r   rb   rg   rc   rh   rj   r
   r!   r
   ©
rR   r   rX   r   rb   rg   rj   r
   r!   r
   ©
rƒ   r„   rX   r   rb   rg   rj   r
   r!   r
   )rd   re   rŠ   re   rX   r   rb   rg   rc   rh   rA   ri   rj   r
   r!   r
   )
rR   r
   rX   r   rb   rg   rj   r
   r!   r
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
run_inlinerE   rQ   rW   r^   ra   rs   rz   r‚   rˆ   r�   r“   r•   r%   r+   r)   r7   r7   1   s¿  € € € € € ðð ð €JØXð -1ð##ð ##ð ##ð ##ð ##ð ##ðJ INð Cð Cð Cð Cð Cð Cð@ð @ð @ð @ð ð ð ð ð
ð ð ð ð &*Ø!%Ø*.ð3ð 3ð 3ð 3ð 3ð 3ð2 -1à%)Ø!%ð,ð ,ð ,ð ,ð ,ð ,ð( &*ð(ð (ð (ð (ð (ð (ð( &*ð(ð (ð (ð (ð (ð (ð  &*Ø!%Ø*.ð7ð 7ð 7ð 7ð 7ð 7ðJ &*ð=ð =ð =ð =ð =ð =ð< &*ð(ð (ð (ð (ð (ð (ð (ð (r+   r7   c                  ót   ‡ — e Zd ZdZddddœd)d„Zddœd*ˆ fd„Zd+d„Zddœd,d!„Zddœd-ˆ fd$„Zddd%œd.d(„Z	ˆ xZ
S )/ÚStreamMessagesHandlerV2az  v2 variant of `StreamMessagesHandler`.

    Declaring `_V2StreamingCallbackHandler` as a base flips
    `BaseChatModel.invoke` to route through `_stream_chat_model_events`
    (firing `on_stream_event`) instead of `_stream` (firing
    `on_llm_new_token`). Inherits `on_stream_event` from the parent,
    which forwards protocol events onto the messages stream channel.

    Pregel attaches this class instead of the v1 handler only when
    `StreamingHandler` opts in via the internal
    `CONFIG_KEY_STREAM_MESSAGES_V2` config key; direct
    `graph.stream(stream_mode="messages")` callers keep the v1
    AIMessageChunk shape.
    Nrt   rv   rO   ru   rw   rX   r   rb   rg   rc   rh   rj   r
   r!   c               ó   — dS )u  Intentional no-op â€” v1 chunks are not used on v2-flagged runs.

        The v2 marker already steers `invoke` to the event generator, so
        `on_llm_new_token` should not fire under normal routing. This
        override stays a pass-through (no call to `super()`) to make
        the intent explicit and to guard against any caller (e.g. a
        node that calls `model.stream()` directly, which still fires
        the v1 callback) leaking AIMessageChunks onto a v2-flagged
        messages stream.
        Nr%   )rD   rv   ru   rX   rb   rc   rj   s          r)   rz   z(StreamMessagesHandlerV2.on_llm_new_token  s   € € € r+   r8   r:   r;   r<   r=   r9   r>   r?   c               óv   •— t          ¦   «                              |||¬¦  «         t          ¦   «         | _        d S )Nr8   )ÚsuperrE   rB   Ú_streamed_run_ids)rD   r:   r<   r9   Ú	__class__s       €r)   rE   z StreamMessagesHandlerV2.__init__)  s6   ø€ õ 	‰Œ×Ò˜ °iÐÑ@Ô@Ð@Ý,/©E¬EˆÔÐÐr+   rH   rI   rR   c                ó¬  — t          |t          ¦  «        r/t          |t          ¦  «        s|                      ||d¬¦  «         dS t          |t          ¦  «        rI|D ]D}t          |t          ¦  «        r-t          |t          ¦  «        s|                      ||d¬¦  «         ŒEdS t          |¦  «        D ]¡}t          |t          ¦  «        r.t          |t          ¦  «        s|                      ||d¬¦  «         ŒEt          |t          ¦  «        rG|D ]D}t          |t          ¦  «        r-t          |t          ¦  «        s|                      ||d¬¦  «         ŒEŒ¢dS )ac  Like the v1 handler, but skip ToolMessage from node outputs.

        Tool results belong on the tools channel / state in v3; v2-flagged streams
        must not replay finalized ToolMessages as chat tokens (see MessagesTransformer).
        Legacy v1-only `stream_mode="messages"` still emits ToolMessages (see subgraph
        streaming tests).
        TrF   N)r/   r   r   rQ   r   r5   rT   s        r)   rW   z/StreamMessagesHandlerV2._find_and_emit_messages3  s�  € õ �h¥Ñ,Ô,ð 	@µZÀÍ+Ñ5VÔ5Vð 	@Ø�JŠJ�t˜X¨dˆJÑ3Ô3Ð3Ð3Ð3Ý˜¥(Ñ+Ô+ð 	@Ø!ð 9ð 9�Ý˜e¥[Ñ1Ô1ð 9½*Ø�;ñ;ô ;ð 9ð —J’J˜t U°4�JÑ8Ô8Ð8øð	9ð 9õ ' xÑ0Ô0ð 
@ð 
@�Ý˜e¥[Ñ1Ô1ð 	@½*Ø�;ñ;ô ;ð 	@ð —J’J˜t U°4�JÑ8Ô8Ð8Ð8Ý ¥xÑ0Ô0ð @Ø %ð @ð @˜Ý% d­KÑ8Ô8ð @ÅØ ¥+ñBô Bð @ð !ŸJšJ t¨T¸$˜JÑ?Ô?Ð?øøð
@ð 
@r+   r{   r   c               ó  — | j                              |¦  «        x}r¸|j        r±|j        d         r¤|j        d         d         }t          |t          ¦  «        r||| j        v rV|j        j        €%t          t          ¦   «         ¦  «        |j        _        | j
                             |j        j        ¦  «         n|                      ||j        d¬¦  «         | j                             |¦  «         | j                              |d ¦  «         d S r}   )rA   ry   r~   r/   r   r¥   rJ   rN   rO   r   rC   rP   rQ   Údiscardr   r€   s          r)   r‚   z"StreamMessagesHandlerV2.on_llm_endP  sø   € ð ”=×$Ò$ VÑ,Ô,Ð,ˆ4ð 		CØÔ#ð C¨Ô(<¸QÔ(?ð CØÔ*¨1Ô-¨aÔ0�Ý˜c¥>Ñ2Ô2ð CØ Ô!7Ð7Ð7Øœ;œ>Ð1Ý-0µ±´©\¬\˜CœKœNØœ	Ÿš c¤k¤nÑ5Ô5Ð5Ð5àŸ
š
 4¨¬¸T˜
ÑBÔBÐBØÔ×&Ò& vÑ.Ô.Ð.ØŒ×Ò˜& $Ñ'Ô'Ð'Ð'Ð'r+   rƒ   r„   c               óv   •— | j                              |¦  «          t          ¦   «         j        |f||dœ|¤Ž d S )N)rX   rb   )r¥   r©   r¤   rˆ   )rD   rƒ   rX   rb   rj   r¦   s        €r)   rˆ   z$StreamMessagesHandlerV2.on_llm_errore  s^   ø€ ð 	Ô×&Ò& vÑ.Ô.Ð.Ø�‰ŒÔØð	
àØ'ð	
ð 	
ð ð		
ð 	
ð 	
ð 	
ð 	
r+   )rb   rc   Úeventre   c               ó€  — | j                              |¦  «        x}r¡|                     d¦  «        dk    rK| j                             |¦  «         |                     d¦  «        }|r| j                             |¦  «         i |d         ¥dt          |¦  «        i¥}|                      |d         d||ff¦  «         dS dS )	uø  Forward a protocol event from `stream_events(version="v3")` as a messages stream part.

        Fires once per `MessagesData` event (`message-start`, per-block
        `content-block-*`, `message-finish`). The transformer layer
        correlates events back to a single `ChatModelStream` via
        `metadata["run_id"]` â€” attached here so the v1
        `stream_mode="messages"` output (which emits
        `(AIMessageChunk, metadata)` via `on_llm_new_token`) keeps its
        original metadata shape.

        Lives on the v2 handler rather than the v1 base: content-block
        events are a v2-only concept, and forwarding them only when the
        v2 handler is attached keeps the message channel's shape
        predictable for v1 callers.
        r«   zmessage-startÚ
message_idrM   rX   r   rL   N)rA   ry   r¥   rP   rC   rO   r:   )	rD   r«   rX   rb   rc   rj   rH   Úmsg_idÚv2_metas	            r)   Úon_stream_eventz'StreamMessagesHandlerV2.on_stream_eventu  sÑ   € ð0 ”=×$Ò$ VÑ,Ô,Ð,ˆ4ð 	Að
 �yŠy˜Ñ!Ô! _Ò4Ð4ØÔ&×*Ò*¨6Ñ2Ô2Ð2ØŸš <Ñ0Ô0�Øð *Ø”I—M’M &Ñ)Ô)Ð)Ø8˜˜aœÐ8 (­C°©K¬KÐ8Ð8ˆGØ�KŠK˜˜aœ *¨u°gÐ.>Ð?Ñ@Ô@Ð@Ð@Ð@ð	Að 	Ar+   r˜   r–   r—   r™   rš   )r«   re   rX   r   rb   rg   rc   rh   rj   r
   r!   r
   )r›   rœ   r�   rž   rz   rE   rW   r‚   rˆ   r°   Ú__classcell__)r¦   s   @r)   r¡   r¡     s  ø€ € € € € ðð ð& -1à%)Ø!%ðð ð ð ð ð ð6 -1ð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð@ð @ð @ð @ðD &*ð(ð (ð (ð (ð (ð (ð4 &*ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð* &*Ø!%ð#Að #Að #Að #Að #Að #Að #Að #Að #Að #Ar+   r¡   >   ÚaiÚtoolÚuserÚhumanÚsystemÚfunctionÚ	assistantzfrozenset[str]Ú_MESSAGE_ROLES>   r²   r³   rµ   Úremover¶   r·   Ú_MESSAGE_TYPESrV   r0   r=   c                ór   — |                       d¦  «        t          v p|                       d¦  «        t          v S )NÚroler3   )ry   r¹   r»   )rV   s    r)   Ú_is_message_dictr¾   ¦  s/   € Ø�8Š8�FÑÔ�~Ð-ÐS°·²¸&Ñ1AÔ1AÅ^Ð1SÐSr+   rU   r?   c                óÚ  — t          | t          ¦  «        r+| j        €"t          t	          ¦   «         ¦  «        | _        dS dS t          | t
          ¦  «        rFt          | ¦  «        r7|                      d¦  «        s t          t	          ¦   «         ¦  «        | d<   dS dS t          | t          ¦  «        r¸t          | ¦  «        D ]ª\  }}t          |t          ¦  «        r(|j        € t          t	          ¦   «         ¦  «        |_        ŒBt          |t
          ¦  «        rQt          |¦  «        rBt          |g¦  «        d         }|j        € t          t	          ¦   «         ¦  «        |_        || |<   Œ©dS dS )aA  Coerce message-like write values to typed BaseMessages with stable IDs.

    Called in put_writes() before DeltaChannel writes are submitted to the
    checkpointer. Without this the checkpoint may store raw dicts or id=None
    BaseMessages; every get_state() replay then produces a different UUID and
    the same message appears with a different ID in each LangSmith trace.

    Handles three input shapes:
    - BaseMessage objects: assign a UUID if id is None.
    - Dicts with a known "role" (OpenAI-style) or "type" (LangChain format) at
      the root level: stamp "id" into the dict in-place. The reducer's
      convert_to_messages call will forward the id to the resulting BaseMessage.
    - Lists of the above: apply the same logic to each element, replacing dict
      items with coerced BaseMessages so the shared list reference seen by
      checkpoint_pending_writes and the background thread both get typed messages.

    Mutating synchronously here (before the background thread is submitted) is
    safe: the serialised bytes always reflect the post-coercion state.
    NrN   r   )r/   r   rN   rO   r   r0   r¾   ry   r1   Ú	enumerater   )rU   ÚirV   Úmsgs       r)   Úensure_message_idsrÃ   ª  sT  € õ( �%�Ñ%Ô%ð ØŒ8ÐÝ�5™7œ7‘|”|ˆEŒHˆHˆHð Ðå	�E�4Ñ	 Ô	 ð Õ%5°eÑ%<Ô%<ð Ø�yŠy˜‰Œð 	'Ý�e™gœg™,œ,ˆE�$‰KˆKˆKð	'ð 	'å	�E�4Ñ	 Ô	 ð 	Ý  Ñ'Ô'ð 	ð 	‰GˆAˆtÝ˜$¥Ñ,Ô,ð Ø”7�?Ý!¥%¡'¤'™lœl�D”GøÝ˜D¥$Ñ'Ô'ð Õ,<¸TÑ,BÔ,Bð Ý)¨4¨&Ñ1Ô1°!Ô4�Ø”6�>Ý ¥¡¤™\œ\�C”FØ��a‘øð	ð 	ð	ð 	r+   N)r    r
   r!   r"   )rV   r0   r!   r=   )rU   r
   r!   r?   )<Ú
__future__r   Úcollections.abcr   r   r   r   Údataclassesr   r	   Útypingr
   r   r   Úuuidr   r   Úlangchain_core.callbacksr   Úlangchain_core.messagesr   r   Úlangchain_core.messages.utilsr   Úlangchain_core.outputsr   r   r   Úpydanticr   Úlanggraph._internal._configr   Úlanggraph._internal._constantsr   Úlanggraph.constantsr   r   Úlanggraph.pregel.protocolr   Úlanggraph.typesr   Ú!langchain_core.tracers._streamingr   ÚImportErrorÚobjectr   r   rn   rO   r0   rI   r5   r7   r¡   Ú	frozensetr¹   Ú__annotations__r»   r¾   rÃ   r%   r+   r)   ú<module>rØ      s>  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð ð ð ð ð ð ð ð ð ð
 Ð Ð Ð Ð Ð Ð Ð à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø =Ð =Ð =Ð =Ð =Ð =Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ Ð Ð Ð Ð Ð à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø #Ð #Ð #Ð #Ð #Ð #ð'ØKÐKÐKÐKÐKÐKÐKøØð 'ð 'ð 'Ø &ÐÐÐð'øøøð)ØMÐMÐMÐMÐMÐMÐMøØð )ð )ð )Ø"(ÐÐÐð)øøøð €GˆC�L„L€ØˆU�3˜�8Œ_˜d 3¨ 8œnÐ,Ô-€ðð ð ð ðO(ð O(ð O(ð O(ð O(Ð/Ð1Jñ O(ô O(ð O(ðdUAð UAð UAð UAð UAÐ3Ð5Pñ UAô UAð UAðv "+ ØFÐFÐFñ"ô "€ð ð ð ñ ð "+ Ø;Ð;Ð;ñ"ô "€ð ð ð ñ ð
Tð Tð Tð Tð#ð #ð #ð #ð #ð #s$   Á3A: Á:BÂBÂB ÂBÂB