o
    ȳgKP                     @   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)temperaturetop_ptop_kstoppresence_penaltyfrequence_penaltyseedfunction_call	functionstoolstool_choiceresponse_format
max_tokens
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(   l/var/www/html/chatdoc2/venv/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,   r0   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   

r6   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(   r9   )r;   elementr(   r(   r)   
<listcomp>N       z_serialize.<locals>.<listcomp>)hasattrr8   
isinstancedictitemslist)r7   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)rD   rG   len_parse_inputrE   r:   get)rH   input_valueinputs_valuequestion_valuequery_valuer(   r(   r)   rO   S   s&   




rO   
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outputoutput_textanswerresult)rD   rE   r:   rP   )rU   
text_valueoutput_valueoutput_text_valueanswer_valueresult_valuer(   r(   r)   _parse_outputo   s(   





r`   rolec                 C   s   | dkrdS | S )Nhumanuserr(   )ra   r(   r(   r)   _parse_lc_role   s   rd   metadatac                 C   s<   t  d ur
t  S | pi } | d}|d u r| d}|S )Nr!   userId)r   rP   )re   r!   r(   r(   r)   _get_user_id   s   

rg   c                 C   s(   t  d ur
t  S | pi } | dd S )Nr"   )r   rP   )re   r(   r(   r)   _get_user_props   s   rh   messagec                    s6   g d} j t jd}| fdd|D  |S )N)r   
tool_callstool_call_idname)rV   ra   c                    s0   i | ]} j |d ur|tt j |qS r$   )additional_kwargsrP   r   r   )r;   r<   ri   r(   r)   r>      s
    z%_parse_lc_message.<locals>.<dictcomp>)contentrd   typeupdate)ri   keysparsedr(   rn   r)   _parse_lc_message   s   
rt   messagesc                 C   s   dd | D S )Nc                 S   r?   r(   )rt   )r;   ri   r(   r(   r)   rA      rB   z&_parse_lc_messages.<locals>.<listcomp>r(   )ru   r(   r(   r)   _parse_lc_messages   s   rv   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`LLMONITOR_API_URLLLMONITOR_VERBOSE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|   r   	importlibre   versionr{   track_event&_LLMonitorCallbackHandler__track_eventImportErrorloggerwarningr   osgetenvDEFAULT_API_URLrx   boolrz   ry   requestsrP   okConnectionError	Exception)r'   r}   r~   r   r   _app_idres	__class__r(   r)   r*      sX   
	

z!LLMonitorCallbackHandler.__init__)parent_run_idtagsre   
serializedpromptsrun_idr   r   re   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$   rP   r;   paramparamsr(   r)   r>   6  
    
z9LLMonitorCallbackHandler.on_llm_start.<locals>.<dictcomp>llmstart
r!   r   r   rl   rJ   r   extrare   r"   r}   z/[LLMonitor] An error occurred in on_llm_start: )r|   rg   rh   rP   rq   PARAMS_TO_CAPTURErO   r   r5   ry   r   warningswarn)r'   r   r   r   r   r   re   r   r!   r"   rl   r   rJ   er(   r   r)   on_llm_start  sL   



z%LLMonitorCallbackHandler.on_llm_startru   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)   r>   o  r   z@LLMonitorCallbackHandler.on_chat_model_start.<locals>.<dictcomp>r   r   r   r   z6[LLMonitor] An error occurred in on_chat_model_start: )r|   rg   rh   rP   rq   r   rv   r   r5   ry   r   r   error)r'   r   ru   r   r   r   re   r   r!   r"   rl   r   rJ   r   r(   r   r)   on_chat_model_startO  sL   



z,LLMonitorCallbackHandler.on_chat_model_start)r   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 rn   )rC   rt   ri   rV   )r;   
generationr(   r(   r)   rA     s    z7LLMonitorCallbackHandler.on_llm_end.<locals>.<listcomp>r   rI   r   endprompt_tokenscompletion_tokens)prompt
completion)r   r   rW   r   r}   z-[LLMonitor] An error occurred in on_llm_end: )r|   
llm_outputrP   generationsrN   r   r5   ry   r   r   r   )r'   r   r   r   r   r   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 )NFrl   toolr   	r!   r   r   rl   rJ   r   re   r"   r}   z0[LLMonitor] An error occurred in on_tool_start: )
r|   rg   rh   rP   r   r5   ry   r   r   r   )r'   r   r   r   r   r   re   r   r!   r"   rl   r   r(   r(   r)   on_tool_start  s.   

z&LLMonitorCallbackHandler.on_tool_start)r   r   rW   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   r   rW   r}   z.[LLMonitor] An error occurred in on_tool_end: )r5   r|   r   ry   r   r   r   )r'   rW   r   r   r   r   r   r(   r(   r)   on_tool_end  s    	
z$LLMonitorCallbackHandler.on_tool_endrK   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   chain
agent_name	agentNameAgentExecutorPlanAndExecuteagentr   r   z1[LLMonitor] An error occurred in on_chain_start: )r|   rP   rg   rh   rO   r   r5   ry   r   r   r   )r'   r   rK   r   r   r   re   r   rl   rp   r   r!   r"   rJ   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: )r|   r`   r   r5   ry   r   r   r   )r'   r   r   r   r   rW   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   r   rl   rJ   r}   z2[LLMonitor] An error occurred in on_agent_action: )
r|   r   rO   
tool_inputr   r5   ry   r   r   r   )r'   r   r   r   r   rl   rJ   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: )	r|   r`   return_valuesr   r5   ry   r   r   r   )r'   r   r   r   r   rW   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   ri   stackr   r   r   r}   z1[LLMonitor] An error occurred in on_chain_error: 	r|   r   r5   	traceback
format_excry   r   r   r   r'   r   r   r   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)r1   r2   r3   r4   r5   __annotations__r   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(   r   r)   rw      s  
 

D

	

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

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

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

7











rw   r$   )1importlib.metadatar   loggingr   r   r   contextvarsr   typingr   r   r   r   r   uuidr   r   langchain_core.agentsr	   r
   langchain_core.callbacksr   langchain_core.messagesr   langchain_core.outputsr   packaging.versionr   	getLoggerr1   r   r   r5   r   r   r   r    r6   r:   rO   rE   r`   rd   rg   rh   rt   rv   rw   __all__r(   r(   r(   r)   <module>   sL    
(
	*   u