
    D_i               	           S r SSKrSSKJr  SSKJr  SSKJr  SSK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Jr  SSKJr   " S S\5      r\ SS\S\\SS4   4S jj5       rg)z6Callback Handler that tracks AIMessage.usage_metadata.    N)	Generator)contextmanager)
ContextVar)Any)override)BaseCallbackHandler)	AIMessage)UsageMetadata	add_usage)ChatGeneration	LLMResult)register_configure_hookc                   h   ^  \ rS rSrSrSU 4S jjr\S\4S j5       r\S\	S\
SS4S	 j5       rS
rU =r$ )UsageMetadataCallbackHandler   a
  Callback Handler that tracks AIMessage.usage_metadata.

Example:
    ```python
    from langchain.chat_models import init_chat_model
    from langchain_core.callbacks import UsageMetadataCallbackHandler

    llm_1 = init_chat_model(model="openai:gpt-4o-mini")
    llm_2 = init_chat_model(model="anthropic:claude-3-5-haiku-20241022")

    callback = UsageMetadataCallbackHandler()
    result_1 = llm_1.invoke("Hello", config={"callbacks": [callback]})
    result_2 = llm_2.invoke("Hello", config={"callbacks": [callback]})
    callback.usage_metadata
    ```
    ```txt
    {'gpt-4o-mini-2024-07-18': {'input_tokens': 8,
      'output_tokens': 10,
      'total_tokens': 18,
      'input_token_details': {'audio': 0, 'cache_read': 0},
      'output_token_details': {'audio': 0, 'reasoning': 0}},
     'claude-3-5-haiku-20241022': {'input_tokens': 8,
      'output_tokens': 21,
      'total_tokens': 29,
      'input_token_details': {'cache_read': 0, 'cache_creation': 0}}}
    ```

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

returnNc                 d   > [         TU ]  5         [        R                  " 5       U l        0 U l        g)z,Initialize the UsageMetadataCallbackHandler.N)super__init__	threadingLock_lockusage_metadata)self	__class__s    X/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/callbacks/usage.pyr   %UsageMetadataCallbackHandler.__init__2   s$    ^^%
8:    c                 ,    [        U R                  5      $ )N)strr   )r   s    r   __repr__%UsageMetadataCallbackHandler.__repr__8   s    4&&''r   responsekwargsc                 &    UR                   S   S   nSnSn[        U[        5      (       aI   UR                  n[        U[
        5      (       a'  UR                  nUR                  R                  S5      nU(       ab  U(       aZ  U R                     XPR                  ;  a  X@R                  U'   O&[        U R                  U   U5      U R                  U'   SSS5        ggg! [         a    Sn Nf = f! [         a     Nf = f! , (       d  f       g= f)zCollect token usage.r   N
model_name)generations
IndexError
isinstancer   messager	   r   response_metadatagetAttributeErrorr   r   )r   r#   r$   
generationr   r&   r*   s          r   
on_llm_end'UsageMetadataCallbackHandler.on_llm_end<   s    	!--a03J 
j.11$,,gy11%,%;%;N!(!:!:!>!>|!LJ
 j%8%886D''
36?++J77D''
3	  )>  	J	 " 
 s0   C  AC2 AD C/.C/2
C?>C?
D)r   r   )r   N)__name__
__module____qualname____firstlineno____doc__r   r   r    r!   r   r   r/   __static_attributes____classcell__)r   s   @r   r   r      sQ    >; (# ( ( 9    r   r   namer   c              #      #    [        U SS9n[        USS9  [        5       nUR                  U5        Uv   UR                  S5        g7f)a  Get usage metadata callback.

Get context manager for tracking usage metadata across chat model calls using
[`AIMessage.usage_metadata`][langchain.messages.AIMessage.usage_metadata].

Args:
    name: The name of the context variable.

Yields:
    The usage metadata callback.

Example:
    ```python
    from langchain.chat_models import init_chat_model
    from langchain_core.callbacks import get_usage_metadata_callback

    llm_1 = init_chat_model(model="openai:gpt-4o-mini")
    llm_2 = init_chat_model(model="anthropic:claude-3-5-haiku-20241022")

    with get_usage_metadata_callback() as cb:
        llm_1.invoke("Hello")
        llm_2.invoke("Hello")
        print(cb.usage_metadata)
    ```
    ```txt
    {
        "gpt-4o-mini-2024-07-18": {
            "input_tokens": 8,
            "output_tokens": 10,
            "total_tokens": 18,
            "input_token_details": {"audio": 0, "cache_read": 0},
            "output_token_details": {"audio": 0, "reasoning": 0},
        },
        "claude-3-5-haiku-20241022": {
            "input_tokens": 8,
            "output_tokens": 21,
            "total_tokens": 29,
            "input_token_details": {"cache_read": 0, "cache_creation": 0},
        },
    }
    ```

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

N)defaultT)inheritable)r   r   r   set)r8   usage_metadata_callback_varcbs      r   get_usage_metadata_callbackr?   [   sM     d 	4&   7TJ	%	'B##B'
H##D)s   AA)usage_metadata_callback)r5   r   collections.abcr   
contextlibr   contextvarsr   typingr   typing_extensionsr   langchain_core.callbacksr   langchain_core.messagesr	   langchain_core.messages.air
   r   langchain_core.outputsr   r   langchain_core.tracers.contextr   r   r    r?    r   r   <module>rL      sm    <  % % "  & 8 - ? < BF#6 FR )7*
7*+T4787* 7*r   