§
    šŠtjt<  ã                  óv  — d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZmZmZ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 d d
lm Z  dZ!e"e         ez  Z#dZ$d/d„Z%e%ddœd0d„¦   «         Z&d1d„Z' edd¬¦  «         G d „ d!e¦  «        ¦   «         Z( G d"„ d#e¦  «        Z)d2d'„Z*d$d(œd3d.„Z+dS )4é    )Ú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__Úfuncr   Úreturnú(Callable[[Messages, Messages], Messages]c                óˆ   ‡ — 	 d	d
ˆ fd„}‰ j         |_         t          t          t          t          gt          f         |¦  «        S )NÚleftúMessages | NoneÚrightÚkwargsr   r   ú3Messages | Callable[[Messages, Messages], Messages]c                ót   •— | �|�
 ‰| |fi |¤ŽS | €|�d| rdnd› d�}t          |¦  «        ‚t          ‰fi |¤ŽS )NzMMust specify non-null arguments for both 'left' and 'right'. Only received: 'r"   r$   z'.)Ú
ValueErrorr   )r"   r$   r%   Úmsgr   s       €úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph/graph/message.pyÚ_add_messagesz,_add_messages_wrapper.<locals>._add_messages*   s~   ø€ ð Ð Ð 1Ø�4˜˜eÐ.Ð. vÐ.Ð.Ð.ØÐ Ð!2ð>Ø(,Ð9˜f˜f°'ð>ð >ð >ð õ ˜S‘/”/Ð!å˜4Ð*Ð* 6Ð*Ð*Ð*ó    )NN)r"   r#   r$   r#   r%   r   r   r&   )Ú__doc__r
   r   ÚMessages)r   r+   s   ` r*   Ú_add_messages_wrapperr/   )   sT   ø€ à?Cð+ð +ð +ð +ð +ð +ð +ð !œL€MÔÝ•�(¥HÐ-­xÐ7Ô8¸-ÑHÔHÐHr,   )Úformatr"   r.   r$   r0   ú"Literal['langchain-openai'] | Nonec               ó¢  ‡
— d}t          | t          ¦  «        s| g} t          |t          ¦  «        s|g}d„ t          | ¦  «        D ¦   «         } d„ t          |¦  «        D ¦   «         }| D ].}|j        €%t	          t          j        ¦   «         ¦  «        |_        Œ/t          |¦  «        D ]X\  }}|j        €%t	          t          j        ¦   «         ¦  «        |_        t          |t          ¦  «        r|j        t          k    r|}ŒY|�||dz   d…         S |  
                    ¦   «         }d„ t          |¦  «        D ¦   «         }t          ¦   «         Š
|D ]Ç}|                     |j        ¦  «        x}�Pt          |t          ¦  «        r‰
                     |j        ¦  «         ŒN‰
                     |j        ¦  «         |||<   Œnt          |t          ¦  «        rt          d|j        › d�¦  «        ‚t!          |¦  «        ||j        <   |                     |¦  «         ŒÈˆ
fd„|D ¦   «         }|d	k    rt%          |¦  «        }n|rd
|›d�}	t          |	¦  «        ‚	 |S )aÓ  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"},
        #                 },
        #             ],
        #         ),
        #     ]
        # }
        ```

    Nc                óR   — g | ]$}t          t          t          |¦  «        ¦  «        ‘Œ%S © ©r   r
   r   ©Ú.0Úms     r*   ú
