Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
message.cpython-313.pyc241 linesDownload Raw Back to __pycache__
1�

2��jt<��|�SSKJr SSKrSSKrSSKJrJr SSKJr SSK	J3r4JrJrJ
r
 SSKJrJrJrJrJrJrJr SSKJrJr SSKJrJrJr SS	KJr SS5KJ r  Sr!\"\\-r#Sr$SS
jr%\%SS.SSjj5r&SSjr'\"SSS9"SS\55r("SS\5r)SSjr*SS.SSjjr+g) �)�annotationsN)�Callable�Sequence)�partial)�	Annotated�Any�Literal�cast)�6AnyMessage�BaseMessage�BaseMessageChunk�MessageLikeRepresentation�
RemoveMessage�convert_to_messages�message_chunk_to_message)�	TypedDict�7deprecated)�CONF�CONFIG_KEY_SEND�NS_SEP)�8StateGraph)�LangGraphDeprecatedSinceV10)�add_messages�
MessagesState�MessageGraph�REMOVE_ALL_MESSAGES�__remove_all__c�^�SSU4SjjjnTRUl[[[[/[4U5$)Nc�z>�UbUb	T"X40UD6$UcUbSU(aSOSS3n[U5e[T40UD6$)NzMMust specify non-null arguments for both 'left' and 'right'. Only received: '�left�rightz'.)�9ValueErrorr)r r!�kwargs�msg�funcs    ��]D:\code\apps\devtools\python\user_packages\Python313\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__r10r�Messages)r%r's` r&�_add_messages_wrapperr.)sZ���?C�+��+�-<�+�OR�+�	<�+�+�!�L�L�M����(�H�-�x�7�8�-�H�Hr))�formatc	��Sn[U[5(dU/n[U[5(dU/n[U5Vs/sHn[[	[11U55PM nn[U5Vs/sHn[[	[12U55PM nnUH5nURbM[[R"55UlM7 [U5HdupTURc#[[R"55Ul[U[5(dMLUR[:XdMbUnMf UbXS-S$UR5n[U5VVs0sHuptURU_M nnn[5n	UH�nURUR5=n13bS[U[5(aU	R!UR5 MSU	R#UR5 XFU14'Mt[U[5(a[%SURS35e['U5X�R'UR)U5 M� UVs/sHoDRU	;dMUPM nnUS:Xa
[+U5nU$U(aSU<S3n[%U5eU$s snfs snfs snnfs snf)aKMerges two lists of messages, updating existing messages by ID.15 16By default, this ensures the state is "append-only", unless the17new message has the same ID as an existing message.18 19Args:20    left: The base list of `Messages`.21    right: The list of `Messages` (or single `Message`) to merge22        into the base list.23    format: The format to return messages in. If `None` then `Messages` will be24        returned as is. If `langchain-openai` then `Messages` will be returned as25        `BaseMessage` objects with their contents formatted to match OpenAI message26        format, meaning contents can be string, `'text'` blocks, or `'image_url'` blocks27        and tool responses are returned as their own `ToolMessage` objects.28 29        !!! important "Requirement"30 31            Must have `langchain-core>=0.3.11` installed to use this feature.32 33Returns:34    A new list of messages with the messages from `right` merged into `left`.35    If a message in `right` has the same ID as a message in `left`, the36        message from `right` will replace the message from `left`.37 38Example: Basic usage39    ```python40    from langchain_core.messages import AIMessage, HumanMessage41 42    msgs1 = [HumanMessage(content="Hello", id="1")]43    msgs2 = [AIMessage(content="Hi there!", id="2")]44    add_messages(msgs1, msgs2)45    # [HumanMessage(content='Hello', id='1'), AIMessage(content='Hi there!', id='2')]46    ```47 48Example: Overwrite existing message49    ```python50    msgs1 = [HumanMessage(content="Hello", id="1")]51    msgs2 = [HumanMessage(content="Hello again", id="1")]52    add_messages(msgs1, msgs2)53    # [HumanMessage(content='Hello again', id='1')]54    ```55 56Example: Use in a StateGraph57    ```python58    from typing import Annotated59    from typing_extensions import TypedDict60    from langgraph.graph import StateGraph61 62 63    class State(TypedDict):64        messages: Annotated[list, add_messages]65 66 67    builder = StateGraph(State)68    builder.add_node("chatbot", lambda state: {"messages": [("assistant", "Hello")]})69    builder.set_entry_point("chatbot")70    builder.set_finish_point("chatbot")71    graph = builder.compile()72    graph.invoke({})73    # {'messages': [AIMessage(content='Hello', id=...)]}74    ```75 76Example: Use OpenAI message format77    ```python78    from typing import Annotated79    from typing_extensions import TypedDict80    from langgraph.graph import StateGraph, add_messages81 82 83    class State(TypedDict):84        messages: Annotated[list, add_messages(format="langchain-openai")]85 86 87    def chatbot_node(state: State) -> list:88        return {89            "messages": [90                {91                    "role": "user",92                    "content": [93                        {94                            "type": "text",95                            "text": "Here's an image:",96                            "cache_control": {"type": "ephemeral"},97                        },98                        {99                            "type": "image",100                            "source": {101                                "type": "base64",102                                "media_type": "image/jpeg",103                                "data": "1234",104                            },105                        },106                    ],107                },108            ]109        }110 111 112    builder = StateGraph(State)113    builder.add_node("chatbot", chatbot_node)114    builder.set_entry_point("chatbot")115    builder.set_finish_point("chatbot")116    graph = builder.compile()117    graph.invoke({"messages": []})118    # {119    #     'messages': [120    #         HumanMessage(121    #             content=[122    #                 {"type": "text", "text": "Here's an image:"},123    #                 {124    #                     "type": "image_url",125    #                     "image_url": {"url": "data:image/jpeg;base64,1234"},126    #                 },127    #             ],128    #         ),129    #     ]130    # }131    ```132 133N�z?Attempting to delete a message with an ID that doesn't exist ('z')zlangchain-openaizUnrecognized format=z+. Expected one of 'langchain-openai', None.)�134isinstance�listrrr135r
�id�str�uuid�uuid4�	enumeraterr�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&rr<s}��~�N��d�D�!�!��v���e�T�"�"����%�T�*��*�A�	!��&6��!:�;�*�	��%�U�+�
�+�A�	!��&6��!:�;�+�136�
�137���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�
138�%�f�Y�&Q�R����o����M��e��
��&;��">s�#J5�2#J:�-J?�'K�>Kc���/nUH<n[U[5(aURU5 M+URU5 M> U(a[US[5(aUnO[S[
U55n[S[
U55n[U5VVs0sH!upgURcMURU_M# nnn[U5n	UHwn139U140RnUcU	RU1415 M%[U142[5(aX�;aSX�U'X�	MJMLX�;aX�X�'MY[U	5X�'U	RU1435 My U	Vs/sH	owcMUPM sn$s snnfs snf)u�**Experimental.** Batch reducer for use with `DeltaChannel`.144 145Processes all writes in one pass — dedup by ID, `RemoveMessage`146tombstoning — without calling `add_messages`.147 148This reducer is batching-invariant, as required by `DeltaChannel`:149`reducer(reducer(state, xs), ys) == reducer(state, xs + ys)`.150 151Raw dict / string / tuple inputs are coerced to typed `BaseMessage`152objects so that HTTP-driven graphs work without a separate coercion153step. This is not full `add_messages` parity — `REMOVE_ALL_MESSAGES`,154unknown-id `RemoveMessage` errors, missing-id UUID assignment, and155`BaseMessageChunk` conversion are not handled here.156 157Example::158 159    from typing import Annotated160    from langgraph.channels.delta import DeltaChannel161    from langgraph.graph.message import _messages_delta_reducer162 163    class State(TypedDict):164        messages: Annotated[list, DeltaChannel(_messages_delta_reducer)]165r�list[AnyMessage]N)r2r3�extendr?rr166rr8r4rr>)�state�writes�flat�w�167state_msgs�msgsrErB�index�resultr$�mids            r&�_messages_delta_reducerrU�sM��<�D�
���a�����K�K��N��K�K��N�	�
��E�!�H�k�2�2��168��,�.A�%�.H�I�169��"�$7��$=�>�D�&�j�1��1�D�A�Q�T�T�����a��1�170��'+�:�&6�F����f�f���;��M�M�#��
��]�
+�
+��|�%)��S�z�"��J���\�!$�5�:���V��E�J��M�M�#����/�v�!�A�v�/�/��#��"0s�E)�6E)�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^�\rSrSrSrSU4SjjrSrU=r$)ri8aA StateGraph where every node receives a list of messages as input and returns one or more messages as output.171 172MessageGraph is a subclass of StateGraph whose entire state is a single, append-only* list of messages.173Each node in a MessageGraph takes a list of messages as input and returns zero or more174messages as output. The `add_messages` function is used to merge the output messages from each node175into the existing list of messages in the graph's state.176 177Examples:178    ```pycon179    >>> from langgraph.graph.message import MessageGraph180    ...181    >>> builder = MessageGraph()182    >>> builder.add_node("chatbot", lambda state: [("assistant", "Hello!")])183    >>> builder.set_entry_point("chatbot")184    >>> builder.set_finish_point("chatbot")185    >>> builder.compile().invoke([("user", "Hi there.")])186    [HumanMessage(content="Hi there.", id='...'), AIMessage(content="Hello!", id='...')]187    ```188 189    ```pycon190    >>> from langchain_core.messages import AIMessage, HumanMessage, ToolMessage191    >>> from langgraph.graph.message import MessageGraph192    ...193    >>> builder = MessageGraph()194    >>> builder.add_node(195    ...     "chatbot",196    ...     lambda state: [197    ...         AIMessage(198    ...             content="Hello!",199    ...             tool_calls=[{"name": "search", "id": "123", "args": {"query": "X"}}],200    ...         )201    ...     ],202    ... )203    >>> builder.add_node(204    ...     "search", lambda state: [ToolMessage(content="Searching...", tool_call_id="123")]205    ... )206    >>> builder.set_entry_point("chatbot")207    >>> builder.add_edge("chatbot", "search")208    >>> builder.set_finish_point("search")209    >>> builder.compile().invoke([HumanMessage(content="Hi there. Can you search for X?")])210    {'messages': [HumanMessage(content="Hi there. Can you search for X?", id='b8b7d8f4-7f4d-4f4d-9c1d-f8b8d8f4d9c1'),211                 AIMessage(content="Hello!", id='f4d9c1d8-8d8f-4d9c-b8b7-d8f4f4d9c1d8'),212                 ToolMessage(content="Searching...", id='d8f4f4d9-c1d8-4f4d-b8b7-d8f4f4d9c1d8', tool_call_id="123")]}213    ```214c�>�[R"S[SS9 [TU][215[[[45 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�216stacklevel)	�warnings�warnr�super�__init__rr3rr)�self�	__class__s �r&r^�MessageGraph.__init__ks9����
�
�
L�0��	217�218	����4�219�#3�\�#A�B�Cr)�)r+�None)�__name__�220__module__�__qualname__�__firstlineno__r,r^�__static_attributes__�
__classcell__)r`s@r&rr8s���221,�\D�Dr)rc� �\rSrSr%S\S'Srg)ritz)Annotated[list[AnyMessage], add_messages]�messagesrbN)rdrerfrg�__annotations__rhrbr)r&rrts��7�7r)rrkc��SSKJn [U"U55$![a& Sn[R222"U5 [
U5s$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.messagesrnr�ImportErrorr[r\r3)rkrnr$s   r&r@r@xsQ��I�F�#�#=�h�#G�H�H����
�	�	�
�
�c���H�~���s��-A	�A	)�	state_keyc�l^223^�SSKJm224Jn SSKJn SSKJm U"5n[S[U/555nURc[S5e[USU5(aUSnURnO:[US[5(a"[U2254S	jUS55(aUSn[U4S226jW5S5=n(aFUSn[[!["US5R%[&55U4n	UR)X�S
S9 U(aU[*[,"X4/5 U$)z�Write a message manually to the `messages` / `messages-tuple` stream mode.227 228Will automatically write to the channel specified in the `state_key` unless `state_key` is `None`.229r)�BaseCallbackHandler�BaseCallbackManager)�230get_config)�StreamMessagesHandlerc3�$# �UHov� M g7f�Nrb)�.0�xs  r&�	<genexpr>�push_message.<locals>.<genexpr>�s���=�<��1�<�s�NzMessage ID is required�	callbacksc3�<># �UHn[UT5v� M g7frx�r2)ryrzrss  �r&r{r|�s ����7�4G�q�231�1�)�*�*�4G�s�c3�N># �UHn[UT5(dMUv� M g7frxr)ryrzrvs  �r&r{r|�s����E�H�q�232�1�.C� D���H�s�%�	%�metadata�langgraph_checkpoint_nsF)�dedupe)�langchain_core.callbacks.basersrt�langgraph.configru�langgraph.pregel._messagesrv�nextrr4r"r2�handlersr3�all�tupler233r5�splitr�_emitrr)�messagerqrtru�config�managerr��stream_handlerr��message_metarsrvs          @@r&�push_messager��s1����234,�@�
�\�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��235��	���\�5��A���t��_�%�	�';�&<�=��Nr))r%rr+z(Callable[[Messages, Messages], Messages])r r-r!r-r/z"Literal['langchain-openai'] | Noner+r-)rLrJrMzlist[list[AnyMessage]]r+rJ)rkzSequence[BaseMessage]r+zlist[BaseMessage])r�z,MessageLikeRepresentation | BaseMessageChunkrqz236str | Noner+r),�237__future__rr6r[�collections.abcrr�	functoolsr�typingrrr	r238rorrr
rrrr�typing_extensionsrr�langgraph._internal._constantsrrr�langgraph.graph.stater�langgraph.warningsr�__all__r3r-rr.rrUrrr@r�rbr)r&�<module>r�s+��"���.�������4�H�H�,�:����)�*�-F�F��&��I�&�23926�	w�240�w��w�
/�	w�241�w��w�t>0��>0�%;�>0��>0�B�B�
��5D�:�5D�	�5D�p8�I�8�
I�&'�-�
9�-��-��	-r)
codekingpro/portable-devtools · Team Ai