a
    bgKP                     @   s  d dl 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mZ d dlmZ d dlZd dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ eeZd
Zeee df  dddZ!eee df  dddZ"g dZ#G dd dZ$d-e e	e$dddZ%e	ee
e e	f ee	 e	f dddZ&e	e	dddZ'e(e	dddZ)e e dddZ*e	e	d d!d"Z+e	e	d d#d$Z,ee
e e	f d%d&d'Z-eee e	f ee
e e	f  d(d)d*Z.G d+d, d,eZ/d,dgZ0dS ).    N)
ContextVar)AnyDictListUnioncast)UUID)AgentActionAgentFinish)BaseCallbackHandler)BaseMessage)	LLMResult)parsezhttps://app.llmonitor.comuser_ctx)defaultuser_props_ctx)ZtemperatureZtop_pZtop_kstopZpresence_penaltyZfrequence_penaltyseedfunction_callZ	functionsZtoolsZtool_choiceZresponse_formatZ
max_tokensZ
logit_biasc                   @   sF   e Zd ZdZdeeddddZedddZeeeed	d
dZdS )UserContextManagerz+Context manager for LLMonitor user context.Nuser_id
user_propsreturnc                 C   s   t | t| d S Nr   setr   )selfr   r    r   ~/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/callbacks/llmonitor_callback.py__init__-   s    
zUserContextManager.__init__)r   c                 C   s   d S r   r   )r   r   r   r   	__enter__1   s    zUserContextManager.__enter__)exc_type	exc_valueexc_tbr   c                 C   s   t d  td  d S r   r   )r   r"   r#   r$   r   r   r   __exit__4   s    
zUserContextManager.__exit__)N)	__name__
__module____qualname____doc__strr   r    r!   r%   r   r   r   r   r   *   s   r   r   c                 C   s
   t | |S )zBuilds an LLMonitor UserContextManager

    Parameters:
        - `user_id`: The user id.
        - `user_props`: The user properties.

    Returns:
        A context manager that sets the user context.
    )r   )r   r   r   r   r   identify9   s    
r+   )objr   c                 C   sJ   t | dr|  S t| tr.dd |  D S t| trFdd | D S | S )Nto_jsonc                 S   s   i | ]\}}|t |qS r   
_serialize).0keyvaluer   r   r   
<dictcomp>K       z_serialize.<locals>.<dictcomp>c                 S   s   g | ]}t |qS r   r.   )r0   elementr   r   r   
<listcomp>N   r4   z_serialize.<locals>.<listcomp>)hasattrr-   
isinstancedictitemslist)r,   r   r   r   r/   F   s    


r/   )	raw_inputr   c                 C   s   | sd S t | tr*t| dkr*t| d S t | ts<t| S | d}| d}| d}| d}|rl|S |rt|S |r||S |r|S t| S )N   r   inputinputsquestionquery)r8   r;   len_parse_inputr9   r/   get)r<   Zinput_valueZinputs_valueZquestion_valueZquery_valuer   r   r   rC   S   s&    




rC   )
raw_outputr   c                 C   s|   | sd S t | tst| S | d}| d}| d}| d}| d}|rT|S |r\|S |rd|S |rl|S |rt|S t| S )NtextoutputZoutput_textZanswerresult)r8   r9   r/   rD   )rE   Z
text_valueZoutput_valueZoutput_text_valueZanswer_valueZresult_valuer   r   r   _parse_outputo   s(    





rI   )roler   c                 C   s   | dkrdS | S d S )NZhumanuserr   )rJ   r   r   r   _parse_lc_role   s    rL   )metadatar   c                 C   s<   t  d urt  S | pi } | d}|d u r8| d}|S )Nr   ZuserId)r   rD   )rM   r   r   r   r   _get_user_id   s    

