U
    h)                  `   @   sJ  d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddddd	d	d
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd_Zd(eeed d!d"Zd)eeeed#d$d%ZG d&d' d'eZdS )*z(Callback Handler that prints to std out.    N)AnyDictList)BaseCallbackHandler)	AIMessage)ChatGeneration	LLMResultga2U0*#?ga2U0*C?g{Gzt?g{Gzd?gQ?g{Gz?gQ?gQ?gQ?g~jtX?gMb@?gMbP?g~jth?gMb`?gMbp?g-C6:?g{Gz?g-C6Z?g~jt?ga2U0*3?g~jtx?ga2U0*S?ga2U0*c?)_zgpt-4o-minizgpt-4o-mini-2024-07-18zgpt-4o-mini-completionz!gpt-4o-mini-2024-07-18-completionzgpt-4ozgpt-4o-2024-05-13zgpt-4o-2024-08-06zgpt-4o-completionzgpt-4o-2024-05-13-completionzgpt-4o-2024-08-06-completiongpt-4z
gpt-4-0314z
gpt-4-0613z	gpt-4-32kzgpt-4-32k-0314zgpt-4-32k-0613zgpt-4-vision-previewzgpt-4-1106-previewzgpt-4-0125-previewzgpt-4-turbo-previewzgpt-4-turbozgpt-4-turbo-2024-04-09zgpt-4-completionzgpt-4-0314-completionzgpt-4-0613-completionzgpt-4-32k-completionzgpt-4-32k-0314-completionzgpt-4-32k-0613-completionzgpt-4-vision-preview-completionzgpt-4-1106-preview-completionzgpt-4-0125-preview-completionzgpt-4-turbo-preview-completionzgpt-4-turbo-completionz!gpt-4-turbo-2024-04-09-completionzgpt-3.5-turbozgpt-3.5-turbo-0125zgpt-3.5-turbo-0301zgpt-3.5-turbo-0613zgpt-3.5-turbo-1106zgpt-3.5-turbo-instructzgpt-3.5-turbo-16kzgpt-3.5-turbo-16k-0613zgpt-3.5-turbo-completionzgpt-3.5-turbo-0125-completionzgpt-3.5-turbo-0301-completionzgpt-3.5-turbo-0613-completionzgpt-3.5-turbo-1106-completionz!gpt-3.5-turbo-instruct-completionzgpt-3.5-turbo-16k-completionz!gpt-3.5-turbo-16k-0613-completionzgpt-35-turbozgpt-35-turbo-0125zgpt-35-turbo-0301zgpt-35-turbo-0613zgpt-35-turbo-instructzgpt-35-turbo-16kzgpt-35-turbo-16k-0613zgpt-35-turbo-completionzgpt-35-turbo-0125-completionzgpt-35-turbo-0301-completionzgpt-35-turbo-0613-completionz gpt-35-turbo-instruct-completionzgpt-35-turbo-16k-completionz gpt-35-turbo-16k-0613-completionztext-ada-001Zadaztext-babbage-001Zbabbageztext-curie-001Zcurieztext-davinci-003ztext-davinci-002zcode-davinci-002zbabbage-002-finetunedzdavinci-002-finetunedzgpt-3.5-turbo-0613-finetunedzgpt-3.5-turbo-1106-finetunedzgpt-3.5-turbo-0125-finetunedz gpt-4o-mini-2024-07-18-finetunedz babbage-002-finetuned-completionz davinci-002-finetuned-completionz'gpt-3.5-turbo-0613-finetuned-completionz'gpt-3.5-turbo-1106-finetuned-completionz'gpt-3.5-turbo-0125-finetuned-completionz+gpt-4o-mini-2024-07-18-finetuned-completionzbabbage-002-azure-finetunedzdavinci-002-azure-finetunedz!gpt-35-turbo-0613-azure-finetunedz&babbage-002-azure-finetuned-completionz&davinci-002-azure-finetuned-completionz,gpt-35-turbo-0613-azure-finetuned-completionzada-finetuned-legacyzbabbage-finetuned-legacyzcurie-finetuned-legacyzdavinci-finetuned-legacyF)
model_nameis_completionreturnc                 C   s   |   } d| kr"| dd d } d| kr<| dd d } d| krV| dd d	 } |r| d
s| ds| dsd| krd| kr| d S | S dS )a%  
    Standardize the model name to a format that can be used in the OpenAI API.

    Args:
        model_name: Model name to standardize.
        is_completion: Whether the model is used for completion or not.
            Defaults to False.

    Returns:
        Standardized model name.

    z.ft-r   z-azure-finetunedz:ft-:z-finetuned-legacyzft:   z