<listcomp>z add_messages.<locals>.<listcomp>Â   s;   € ð ð ð àõ 	!¥Õ&6¸Ñ!:Ô!:Ñ;Ô;ðð ð r,   c                óR   — g | ]$}t          t          t          |¦  «        ¦  «        ‘Œ%S r4   r5   r6   s     r*   r9   z add_messages.<locals>.<listcomp>Æ   s;   € ð ð ð àõ 	!¥Õ&6¸Ñ!:Ô!:Ñ;Ô;ðð ð r,   é   c                ó$   — i | ]\  }}|j         |“ŒS r4   ©Úid©r7   Úir8   s      r*   ú
<dictcomp>z add_messages.<locals>.<dictcomp>Ù   s    € Ð:Ð:Ð:¡  1�A”D˜!Ð:Ð:Ð:r,   z?Attempting to delete a message with an ID that doesn't exist ('z')c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r4   r=   )r7   r8   Úids_to_removes     €r*   r9   z add_messages.<locals>.<listcomp>ê   s%   ø€ Ð=Ð=Ð=�A 1¤4¨}Ð#<Ð#<ˆaÐ#<Ð#<Ð#<r,   zlangchain-openaizUnrecognized format=z+. Expected one of 'langchain-openai', None.)Ú
isinstanceÚlistr   r>   ÚstrÚuuidÚuuid4Ú	enumerater   r   ÚcopyÚsetÚgetÚaddÚdiscardr(   ÚlenÚappendÚ_format_messages)r"   r$   r0   Úremove_all_idxr8   ÚidxÚmergedÚmerged_by_idÚexisting_idxr)   rC   s             @r*   r   r   <   s™  ø€ ð~ €Nå�d�DÑ!Ô!ð ØˆvˆÝ�e�TÑ"Ô"ð Ø�ˆðð å$ TÑ*Ô*ðñ ô €Dðð å$ UÑ+Ô+ðñ ô €Eð
 ð %ð %ˆØŒ4ˆ<Ý•t”z‘|”|Ñ$Ô$ˆAŒDøÝ˜EÑ"Ô"ð !ð !‰ˆˆQØŒ4ˆ<Ý•t”z‘|”|Ñ$Ô$ˆAŒDÝ�a�Ñ'Ô'ð 	!¨A¬DÕ4GÒ,GÐ,GØ ˆNøàÐ!Ø�^ aÑ'Ð)Ð)Ô*Ð*ð �YŠY‰[Œ[€FØ:Ð:­	°&Ñ(9Ô(9Ð:Ñ:Ô:€LÝ‘E”E€MØð ð ˆØ(×,Ò,¨Q¬TÑ2Ô2Ð2ˆLÐ?Ý˜!�]Ñ+Ô+ð )Ø×!Ò! !¤$Ñ'Ô'Ð'Ð'à×%Ò% a¤dÑ+Ô+Ð+Ø'(��|Ñ$Ð$å˜!�]Ñ+Ô+ð Ý Ø^ÐVWÔVZÐ^Ð^Ð^ñô ð õ "% V¡¤ˆL˜œÑØ�MŠM˜!ÑÔÐÐØ=Ð=Ð=Ð=˜Ð=Ñ=Ô=€FàÐ#Ò#Ð#Ý! &Ñ)Ô)ˆˆØ	ð ØR˜fÐRÐRÐRˆÝ˜‰oŒoÐàà€Mr,   Ústateúlist[AnyMessage]Úwritesúlist[list[AnyMessage]]c                ó²  — g }|D ]B}t          |t          ¦  «        r|                     |¦  «         Œ-|                     |¦  «         ŒC| rt          | d         t          ¦  «        r| }nt          dt          | ¦  «        ¦  «        }t          dt          |¦  «        ¦  «        }d„ t          |¦  «        D ¦   «         }t          |¦  «        }|D ]€}|j        }	|	€|                     |¦  «         Œ!t          |t          ¦  «        r|	|v rd|||	         <   ||	= ŒI|	|v r||||	         <   ŒYt          |¦  «        ||	<   |                     |¦  «         Œ�d„ |D ¦   «         S )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   rX   c                ó2   — i | ]\  }}|j         ®|j         |“ŒS ©Nr=   r?   s      r*   rA   z+_messages_delta_reducer.<locals>.<dictcomp>$  s.   € ð ð ð Ù�A�q°Q´TÐ5EˆŒˆaÐ5EÐ5EÐ5Er,   Nc                ó   — g | ]}|®|‘ŒS r]   r4   r6   s     r*   r9   z+_messages_delta_reducer.<locals>.<listcomp>5  s   € Ð/Ð/Ð/�!  ˆA   r,   )rD   rE   ÚextendrP   r   r
   r   rI   r>   r   rO   )
