a
    bg<"                     @   s   d dl Z d dlmZmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ edd	d
ZedddZeeedddZG dd deZdS )    N)AnyDictListOptionalcast)AgentActionAgentFinish)BaseCallbackHandler)BaseMessage)ChatGeneration	LLMResultguard_import)returnc                   C   s   t d S )zImport the infino client.Zinfinopy)r   ZInfinoClient r   r   {/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/callbacks/infino_callback.pyimport_infino   s    r   c                   C   s   t dS )z6Import tiktoken for counting tokens for OpenAI models.tiktokenr   r   r   r   r   import_tiktoken   s    r   )stringopenai_model_namer   c                 C   s"   t  }||}t|| }|S )zCalculate num tokens for OpenAI with tiktoken package.

    Official documentation: https://github.com/openai/openai-cookbook/blob/main
                            /examples/How_to_count_tokens_with_tiktoken.ipynb
    )r   Zencoding_for_modellenencode)r   r   r   encoding
num_tokensr   r   r   get_num_tokens   s    
r   c                   @   s  e Zd ZdZd3ee ee eddddZd4eeed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eeddddZe
eef e
eef eddddZe
eef eddddZeeddddZe
eef eeddd d!Zeeed"d#d$Zd5eee ee edd%d&d'Zeeddd(d)Zeedd*d+d,Zeedd-d.d/Ze
eef eee  edd0d1d2ZdS )6InfinoCallbackHandlerz%Callback Handler that logs to Infino.NF)model_idmodel_versionverboser   c                 C   s*   t  | _|| _|| _|| _d| _d| _d S )NFzgpt-3.5-turbo)r   clientr   r   r   is_chat_openai_modelchat_openai_model_name)selfr   r   r   r   r   r   __init__%   s    zInfinoCallbackHandler.__init__T)keyvalueis_tsr   c                 C   s^   dt t ||d| j| jdi}| jr<td| d|  |rN| j| n| j| dS )a  Send the key-value to Infino.

        Parameters:
        key (str): the key to send to Infino.
        value (Any): the value to send to Infino.
        is_ts (bool): if True, the value is part of a time series, else it
                      is sent as a log message.
        datelabels)r   r   z	Tracking z with Infino: N)	inttimer   r   r   printr    Z	append_tsZ
append_log)r#   r%   r&   r'   payloadr   r   r   _send_to_infino3   s    z%InfinoCallbackHandler._send_to_infino)
serializedpromptskwargsr   c                 K   s.   |D ]}| j d|dd qd| _t | _dS )z=Log the prompts to Infino, and set start time and error flag.promptFr'   r   N)r.   errorr+   
start_time)r#   r/   r0   r1   r2   r   r   r   on_llm_startS   s    z"InfinoCallbackHandler.on_llm_start)tokenr1   r   c                 K   s   dS )z)Do nothing when a new token is generated.Nr   )r#   r7   r1   r   r   r   on_llm_new_tokene   s    z&InfinoCallbackHandler.on_llm_new_token)responser1   r   c                 K   s   t   | _| j| j }| d| | d| j |jD ] }|D ]}| jd|jdd q>q6|jdurt|jt	r|jd }|dur|d }|d	 }|d
 }	| d| | d	| | d
|	 | j
rddd |D }
t|
| jd}	| d
|	 dS )z<Log the latency, error, token usage, and response to Infino.Zlatencyr4   Zprompt_responseFr3   Ntoken_usageprompt_tokenstotal_tokenscompletion_tokens c                 s   s"   | ]}t tt t|jjV  qd S N)r   strr   messagecontent).0
generationr   r   r   	<genexpr>   s   z3InfinoCallbackHandler.on_llm_end.<locals>.<genexpr>r   )r+   end_timer5   r.   r4   generationstextZ
llm_output
isinstancer   r!   joinr   r"   )r#   r9   r1   durationrH   rD   r:   r;   r<   r=   messagesr   r   r   
on_llm_endi   s0    



