o
    i3                     @   sX  d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	m
Z
mZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ zd d	lmZ d d
lmZ W n eyU   edw G dd deZd6ddZd7ddZd8ddZd9ddZd9dd Z d9d!d"Z!	#		$			d:d%d&Z"d;d(d)Z#d<d*d+Z$d=d.d/Z%d=d0d1Z&	,		#		2		3			d>d4d5Z'dS )?    wraps)AnyCallableListOptionalN)set_data_normalizednormalize_message_rolestruncate_and_annotate_messages)OPSPANDATA)DidNotEnableIntegration)should_send_default_pii)safe_serialize)
StateGraph)Pregelzlanggraph not installedc                   @   s@   e Zd ZdZde Zddd deddfdd	Zedd
dZdS )LanggraphIntegration	langgraphzauto.ai.Tselfinclude_promptsreturnNc                 C   s
   || _ d S )N)r   )r   r    r   ^/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/sentry_sdk/integrations/langgraph.py__init__   s   
zLanggraphIntegration.__init__c                   C   s@   t tjt_ttdrttjt_ttdrttjt_d S d S )Ninvokeainvoke)	_wrap_state_graph_compiler   compilehasattrr   _wrap_pregel_invoker   _wrap_pregel_ainvoker   r   r   r   r   
setup_once   s   	

zLanggraphIntegration.setup_once)T)r   N)	__name__
__module____qualname__
identifieroriginboolr   staticmethodr"   r   r   r   r   r      s    
r   	graph_objr   r   Optional[str]c                 C   s8   dD ]}t | |rt| |}|rt|tr|  S qd S )N)name
graph_namer#   _name)r   getattr
isinstancestr)r*   attrr,   r   r   r   _get_graph_name.   s   

r3   messagec                 C   sT   t | dsd S t| dd | jd}dD ]}t | |r't| |}|d ur'|||< q|S )Ncontenttype)roler5   )r,   
tool_callsfunction_calltool_call_idresponse_metadata)r   r/   r5   )r4   parsedr2   valuer   r   r   _normalize_langgraph_message7   s   


r>   stateOptional[List[Any]]c              	   C   s   | sd S d }t | tr| d}n$t| dr| j}nt| dr5t| jr5z| d}W n	 ty4   Y nw |r>t |ttfs@d S g }|D ]}zt	|}|rR|
| W qD ty\   Y qDw |ra|S d S )Nmessagesget)r0   dictrB   r   rA   callable	Exceptionlisttupler>   append)r?   rA   normalized_messagesr4   
normalizedr   r   r   _parse_langgraph_messagesL   s4   


