o
    ZhKP                     @   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/de de	de$fddZ%de	dee
e e	f ee	 e	f fddZ&de	de	fddZ'de(de	fddZ)de de fd d!Z*d"e	de	fd#d$Z+d"e	de	fd%d&Z,d'ede
e e	f fd(d)Z-d*eee e	f dee
e e	f  fd+d,Z.G d-d. d.eZ/d.dgZ0dS )0    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                   @   sP   e Zd ZdZddededdfddZdefdd	Zd
edededef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   g/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/callbacks/llmonitor_callback.py__init__-      
zUserContextManager.__init__c                 C   s   d S r   r   )r   r   r   r   	__enter__1   s   zUserContextManager.__enter__exc_type	exc_valueexc_tbc                 C   s   t d  td  d S r   r   )r   r"   r#   r$   r   r   r   __exit__4   r    zUserContextManager.__exit__r   )	__name__
__module____qualname____doc__strr   r   r!   r%   r   r   r   r   r   *   s
    r   r   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+   objc                 C   sJ   t | dr	|  S t| trdd |  D S t| tr#dd | D S | S )Nto_jsonc                 S   s   i | ]	\}}|t |qS r   
_serialize).0keyvaluer   r   r   
<dictcomp>K   s    z_serialize.<locals>.<dictcomp>c                 S      g | ]}t |qS r   r.   )r0   elementr   r   r   
<listcomp>N       z_serialize.<locals>.<listcomp>)hasattrr-   
isinstancedictitemslist)r,   r   r   r   r/   F   s   


r/   	raw_inputc                 C   s   | sd S t | trt| dkrt| d S t | tst| S | d}| d}| d}| d}|r6|S |r:|S |r>|S |rB|S t| S )N   r   inputinputsquestionquery)r9   r<   len_parse_inputr:   r/   get)r=   Zinput_valueZinputs_valueZquestion_valueZquery_valuer   r   r   rD   S   s&   




rD   
raw_outputc                 C   s|   | sd S t | tst| S | d}| d}| d}| d}| d}|r*|S |r.|S |r2|S |r6|S |r:|S t| S )NtextoutputZoutput_textZanswerresult)r9   r:   r/   rE   )rF   Z
text_valueZoutput_valueZoutput_text_valueZanswer_valueZresult_valuer   r   r   _parse_outputo   s(   





rJ   rolec                 C   s   | dkrdS | S )NZhumanuserr   )rK   r   r   r   _parse_lc_role   s   rM   metadatac                 C   s<   t  d ur
t  S | pi } | d}|d u r| d}|S )Nr   ZuserId)r   rE   )rN   r   r   r   r   _get_user_id   s   

rO   c                 C   s(   t  d ur
t  S | pi } | dd S )Nr   )r   rE   )rN   r   r   r   _get_user_props   s   rP   messagec                    s6   g d} j t jd}| fdd|D  |S )N)r   Z
tool_callsZtool_call_idname)rG   rK   c                    s0   i | ]} j |d ur|tt j |qS r   )Zadditional_kwargsrE   r   r   )r0   r1   rQ   r   r   r3      s
    z%_parse_lc_message.<locals>.<dictcomp>)contentrM   typeupdate)rQ   keysparsedr   rS   r   _parse_lc_message   s   