rN   c                 C   s(   t  d urt  S | pi } | dd S )Nr   )r   rD   )rM   r   r   r   _get_user_props   s    rO   )messager   c                    s6   g d} j t jd}| fdd|D  |S )N)r   Z
tool_callsZtool_call_idname)rF   rJ   c                    s0   i | ](} j |d ur|tt j |qS r   )Zadditional_kwargsrD   r   r   )r0   r1   rP   r   r   r3      s   z%_parse_lc_message.<locals>.<dictcomp>)contentrL   typeupdate)rP   keysparsedr   rR   r   _parse_lc_message   s    
rX   )messagesr   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )rX   )r0   rP   r   r   r   r6      r4   z&_parse_lc_messages.<locals>.<listcomp>r   )rY   r   r   r   _parse_lc_messages   s    rZ   c                
       s  e Zd ZU dZeed< eed< eed< eed< eed< d1eedf eedf edd	 fd
dZdddde	ee
f ee eeedf eee df ee	ee
f df e
ddddZdddde	ee
f eee  eeedf eee df ee	ee
f df e
e
dddZddeeeedf e
ddddZdddde	ee
f eeeedf eee df ee	ee
f df e
ddddZddde
eeedf eee df e
ddddZdddde	ee
f e	ee
f eeedf eee df ee	ee
f df e
e
ddd Zdde	ee
f eeedf e
e
d!d"d#Zddeeeedf e
e
d$d%d&Zddeeeedf e
e
d'd(d)Zddeeeedf e
e
d*d+d,Zddeeeedf e
e
d*d-d.Zddeeeedf e
e
d*d/d0Z  ZS )2LLMonitorCallbackHandlera  Callback Handler for LLMonitor`.

    #### Parameters:
        - `app_id`: The app id of the app you want to report to. Defaults to
        `None`, which means that `LLMONITOR_APP_ID` will be used.
        - `api_url`: The url of the LLMonitor API. Defaults to `None`,
        which means that either `LLMONITOR_API_URL` environment variable
        or `https://app.llmonitor.com` will be used.

    #### Raises:
        - `ValueError`: if `app_id` is not provided either as an
        argument or as an environment variable.
        - `ConnectionError`: if the connection to the API fails.


    #### Example:
    ```python
    from langchain_community.llms import OpenAI
    from langchain_community.callbacks import LLMonitorCallbackHandler

    llmonitor_callback = LLMonitorCallbackHandler()
    llm = OpenAI(callbacks=[llmonitor_callback],
                 metadata={"userId": "user-123"})
    llm.invoke("Hello, how are you?")
    ```
    "_LLMonitorCallbackHandler__api_url!_LLMonitorCallbackHandler__app_id"_LLMonitorCallbackHandler__verbose,_LLMonitorCallbackHandler__llmonitor_version+_LLMonitorCallbackHandler__has_valid_configNF)app_idapi_urlverboser   c                    sD  t    d| _z"dd l}tjd| _|j| _	W n$ t
yV   td d| _Y d S 0 t| jtdk rtd| j d d| _d| _|ptd	pt| _|pttd
| _|ptd}|d u rtd d| _n|| _| jdu rd S z*t| j d| j }|jst W n& ty>   td| j  Y n0 d S )NTr   	llmonitorz[LLMonitor] To use the LLMonitor callback handler you need to 
                have the `llmonitor` Python package installed. Please install it 
                with `pip install llmonitor`Fz0.0.32zB[LLMonitor] The installed `llmonitor` version is 
                z 
                but `LLMonitorCallbackHandler` requires at least version 0.0.32 
                upgrade `llmonitor` with `pip install --upgrade llmonitor`ZLLMONITOR_API_URLZLLMONITOR_VERBOSEZLLMONITOR_APP_IDzh[LLMonitor] app_id must be provided either as an argument or 
                as an environment variablez	/api/app/zG[LLMonitor] Could not connect to the LLMonitor API at 
                )superr    r`   rd   	importlibrM   versionr_   Ztrack_event&_LLMonitorCallbackHandler__track_eventImportErrorloggerwarningr   osgetenvDEFAULT_API_URLr\   boolr^   r]   requestsrD   okConnectionError	Exception)r   ra   rb   rc   rd   Z_app_idres	__class__r   r   r       sR    


z!LLMonitorCallbackHandler.__init__)parent_run_idtagsrM   )
serializedpromptsrun_idrw   rx   rM   kwargsr   c                   s   | j du rd S zt|}t|}	|di   |di   dpZ dpZ d}
|
srd dv rrd	}
 fd
dtD }t|}| jdd|t||rt|nd |
|||||	| j	d W n4 t
y } ztd|  W Y d }~n
d }~0 0 d S )NFinvocation_paramsr|   model
model_namemodel_id	anthropic_typeclaude-2c                    s&   i | ]}  |d ur|  |qS r   rD   r0   paramparamsr   r   r3   6  s   z9LLMonitorCallbackHandler.on_llm_start.<locals>.<dictcomp>llmstart
r   r{   rw   rQ   r>   rx   extrarM   r   ra   z/[LLMonitor] An error occurred in on_llm_start: )r`   rN   rO   rD   rU   PARAMS_TO_CAPTURErC   rh   r*   r]   rs   warningswarn)r   ry   rz   r{   rw   rx   rM   r|   r   r   rQ   r   r>   er   r   r   on_llm_start  sH    




z%LLMonitorCallbackHandler.on_llm_start)ry   rY   r{   rw   rx   rM   r|   r   c                   s   | j du rd S zt|}t|}	|di   |di   dpZ dpZ d}
|
srd dv rrd	}
 fd
