
    <i2                    f   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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__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       g/home/dmtnaga/Documents/work/airagagent/rag_env/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+	<+ + !LLM(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      XR                  '   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 )aP  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:
    ```python title="Basic usage"
    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')]
    ```

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

    ```python title="Use in a StateGraph"
    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=...)]}
    ```

    ```python title="Use OpenAI message format"
    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   REMOVE_ALL_MESSAGES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}   x NdD!!veT"" %T**A 	!&6!:;* 	  %U++A 	!&6!:;+ 
 
 44<tzz|$AD  E"44<tzz|$ADa''ADD4G,G N	 # !a')** YY[F(1&(9:(9ADD!G(9L:EM(,,QTT22L?!]++!!!$$'%%add+'(|$!]++ UVWVZVZU[[]^  "%VLMM!   =A44}#<aF=##!&) M 
%fY&QRoMe& ;" >s    #J52#J:-J?'K>K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      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.   )rI   
stacklevel)	warningswarnr   super__init__r   r2   r   r   )self	__class__s    r%   rR   MessageGraph.__init__&  s9     L0	

 	4
#3\#ABCr(    )r*   None)__name__
__module____qualname____firstlineno__r+   rR   __static_attributes____classcell__)rT   s   @r%   r   r      s    
,\D Dr(   r   c                       \ rS rSr% S\S'   Srg)r   i/  z)Annotated[list[AnyMessage], add_messages]messagesrV   N)rX   rY   rZ   r[   __annotations__r\   rV   r(   r%   r   r   /  s    77r(   r   r_   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_messageszMust 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.messagesrb   r   ImportErrorrO   rP   r2   )r_   rb   r#   s      r%   r@   r@   3  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)                  XSS9  U(       a  U[*           [,           " X4/5        U $ )zWrite 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NrV   ).0xs     r%   	<genexpr>push_message.<locals>.<genexpr>V  s     =<1<s   NzMessage ID is required	callbacksc              3  <   >#    U  H  n[        UT5      v   M     g 7frl   r1   )rm   rn   rg   s     r%   ro   rp   ^  s       74Gq
1)**4Gs   c              3  N   >#    U  H  n[        UT5      (       d  M  Uv   M     g 7frl   rs   )rm   rn   rj   s     r%   ro   rp   d  s     EHq
1.C DHs   %	%metadatalanggraph_checkpoint_nsF)dedupe)langchain_core.callbacks.baserg   rh   langgraph.configri   langgraph.pregel._messagesrj   nextr   r3   r!   r1   handlersr2   alltupler
   r4   splitr   _emitr   r   )messagere   rh   ri   configmanagerr|   stream_handlerru   message_metarg   rj   s             @@r%   push_messager   C  s1   
 ,@\F=17)<==Gzz122&%':;;%##	F;'	.	.3 74:;4G7 4 4 +&EHEt ~  *%$sH%>?@FFv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,   )r_   zSequence[BaseMessage]r*   zlist[BaseMessage])r   z,MessageLikeRepresentation | BaseMessageChunkre   z
str | Noner*   r   )+
__future__r   r5   rO   collections.abcr   r   	functoolsr   typingr   r   r	   r
   rc   r   r   r   r   r   r   r   typing_extensionsr   r   langgraph._internal._constantsr   r   r   langgraph.graph.stater   langgraph.warningsr   __all__r2   r,   r8   r-   r   r   r   r@   r   rV   r(   r%   <module>r      s   "   .     4 H H , : )*-FF& I& 
 26	t
tt /	t
 t tn  B5D: 5D	5Dp8I 8I& '-9- - 	-r(   