rY   messagesc                 C   s   dd | D S )Nc                 S   r4   r   )rY   )r0   rQ   r   r   r   r6      r7   z&_parse_lc_messages.<locals>.<listcomp>r   )rZ   r   r   r   _parse_lc_messages   s   r[   c                       s  e Zd ZU dZeed< eed< eed< eed< eed< 			d:d	eedf d
eedf deddf fddZddddde	ee
f dee dedeedf deee df dee	ee
f df de
ddfddZddddde	ee
f deee  dedeedf deee df dee	ee
f df de
de
fddZdddededeedf de
ddf
ddZddddde	ee
f d ededeedf deee df dee	ee
f df de
ddfd!d"Zddd#d$e
dedeedf deee df de
ddfd%d&Zddddde	ee
f d'e	ee
f dedeedf deee df dee	ee
f df de
de
fd(d)Zddd*e	ee
f dedeedf de
de
f
d+d,Zddd-ededeedf de
de
f
d.d/Zddd0ededeedf de
de
f
d1d2Zddd3ededeedf de
de
f
d4d5Zddd3ededeedf de
de
f
d6d7Zddd3ededeedf de
de
f
d8d9Z  ZS );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                    s@  t    d| _zdd l}tjd| _|j| _	W n t
y+   td d| _Y d S w t| jtdk rBtd| j d d| _d| _|pMtd	pMt| _|pWttd
| _|p_td}|d u rmtd d| _n|| _| jdu rwd S zt| j d| j }|jst W d S  ty   td| j  Y d S w )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   ra   re   	importlibrN   versionr`   Ztrack_event&_LLMonitorCallbackHandler__track_eventImportErrorloggerwarningr   osgetenvDEFAULT_API_URLr]   boolr_   r^   requestsrE   okConnectionError	Exception)r   rb   rc   rd   re   Z_app_idres	__class__r   r   r      sX   
	

z!LLMonitorCallbackHandler.__init__)parent_run_idtagsrN   
serializedpromptsrun_idrx   ry   rN   kwargsc                   s   | j du rd S z[t|}t|}	|di   |di   dp- dp- d}
|
s9d dv r9d	}
 fd
dtD }t|}| jdd|t||rTt|nd |
|||||	| j	d W d S  t
y} } ztd|  W Y d }~d S d }~ww )NFinvocation_paramsr}   model
model_namemodel_id	anthropic_typeclaude-2c                    &   i | ]}  |d ur|  |qS r   rE   r0   paramparamsr   r   r3   6  
    
z9LLMonitorCallbackHandler.on_llm_start.<locals>.<dictcomp>llmstart
r   r|   rx   rR   r?   ry   extrarN   r   rb   z/[LLMonitor] An error occurred in on_llm_start: )ra   rO   rP   rE   rV   PARAMS_TO_CAPTURErD   ri   r*   r^   rt   warningswarn)r   rz   r{   r|   rx   ry   rN   r}   r   r   rR   r   r?   er   r   r   on_llm_start  sL   



z%LLMonitorCallbackHandler.on_llm_startrZ   c                   s   | j du rd S z]t|}t|}	|di   |di   dp- dp- d}
|
s9d dv r9d	}
 fd
dtD }t|d }| jdd|t||rVt|nd |
|||||	| j	d W d S  t
y } ztd|  W Y d }~d S d }~ww )NFr~   r}   r   r   r   r   r   r   c                    r   r   r   r   r   r   r   r3   o  r   z@LLMonitorCallbackHandler.on_chat_model_start.<locals>.<dictcomp>r   r   r   r   z6[LLMonitor] An error occurred in on_chat_model_start: )ra   rO   rP   rE   rV   r   r[   ri   r*   r^   rt   rk   error)r   rz   rZ   r|   rx   ry   rN   r}   r   r   rR   r   r?   r   r   r   r   on_chat_model_startO  sL   



z,LLMonitorCallbackHandler.on_chat_model_start)rx   responsec             
   K   s   | j du rd S z>|jpi di }dd |jd D }t|dkr%|d }| jddt||r2t|nd ||d	|d
d| jd W d S  ty` } zt	
d|  W Y d }~d S d }~ww )NFtoken_usagec                 S   s&   g | ]}t |d rt|jn|jqS rS   )r8   rY   rQ   rG   )r0   Z
generationr   r   r   r6     s    z7LLMonitorCallbackHandler.on_llm_end.<locals>.<listcomp>r   r>   r   endZprompt_tokensZcompletion_tokens)prompt
completion)r|   rx   rH   r   rb   z-[LLMonitor] An error occurred in on_llm_end: )ra   Z
llm_outputrE   ZgenerationsrC   ri   r*   r^   rt   rk   r   )r   r   r|   rx   r}   r   Zparsed_outputr   r   r   r   
on_llm_end  s0   
z#LLMonitorCallbackHandler.on_llm_end	input_strc                K   s   | j du rd S z)t|}t|}	|d}
| jdd|t||r#t|nd |
||||	| jd W d S  tyK } zt	d|  W Y d }~d S d }~ww )NFrR   toolr   	r   r|   rx   rR   r?   ry   rN   r   rb   z0[LLMonitor] An error occurred in on_tool_start: )
ra   rO   rP   rE   ri   r*   r^   rt   rk   r   )r   rz   r   r|   rx   ry   rN   r}   r   r   rR   r   r   r   r   on_tool_start  s.   