-finetunedr	   zgpt-3.5zgpt-35Z	finetunedlegacyz-completionN)lowersplit
startswith)r
   r    r   M/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/callbacks/openai_info.pystandardize_model_name   s(    r   )r
   
num_tokensr   r   c                 C   sB   t | |d} | tkr2td|  ddt  t|  |d  S )a&  
    Get the cost in USD for a given model and number of tokens.

    Args:
        model_name: Name of the model
        num_tokens: Number of tokens.
        is_completion: Whether the model is used for completion or not.
            Defaults to False.

    Returns:
        Cost in USD.
    r   zUnknown model: z=. Please provide a valid OpenAI model name.Known models are: z, i  )r   MODEL_COST_PER_1K_TOKENS
ValueErrorjoinkeys)r
   r   r   r   r   r   get_openai_token_cost_for_model   s    
r   c                       s   e Zd ZU dZdZeed< dZeed< dZeed< dZ	eed< dZ
eed< d	d
 fddZed
ddZeed
ddZeeef ee ed	dddZeed	dddZeed	dddZd d
ddZed dddZ  ZS )OpenAICallbackHandlerz)Callback Handler that tracks OpenAI info.r   total_tokensprompt_tokenscompletion_tokenssuccessful_requestsg        
total_costN)r   c                    s   t    t | _d S )N)super__init__	threadingLock_lockself	__class__r   r   r$      s    
zOpenAICallbackHandler.__init__c              
   C   s,   d| j  d| j d| j d| j d| j 
S )NzTokens Used: z
	Prompt Tokens: z
	Completion Tokens: z
Successful Requests: z
Total Cost (USD): $)r   r   r    r!   r"   r(   r   r   r   __repr__   s    *zOpenAICallbackHandler.__repr__c                 C   s   dS )z;Whether to call verbose callbacks even if verbose is False.Tr   r(   r   r   r   always_verbose   s    z$OpenAICallbackHandler.always_verbose)
serializedpromptskwargsr   c                 K   s   dS )zPrint out the prompts.Nr   )r)   r.   r/   r0   r   r   r   on_llm_start   s    z"OpenAICallbackHandler.on_llm_start)tokenr0   r   c                 K   s   dS )zPrint out the token.Nr   )r)   r2   r0   r   r   r   on_llm_new_token   s    z&OpenAICallbackHandler.on_llm_new_token)responser0   r   c              	   K   s  z|j d d }W n tk
r*   d}Y nX t|trz*|j}t|trV|j}|j}nd}d}W q tk
r|   d}d}Y qX nd}d}|rd|d i}|d }|d }	|pi 	d }
rt
|
}n"|jdkrd}nt
|j	dd}nr|jdkrdS d|jkr&| j |  jd	7  _W 5 Q R X dS |jd }|	d
d}|	dd}	t
|j	dd}|tkr~t||dd}t||	}nd}d}| jX |  j|| 7  _|  j|	dd7  _|  j|	7  _|  j|7  _|  jd	7  _W 5 Q R X dS )zCollect token usage.r   Nr   Zoutput_tokensZinput_tokensr
    token_usager   r    r   Tr   )Zgenerations
IndexError
isinstancer   messager   usage_metadataresponse_metadataAttributeErrorgetr   Z
llm_outputr'   r!   r   r   r"   r   r   r    )r)   r4   r0   Z
generationr9   r:   r;   r6   r    r   Zresponse_model_namer
   Zcompletion_costZprompt_costr   r   r   
on_llm_end   sn    







  z OpenAICallbackHandler.on_llm_endc                 C   s   | S )z&Return a copy of the callback handler.r   r(   r   r   r   __copy__$  s    zOpenAICallbackHandler.__copy__)memor   c                 C   s   | S )z+Return a deep copy of the callback handler.r   )r)   r@   r   r   r   __deepcopy__(  s    z"OpenAICallbackHandler.__deepcopy__)__name__
__module____qualname____doc__r   int__annotations__r   r    r!   r"   floatr$   strr,   propertyboolr-   r   r   r   r1   r3   r   r>   r?   rA   __classcell__r   r   r*   r   r      s&   
	
  Dr   )F)F)rE   r%   typingr   r   r   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   Zlangchain_core.outputsr   r   r   rI   rK   r   rF   rH   r   r   r   r   r   r   <module>   s   y #   