rK   fCallable[..., Any]c                       t  d fdd}|S )	Nr   r   argskwargsr   c                    sj  t  t}|d u r | g|R i |S t jtjtjd} | g|R i |}t|dd }|	t
jd |	t
j| |rHd| |_nd|_|dd d ur]|	t
j|d d }t|dd }|rt|r| }	t|	dd }
|
rt|
tr|
d}|rt|d	d }|rt|d
rt|j }|d ur|	t
j| |W  d    S 1 sw   Y  d S )N)opr'   r,   create_agentzcreate_agent model	get_graphnodestoolsdatatools_by_name)
sentry_sdk
get_clientget_integrationr   
start_spanr   GEN_AI_CREATE_AGENTr'   r/   set_datar   GEN_AI_OPERATION_NAMEGEN_AI_AGENT_NAMEdescriptionrB   GEN_AI_REQUEST_MODELrD   rT   r0   rC   r   rF   rX   keysGEN_AI_REQUEST_AVAILABLE_TOOLS)r   rO   rP   integrationspancompiled_graphcompiled_graph_namerV   rT   r*   rU   
tools_noderW   rL   r   r   new_compilel   s@   
$z._wrap_state_graph_compile.<locals>.new_compiler   r   rO   r   rP   r   r   r   r   )rL   rk   r   rj   r   r   k   s   'r   c                    rN   )	Nr   r   rO   rP   r   c                    s:  t  t}|d u r | g|R i |S t| }|r#d|  nd}t jtj|tj	dd}|r@|
tj| |
tj| |
tjd d }t|dkrxt rx|jrxt|d }|rxt|}t  }	t|||	}
|
d urxt|tj|
dd  | g|R i |}t|||| |W  d    S 1 sw   Y  d S Nzinvoke_agent invoke_agent)rQ   r,   r'   r   FunpackrY   rZ   r[   r   r3   stripr\   r   GEN_AI_INVOKE_AGENTr'   r^   r   GEN_AI_PIPELINE_NAMEr`   r_   lenr   r   rK   r	   get_current_scoper
   r   GEN_AI_REQUEST_MESSAGES_set_response_attributesr   rO   rP   re   r-   	span_namerf   input_messagesnormalized_input_messagesscopemessages_dataresultrj   r   r   
new_invoke   sP   $z'_wrap_pregel_invoke.<locals>.new_invokerl   r   )rL   r   r   rj   r   r       s   1r    c                    rN   )	Nr   r   rO   rP   r   c                    sH  t  t}|d u r | g|R i |I d H S t| }|r'd|  nd}t jtj|tj	dg}|rD|
tj| |
tj| |
tjd d }t|dkr|t r||jr|t|d }|r|t|}t  }	t|||	}
|
d ur|t|tj|
dd  | g|R i |I d H }t|||| |W  d    S 1 sw   Y  d S rm   rq   ry   rj   r   r   new_ainvoke   sR   $z)_wrap_pregel_ainvoke.<locals>.new_ainvokerl   r   )rL   r   r   rj   r   r!      s   0r!   r{   output_messagesc                 C   s@   |sdS | s|S t | }t ||kr||d ng }|r|S dS )z;Extract only the new messages added during this invocation.N)ru   )r{   r   input_countnew_messagesr   r   r   _get_new_messages  s   r   rA   c                 C   sV   | sd S t | D ] }t|tr(|d}|dv r(|d}|r(t|tr(|  S qd S )Nr7   )	assistantair5   )reversedr0   rC   rB   r1   )rA   r4   r7   r5   r   r   r   _extract_llm_response_text  s   


r   c                 C   sN   | sd S g }| D ]}t |tr |d}|r t |tr || q|r%|S d S )Nr8   )r0   rC   rB   rF   extend)rA   r8   r4   msg_tool_callsr   r   r   _extract_tool_calls$  s   


r   rf   sentry_sdk.tracing.Spanc                 C   s   d}d}d}|D ]2}| d}|d u rq| d}|sq|t| dd7 }|t| dd7 }|t| dd7 }q|dkrF| tj| |dkrQ| tj| |dkr^| tj| d S d S )Nr   r;   token_usageprompt_tokenscompletion_tokenstotal_tokens)rB   intr^   r   GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rf   rA   input_tokensoutput_tokensr   r4   r;   r   r   r   r   _set_usage_data2  s.   

r   c                 C   sV   t |dkrd S |d }|d}|d u rd S |d}|d u r"d S t| tj| d S )Nr   r;   
model_name)ru   rB   r   r   GEN_AI_RESPONSE_MODEL)rf   rA   last_messager;   r   r   r   r   _set_response_model_nameQ  s   

r   r   re   c                 C   s   t |}t||}|d u rd S t| | t| | t r|js!d S t|}|r/t| tj	| n|r9t| tj	| nt| tj	| t
|}|rSt| tjt|dd d S d S )NFro   )rK   r   r   r   r   r   r   r   r   GEN_AI_RESPONSE_TEXTr   GEN_AI_RESPONSE_TOOL_CALLSr   )rf   r{   r   re   parsed_response_messagesr   llm_response_textr8   r   r   r   rx   a  s.   



rx   )r*   r   r   r+   )r4   r   r   r   )r?   r   r   r@   )rL   rM   r   rM   )r{   r@   r   r@   r   r@   )rA   r@   r   r+   )rA   r@   r   r@   )rf   r   rA   r   r   N)
rf   r   r{   r@   r   r   re   r   r   N)(	functoolsr   typingr   r   r   r   rY   sentry_sdk.ai.utilsr   r	   r
   sentry_sdk.constsr   r   sentry_sdk.integrationsr   r   sentry_sdk.scoper   sentry_sdk.utilsr   langgraph.graphr   langgraph.pregelr   ImportErrorr   r3   r>   rK   r   r    r!   r   r   r   r   r   rx   r   r   r   r   <module>   sV    

	


,
65




