
    f3fi               	           d Z ddlZddlmZ ddlmZ ddlmZ ddl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mZ ddlmZ  G d de      Ze	 ddedeeddf   fd       Zy)z6Callback Handler that tracks AIMessage.usage_metadata.    N)	Generator)contextmanager)
ContextVar)Any)override)BaseCallbackHandler)	AIMessage)UsageMetadata	add_usage)ChatGeneration	LLMResult)register_configure_hookc                   X     e Zd ZdZd	 fdZedefd       Zedede	ddfd       Z
 xZS )
UsageMetadataCallbackHandleraj  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                 b    t         |           t        j                         | _        i | _        y)z,Initialize the UsageMetadataCallbackHandler.N)super__init__	threadingLock_lockusage_metadata)self	__class__s    \/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_core/callbacks/usage.pyr   z%UsageMetadataCallbackHandler.__init__2   s$    ^^%
8:    c                 ,    t        | j                        S )N)strr   )r   s    r   __repr__z%UsageMetadataCallbackHandler.__repr__8   s    4&&''r   responsekwargsc                    	 |j                   d   d   }d}d}t        |t              rD	 |j                  }t        |t
              r'|j                  }|j                  j                  d      }|r]|rZ| j                  5  || j                  vr|| j                  |<   n&t        | j                  |   |      | j                  |<   ddd       yyy# t        $ r d}Y w xY w# t        $ r Y |w xY w# 1 sw Y   yxY w)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_endz'UsageMetadataCallbackHandler.on_llm_end<   s   	!--a03J 
j.1$,,gy1%,%;%;N!(!:!:!>!>|!LJ
 j T%8%886DD''
36?++J77D''
3	  )>  	J	 " 
 s0   C AC <AC,CC	C)(C),C5)r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r,   __classcell__)r   s   @r   r   r      sQ    >; (# ( ( 9    r   r   namer   c              #      K   t        | d      }t        |d       t               }|j                  |       | |j                  d       yw)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)r2   usage_metadata_callback_varcbs      r   get_usage_metadata_callbackr9   [   sN     d 	4&   7TJ	%	'B##B'
H##D)s   AA)usage_metadata_callback)r0   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   r9    r   r   <module>rF      sm    <  % % "  & 8 - ? < BF#6 FR )7*
7*+T4787* 7*r   