
    f3fik                        d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZ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 dd
lmZm Z m!Z!m"Z" ddlm#Z$ ddlm%Z& ddlm'Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2  ejf                  e4      Z5 G d ded      Z6 G d ded      Z7 G d de      Z8 G d de      Z9 G d de9e      Z:de:de:d e:fd!Z;de8dz  d"e8dz  d e8fd#Z<de8dz  d"e8dz  d e8fd$Z=y)%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                   4    e Zd ZU dZeed<   	 eed<   	 eed<   y)InputTokenDetailsa  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_readN__name__
__module____qualname____doc__int__annotations__     X/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_core/messages/ai.pyr#   r#   &   s(    $ J
 Or/   r#   F)totalc                   (    e Zd ZU dZeed<   	 eed<   y)OutputTokenDetailsab  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$   	reasoningNr'   r.   r/   r0   r3   r3   J   s    $ JNr/   r3   c                   X    e Zd ZU dZeed<   	 eed<   	 eed<   	 ee   ed<   	 ee   ed<   y)UsageMetadataa  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_detailsN)	r(   r)   r*   r+   r,   r-   r
   r#   r3   r.   r/   r0   r6   r6   h   sI    B JPE$%677
 &&899r/   r6   c            
           e Zd ZU dZ ee      Zee   ed<   	  ee      Z	ee
   ed<   	 dZedz  ed<   	 dZed   ed<   	 ed	eeeez     z  d
eddfd       Ze	 	 dd	eeeez     z  dz  deej*                     dz  d
eddfd       Z	 	 dd	eeeez     z  dz  deej*                     dz  d
eddf fdZedefd       Zedeej*                     f fd       Z ed      ededefd              Zeddedef fd       Z xZS )	AIMessagea<  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                      y Nr.   )selfr   rE   s      r0   __init__zAIMessage.__init__   s    
 r/   content_blocksc                      y rH   r.   )rI   r   rK   rE   s       r0   rJ   zAIMessage.__init__   s     r/   c                     |K|D cg c]  }|j                  d      dk(  s| }}|r	d|vr||d<   t        |   ddt        d|      i| yt        |   dd|i| yc c}w )a,  Initialize 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.
        NrD   r   r@   r   zstr | list[str | dict]r.   )getsuperrJ   r   )rI   r   rK   rE   blockcontent_tool_calls	__class__s         r0   rJ   zAIMessage.__init__   s     % $2"UYYv5F+5U" " "l&&@'9|$G 5~F
 G7W77"s
   A!A!c                 4    | j                   | j                  dS )zAttributes to be serialized.

        Includes all attributes, even if they are derived from other initialization
        arguments.
        r@   rA   rT   rI   s    r0   lc_attributeszAIMessage.lc_attributes   s     //"&"9"9
 	
r/   c                    | j                   j                  d      dk(  rt        d| j                        S | j                   j                  d      }|rddlm}  ||      }|r	  |d   |       S t        |    }| j                  r| j                  D ch c]7  }t        |t              r%|j                  d      d	k(  r|j                  d
      9 }}| j                  D ]Q  }|j                  d
      x}s||vsd	||d   |d   d}	d|v r|d   |	d<   d|v r|d   |	d<   |j                  |	       S t        d |D              }
|
st        |       x}r|j                  d|       |S # t        $ r Y w xY wc c}w )a  Return 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_contentrD   r   idnameargsrD   r_   r`   ra   indexextrasc              3   D   K   | ]  }|j                  d       dk(    ywrD   r4   NrN   .0rP   s     r0   	<genexpr>z+AIMessage.content_blocks.<locals>.<genexpr>%       QEIIf-<Q    )response_metadatarN   r   r   )langchain_core.messages.block_translatorsr]   NotImplementedErrorrO   rK   r@   
isinstancedictappendanyr   insert)rI   r[   r]   
translatorblocksrP   content_tool_call_idsr   id_tool_call_blockhas_reasoningreasoning_blockrR   s               r0   rK   zAIMessage.content_blocks   s    !!%%&674?2DLLAA//334DE (7J::&9:4@@
 '?? "\\%eT*uyy/@K/O 		$%! %
 "__ 3	$==..C.C?T4T +! )& 1 )& 1	7O )+3<W3E09,4=h4G1MM/23" Q&QQHNNONMM!_-I + %s   $
