
    D_ik                        S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	J
r
  SSKJrJr  SSKJrJr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  SS
KJrJrJ r J!r!  SSKJ"r#  SSKJ$r%  SSKJ&r'  SSK(J)r)J*r*  SSK+J,r,  SSK-J.r.  SSK/J0r0J1r1  \Rd                  " \35      r4 " S S\SS9r5 " S S\SS9r6 " S S\5      r7 " S S\5      r8 " S S\8\5      r9S\9S\9S \94S! jr:S\7S-  S"\7S-  S \74S# jr;S\7S-  S"\7S-  S \74S$ jr<g)%zAI message.    N)Sequence)AnyLiteralcastoverload)Fieldmodel_validator)NotRequiredSelf	TypedDictoverridecontent)BaseMessageBaseMessageChunk)_extract_reasoning_from_additional_kwargsmerge_content)InvalidToolCall)ToolCallToolCallChunkdefault_tool_chunk_parserdefault_tool_parser)invalid_tool_call)	tool_call)tool_call_chunk)merge_dictsmerge_lists)parse_partial_json)_dict_int_op)LC_AUTO_PREFIXLC_ID_PREFIXc                   <    \ rS rSr% Sr\\S'    \\S'    \\S'   Srg)InputTokenDetails%   aS  Breakdown of input token counts.

Does *not* need to sum to full input token count. Does *not* need to have all keys.

Example:
    ```python
    {
        "audio": 10,
        "cache_creation": 200,
        "cache_read": 100,
    }
    ```

May also hold extra provider-specific keys.

