ó
    ýÞ jt<  ã                  ó|  • S SK Jr  S SKrS SKrS SKJrJr  S SKJr  S SK	J
r
JrJrJr  S SKJrJrJrJrJrJrJr  S SKJrJr  S SKJrJrJr  S S	KJr  S S
KJ r   Sr!\"\   \-  r#Sr$SS jr%\%SS.       SS jj5       r&      SS jr'\" SSS9 " S S\5      5       r( " S S\5      r)SS jr*SS.     SS jjr+g) é    )ÚannotationsN)ÚCallableÚSequence)Úpartial)Ú	AnnotatedÚAnyÚLiteralÚcast)Ú
AnyMessageÚBaseMessageÚBaseMessageChunkÚMessageLikeRepresentationÚRemoveMessageÚconvert_to_messagesÚmessage_chunk_to_message)Ú	TypedDictÚ
deprecated)ÚCONFÚCONFIG_KEY_SENDÚNS_SEP)Ú
StateGraph)ÚLangGraphDeprecatedSinceV10)Úadd_messagesÚMessagesStateÚMessageGraphÚREMOVE_ALL_MESSAGESÚ__remove_all__c                ó�   ^ •  S       SU 4S jjjnT R                   Ul         [        [        [        [        /[        4   U5      $ )Nc                óz   >• U b  Ub	  T" X40 UD6$ U c  Ub  SU (       a  SOS S3n[        U5      e[        T40 UD6$ )NzMMust specify non-null arguments for both 'left' and 'right'. Only received: 'ÚleftÚrightz'.)Ú
ValueErrorr   )r    r!   ÚkwargsÚmsgÚfuncs       €ÚQ/var/www/html/gaurav/venv/lib/python3.13/site-packages/langgraph/graph/message.pyÚ_add_messagesÚ,_add_messages_wrapper.<locals>._add_messages*   sb   ø€ ð Ñ Ñ 1Ù˜Ñ. vÑ.Ð.ØÑ Ñ!2ðÞ(,™f°'Ð:¸"ð>ð ô ˜S“/Ð!ä˜4Ñ* 6Ñ*Ð*ó    )NN)r    úMessages | Noner!   r*   r#   r   Úreturnz3Messages | Callable[[Messages, Messages], Messages])Ú__doc__r
   r   ÚMessages)r%   r'   s   ` r&   Ú_add_messages_wrapperr.   )   sZ   ø€ à?Cð+Øð+Ø-<ð+ØORð+à	<÷+ð +ð !ŸL™L€MÔÜ”œ(¤HÐ-¬xÐ7Ñ8¸-ÓHÐHr)   )Úformatc          	     óŒ  • Sn[        U [        5      (       d  U /n [        U[        5      (       d  U/n[        U 5       Vs/ sH  n[        [	        [
        U5      5      PM     n n[        U5       Vs/ sH  n[        [	        [
        U5      5      PM     nnU  H5  nUR                  b  M  [        [        R                  " 5       5      Ul        M7     [        U5       Hd  u  pTUR                  c#  [        [        R                  " 5       5      Ul        [        U[        5      (       d  ML  UR                  [        :X  d  Mb  UnMf     Ub  XS-   S $ U R                  5       n[        U5       VVs0 sH  u  ptUR                  U_M     nnn[        5       n	U HÊ  nUR                  UR                  5      =n
bS  [        U[        5      (       a  U	R!                  UR                  5        MS  U	R#                  UR                  5        XFU
'   Mt  [        U[        5      (       a  [%        SUR                   S35      e['        U5      X„R                  '   UR)                  U5        MÌ     U Vs/ sH  oDR                  U	;  d  M  UPM     nnUS:X  a  [+        U5      nU$ U(       a  SU< S3n[%        U5      e U$ s  snf s  snf s  snnf s  snf )aK  Merges two lists of messages, updating existing messages by ID.

By default, this ensures the state is "append-only", unless the
new message has the same ID as an existing message.

Args:
    left: The base list of `Messages`.
    right: The list of `Messages` (or single `Message`) to merge
        into the base list.
    format: The format to return messages in. If `None` then `Messages` will be
        returned as is. If `langchain-openai` then `Messages` will be returned as
        `BaseMessage` objects with their contents formatted to match OpenAI message
        format, meaning contents can be string, `'text'` blocks, or `'image_url'` blocks
        and tool responses are returned as their own `ToolMessage` objects.

        !!! important "Requirement"

            Must have `langchain-core>=0.3.11` installed to use this feature.

Returns:
    A new list of messages with the messages from `right` merged into `left`.
    If a message in `right` has the same ID as a message in `left`, the
        message from `right` will replace the message from `left`.

Example: Basic usage
    ```python
    from langchain_core.messages import AIMessage, HumanMessage

    msgs1 = [HumanMessage(content="Hello", id="1")]
    msgs2 = [AIMessage(content="Hi there!", id="2")]
    add_messages(msgs1, msgs2)
    # [HumanMessage(content='Hello', id='1'), AIMessage(content='Hi there!', id='2')]
    ```

Example: Overwrite existing message
    ```python
    msgs1 = [HumanMessage(content="Hello", id="1")]
    msgs2 = [HumanMessage(content="Hello again", id="1")]
    add_messages(msgs1, msgs2)
    # [HumanMessage(content='Hello again', id='1')]
    ```

Example: Use in a StateGraph
    ```python
    from typing import Annotated
    from typing_extensions import TypedDict
    from langgraph.graph import StateGraph


    class State(TypedDict):
        messages: Annotated[list, add_messages]


    builder = StateGraph(State)
    builder.add_node("chatbot", lambda state: {"messages": [("assistant", "Hello")]})
    builder.set_entry_point("chatbot")
    builder.set_finish_point("chatbot")
    graph = builder.compile()
    graph.invoke({})
    # {'messages': [AIMessage(content='Hello', id=...)]}
    ```

Example: Use OpenAI message format
    ```python
    from typing import Annotated
    from typing_extensions import TypedDict
    from langgraph.graph import StateGraph, add_messages


    class State(TypedDict):
        messages: Annotated[list, add_messages(format="langchain-openai")]


    def chatbot_node(state: State) -> list:
        return {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "Here's an image:",
                            "cache_control": {"type": "ephemeral"},
                        },
                        {
                            "type": "image",
                            "source": {
                                "type": "base64",
                                "media_type": "image/jpeg",
                                "data": "1234",
                            },
                        },
                    ],
                },
            ]
        }


    builder = StateGraph(State)
    builder.add_node("chatbot", chatbot_node)
    builder.set_entry_point("chatbot")
    builder.set_finish_point("chatbot")
    graph = builder.compile()
    graph.invoke({"messages": []})
    # {
    #     'messages': [
    #         HumanMessage(
    #             content=[
    #                 {"type": "text", "text": "Here's an image:"},
    #                 {
    #                     "type": "image_url",
    #                     "image_url": {"url": "data:image/jpeg;base64,1234"},
    #                 },
    #             ],
    #         ),
    #     ]
    # }
    ```

Né   z?Attempting to delete a message with an ID that doesn't exist ('z')zlangchain-openaizUnrecognized format=z+. Expected one of 'langchain-openai', None.)Ú
isinstanceÚlistr   r   r
   r   ÚidÚstrÚuuidÚuuid4Ú	enumerater   r   ÚcopyÚsetÚgetÚaddÚdiscardr"   ÚlenÚappendÚ_format_messages)r    r!   r/   Úremove_all_idxÚmÚidxÚmergedÚiÚmerged_by_idÚids_to_removeÚexisting_idxr$   s               r&   r   r   <   s}  € ð~ €Nä�dœD×!Ñ!ØˆvˆÜ�eœT×"Ñ"Ø�ˆô % TÔ*óá*ˆAô 	!¤Ô&6¸Ó!:Ö;Ù*ð 	ð ô % UÔ+óá+ˆAô 	!¤Ô&6¸Ó!:Ö;Ù+ð 
ð ó
 ˆØ�4‰4‹<Ü”t—z’z“|Ó$ˆAŽDñ ô ˜EÖ"‰ˆØ�4‰4‰<Ü”t—z’z“|Ó$ˆAŒDÜ�aœ×'Ó'¨A¯D©DÔ4GÕ,GØ ŠNñ	 #ð Ñ!Ø aÑ'Ð)Ð*Ð*ð �Y‰Y‹[€FÜ(1°&Ô(9Ô:Ñ(9¡ �A—D‘D˜!’GÑ(9€LÑ:Ü“E€MÛˆØ(×,Ñ,¨Q¯T©TÓ2Ð2ˆLÑ?Ü˜!œ]×+Ñ+Ø×!Ñ! !§$¡$Ö'à×%Ñ% a§d¡dÔ+Ø'(�|Ó$ä˜!œ]×+Ñ+Ü ØUÐVW×VZÑVZÐU[Ð[]Ð^óð ô "% V£ˆLŸ™ÑØ�M‰M˜!Öñ ñ  Ó=™�A§4¡4¨}Ñ#<�a™€FÐ=àÐ#Ó#Ü! &Ó)ˆð €Mö 
Ø%˜f™YÐ&QÐRˆÜ˜‹oÐàà€Mùòeùòùó& ;ùò" >s   Á "J1Á1"J6Å+J;É$KÉ:Kc                óä  • / nU H<  n[        U[        5      (       a  UR                  U5        M+  UR                  U5        M>     U (       a  [        U S   [        5      (       a  U nO[        S[        U 5      5      n[        S[        U5      5      n[        U5       VVs0 sH!  u  pgUR                  c  M  UR                  U_M#     nnn[        U5      n	U Hw  n
U
R                  nUc  U	R                  U
5        M%  [        U
[        5      (       a  X¸;   a  SX˜U   '   X‹	 MJ  ML  X¸;   a  X©X‹   '   MY  [        U	5      X‹'   U	R                  U
5        My     U	 Vs/ sH	  owc  M  UPM     sn$ s  snnf s  snf )uƒ  **Experimental.** Batch reducer for use with `DeltaChannel`.

Processes all writes in one pass â€” dedup by ID, `RemoveMessage`
tombstoning â€” without calling `add_messages`.

This reducer is batching-invariant, as required by `DeltaChannel`:
`reducer(reducer(state, xs), ys) == reducer(state, xs + ys)`.

Raw dict / string / tuple inputs are coerced to typed `BaseMessage`
objects so that HTTP-driven graphs work without a separate coercion
step. This is not full `add_messages` parity â€” `REMOVE_ALL_MESSAGES`,
unknown-id `RemoveMessage` errors, missing-id UUID assignment, and
`BaseMessageChunk` conversion are not handled here.

Example::

    from typing import Annotated
    from langgraph.channels.delta import DeltaChannel
    from langgraph.graph.message import _messages_delta_reducer

    class State(TypedDict):
        messages: Annotated[list, DeltaChannel(_messages_delta_reducer)]
r   úlist[AnyMessage]N)r2   r3   Úextendr?   r   r
   r   r8   r4   r   r>   )ÚstateÚwritesÚflatÚwÚ
state_msgsÚmsgsrE   rB   ÚindexÚresultr$   Úmids               r&   Ú_messages_delta_reducerrU   ÷   sM  € ð< €DÛˆÜ�aœ×ÑØ�K‰K˜ŽNà�K‰K˜ŽNñ	 ö ”˜E !™H¤k×2Ñ2Ø‰
äÐ,Ô.AÀ%Ó.HÓIˆ
ÜÐ"Ô$7¸Ó$=Ó>€Dô & jÔ1ôÙ1‘D�A°Q·T±T‹ˆ�‰ˆaŠÑ1ð 
ñ ô '+¨:Ó&6€FÛˆØ�f‰fˆØ‰;Ø�M‰M˜#ÖÜ˜œ]×+Ñ+Ø‹|Ø%)�˜S‘zÑ"Ø’Jñ ð ‹\Ø!$�5‘:Óä˜V›ˆE‰JØ�M‰M˜#Öñ ñ Ó/‘v�!�A‘vÑ/Ð/ùó#ùò" 0s   ÂE'Â5E'ÅE-ÅE-z{MessageGraph is deprecated in langgraph 1.0.0, to be removed in 2.0.0. Please use StateGraph with a `messages` key instead.)Úcategoryc                  ó0   ^ • \ rS rSrSrSU 4S jjrSrU =r$ )r   i8  a  A StateGraph where every node receives a list of messages as input and returns one or more messages as output.

MessageGraph is a subclass of StateGraph whose entire state is a single, append-only* list of messages.
Each node in a MessageGraph takes a list of messages as input and returns zero or more
messages as output. The `add_messages` function is used to merge the output messages from each node
into the existing list of messages in the graph's state.

Examples:
    ```pycon
    >>> from langgraph.graph.message import MessageGraph
    ...
    >>> builder = MessageGraph()
    >>> builder.add_node("chatbot", lambda state: [("assistant", "Hello!")])
    >>> builder.set_entry_point("chatbot")
    >>> builder.set_finish_point("chatbot")
    >>> builder.compile().invoke([("user", "Hi there.")])
    [HumanMessage(content="Hi there.", id='...'), AIMessage(content="Hello!", id='...')]
    ```

    ```pycon
    >>> from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
    >>> from langgraph.graph.message import MessageGraph
    ...
    >>> builder = MessageGraph()
    >>> builder.add_node(
    ...     "chatbot",
    ...     lambda state: [
    ...         AIMessage(
    ...             content="Hello!",
    ...             tool_calls=[{"name": "search", "id": "123", "args": {"query": "X"}}],
    ...         )
    ...     ],
    ... )
    >>> builder.add_node(
    ...     "search", lambda state: [ToolMessage(content="Searching...", tool_call_id="123")]
    ... )
    >>> builder.set_entry_point("chatbot")
    >>> builder.add_edge("chatbot", "search")
    >>> builder.set_finish_point("search")
    >>> builder.compile().invoke([HumanMessage(content="Hi there. Can you search for X?")])
    {'messages': [HumanMessage(content="Hi there. Can you search for X?", id='b8b7d8f4-7f4d-4f4d-9c1d-f8b8d8f4d9c1'),
                 AIMessage(content="Hello!", id='f4d9c1d8-8d8f-4d9c-b8b7-d8f4f4d9c1d8'),
                 ToolMessage(content="Searching...", id='d8f4f4d9-c1d8-4f4d-b8b7-d8f4f4d9c1d8', tool_call_id="123")]}
    ```
c                óˆ   >• [         R                  " S[        SS9  [        TU ]  [
        [        [           [        4   5        g )Nz}MessageGraph is deprecated in LangGraph v1.0.0, to be removed in v2.0.0. Please use StateGraph with a `messages` key instead.é   )rV   Ú
stacklevel)	ÚwarningsÚwarnr   ÚsuperÚ__init__r   r3   r   r   )ÚselfÚ	__class__s    €r&   r^   ÚMessageGraph.__init__k  s9   ø€ Ü�Šð LÜ0Øò	
ô
 	‰Ñœ¤4¬
Ñ#3´\Ð#AÑBÕCr)   © )r+   ÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r,   r^   Ú__static_attributes__Ú__classcell__)r`   s   @r&   r   r   8  s   ø† ñ
,÷\Dõ Dr)   r   c                  ó    • \ rS rSr% S\S'   Srg)r   it  z)Annotated[list[AnyMessage], add_messages]Úmessagesrb   N)rd   re   rf   rg   Ú__annotations__rh   rb   r)   r&   r   r   t  s   ‡ Ø7Ö7r)   r   rk   c                ó˜   •  SSK Jn  [        U" U 5      5      $ ! [         a&    Sn[        R
                  " U5        [        U 5      s $ f = f)Nr   )Úconvert_to_openai_messageszÓMust have langchain-core>=0.3.11 installed to use automatic message formatting (format='langchain-openai'). Please update your langchain-core version or remove the 'format' flag. Returning un-formatted messages.)Úlangchain_core.messagesrn   r   ÚImportErrorr[   r\   r3   )rk   rn   r$   s      r&   r@   r@   x  sQ   € ðIÝFô #Ñ#=¸hÓ#GÓHÐHøô ó ðð 	ô 	�Š�cÔÜ�H‹~Òðús   ‚ ™-A	ÁA	)Ú	state_keyc               ól  ^
^• SSK Jm
Jn  SSKJn  SSKJm  U" 5       n[        S [        U /5       5       5      n U R                  c  [        S5      e[        US   U5      (       a  US   nUR                  nO:[        US   [        5      (       a"  [        U
4S	 jUS    5       5      (       a  US   n[        U4S
 jW 5       S5      =n(       aF  US   n[        [!        ["        US   5      R%                  [&        5      5      U4n	UR)                  X�SS9  U(       a  U[*           [,           " X4/5        U $ )z¯Write a message manually to the `messages` / `messages-tuple` stream mode.

Will automatically write to the channel specified in the `state_key` unless `state_key` is `None`.
r   )ÚBaseCallbackHandlerÚBaseCallbackManager)Ú
get_config)ÚStreamMessagesHandlerc              3  ó"   #   • U H  ov •  M     g 7f©Nrb   )Ú.0Úxs     r&   Ú	<genexpr>Úpush_message.<locals>.<genexpr>›  s   é € Ð=Ñ<˜”1Ò<ùs   ‚NzMessage ID is requiredÚ	callbacksc              3  ó:   >#   • U H  n[        UT5      v •  M     g 7frx   ©r2   )ry   rz   rs   s     €r&   r{   r|   £  s    øé € ð 7Ù4G¨qŒ
�1Ð)×*Ð*Ò4Gùs   ƒc              3  óL   >#   • U H  n[        UT5      (       d  M  Uv •  M     g 7frx   r   )ry   rz   rv   s     €r&   r{   r|   ©  s   øé € ÐE‘Hˆq¤
¨1Ð.C× D�‰’Hùs   ƒ$›	$ÚmetadataÚlanggraph_checkpoint_nsF)Údedupe)Úlangchain_core.callbacks.basers   rt   Úlanggraph.configru   Úlanggraph.pregel._messagesrv   Únextr   r4   r"   r2   Úhandlersr3   ÚallÚtupler
   r5   Úsplitr   Ú_emitr   r   )Úmessagerq   rt   ru   ÚconfigÚmanagerrˆ   Ústream_handlerr�   Úmessage_metars   rv   s             @@r&   Úpush_messager’   ˆ  s1  ù€ ÷õ
 ,Ý@á‹\€FÜÑ=Ô1°7°)Ô<Ó=Ó=€Gà‡z�zÑÜÐ1Ó2Ð2ä�&˜Ñ%Ð':×;Ñ;Ø˜Ñ%ˆØ×#Ñ#‰Ü	�F˜;Ñ'¬×	.Ñ	.´3ô 7Ø4:¸;Ò4Gó7÷ 4ñ 4ð ˜+Ñ&ˆäÜE‘HÓEÀtóð €~õ ð ˜*Ñ%ˆä”$”s˜HÐ%>Ñ?Ó@×FÑFÄvÓNÓOØð
ˆð 	×Ñ˜\¸5ÐÑAæØŒt‰”_Ò%¨	Ð';Ð&<Ô=à€Nr)   )r%   r   r+   z(Callable[[Messages, Messages], Messages])r    r-   r!   r-   r/   z"Literal['langchain-openai'] | Noner+   r-   )rL   rJ   rM   zlist[list[AnyMessage]]r+   rJ   )rk   zSequence[BaseMessage]r+   zlist[BaseMessage])r�   z,MessageLikeRepresentation | BaseMessageChunkrq   z
str | Noner+   r   ),Ú
__future__r   r6   r[   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r	   r
   ro   r   r   r   r   r   r   r   Útyping_extensionsr   r   Úlanggraph._internal._constantsr   r   r   Úlanggraph.graph.stater   Úlanggraph.warningsr   Ú__all__r3   r-   r   r.   r   rU   r   r   r@   r’   rb   r)   r&   Ú<module>rœ      s+  ðÝ "ã Û ß .Ý ÷ó ÷÷ ñ ÷ 4ç HÑ HÝ ,Ý :ð€ð Ð)Ñ*Ð-FÑF€à&Ð ôIð& ð
 26ñ	wØ
ðwàðwð /ð	wð
 ôwó ðwðt>0Øð>0Ø%;ð>0àô>0ñB ð BØñô5D�:ó 5Dó	ð5Dôp8�Iô 8ôIð& 'ñ-Ø9ð-ð ð-ð ö	-r)   