E& <E6&	E32E3beforemodevaluesc                    t        fddD               }|r[j                  di       j                  d      x}r8	 t        | t              rt	        |      d<   nt        |      \  }}|d<   |d<   j                  d      x}rG|D 	cg c]4  }t        di |j                         D 	ci c]  \  }}	|d
vs||	 c}	}6 c}	}}d<   j                  d      x}
rH|
D 	cg c]5  }t        di |j                         D 	ci c]  \  }}	|dk7  s||	 c}	}7 c}	}}d<   j                  d      x}rH|D 	cg c]5  }t        di |j                         D 	ci c]  \  }}	|dk7  s||	 c}	}7 c}	}}d<   S # t        $ r t        j                  dd	       Y 5w xY wc c}	}w c c}	}}w c c}	}w c c}	}}w c c}	}w c c}	}}w )Nc              3   @   K   | ]  }j                  |        y wrH   rg   )ri   kr   s     r0   rj   z9AIMessage._backwards_compat_tool_calls.<locals>.<genexpr>1  s!      *
 JJqM*
s   )r@   rA   tool_call_chunksadditional_kwargsr@   r   rA   zFailed to parse tool callsT)exc_info>   rD   rd   rD   r.   )rs   rN   
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_callsr@   tcr   vrA   r   s    `          r0   _backwards_compat_tool_callsz&AIMessage._backwards_compat_tool_calls.  s    '* *
M*
 '
 #
 #$jj)<bAEElSSNSJc>21J&2F-. DW&D@%'@ ,=F<(3LF/0
  L11:1
 %	$ $  ! (*
R1a?Q6Qq!tR$F<  "(,@!AAA -, , )XRXXZ+WTQ1PV;AqD+WX,F'(
  &zz*<=== +* * 'V288:)U41af!Q$)UV*F%&
 /  J9DIJ S$ ,X, *V*sk   7F F3,F-9F->F3'G F:F:G G!G/G4G F*)F*-F3:G Ghtmlc                    t         |   |      }g }dt        t        z  dt        t
           fd}| j                  r9|j                  d       | j                  D ]  }|j                   ||              | j                  r9|j                  d       | j                  D ]  }|j                   ||              |j                         dz   dj                  |      z   j                         S )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   rF   c                    d| j                  dd       d| j                  d       dd| j                  d       g}| j                  d      r#|j                  d	| j                  d              |j                  d
       | j                  d      }t        |t              r|j                  d|        |S t        |t              r/|j                         D ]  \  }}|j                  d| d|         |S )Nz  r`   Toolz (r_   )z
 Call ID: errorz	  Error: z  Args:ra   z    z: )rN   rr   rp   strrq   r   )r   linesra   argvalues        r0   _format_tool_argsz0AIMessage.pretty_repr.<locals>._format_tool_argsj  s    RVVFF+,Brvvd|nA>RVVD\N+E vvgy(9:;LL#66&>D$$tD6]+ L D$'"&**, 8JCLL4uBug!678Lr/   zTool Calls:zInvalid Tool Calls:
)rO   pretty_reprr   r   listr   r@   rr   extendrA   stripjoin)rI   r   baser   r   r   itcrR   s          r0   r   zAIMessage.pretty_repr\  s     w""-	(_"< 	c 	  ??LL'oo 4.r234""LL./.. 5.s345

t#dii&66==??r/   )NN)F) r(   r)   r*   r+   r   r   r@   r   r-   rA   r   rB   r6   rD   r   r   r   rq   r   rJ   typesContentBlockpropertyrV   rK   r	   classmethodr   r   boolr   __classcell__rR   s   @r0   r=   r=      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< 	
t 	
 	
 8U%7%7 8 8 8v (#*$ *3 *  $*X %@ %@ %@ %@r/   r=   c                   l    e Zd ZU dZd Zed    ed<   	  ee      Z	ee
   ed<   	 dZed   dz  ed<   	 edefd	       Zedeej                      f fd
       Z ed      defd       Z ed      defd       Zedd       Zeded    dd fd       Zededefd       Zededef fd       Z xZS )r   z2Message chunk from an AI (yielded when streaming).rD   r>   r   Nlastchunk_positionrF   c                 4    | j                   | j                  dS )zUAttributes to be serialized, even if they are derived from other initialization args.rT   rT   rU   s    r0   rV   zAIMessageChunk.lc_attributes  s     //"&"9"9
 	