z InfinoCallbackHandler.on_llm_end)r4   r1   r   c                 K   s
   d| _ dS )zSet the error flag.   N)r4   r#   r4   r1   r   r   r   on_llm_error   s    z"InfinoCallbackHandler.on_llm_error)r/   inputsr1   r   c                 K   s   dS )z!Do nothing when LLM chain starts.Nr   )r#   r/   rR   r1   r   r   r   on_chain_start   s    z$InfinoCallbackHandler.on_chain_start)outputsr1   r   c                 K   s   dS )zDo nothing when LLM chain ends.Nr   )r#   rT   r1   r   r   r   on_chain_end   s    z"InfinoCallbackHandler.on_chain_endc                 K   s   dS )zNeed to log the error.Nr   rP   r   r   r   on_chain_error   s    z$InfinoCallbackHandler.on_chain_error)r/   	input_strr1   r   c                 K   s   dS )zDo nothing when tool starts.Nr   )r#   r/   rW   r1   r   r   r   on_tool_start   s    z#InfinoCallbackHandler.on_tool_start)actionr1   r   c                 K   s   dS )z.Do nothing when agent takes a specific action.Nr   )r#   rY   r1   r   r   r   on_agent_action   s    z%InfinoCallbackHandler.on_agent_action)outputobservation_prefix
llm_prefixr1   r   c                 K   s   dS )zDo nothing when tool ends.Nr   )r#   r[   r\   r]   r1   r   r   r   on_tool_end   s    z!InfinoCallbackHandler.on_tool_endc                 K   s   dS )z&Do nothing when tool outputs an error.Nr   rP   r   r   r   on_tool_error   s    z#InfinoCallbackHandler.on_tool_error)rI   r1   r   c                 K   s   dS zDo nothing.Nr   )r#   rI   r1   r   r   r   on_text   s    zInfinoCallbackHandler.on_text)finishr1   r   c                 K   s   dS r`   r   )r#   rb   r1   r   r   r   on_agent_finish   s    z%InfinoCallbackHandler.on_agent_finish)r/   rM   r1   r   c                 K   s   | d}|r*|D ]}|dkrd| _ q*q| jr| d}|r| d}|r|| _d}|D ].}	ddd	 |	D }
t|
| jd
}||7 }qZ| d| | jrtd| j d| j  ddd	 |D }| jd|dd d| _t		 | _
dS )zRun when LLM starts running.idZ
ChatOpenAITinvocation_params
model_namer   r>   c                 s   s   | ]}t t|jV  qd S r?   r   r@   rB   )rC   msgr   r   r   rE      s   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>rF   r;   z=on_chat_model_start: is_chat_openai_model=                   z+,                   chat_openai_model_name=c                 s   s$   | ]}|D ]}t t|jV  q
qd S r?   rg   )rC   Zsublistrh   r   r   r   rE      s   r2   Fr3   N)getr!   r"   rK   r   r.   r   r,   r4   r+   r5   )r#   r/   rM   r1   valuesr&   re   rf   r;   Zmessage_listZmessage_stringr   r2   r   r   r   on_chat_model_start   sJ    






z)InfinoCallbackHandler.on_chat_model_start)NNF)T)NN)__name__
__module____qualname____doc__r   r@   boolr$   r   r.   r   r   r6   r8   r   rN   BaseExceptionrQ   rS   rU   rV   rX   r   rZ   r^   r_   ra   r   rc   r
   rk   r   r   r   r   r   "   sj       "
%
	  


r   )r+   typingr   r   r   r   r   Zlangchain_core.agentsr   r   Zlangchain_core.callbacksr	   Zlangchain_core.messagesr
   Zlangchain_core.outputsr   r   Zlangchain_core.utilsr   r   r   r@   r*   r   r   r   r   r   r   <module>   s   