z&LLMonitorCallbackHandler.on_tool_start)rx   ry   rH   c             
   K   s|   t |}| jdu rd S z| jddt ||rt |nd || jd W d S  ty= } ztd|  W Y d }~d S d }~ww )NFr   r   r|   rx   rH   rb   z.[LLMonitor] An error occurred in on_tool_end: )r*   ra   ri   r^   rt   rk   r   )r   rH   r|   rx   ry   r}   r   r   r   r   on_tool_end  s    	
z$LLMonitorCallbackHandler.on_tool_endr@   c                K   s  | j du rd S z^|dg dd }d}	|pi }|d}
|
d u r&|d}
|dks.|d	kr0d
}	|
d ur8d
}	|
}|d ur>d}	t|}t|}t|}| j|	d|t||rXt|nd |||||| jd W d S  ty } zt	
d|  W Y d }~d S d }~ww )NFid)NNNN   chainZ
agent_name	agentNameZAgentExecutorZPlanAndExecuteagentr   r   z1[LLMonitor] An error occurred in on_chain_start: )ra   rE   rO   rP   rD   ri   r*   r^   rt   rk   r   )r   rz   r@   r|   rx   ry   rN   r}   rR   rU   r   r   r   r?   r   r   r   r   on_chain_start  sH   


z'LLMonitorCallbackHandler.on_chain_startoutputsc             
   K   s|   | j du rd S zt|}| jddt||rt|nd || jd W d S  ty= } ztd|  W Y d }~d S d }~ww )NFr   r   r   z/[LLMonitor] An error occurred in on_chain_end: )ra   rJ   ri   r*   r^   rt   rk   r   )r   r   r|   rx   r}   rH   r   r   r   r   on_chain_end  s    
z%LLMonitorCallbackHandler.on_chain_endactionc             
   K   s   | j du rd S z |j}t|j}| jddt||rt|nd ||| jd W d S  tyB } zt	d|  W Y d }~d S d }~ww )NFr   r   )r|   rx   rR   r?   rb   z2[LLMonitor] An error occurred in on_agent_action: )
ra   r   rD   Z
tool_inputri   r*   r^   rt   rk   r   )r   r   r|   rx   r}   rR   r?   r   r   r   r   on_agent_action4  s$   

	z(LLMonitorCallbackHandler.on_agent_actionfinishc             
   K   s~   | j du rd S zt|j}| jddt||rt|nd || jd W d S  ty> } ztd|  W Y d }~d S d }~ww )NFr   r   r   z2[LLMonitor] An error occurred in on_agent_finish: )	ra   rJ   Zreturn_valuesri   r*   r^   rt   rk   r   )r   r   r|   rx   r}   rH   r   r   r   r   on_agent_finishN  s    

z(LLMonitorCallbackHandler.on_agent_finishr   c             
   K      | j du rd S z| jddt||rt|nd t|t d| jd W d S  ty@ } ztd|  W Y d }~d S d }~ww )NFr   r   rQ   stackr|   rx   r   rb   z1[LLMonitor] An error occurred in on_chain_error: 	ra   ri   r*   	traceback
format_excr^   rt   rk   r   r   r   r|   rx   r}   r   r   r   r   on_chain_errorf     
z'LLMonitorCallbackHandler.on_chain_errorc             
   K   r   )NFr   r   r   r   z0[LLMonitor] An error occurred in on_tool_error: r   r   r   r   r   on_tool_error|  r   z&LLMonitorCallbackHandler.on_tool_errorc             
   K   r   )NFr   r   r   r   z/[LLMonitor] An error occurred in on_llm_error: r   r   r   r   r   on_llm_error  r   z%LLMonitorCallbackHandler.on_llm_error)NNF)r&   r'   r(   r)   r*   __annotations__rp   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   rv   r   r\      s  
 

D

	

>


	

>

.

	

'




	

7











r\   r   )1importlib.metadatarg   loggingrm   r   r   contextvarsr   typingr   r   r   r   r   uuidr   rq   Zlangchain_core.agentsr	   r
   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   Zlangchain_core.outputsr   Zpackaging.versionr   	getLoggerr&   rk   ro   r*   r   r   r   r   r+   r/   rD   r:   rJ   rM   rO   rP   rY   r[   r\   __all__r   r   r   r   <module>   sL    
(
	*   u