r/   c                    | j                   j                  d      dk(  rt        d| j                        S | j                   j                  d      }|rddlm}  ||      }|r	  |d   |       S t        |    }| j                  r| j                  s| j                  dk7  r|D cg c]  }|d	   d
vr| }}| j                  D ]_  }d|j                  d      |j                  d      |j                  d      d}|j                  d      x}||d<   |j                  |       a t        d |D              }	|	st        |       x}
r|j                  d|
       |S # t        $ r Y w xY wc c}w )z=Return standard, typed `ContentBlock` dicts from the message.rX   rY   rZ   r[   r   r\   translate_content_chunkr   rD   >   r   r   r   r_   r`   ra   rb   rc   c              3   D   K   | ]  }|j                  d       dk(    ywrf   rg   rh   s     r0   rj   z0AIMessageChunk.content_blocks.<locals>.<genexpr>  rk   rl   )rm   rN   r   r   rn   r]   ro   rO   rK   r   r   rr   rs   r   rt   )rI   r[   r]   ru   rv   rP   r   r   idxrz   r{   rR   s              r0   rK   zAIMessageChunk.content_blocks  s    !!%%&674?2DLLAA//334DE (7J@:&?@FF
 ' !!LL##v- $=(JJ F 
 $(#8#8 	"-)--d3+//7+//7	+ +..w77CD"%BwKb!	" Q&QQHNNONMM!_-I + s   $
E $E(	E%$E%afterr}   c                 T   | j                   s| j                  rH| j                  D cg c]-  }t        |d   t        j                  |d         |d   d      / c}| _         | j
                  rR| j                   }|j                  | j
                  D cg c]  }t        |d   |d   |d   d       c}       || _         | S g }g dt        ddffd}| j                   D ]X  }	 |d   rt        |d         ni }t        |t              r(|j                  t        |d   xs d	||d   
             n ||       Z || _        | _        | j                  dk(  r(| j                   r| j                  j!                  d      dk(  rt        | j"                  t$              r| j                  D ci c]<  }d|v r6t'        d|j!                  d            d|d   |d   |j!                  d      d> }}t)        | j"                        D ]z  \  }}	t        |	t              s|	j!                  d      dk(  s,|	j!                  d      x}
s@|
|v sEt'        d||
         | j"                  |<   d|	v sf|	d   | j"                  |   d<   | | S c c}w c c}w # t        $ r  ||       Y w xY wc c}w )zInitialize tool calls from tool call chunks.

        Returns:
            The values with tool calls initialized.

        Raises:
            ValueError: If the tool call chunks are malformed.
        r`   ra   r_   N)r`   ra   r_   rc   chunkrF   c                 T    j                  t        | d   | d   | d   d              y )Nr`   ra   r_   )r`   ra   r_   r   )rr   r   )r   rA   s    r0   add_chunk_to_invalid_tool_callszGAIMessageChunk.init_tool_calls.<locals>.add_chunk_to_invalid_tool_calls  s1    %%(vvT{	r/    )r`   ra   r_   r   rX   rY   r   r   )rD   r`   ra   r_   rD   r   zdict[str, Any]rd   )r   r@   r   jsondumpsrA   r   r   r   rp   rq   rr   r   r   r   rm   rN   r   r   r   	enumerate)rI   r   r   r@   r   r   args_id_to_tcr   rP   call_idrA   s              @r0   init_tool_callszAIMessageChunk.init_tool_calls  s    $$ #oo)  +Z!ZZ6
3d8"	)% &&#'#8#8  ''
 #'"9"9	  /!#F"V*DQU )9%K
	= 	T 	 ** 	7E7=B6]*5=9PReT*%%(!&v!4"!&$T{ 4E:	7 %"4 6)%%&&**+;<D4<<. //	3 2: UBFF4L)'vJvJ&&,	, 	3H 	3 (5 
F
Uud+		&)->>$)IIdO338+(,-=x?P(QDLL%5(6;HoS)(3
F c)H  7/67	3s%   2JJ$AJ,AJ%J"!J"c                 (   | j                   dk(  r| j                  j                  d      dk(  rt        | j                  t
              rt        | j                        D ]  \  }}t        |t              s|j                  d      dv s+|j                  d      x}s?t        |t              sP	 t        j                  |      }t        |t              r$d| j                  |   d<   || j                  |   d<    | S # t        j                  $ r Y w xY w)zmParse `server_tool_call_chunks` from [`ServerToolCallChunk`][langchain.messages.ServerToolCallChunk] objects.r   rX   rY   rD   >   server_tool_callserver_tool_call_chunkra   r   )r   rm   rN   rp   r   r   r   rq   r   r   loadsJSONDecodeError)rI   r   rP   args_strra   s        r0   init_server_tool_callsz%AIMessageChunk.init_server_tool_calls5  s     6)&&**+;<D4<<.'5 