dtD }t|d }| jdd|t||rt|nd |
|||||	| j	d W n4 t
y } ztd|  W Y d }~n
d }~0 0 d S )NFr}   r|   r~   r   r   r   r   r   c                    s&   i | ]}  |d ur|  |qS r   r   r   r   r   r   r3   o  s   z@LLMonitorCallbackHandler.on_chat_model_start.<locals>.<dictcomp>r   r   r   r   z6[LLMonitor] An error occurred in on_chat_model_start: )r`   rN   rO   rD   rU   r   rZ   rh   r*   r]   rs   rj   error)r   ry   rY   r{   rw   rx   rM   r|   r   r   rQ   r   r>   r   r   r   r   on_chat_model_startO  sH    




z,LLMonitorCallbackHandler.on_chat_model_start)rw   )responser{   rw   r|   r   c             
   K   s   | j du rd S zz|jpi di }dd |jd D }t|dkrJ|d }| jddt||rdt|nd ||d	|d
d| jd W n4 ty } zt	
d|  W Y d }~n
d }~0 0 d S )NFtoken_usagec                 S   s&   g | ]}t |d rt|jn|jqS rR   )r7   rX   rP   rF   )r0   Z
generationr   r   r   r6     s   z7LLMonitorCallbackHandler.on_llm_end.<locals>.<listcomp>r   r=   r   endZprompt_tokensZcompletion_tokens)prompt
completion)r{   rw   rG   r   ra   z-[LLMonitor] An error occurred in on_llm_end: )r`   Z
llm_outputrD   ZgenerationsrB   rh   r*   r]   rs   rj   r   )r   r   r{   rw   r|   r   Zparsed_outputr   r   r   r   
on_llm_end  s,    

z#LLMonitorCallbackHandler.on_llm_end)ry   	input_strr{   rw   rx   rM   r|   r   c                K   s   | j du rd S zPt|}t|}	|d}
| jdd|t||rFt|nd |
||||	| jd W n4 ty } zt	d|  W Y d }~n
d }~0 0 d S )NFrQ   toolr   	r   r{   rw   rQ   r>   rx   rM   r   ra   z0[LLMonitor] An error occurred in on_tool_start: )
r`   rN   rO   rD   rh   r*   r]   rs   rj   r   )r   ry   r   r{   rw   rx   rM   r|   r   r   rQ   r   r   r   r   on_tool_start  s*    


z&LLMonitorCallbackHandler.on_tool_start)rw   rx   )rG   r{   rw   rx   r|   r   c             
   K   s|   t |}| jdu rd S z,| jddt ||r2t |nd || jd W n4 tyv } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   r{   rw   rG   ra   z.[LLMonitor] An error occurred in on_tool_end: )r*   r`   rh   r]   rs   rj   r   )r   rG   r{   rw   rx   r|   r   r   r   r   on_tool_end  s    	

z$LLMonitorCallbackHandler.on_tool_end)ry   r?   r{   rw   rx   rM   r|   r   c                K   s  | j du rd S z|dg dd }d}	|p.i }|d}
|
d u rL|d}
|dks\|d	kr`d
}	|
d urpd
}	|
}|d ur|d}	t|}t|}t|}| j|	d|t||rt|nd |||||| jd W n4 ty } zt	
d|  W Y d }~n
d }~0 0 d S )NFid)NNNN   chainZ
agent_name	agentNameZAgentExecutorZPlanAndExecuteagentr   r   z1[LLMonitor] An error occurred in on_chain_start: )r`   rD   rN   rO   rC   rh   r*   r]   rs   rj   r   )r   ry   r?   r{   rw   rx   rM   r|   rQ   rT   r   r   r   r>   r   r   r   r   on_chain_start  sD    



z'LLMonitorCallbackHandler.on_chain_start)outputsr{   rw   r|   r   c             
   K   s|   | j du rd S z4t|}| jddt||r2t|nd || jd W n4 tyv } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   r   z/[LLMonitor] An error occurred in on_chain_end: )r`   rI   rh   r*   r]   rs   rj   r   )r   r   r{   rw   r|   rG   r   r   r   r   on_chain_end  s    

z%LLMonitorCallbackHandler.on_chain_end)actionr{   rw   r|   r   c             
   K   s   | j du rd S z>|j}t|j}| jddt||r:t|nd ||| jd W n4 ty } zt	d|  W Y d }~n
d }~0 0 d S )NFr   r   )r{   rw   rQ   r>   ra   z2[LLMonitor] An error occurred in on_agent_action: )
r`   r   rC   Z
tool_inputrh   r*   r]   rs   rj   r   )r   r   r{   rw   r|   rQ   r>   r   r   r   r   on_agent_action4  s     


	z(LLMonitorCallbackHandler.on_agent_action)finishr{   rw   r|   r   c             
   K   s~   | j du rd S z6t|j}| jddt||r4t|nd || jd W n4 tyx } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   r   z2[LLMonitor] An error occurred in on_agent_finish: )	r`   rI   Zreturn_valuesrh   r*   r]   rs   rj   r   )r   r   r{   rw   r|   rG   r   r   r   r   on_agent_finishN  s    


z(LLMonitorCallbackHandler.on_agent_finish)r   r{   rw   r|   r   c             
   K   s   | j du rd S z:| jddt||r*t|nd t|t d| jd W n4 ty| } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   rP   stackr{   rw   r   ra   z1[LLMonitor] An error occurred in on_chain_error: 	r`   rh   r*   	traceback
