o
    i                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d	efd
dZeeZedi  d	eeef fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Z dS )%    N)config)unwrap)wrap)
get_logger)get_argument_value)CrewAIIntegration)tracerreturnc                   C   s   t tddS )N__version__ )getattrcrewai r   r   Y/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/crewai/patch.pyget_version   s   r   r   c                   C   s   ddiS )Nr   z>=0.102r   r   r   r   r   _supported_versions   s   r   c           	      C   s   t j}d }t|dd}t|dd}|jdddd||d	}z.z	| |i |}W n ty5   |jt    w W ||d
< |j||||dd |	  |S ||d
< |j||||dd |	  w )Nidr   planningFzCrew KickoffzCrewAI CrewTcrew)	span_namesubmit_to_llmobs	operationinstance_idr   _dd.instanceargskwargsresponser   )
r   _datadog_integrationr   trace	Exceptionset_exc_infosysexc_infollmobs_set_tagsfinish)	funcinstancer   r   integrationresultr   planning_enabledspanr   r   r   traced_kickoff   s4   
r,   c                 C   s   t j}d }|jdt|ddd|jdt|dd d}z9z	| |i |}W n ty2   |jt    w W t|dd r?t	|d ||d< |j
||||dd	 |  |S t|dd r^t	|d ||d< |j
||||dd	 |  w )
NzCrewAI Tasknamer   taskT_ddtrace_ctx)r   r   r   r   r/   r   r   )r   r   r   r   r   r    r!   r"   r#   delattrr$   r%   r&   r'   r   r   r(   r)   r+   r   r   r   traced_task_execute5   s8   




r2   c                 C   s(   t j}| }t|d| | |i |S )Nr/   )r   r   _get_current_ctxsetattr)r&   r'   r   r   r(   r/   r   r   r   traced_task_execute_asyncN   s   r5   c                 C   s.   t j}t }| |i |}|||| |S N)r   r   r   current_span_llmobs_set_span_link_on_task)r&   r'   r   r   r(   r+   r)   r   r   r   traced_task_get_contextU   s
   r9   c                 C      t j}d }|jdt|ddddd}z.z	| |i |}W n ty+   |jt    w W ||d< |j||||dd |	  |S ||d< |j||||dd |	  w )	NzCrewAI Agentroler   agentTr   r   r   r   r   
r   r   r   r   r    r!   r"   r#   r$   r%   r1   r   r   r   traced_agent_execute]   &   
r?   c                 C   r:   )	NzCrewAI Toolr-   r   toolTr=   r   r   r>   r1   r   r   r   traced_tool_runo   r@   rB   c                    sz   t j}tt|dd}|jd|ddd}| |i |I d H }|j||||dd |W  d    S 1 s6w   Y  d S )N__name__zCrewAI FlowflowTr=   r   )r   r   r   typer   r$   )r&   r'   r   r   r(   r   r+   r)   r   r   r   traced_flow_kickoff   s   $rF   c           
         s   t j}t||ddddpd}|jd|dd|dA}t|d	i }i }t|tr,i |}n	t|d
r5| }| |i |I d H }	||d< ||d< |j	||||	dd |	W  d    S 1 s]w   Y  d S )Nr   method_nameT)optionalzFlow MethodzCrewAI Flow Methodflow_method)r   r   r   flow_instancestate
model_dumpr   z_dd.initial_flow_stater   )
r   r   r   r   r   
isinstancedicthasattrrL   r$   )
r&   r'   r   r   r(   r   r+   
flow_stateinitial_flow_stater)   r   r   r   traced_flow_method   s.   


$rR   c                 C   s0   t j}| |i |}t }||||| |S r6   )r   r   r   r7   llmobs_set_span_links_on_flow)r&   r'   r   r   r(   r)   r7   r   r   r   patched_find_triggered_methods   s
   rT   c                  C   s   t tddrd S dt_ttjd} | t_ttdt ttdt ttdt	 ttj
jdt ttd	t zttd
t ttdt ttdt ttdt W d S  ty^   td Y d S w )N_datadog_patchFT)integration_configzCrew.kickoffzTask.execute_asynczAgent.execute_taskzCrewStructuredTool.invokezFlow.kickoff_asynczCrew._get_contextzTask._execute_corezFlow._execute_methodzFlow._find_triggered_methodsz(Failed to patch internal CrewAI methods.)r   r   rU   r   r   r   r   r,   r5   r?   toolsstructured_toolrB   rF   r9   r2   rR   rT   AttributeErrorloggerwarning)r(   r   r   r   patch   s$   r\   c                   C   s   t tddsd S dt_ttjd ttjd ttjd ttjjj	d ttj
d zttjd ttjd	 ttj
d
 ttj
d W n	 tyN   Y nw ttd d S )NrU   Fkickoffexecute_asyncexecute_taskinvokekickoff_async_get_context_execute_core_execute_method_find_triggered_methodsr   )r   r   rU   r   CrewTaskAgentrW   rX   CrewStructuredToolFlowrY   r0   r   r   r   r   unpatch   s"   rk   )!r"   r   ddtracer   $ddtrace.contrib.internal.trace_utilsr   r   ddtrace.internal.loggerr   ddtrace.internal.utilsr   #ddtrace.llmobs._integrations.crewair   ddtrace.tracer   strr   rC   rZ   _addrN   r   r,   r2   r5   r9   r?   rB   rF   rR   rT   r\   rk   r   r   r   r   <module>   s0    	