!!! version-added "Added in `langchain-core` 0.3.9"
audiocache_creation
cache_read N__name__
__module____qualname____firstlineno____doc__int__annotations____static_attributes__r(       T/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/messages/ai.pyr#   r#   %   s(    $ J
 Or2   r#   F)totalc                   0    \ rS rSr% Sr\\S'    \\S'   Srg)OutputTokenDetailsI   a6  Breakdown of output token counts.

Does *not* need to sum to full output token count. Does *not* need to have all keys.

Example:
    ```python
    {
        "audio": 10,
        "reasoning": 200,
    }
    ```

May also hold extra provider-specific keys.

!!! version-added "Added in `langchain-core` 0.3.9"

r%   	reasoningr(   Nr)   r(   r2   r3   r6   r6   I   s    $ JNr2   r6   c                   `    \ rS rSr% Sr\\S'    \\S'    \\S'    \\   \S'    \\	   \S'   Sr
g	)
UsageMetadatag   aS  Usage metadata for a message, such as token counts.

This is a standard representation of token usage that is consistent across models.

Example:
    ```python
    {
        "input_tokens": 350,
        "output_tokens": 240,
        "total_tokens": 590,
        "input_token_details": {
            "audio": 10,
            "cache_creation": 200,
            "cache_read": 100,
        },
        "output_token_details": {
            "audio": 10,
            "reasoning": 200,
        },
    }
    ```

!!! warning "Behavior changed in `langchain-core` 0.3.9"

    Added `input_token_details` and `output_token_details`.

!!! note "LangSmith SDK"

    The LangSmith SDK also has a `UsageMetadata` class. While the two share fields,
    LangSmith's `UsageMetadata` has additional fields to capture cost information
    used by the LangSmith platform.
input_tokensoutput_tokenstotal_tokensinput_token_detailsoutput_token_detailsr(   N)r*   r+   r,   r-   r.   r/   r0   r
   r#   r6   r1   r(   r2   r3   r:   r:   g   sI    B JPE$%677
 &&899r2   r:   c            
       $  ^  \ rS rSr% Sr\" \S9r\\   \	S'    \" \S9r
\\   \	S'    Sr\S-  \	S'    Sr\S   \	S	'    \S
\\\\-     -  S\SS4S j5       r\  SS
\\\\-     -  S-  S\\R,                     S-  S\SS4S jj5       r  SS
\\\\-     -  S-  S\\R,                     S-  S\SS4U 4S jjjr\S\4S j5       r\S\\R,                     4U 4S jj5       r\" SS9\S\S\4S j5       5       r\SS\S\4U 4S jjj5       rSr U =r!$ )	AIMessage   a(  Message from an AI.

An `AIMessage` is returned from a chat model as a response to a prompt.

This message represents the output of the model and consists of both
the raw output as returned by the model and standardized fields
(e.g., tool calls, usage metadata) added by the LangChain framework.
default_factory
tool_callsinvalid_tool_callsNusage_metadataaityper   kwargsreturnc                     g Nr(   )selfr   rK   s      r3   __init__AIMessage.__init__   s    
 r2   content_blocksc                     g rN   r(   )rO   r   rR   rK   s       r3   rP   rQ      s     r2   c                    > UbV  U Vs/ s H  oDR                  S5      S:X  d  M  UPM     nnU(       a
  SU;  a  XSS'   [        TU ]  " SS[        SU5      0UD6  g[        TU ]  " SSU0UD6  gs  snf )zInitialize an `AIMessage`.

Specify `content` as positional arg or `content_blocks` for typing.

Args:
    content: The content of the message.
    content_blocks: Typed standard content.
    **kwargs: Additional arguments to pass to the parent class.
NrJ   r   rF   r   zstr | list[str | dict]r(   )getsuperrP   r   )rO   r   rR   rK   blockcontent_tool_calls	__class__s         r3   rP   rQ      s     % $2"#1%YYv5F+5U>  " "l&&@'9|$G 5~F
 G7W77"s
   A.A.c                 4    U R                   U R                  S.$ )zuAttributes to be serialized.

Includes all attributes, even if they are derived from other initialization
arguments.
rF   rG   r[   rO   s    r3   lc_attributesAIMessage.lc_attributes   s     //"&"9"9
 	
r2   c                 b  > U R                   R                  S5      S:X  a  [        SU R                  5      $ U R                   R                  S5      nU(       a!  SSKJn  U" U5      nU(       a   US   " U 5      $ [        TU ]   nU R                  (       a  U R                   Vs1 s HB  n[        U[        5      (       d  M  UR                  S5      S	:X  d  M1  UR                  S
5      iMD     nnU R                   H^  nUR                  S
5      =n(       d  M  X;  d  M$  S	UUS   US   S.n	SU;   a  US   U	S'   SU;   a  US   U	S'   UR                  U	5        M`     [        S U 5       5      n
U
(       d$  [        U 5      =n(       a  UR                  SU5        U$ ! [         a     GN.f = fs  snf )zReturn standard, typed `ContentBlock` dicts from the message.

If the message has a known model provider, use the provider-specific translator
first before falling back to best-effort parsing. For details, see the property
on `BaseMessage`.
output_versionv1list[types.ContentBlock]model_providerr   get_translatortranslate_contentrJ   r   idnameargsrJ   rg   rh   ri   indexextrasc              3   H   #    U  H  oR                  S 5      S:H  v   M     g7frJ   r8   NrU   .0rW   s     r3   	<genexpr>+AIMessage.content_blocks.<locals>.<genexpr>$       Q&IIf-<&    ")response_metadatarU   r   r   )langchain_core.messages.block_translatorsre   NotImplementedErrorrV   rR   rF   
isinstancedictappendanyr   insert)rO   rc   re   
translatorblocksrW   content_tool_call_idsr   id_tool_call_blockhas_reasoningreasoning_blockrY   s               r3   rR   AIMessage.content_blocks   s    !!%%&674?2DLLAA//334DE (7J%&9:4@@
 '?? "\\%)EeT*  /4yy/@K/O  		$) " %
 "__	$==..C.C4T +! )& 1 )& 1	7O )+3<W3E09,4=h4G1MM/2 -" Q&QQHNNONMM!_-I + %s$   /
F #F, F,F,
F)(F)beforemodevaluesc                   ^ [        U4S jS 5       5      (       + nU(       ae  TR                  S0 5      R                  S5      =n(       a=   [        U [        5      (       a  [	        U5      TS'   O[        U5      u  pEUTS'   UTS'    TR                  S5      =n(       aN  U VVV	s/ s H9  n[        S0 UR                  5        VV	s0 s H  u  pUS
;  d  M  X_M     sn	nD6PM;     sn	nnTS'   TR                  S5      =n
(       aN  U
 VVV	s/ s H9  n[        S0 UR                  5        VV	s0 s H  u  pUS:w  d  M  X_M     sn	nD6PM;     sn	nnTS'   TR                  S5      =n(       aN  U VVV	s/ s H9  n[        S0 UR                  5        VV	s0 s H  u  pUS:w  d  M  X_M     sn	nD6PM;     sn	nnTS'   T$ ! [         a    [        R                  SSS	9   GNUf = fs  sn	nf s  sn	nnf s  sn	nf s  sn	nnf s  sn	nf s  sn	nnf )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frN   ro   )rq   kr   s     r3   rr   9AIMessage._backwards_compat_tool_calls.<locals>.<genexpr>0  s"      *
M JJqMMMs   !)rF   rG   tool_call_chunksadditional_kwargsrF   r   rG   zFailed to parse tool callsT)exc_info>   rJ   rl   rJ   r(   )r|   rU   
issubclassAIMessageChunkr   r   	Exceptionloggerdebugcreate_tool_callitemscreate_invalid_tool_callcreate_tool_call_chunk)clsr   check_additional_kwargsraw_tool_callsparsed_tool_callsparsed_invalid_tool_callsrF   tcr   vrG   r   s    `          r3   _backwards_compat_tool_calls&AIMessage._backwards_compat_tool_calls-  s"    '* *
M*
 '
 #
 #$jj)<bAEElSSNSJc>221J&2F-. DW&D@% ,=F<(3LF/0
  L11:1
 %	$ %B ! (*
R
a?Q6Qtqt
R %	$F<  "(,@!AAA -,,B )XRXXZ+WZTQ1PV;DADZ+WX,,F'(
  &zz*<=== +**B 'V288:)U:41f$!$:)UV**F%&
 /  J9DIJ S$ ,X, *V*sr   #F< 0F< & G'G!G!
G' G4,G.<G.
G42 HG;"G;(
H<GG!G'.G4;Hhtmlc                   > [         TU ]  US9n/ nS[        [        -  S[        [
           4S jnU R                  (       a;  UR                  S5        U R                   H  nUR                  U" U5      5        M     U R                  (       a;  UR                  S5        U R                   H  nUR                  U" U5      5        M     UR                  5       S-   SR                  U5      -   R                  5       $ )zReturn a pretty representation of the message for display.

Args:
    html: Whether to return an HTML-formatted string.

Returns:
    A pretty representation of the message.

)r   r   rL   c                    SU R                  SS5       SU R                  S5       S3SU R                  S5       3/nU R                  S5      (       a#  UR                  S	U R                  S5       35        UR                  S
5        U R                  S5      n[        U[        5      (       a  UR                  SU 35        U$ [        U[        5      (       a0  UR                  5        H  u  p4UR                  SU SU 35        M     U$ )Nz  rh   Toolz (rg   )z
 Call ID: errorz	  Error: z  Args:ri   z    z: )rU   r{   ry   strrz   r   )r   linesri   argvalues        r3   _format_tool_args0AIMessage.pretty_repr.<locals>._format_tool_argsi  s    RVVFF+,Brvvd|nA>RVVD\N+E vvgy(9:;LL#66&>D$$$tD6]+ L D$''"&**,JCLL4uBug!67 #/Lr2   zTool Calls:zInvalid Tool Calls:
)rV   pretty_reprr   r   listr   rF   r{   extendrG   stripjoin)rO   r   baser   r   r   itcrY   s          r3   r   AIMessage.pretty_repr[  s     w""-	(_"< 	c 	  ??LL'oo.r23 &""LL./...s34 /

t#dii&66==??r2   r(   )NN)F)"r*   r+   r,   r-   r.   r   r   rF   r   r0   rG   r   rH   r:   rJ   r   r   r   rz   r   rP   typesContentBlockpropertyr]   rR   r	   classmethodr   r   boolr   r1   __classcell__rY   s   @r3   rB   rB      s    "'t!<JX<=05d0K_-KQ+/NMD(/
 D'$-=tC$J''  
	   26:>tC$J''$. U//047 	
 
  26:>8tC$J''$.8 U//0478 	8
 
8 8< 	
t 	
 	
 8U%7%7 8 8 8v (#*$ *3 *  $*X %@ %@ %@ %@r2   rB   c                   v  ^  \ rS rSr% SrS r\S    \S'    \" \	S9r
\	\   \S'    Sr\S   S-  \S'    \S	\4S
 j5       r\S	\	\R"                     4U 4S jj5       r\" SS9S	\4S j5       r\" SS9S	\4S j5       r\SS j5       r\S\S    S	S 4S j5       r\S\S	\4S j5       r\S\S	\4U 4S jj5       rSrU =r$ )r   i  z2Message chunk from an AI (yielded when streaming).rJ   rD   r   Nlastchunk_positionrL   c                 4    U R                   U R                  S.$ )zUAttributes to be serialized, even if they are derived from other initialization args.r[   r[   r\   s    r3   r]   AIMessageChunk.lc_attributes  s     //"&"9"9
 	
r2   c                 0  > U R                   R                  S5      S:X  a  [        SU R                  5      $ U R                   R                  S5      nU(       a!  SSKJn  U" U5      nU(       a   US   " U 5      $ [        TU ]   nU R                  (       a  U R                  (       d  U R                  S:w  a  U Vs/ s H  nUS	   S
;  d  M  UPM     nnU R                   H`  nSUR                  S5      UR                  S5      UR                  S5      S.nUR                  S5      =nb  XS'   UR                  U5        Mb     [        S U 5       5      n	U	(       d$  [        U 5      =n
(       a  UR                  SU
5        U$ ! [         a     GNf = fs  snf )z=Return standard, typed `ContentBlock` dicts from the message.r`   ra   rb   rc   r   rd   translate_content_chunkr   rJ   >   r   r   r   rg   rh   ri   rj   rk   c              3   H   #    U  H  oR                  S 5      S:H  v   M     g7frn   ro   rp   s     r3   rr   0AIMessageChunk.content_blocks.<locals>.<genexpr>  rt   ru   )rv   rU   r   r   rw   re   rx   rV   rR   r   r   r{   r|   r   r}   )rO   rc   re   r~   r   rW   r   r   idxr   r   rY   s              r3   rR   AIMessageChunk.content_blocks  s    !!%%&674?2DLLAA//334DE (7J%&?@FF
 ' !!LL##v- $#E=(JJ #  
 $(#8#8-)--d3+//7+//7	+ +..w77CD"%wKb! $9 Q&QQHNNONMM!_-I + s   /
F :FF
FFafterr   c                   ^ U R                   (       d  U R                  (       aI  U R                   Vs/ s H,  n[        US   [        R                  " US   5      US   SS9PM.     snU l         U R
                  (       aQ  U R                   nUR                  U R
                   Vs/ s H  n[        US   US   US   SS9PM     sn5        X l         U $ / n/ mS[        SS4U4S jjnU R                    Hf  n US   (       a  [        US   5      O0 n[        U[        5      (       a+  UR                  [        US   =(       d    S	UUS   S
95        M^  U" U5        Mh     X0l        TU l        U R                  S:X  GaN  U R                   (       Ga<  U R                  R!                  S5      S:X  Ga  [        U R"                  [$        5      (       a  U R                   Vs0 s HA  nSU;   d  M  ['        SUR!                  S5      5      SUS   US   UR!                  S5      S._MC     nn[)        U R"                  5       H  u  p[        U	[        5      (       d  M  U	R!                  S5      S:X  d  M3  U	R!                  S5      =n
(       d  MM  X;   d  MT  ['        SXz   5      U R"                  U'   SU	;   d  Mw  U	S   U R"                  U   S'   M     U $ s  snf s  snf ! [         a    U" U5         GM  f = fs  snf )zInitialize tool calls from tool call chunks.

Returns:
    The values with tool calls initialized.

Raises:
    ValueError: If the tool call chunks are malformed.
rh   ri   rg   N)rh   ri   rg   rk   chunkrL   c           	      N   > TR                  [        U S   U S   U S   S S95        g )Nrh   ri   rg   )rh   ri   rg   r   )r{   r   )r   rG   s    r3   add_chunk_to_invalid_tool_callsGAIMessageChunk.init_tool_calls.<locals>.add_chunk_to_invalid_tool_calls  s1    %%(vvT{	r2    )rh   ri   rg   r   r`   ra   r   r   )rJ   rh   ri   rg   rJ   r   zdict[str, Any]rl   )r   rF   r   jsondumpsrG   r   r   r   ry   rz   r{   r   r   r   rv   rU   r   r   r   	enumerate)rO   r   r   rF   r   r   args_id_to_tcr   rW   call_idrG   s              @r3   init_tool_callsAIMessageChunk.init_tool_calls  s    $$ #oo) . +Z!ZZ6
3d8"	 .)% &&#'#8#8  ''
 #'"9"9	 #:B /!#F"V*DQU #:	 )9%K
	= 	T 	 **E7=B6]*5=9PReT**%%(!&v!4"!&$T{ 4E: + %"4 6)%%%&&**+;<D4<<.. //	3 *B2:UBFF4L)'vJvJ&&,	,  *  	3 (5
ud++		&)->>$)IIdO33+(,-=x?P(QDLL%5(6;HoS)(3 6 c)H  7/667	3s0   3K	#K5AKK
K-&:K-K*)K*c                 v   U R                   S:X  Ga  U R                  R                  S5      S:X  a  [        U R                  [
        5      (       a  [        U R                  5       H  u  p[        U[        5      (       d  M  UR                  S5      S;   d  M3  UR                  S5      =n(       d  MM  [        U[        5      (       d  Md   [        R                  " U5      n[        U[        5      (       a%  SU R                  U   S'   X@R                  U   S'   M  M     U $ ! [        R                   a     M  f = f)zmParse `server_tool_call_chunks` from [`ServerToolCallChunk`][langchain.messages.ServerToolCallChunk] objects.r   r`   ra   rJ   >   server_tool_callserver_tool_call_chunkri   r   )r   rv   rU   ry   r   r   r   rz   r   r   loadsJSONDecodeError)rO   r   rW   args_strri   s        r3   init_server_tool_calls%AIMessageChunk.init_server_tool_calls4  s     6)&&**+;<D4<<..'5
ud++		&)EF%*YYv%666"8S11#zz(3%dD118JDLL-f58<LL-f5 2 6   // s   
AD  D87D8otherc                     g rN   r(   rO   r   s     r3   __add__AIMessageChunk.__add__M  s    DGr2   c                     g rN   r(   r   s     r3   r   r   P  s    NQr2   c                     g rN   r(   r   s     r3   r   r   S  s    7:r2   c                    > [        U[        5      (       a  [        X5      $ [        U[        [        45      (       a#  [        S U 5       5      (       a  [        U /UQ76 $ [        TU ]  U5      $ )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frN   )ry   r   rq   os     r3   rr   )AIMessageChunk.__add__.<locals>.<genexpr>Z  s      4
38aJq.))5s   )ry   r   add_ai_message_chunksr   tupleallrV   r   )rO   r   rY   s     r3   r   r   V  sf    e^,,(55edE]++ 4
384
 1
 1
 )666wu%%r2   )rG   r   rF   )r   r   rL   r   )r*   r+   r,   r-   r.   rJ   r   r0   r   r   r   r   r   r   rz   r]   r   r   rR   r	   r   r   r   r   r   r   r   r   r   r1   r   r   s   @r3   r   r     s:   <
 '7D'"
#6=,1$,Gd=)GD-1NGFOd*1 
t 
 
 3U%7%7 8 3 3j '"\ \ #\| '"  #0 G GQX&67Q<LQ Q:S:%5: :&S &%5 & &r2   r   leftothersrL   c                 J   [        U R                  /S U 5       Q76 n[        U R                  /S U 5       Q76 n[        U R                  /S U 5       Q76 n[        U R                  /S U 5       Q76 =n(       aY  U Vs/ s HK  n[        UR                  S5      UR                  S5      UR                  S5      UR                  S5      S	9PMM     nnO/ nU R                  (       d  [        S
 U 5       5      (       a+  U R                  nU H  n	[        XR                  5      nM     OSnSn
U R                  /U Vs/ s H  oR                  PM     sn-   nU HF  nU(       d  M  UR                  [        5      (       a  M(  UR                  [        5      (       a  MD  Un
  OF   U H*  nU(       d  M  UR                  [        5      (       d  M(  Un
  O   U H  nU(       d  M  Un
  O   [        S U /UQ 5       5      (       a  SOSnU R!                  UUUUUU
US9$ s  snf s  snf )zAdd multiple `AIMessageChunk`s together.

Args:
    left: The first `AIMessageChunk`.
    *others: Other `AIMessageChunk`s to add.

Returns:
    The resulting `AIMessageChunk`.

c              3   8   #    U  H  oR                   v   M     g 7frN   r   r   s     r3   rr   (add_ai_message_chunks.<locals>.<genexpr>n  s     +Fv!IIv   c              3   8   #    U  H  oR                   v   M     g 7frN   )r   r   s     r3   rr   r   p       !Fv!"5"5vr   c              3   8   #    U  H  oR                   v   M     g 7frN   )rv   r   s     r3   rr   r   s  r   r   c              3   8   #    U  H  oR                   v   M     g 7frN   )r   r   s     r3   rr   r   x  s      DV!3!3Vr   rh   ri   rk   rg   )rh   ri   rk   rg   c              3   <   #    U  H  oR                   S Lv   M     g 7frN   )rH   r   s     r3   rr   r     s     !O1"2"2$">s   Nc              3   >   #    U  H  oR                   S :H  v   M     g7f)r   N)r   )rq   xs     r3   rr   r     s     J/Q&&&0/s   r   )r   r   r   rv   rH   rg   r   )r   r   r   r   rv   r   r   r   rU   rH   r|   	add_usagerg   
startswithr!   r    rY   )r   r   r   r   rv   r   rtcr   rH   r   chunk_idr   
candidatesr   r   s                  r3   r   r   a  s-    DLLG+Fv+FGG#!Fv!F $!Fv!F
 % DV D ~  &
 & #WWV_WWV_ggg&774=	 & 	 
  c!O!OOO/3/B/BE&~7K7KLN  H''F3FqddF33JCNN<00NN>22H  Css~~l33  "3"H " J4/&/JJJPT  >>+)+%%   a
* 4s    AH>H rightc                     U (       d  U(       d  [        SSSS9$ U (       a  U(       d  [        SU =(       d    U5      $ [        S0 [        S[        [        SU 5      [        SU5      [        R                  5      5      D6$ )a  Recursively add two UsageMetadata objects.

Example:
    ```python
    from langchain_core.messages.ai import add_usage

    left = UsageMetadata(
        input_tokens=5,
        output_tokens=0,
        total_tokens=5,
        input_token_details=InputTokenDetails(cache_read=3),
    )
    right = UsageMetadata(
        input_tokens=0,
        output_tokens=10,
        total_tokens=10,
        output_token_details=OutputTokenDetails(reasoning=4),
    )

    add_usage(left, right)
    ```

    results in

    ```python
    UsageMetadata(
        input_tokens=5,
        output_tokens=10,
        total_tokens=15,
        input_token_details=InputTokenDetails(cache_read=3),
        output_token_details=OutputTokenDetails(reasoning=4),
    )
    ```
Args:
    left: The first `UsageMetadata` object.
    right: The second `UsageMetadata` object.

Returns:
    The sum of the two `UsageMetadata` objects.

r   r<   r=   r>   r:   rz   r(   )r:   r   r   operatoraddr   r  s     r3   r   r     so    T E!11MMUOT]U33 	
VT"VU#
	 	r2   c                     U (       d  U(       d  [        SSSS9$ U (       a  U(       d  [        SU =(       d    U5      $ [        S0 [        S[        [        SU 5      [        SU5      S 5      5      D6$ )a  Recursively subtract two `UsageMetadata` objects.

Token counts cannot be negative so the actual operation is `max(left - right, 0)`.

Example:
    ```python
    from langchain_core.messages.ai import subtract_usage

    left = UsageMetadata(
        input_tokens=5,
        output_tokens=10,
        total_tokens=15,
        input_token_details=InputTokenDetails(cache_read=4),
    )
    right = UsageMetadata(
        input_tokens=3,
        output_tokens=8,
        total_tokens=11,
        output_token_details=OutputTokenDetails(reasoning=4),
    )

    subtract_usage(left, right)
    ```

    results in

    ```python
    UsageMetadata(
        input_tokens=2,
        output_tokens=2,
        total_tokens=4,
        input_token_details=InputTokenDetails(cache_read=4),
        output_token_details=OutputTokenDetails(reasoning=0),
    )
    ```
Args:
    left: The first `UsageMetadata` object.
    right: The second `UsageMetadata` object.

Returns:
    The resulting `UsageMetadata` after subtraction.

r   r  r:   rz   c                     [        X-
  S5      $ )Nr   )max)leris     r3   <lambda> subtract_usage.<locals>.<lambda>)  s    BGQr2   r(   )r:   r   r   r  s     r3   subtract_usager    sk    \ E!11MMUOT]U33 	
VT"VU#/
	 	r2   )=r.   r   loggingr  collections.abcr   typingr   r   r   r   pydanticr   r	   typing_extensionsr
   r   r   r   langchain_core.messagesr   r   langchain_core.messages.baser   r   r   r   langchain_core.messages.contentr   langchain_core.messages.toolr   r   r   r   r   r   r   r   r   r   langchain_core.utils._merger   r   langchain_core.utils.jsonr   langchain_core.utils.usager   langchain_core.utils.utilsr    r!   	getLoggerr*   r   r#   r6   r:   rB   r   r   r   r  r(   r2   r3   <module>r     s"       $ / / + D D 4  <  W F R @ 8 3 C			8	$!	 !H% <5I 5pb@ b@JZ&Y 0 Z&zQ
Q#1QQh8MD( 81E 8- 8v<
$
<'4t';<<r2   