format_excr]   rs   rj   r   r   r   r{   rw   r|   r   r   r   r   on_chain_errorf  s    

z'LLMonitorCallbackHandler.on_chain_errorc             
   K   s   | j du rd S z:| jddt||r*t|nd t|t d| jd W n4 ty| } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   r   r   z0[LLMonitor] An error occurred in on_tool_error: r   r   r   r   r   on_tool_error|  s    

z&LLMonitorCallbackHandler.on_tool_errorc             
   K   s   | j du rd S z:| jddt||r*t|nd t|t d| jd W n4 ty| } ztd|  W Y d }~n
d }~0 0 d S )NFr   r   r   r   z/[LLMonitor] An error occurred in on_llm_error: r   r   r   r   r   on_llm_error  s    

z%LLMonitorCallbackHandler.on_llm_error)NNF)r&   r'   r(   r)   r*   __annotations__ro   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r
   r   BaseExceptionr   r   r   __classcell__r   r   ru   r   r[      s
  
   

D

>


>
.

'



7






r[   )N)1importlib.metadatarf   loggingrl   r   r   contextvarsr   typingr   r   r   r   r   uuidr   rp   Zlangchain_core.agentsr	   r
   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   Zlangchain_core.outputsr   Zpackaging.versionr   	getLoggerr&   rj   rn   r*   r   r   r   r   r+   r/   rC   r9   rI   rL   rN   rO   rX   rZ   r[   __all__r   r   r   r   <module>   sF   
&	(   u