Uud+		&)EF%*YYv%666"8S1#zz(3%dD18JDLL-f58<DLL-f5   // s   .A	C;;DDotherc                      y rH   r.   rI   r   s     r0   __add__zAIMessageChunk.__add__N  s    DGr/   c                      y rH   r.   r   s     r0   r   zAIMessageChunk.__add__Q  s    NQr/   c                      y rH   r.   r   s     r0   r   zAIMessageChunk.__add__T  s    7:r/   c                     t        |t              rt        | |      S t        |t        t        f      rt        d |D              rt        | g| S t        |   |      S )Nc              3   <   K   | ]  }t        |t                y wrH   )rp   r   ri   os     r0   rj   z)AIMessageChunk.__add__.<locals>.<genexpr>[  s      4
./Jq.)4
s   )rp   r   add_ai_message_chunksr   tupleallrO   r   )rI   r   rR   s     r0   r   zAIMessageChunk.__add__W  s]    e^,(u55edE]+ 4
384
 1
 )666wu%%r/   )r   r   rF   r   )r(   r)   r*   r+   rD   r   r-   r   r   r   r   r   r   rq   rV   r   r   rK   r	   r   r   r   r   r   r   r   r   r   r   r   s   @r0   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 & &r/   r   leftothersrF   c                    t        | j                  gd |D         }t        | j                  gd |D         }t        | j                  gd |D         }t        | j                  gd |D         x}rY|D cg c]M  }t        |j                  d      |j                  d      |j                  d      |j                  d      	      O }}ng }| j                  st        d
 |D              r*| j                  }|D ]  }	t        ||	j                        } nd}d}
d}t        j                  | j                  gd |D              }|D ]V  }|s|j                  t               s|j                  t"              s|} n%|j                  t               rdnd}||
kD  sS|}
|}X t        d | g|D              rdnd}| j%                  |||||||      S c c}w )zAdd multiple `AIMessageChunk`s together.

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

    Returns:
        The resulting `AIMessageChunk`.

    c              3   4   K   | ]  }|j                     y wrH   r   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>o  s     +F!AII+F   c              3   4   K   | ]  }|j                     y wrH   )r   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>q       !F!!"5"5!Fr   c              3   4   K   | ]  }|j                     y wrH   )rm   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>t  r   r   c              3   4   K   | ]  }|j                     y wrH   )r   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>y  s      D!3!3 Dr   r`   ra   rc   r_   )r`   ra   rc   r_   c              3   8   K   | ]  }|j                   d u  y wrH   )rB   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>  s     !O1!"2"2$">!Os   Nc              3   4   K   | ]  }|j                     y wrH   )r_   r   s     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>  s     ,BaQTT,Br      r   c              3   :   K   | ]  }|j                   d k(    yw)r   N)r   )ri   xs     r0   rj   z(add_ai_message_chunks.<locals>.<genexpr>  s     JQa&&&0Js   r   )r   r   r   rm   rB   r_   r   )r   r   r   r   rm   r   r   r   rN   rB   rs   	add_usage	itertoolschainr_   
startswithr!   r    rR   )r   r   r   r   rm   r   rtcr   rB   r   	best_rankchunk_id
candidatesrx   rankr   s                   r0   r   r   b  s	    DLLG+Fv+FGG#!Fv!F $!Fv!F
 % DV D ~  &
  #WWV_WWV_ggg&774=	
 
  c!O!OO/3/B/B 	ME&~u7K7KLN	M  IH$'',B6,BCJ ~~l+CNN>4RHNN<0qa)IH  J4/&/JJPT  >>+)+%%   _
s   ;AGrightc                     | s|st        ddd      S | r|st        d| xs |      S t        di t        dt        t        d|       t        d|      t        j                              S )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   r7   r8   r9   r6   rq   r.   )r6   r   r   operatoraddr   r   s     r0   r   r     so    T E!11MMUOT]U33 	
VT"VU#
	 	r/   c                     | s|st        ddd      S | r|st        d| xs |      S t        di t        dt        t        d|       t        d|      d             S )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   r6   rq   c                      t        | |z
  d      S )Nr   )max)leris     r0   <lambda>z subtract_usage.<locals>.<lambda>)  s    BGQ r/   r.   )r6   r   r   r   s     r0   subtract_usager     sk    \ E!11MMUOT]U33 	
VT"VU#/
	 	r/   )>r+   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#   r3   r6   r=   r   r   r   r   r.   r/   r0   <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P
P#1PPf8MD( 81E 8- 8v<
$
<'4t';<<r/   