rW   rY   ÚflatÚwÚ
state_msgsÚmsgsÚindexÚresultr)   Úmids
             r*   Ú_messages_delta_reducerrg   ÷   sŽ  € ð< €DØð ð ˆÝ�a�ÑÔð 	Ø�KŠK˜‰NŒNˆNˆNà�KŠK˜‰NŒNˆNˆNð ð J•˜E !œH¥kÑ2Ô2ð JØˆ
ˆ
åÐ,Õ.AÀ%Ñ.HÔ.HÑIÔIˆ
ÝÐ"Õ$7¸Ñ$=Ô$=Ñ>Ô>€Dðð Ý% jÑ1Ô1ðñ ô €Eõ '+¨:Ñ&6Ô&6€FØð ð ˆØŒfˆØˆ;Ø�MŠM˜#ÑÔÐÐÝ˜�]Ñ+Ô+ð 	Ø�eˆ|ˆ|Ø%)��u˜S”zÑ"Ø˜#�JøØ�Eˆ\ˆ\Ø!$ˆF�5˜”:ÑÐå˜V™œˆE�#‰JØ�MŠM˜#ÑÔÐÐØ/Ð/�vÐ/Ñ/Ô/Ð/r,   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                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )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")]}
        ```
    r   ÚNonec                óÆ   •— t          j        dt          d¬¦  «         t          ¦   «                              t
          t          t                   t          f         ¦  «         d S )Nz}MessageGraph is deprecated in LangGraph v1.0.0, to be removed in v2.0.0. Please use StateGraph with a `messages` key instead.é   )rh   Ú
stacklevel)	ÚwarningsÚwarnr   ÚsuperÚ__init__r   rE   r   r   )ÚselfÚ	__class__s    €r*   rq   zMessageGraph.__init__k  sW   ø€ ÝŒð LÝ0Øð	
ñ 	
ô 	
ð 	
õ
 	‰Œ×Ò�¥4­
Ô#3µ\Ð#AÔBÑCÔCÐCÐCÐCr,   )r   rj   )Ú__name__Ú
__module__Ú__qualname__r-   rq   Ú__classcell__)rs   s   @r*   r   r   8  sR   ø€ € € € € ð
,ð ,ð\Dð Dð Dð Dð Dð Dð Dð Dð Dð Dr,   r   c                  ó   — e Zd ZU ded<   dS )r   z)Annotated[list[AnyMessage], add_messages]ÚmessagesN)rt   ru   rv   Ú__annotations__r4   r,   r*   r   r   t  s   € € € € € € Ø7Ð7Ð7Ñ7Ð7Ð7r,   r   ry   úSequence[BaseMessage]úlist[BaseMessage]c                óª   — 	 ddl m} t           || ¦  «        ¦  «        S # t          $ r( d}t	          j        |¦  «         t          | ¦  «        cY S w xY w)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.messagesr~   r   ÚImportErrorrn   ro   rE   )ry   r~   r)   s      r*   rQ   rQ   x  s�   € ðIØFÐFÐFÐFÐFÐFõ #Ð#=Ð#=¸hÑ#GÔ#GÑHÔHÐHøõ ð ð ð ðð 	õ 	Œ�cÑÔÐÝ�H‰~Œ~ÐÐÐðøøøs   ‚   /AÁA)Ú	state_keyÚmessageú,MessageLikeRepresentation | BaseMessageChunkr�   ú
str | Noner   c               óà  ‡
‡— ddl mŠ
m} ddlm} ddlmŠ  |¦   «         }t          d„ t          | g¦  «        D ¦   «         ¦  «        } | j	        €t          d¦  «        ‚t          |d         |¦  «        r|d         }|j        }nDt          |d         t          ¦  «        r)t          ˆ
fd	„|d         D ¦   «         ¦  «        r|d         }t          ˆfd
„|D ¦   «         d¦  «        x}rb|d         }t          t!          t"          |d         ¦  «                             t&          ¦  «        ¦  «        |f}	|                     |	| d¬¦  «         |r$ |t*                   t,                   || fg¦  «         | S )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  ó   K  — | ]}|V — Œd S r]   r4   )r7   Úxs     r*   ú	<genexpr>zpush_message.<locals>.<genexpr>›  s"   è è € Ð=Ð=˜�1Ð=Ð=Ð=Ð=Ð=Ð=r,   NzMessage ID is requiredÚ	callbacksc              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S r]   ©rD   )r7   r‹   r†   s     €r*   rŒ   zpush_message.<locals>.<genexpr>£  s?   øè è € ð 7ð 7Ø/0�
�1Ð)Ñ*Ô*ð7ð 7ð 7ð 7ð 7ð 7r,   c              3  ó<   •K  — | ]}t          |‰¦  «        ¯|V — Œd S r]   r�   )r7   r‹   r‰   s     €r*   rŒ   zpush_message.<locals>.<genexpr>©  s3   øè è € ÐEÐEˆq¥
¨1Ð.CÑ DÔ DÐEˆÐEÐEÐEÐEÐEÐEr,   ÚmetadataÚlanggraph_checkpoint_nsF)Údedupe)Úlangchain_core.callbacks.baser†   r‡   Úlanggraph.configrˆ   Úlanggraph.pregel._messagesr‰   Únextr   r>   r(   rD   ÚhandlersrE   ÚallÚtupler
   rF   Úsplitr   Ú_emitr   r   )r‚   r�   r‡   rˆ   ÚconfigÚmanagerr˜   Ústream_handlerr‘   Úmessage_metar†   r‰   s             @@r*   Úpush_messager¡   ˆ  sã  øø€ ðð ð ð ð ð ð ð ð
 ,Ð+Ð+Ð+Ð+Ð+Ø@Ð@Ð@Ð@Ð@Ð@àˆZ‰\Œ\€FÝÐ=Ð=Õ1°7°)Ñ<Ô<Ð=Ñ=Ô=Ñ=Ô=€Gà„zÐÝÐ1Ñ2Ô2Ð2å�&˜Ô%Ð':Ñ;Ô;ð 'Ø˜Ô%ˆØÔ#ˆˆÝ	�F˜;Ô'­Ñ	.Ô	.ð 'µ3ð 7ð 7ð 7ð 7Ø4:¸;Ô4Gð7ñ 7ô 7ñ 4ô 4ð 'ð ˜+Ô&ˆåØEÐEÐEÐE�HÐEÑEÔEÀtñô ð €~ð Bð ˜*Ô%ˆå•$•s˜HÐ%>Ô?Ñ@Ô@×FÒFÅvÑNÔNÑOÔOØð
ˆð 	×Ò˜\¨7¸5ÐÑAÔAÐAàð >Ø%ˆ�tŒ•_Ô%¨	°7Ð';Ð&<Ñ=Ô=Ð=à€Nr,   )r   r   r   r    )r"   r.   r$   r.   r0   r1   r   r.   )rW   rX   rY   rZ   r   rX   )ry   r{   r   r|   )r‚   rƒ   r�   r„   r   r   ),Ú
__future__r   rG   rn   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r	   r
   r   r   r   r   r   r   r   r   Útyping_extensionsr   r   Úlanggraph._internal._constantsr   r   r   Úlanggraph.graph.stater   Úlanggraph.warningsr   Ú__all__rE   r.   r   r/   r   rg   r   r   rQ   r¡   r4   r,   r*   ú<module>r«      s”  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 4Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø :Ð :Ð :Ð :Ð :Ð :ð€ð Ð)Ô*Ð-FÑF€à&Ð ðIð Ið Ið Ið& ð
 26ð	wð wð wð wð wñ Ôðwðt>0ð >0ð >0ð >0ðB €ð BØðñ ô ð5Dð 5Dð 5Dð 5Dð 5D�:ñ 5Dô 5Dñ	ô ð5Dðp8ð 8ð 8ð 8ð 8�Iñ 8ô 8ð 8ðIð Ið Ið Ið& 'ð-ð -ð -ð -ð -ð -ð -ð -r,   