o
    i                     @   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 d dlmZ d dlm	Z	 d dlm
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 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 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 dl(m.Z. d dl(m/Z/ d dl(m0Z0 d dl(m1Z1 d dl(m2Z2 d d l3m4Z4 d d!l3m5Z5 d d"l3m6Z6 d d#l3m7Z7 d d$l3m8Z8 d d%l3m9Z9 d d&l3m:Z: d d'l3m;Z; d d(l<m=Z= d d)l>m?Z? d d*l@mAZA d d+l@mBZB d d,lCmDZD eeEZFG d-d. d.ed/d0ZGG d1d2 d2ed/d0ZHG d3d4 d4eHZIG d5d6 d6ed/d0ZJG d7d8 d8ed/d0ZKdHd9eeL d:eLfd;d<ZMG d=d> d>eZNG d?d@ d@eNZOG dAdB dBeNZPG dCdD dDeNZQdEeId:eIfdFdGZRdS )I    N)Any)Optional)	TypedDict)Union)cast)quote)urlparse)config)agent)EVP_EVENT_SIZE_LIMIT)EVP_PAYLOAD_SIZE_LIMITEVP_PROXY_AGENT_BASE_PATH)EVP_SUBDOMAIN_HEADER_NAME)
get_logger)PeriodicService)RLock)Response)
RetryError)fibonacci_backoff_with_jitter)
_telemetry)AGENTLESS_EVAL_BASE_URL)AGENTLESS_EXP_BASE_URL)AGENTLESS_SPAN_BASE_URL)DROPPED_IO_COLLECTION_ERROR)DROPPED_VALUE_TEXT)EVAL_ENDPOINT)EVAL_SUBDOMAIN_NAME)EXP_SUBDOMAIN_NAME)SPAN_ENDPOINT)SPAN_SUBDOMAIN_NAME)
ConfigType)Dataset)DatasetRecord)DatasetRecordRaw)
Experiment)JSONType)Project)UpdatableDatasetRecord)get_connection)	safe_json)_Meta)	_SpanLink)__version__c                   @   s~   e Zd ZU dZeed< eed< eed< eed< eed< eeef ed< eeef ed< ee	 ed	< e
ed
< eed< eed< dS )LLMObsSpanDataz4Structure of LLMObs span data attached to APM spans.name	parent_idtrace_idml_app
session_idtagsmetrics
span_linksr	   is_evaluation_spanmetaN)__name__
__module____qualname____doc__str__annotations__dictr   listr,   r!   boolr+    rB   rB   J/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_writer.pyr.   9   s   
 r.   F)totalc                   @   sF   e Zd ZU eed< eed< eed< ee ed< ee ed< eed< dS )_LLMObsSpanEventOptionalr3   servicestatus_messagecollection_errorsr6   r	   N)r9   r:   r;   r=   r>   r@   r,   r!   rB   rB   rB   rC   rE   I   s   
 rE   c                   @   sz   e Zd ZU eed< eed< eed< ee ed< eed< eed< eed< eed< eed	< eee	f ed
< eeef ed< dS )LLMObsSpanEventspan_idr1   r0   r4   r/   start_nsdurationstatusr8   r5   _ddN)
r9   r:   r;   r=   r>   r@   intr+   r?   r   rB   rB   rB   rC   rI   R   s   
 rI   c                   @   s   e Zd ZU eeeeef f ed< eed< eed< eed< eed< eed< eed< eed< eed	< e	e ed
< eed< eed< dS )LLMObsEvaluationMetricEventjoin_onmetric_typelabelcategorical_valuenumerical_valuescore_valueboolean_valuer2   timestamp_msr4   
assessment	reasoningN)
r9   r:   r;   r?   r=   r>   floatrA   rO   r@   rB   rB   rB   rC   rP   `   s   
 rP   c                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< eee	f ed
< e
eeef  ed< ee ed< eed< eed< eed< eee	f ed< dS )LLMObsExperimentEvalMetricEventmetric_sourcerJ   r1   rX   rR   rS   rT   rV   rW   
json_valueerrorr4   experiment_idrZ   rY   metadataN)r9   r:   r;   r=   r>   rO   r[   rA   r?   r&   r   r@   rB   rB   rB   rC   r\   o   s"   
 r\   user_defined_agentless_enabledreturnc                 C   s\   | dur| S zt  }W n ty   d}Y nw |du rdS |dg }tdd |D  S )zUDetermine whether to use agentless mode based on agent availability and capabilities.NT	endpointsc                 s   s    | ]}t |v V  qd S Nr   ).0endpointrB   rB   rC   	<genexpr>   s    z'should_use_agentless.<locals>.<genexpr>)r
   info	Exceptiongetany)rb   
agent_inford   rB   rB   rC   should_use_agentless   s   rn   c                       s   e Zd ZdZdZdZdZdZdZdZ	dddde
dddfdededed	ed
ededede
ddf fddZ fddZd* fdd	Zdd Zdeeef deddfddZdd Zd+ddZd ed!efd"d#Zedefd$d%Zd&d' Zd(d) Z  ZS ),BaseLLMObsWriterzBBase writer class for submitting data to Datadog LLMObs endpoints.   i   r/   _idintervaltimeoutis_agentless_site_api_key_app_key_override_url_default_projectrc   Nc	           
         sH  t t| j|d t | _g | _d| _|| _|ptj	| _
|p tj| _|| _|p-tjdd| _|| _|| _| jpE|rC| j d| j ntj| _|rL| jnt | j | _t| j}	| jrm|	jdkrm|	jdvrm| jd| _d	d
i| _|r| j
| jd< | jr| j| jd< n| j | jt!< t"| j#d| j$ d| j#  d dd d| j%| _&d S )N)rt   r   DD_LLMOBS_OVERRIDE_ORIGINrq   .unix)/rq   r   Content-Typeapplication/json
DD-API-KEYDD-APPLICATION-KEY-?S?   c                 S   s
   t | tS re   )
isinstancer   resultrB   rB   rC   <lambda>   s   
 z+BaseLLMObsWriter.__init__.<locals>.<lambda>attemptsinitial_waituntil)'superro   __init__r   _lock_buffer_buffer_size_timeoutr	   _dd_api_keyrx   _dd_siterw   ry   osenvironrk   rz   r{   
_agentlessAGENTLESS_BASE_URLagent_configtrace_agent_url_intakeENDPOINTr   	_endpointr   schemepathlstrip_headersEVP_SUBDOMAIN_HEADER_VALUEr   r   RETRY_ATTEMPTSrt   _send_payload_send_payload_with_retry)
selfrt   ru   rv   rw   rx   ry   rz   r{   override_url_parsed	__class__rB   rC   r      s@   


zBaseLLMObsWriter.__init__c                    s2   t t|   td| jj| j t	| j
 d S )Nzstarted %r to %r)r   ro   startloggerdebugr   r9   _urlatexitregisteron_shutdown)r   argskwargsr   rB   rC   r      s   zBaseLLMObsWriter.startc                    s6   t t| j|d td| jj| j t	| j
 d S )Nru   zstopped %r to %r)r   ro   stopr   r   r   r9   r   r   
unregisterr   )r   ru   r   rB   rC   r      s   zBaseLLMObsWriter.stopc                 C   s   |    d S re   )periodicr   rB   rB   rC   r      s   zBaseLLMObsWriter.on_shutdownevent
event_sizec                 C   s   | j J t| j| jkr(td| jj| j tj	d| j
dd 	 W d   dS | j| tkr8td |   | j| |  j|7  _W d   dS 1 sPw   Y  dS )zOInternal shared logic of enqueuing events to be submitted to LLM Observability.z2%r event buffer full (limit is %d), dropping event   buffer_full
event_typer_   NzRmanually flushing buffer because queueing next event will exceed EVP payload limit)r   lenr   BUFFER_LIMITr   warningr   r9   	telemetryrecord_dropped_payload
EVENT_TYPEr   r   r   r   appendr   r   r   rB   rB   rC   _enqueue   s   
"zBaseLLMObsWriter._enqueuec              	   C   sZ   zt |}td|| j |W S  ty,   tjd|| jdd tj|| jdd Y d S w )Nz&encoded %d LLMObs %s events to be sentz$failed to encode %d LLMObs %s eventsT)exc_infoencoding_errorr   )r*   r   r   r   	TypeErrorr_   r   r   )r   payload
num_eventsenc_llm_eventsrB   rB   rC   _encode   s   zBaseLLMObsWriter._encodec                 C   s   | j  | js	 W d    d S | j}g | _d| _W d    n1 s#w   Y  | jr8| jds8td d S | |}| 	|t
|}|sId S z| |t
| W d S  tyz   tjt
|| jdd tjdt
|| j| jddd	id
 Y d S w )Nr   r   zA Datadog API key is required for sending data to LLM Observability in agentless mode. LLM Observability data will not be sent. Ensure an API key is set either via DD_API_KEY or via `LLMObs.enable(api_key=...)` before running your application.connection_errorr   (failed to send %d LLMObs %s events to %sTsend_to_telemetryFr   extra)r   r   r   r   r   rk   r   r   _datar   r   r   rj   r   r   r   r_   r   )r   eventsdatar   rB   rB   rC   r      s<   
zBaseLLMObsWriter.periodicr   r   c                 C   s   t | j}z]zE|d| j|| j | }|jdkr7tjd|| j	| j
|j| ddid tj|| j	dd n
td	|| j	| j
 t|W W |  S  tyb   tjd
|| j	| jdddid  w |  w )NPOSTi,  zJfailed to send %d LLMObs %s events to %s, got response code %d, status: %sr   F)r   
http_errorr   zsent %d LLMObs %s events to %sr   Tr   )r)   r   requestr   r   getresponserM   r   r_   r   r   readr   r   r   r   from_http_responsecloserj   )r   r   r   connresprB   rB   rC   r     s<   

	

zBaseLLMObsWriter._send_payloadc                 C   s   | j  | j S re   )r   r   r   rB   rB   rC   r   6  s   zBaseLLMObsWriter._urlc                 C   s   t )zRReturn payload containing events to be encoded and submitted to LLM Observability.)NotImplementedErrorr   r   rB   rB   rC   r   :  s   zBaseLLMObsWriter._datac                 C   s"   | j | j| j| j| j| j| jdS )N)rt   ru   rv   rw   rx   rz   )r   	_intervalr   r   rw   rx   rz   r   rB   rB   rC   recreate>  s   zBaseLLMObsWriter.recreatere   )rc   N) r9   r:   r;   r<   r   r   r   r   r   r   r'   r[   rA   r=   r   r   r   r   r   rI   rP   rO   r   r   r   bytesr   propertyr   r   r   __classcell__rB   rB   r   rC   ro      sV    
	
1

  ro   c                   @   sP   e Zd ZdZdZeZeZe	Z
deddfddZdee deeef fd	d
ZdS )LLMObsEvalMetricWriterzDWrites custom evaluation metric events to the LLMObs Evals Endpoint.evaluation_metricr   rc   Nc                 C   s   t t|}| || d S re   )r   r*   r   r   rB   rB   rC   enqueueQ  s   zLLMObsEvalMetricWriter.enqueuer   c                 C   s   ddd|idiS )Nr   r   r5   type
attributesrB   r   rB   rB   rC   r   U  s   zLLMObsEvalMetricWriter._data)r9   r:   r;   r<   r   r   r   r   r   r   r   rP   r   r@   r?   r=   r   r   rB   rB   rB   rC   r   I  s    "r   c                   @   s  e Zd ZdZeZeZdZdZ	dZ
dZdhZde	fded	ed
edefddZeejde	 dej  d dd dde	fded	ed
edefddZdeeef fddZdQded	eded
edef
ddZdeddfddZd ed!ee d"edefd#d$Zed%ee e!f d&e"defd'd(Z#	)	)dRded*ed+e$e! d,e$e  d-e$e d.e"d/e"de%e&e$e e$ee  f fd0d1Z'			dSd ed!ee d2ee& d3ee$e  def
d4d5Z(dTded6e$e) d.e"fd7d8Z*dUd9ee de+fd:d;Z,dUd<ed=eeeef  dd>fd?d@Z-	A				B	)dVd9eded*edCe&dDeeeef  d3ee$e  d"ee dEee& dFe"de%eef fdGdHZ.		dWdIedJee dKee ddfdLdMZ/dIedNe$e0 d3e$e ddfdOdPZ1dS )XLLMObsExperimentsClient
experimentrq   g      $@g      N@   csvNmethodr   bodyrc   c              
   C   sT   z	|  ||||W S  ty) } zt|jd tr$|jd W  Y d }~S  d }~ww )Nr   )_request_with_retryr   r   r   r   )r   r   r   r   ru   erB   rB   rC   r   c  s   zLLMObsExperimentsClient.requestr   r   r   c                 C   s   t | to	| jdk S )Ni  )r   r   rM   r   rB   rB   rC   r   p      z LLMObsExperimentsClient.<lambda>r   c           
      C   s   d| j | jd}| js| j|t< |rt|dnd}t| j	|d}z$| j	| j
 | }td| ||||| | }	t|	W |  S |  w )Nr   r   r   r   utf-8    urlru   zrequesting %s)rx   ry   r   r   r   jsondumpsencoder)   r   r   r   r   r   r   r   r   r   )
r   r   r   r   ru   headersencoded_bodyr   r   r   rB   rB   rC   r   l  s   

z+LLMObsExperimentsClient._request_with_retry
evaluationc                 C   sJ   d}| j d|ddd|idid}|jdkr#td	|d
  d|j d S )Nz1/api/unstable/llm-obs/v1/config/evaluators/customPUTr   evaluator_configr  r   r      zFailed to publish evaluator 	eval_name: )r   rM   
ValueError)r   r  r   r   rB   rB   rC   publish_custom_evaluator  s   
z0LLMObsExperimentsClient.publish_custom_evaluatorr   content_typec           	      C   sv   || j | jd}t| j| jd}z%| j| j | }td|| ||||| |	 }t
|W |  S |  w )Nr   r   zrequesting %s, %s)rx   ry   r)   r   BULK_UPLOAD_TIMEOUTr   r   r   r   r   r   r   r   )	r   r   r   r
  r   r   r   r   r   rB   rB   rC   multipart_request  s   
z)LLMObsExperimentsClient.multipart_request
dataset_idc                 C   sL   d}| j d|ddd|gddid}|jd	kr$td
t d|  d S )Nz(/api/unstable/llm-obs/v1/datasets/deleter   r   datasetssoft)r   dataset_idsr   r  r  zFailed to delete dataset r  )r   rM   r  idget_json)r   r  r   r   rB   rB   rC   dataset_delete  s   
z&LLMObsExperimentsClient.dataset_deletedataset_nameproject_namedescriptionc                 C   s   |  |}|d}td|| d| d}dd||ddi}| d	||}|jd
kr=td| d|j d|  | }	|	d d }
|
d u sO|
dkrYtd|
d u  d|	d d d }t|||
g |||| d d	S )Nrs   z)getting records with project ID %s for %sz/api/unstable/llm-obs/v1/z	/datasetsr   r  r/   r  r   r   r  zFailed to create dataset r   r  rq   z/unexpected dataset state, invalid ID (is None: )r   current_version	r/   projectr  recordsr  latest_versionversion_dne_clientfilter_tags)	project_create_or_getrk   r   r   r   rM   r  r  r"   )r   r  r  r  r  
project_idr   r   r   response_datar  curr_versionrB   rB   rC   dataset_create  s8   


 z&LLMObsExperimentsClient.dataset_createrecord	is_updatec                 C   s   d }d| v r| d d u rdn| d }d }d| v r$| d d u r i n| d }t tttf | d||d}|rAt t| d |d< |S | d}|rOt t||d< |S )	Nexpected_outputrq   ra   
input_datainputr)  ra   	record_idr  r4   )r   r?   r=   r&   rk   r(   )r'  r(  r)  ra   rjr4   rB   rB   rC   _get_record_json  s"   
z(LLMObsExperimentsClient._get_record_jsonTr#  insert_recordsupdate_recordsdelete_record_idsdeduplicatecreate_new_versionc              	      s    fdd|D } fdd|D }	d| d| d}
dd|||	t t|||d	d
i} d|
|}|jdkrKtd| d|j d|j d|j | }|d }|r]|d d d nd}|rhdd |D ng }|rsdd |D ng }|||fS )Nc                       g | ]}  |d qS )Fr/  rf   rr   rB   rC   
<listcomp>      z@LLMObsExperimentsClient.dataset_batch_update.<locals>.<listcomp>c                    r5  Tr6  r7  r   rB   rC   r9    r:  /api/v2/llm-obs/v1/
/datasets/z/batch_updater   r  )r0  r1  delete_recordsr3  r4  )r   r  r   r   r  zFailed to update dataset r  z, r   r   r  c                 S   s   g | ]}|d  qS )r  rB   r7  rB   rB   rC   r9    r   c                 S   s   g | ]	}|d   dqS )r   canonical_id)rk   r7  rB   rB   rC   r9    s    )r   r&   r   rM   r  reasonr   r  )r   r  r#  r0  r1  r2  r3  r4  irsursr   r   r   r$  r   new_versionnew_record_idsnew_canonical_idsrB   r   rC   dataset_batch_update  s2   

 
z,LLMObsExperimentsClient.dataset_batch_updater  r4   c                 C   sH  |  |}|d}td||t|pd d| dt| }| d|}|jdkr<td| d	| d
| d|j |	 }	|	d }
|
sPtd| d| |
d d d }|
d d dd}|
d d }d| d| d}d}g }d}i }|r|r||d< | dt
jj|dd }|r|D ]	}|d| 7 }qtd|| | jd|| jd}|jdkrtd| d | d!|j d"|	  |	 }|dg D ](}|di }|d |d#|d$ |d%|d&i |d'g d(}|| q|d)i d*}i }d+}|rd}||d,< |d-7 }|s|t|||||||p|| |d.	S )/Nrs   z6getting records with project ID %s for %s, version: %slatestr<  z/datasets?filter[name]=GETr  zFailed to pull dataset z from project z (id=z): r   z	Dataset 'z' not found in project r   r   r  r  rq   r  r=  z/recordsTzfilter[version]?z[])safez&filter[tags]=z%list records page %d, request path=%sr   z#Failed to pull dataset records for z, page=r  r  r@  r,  r)  ra   r4   )r-  r@  r*  r)  ra   r4   r8   afterFzpage[cursor]r   r  )r"  rk   r   r   r=   r   r   rM   r  r  urllibparse	urlencodeLIST_RECORDS_TIMEOUTr   r"   )r   r  r  r  r4   r  r#  r   r   r$  r   r%  dataset_descriptionr  list_base_pathhas_next_pageclass_recordspage_numurl_options	list_pathtagrecords_datar'  attrsdataset_recordnext_cursorrB   rB   rC   dataset_get_with_records  s   





$z0LLMObsExperimentsClient.dataset_get_with_recordsr  c                 C   s  t jdd}tj|j}|dd}t|dkr%td| d|j |d }|| j	vr5t| dt
|jd	d
d8}g d}	t|}
|
|	 |D ]}|
t|dd
t|dd
t|dd
g qNW d    n1 sxw   Y  t
|jdd}| }W d    n1 sw   Y  W d    n1 sw   Y  d| d| }d}d}|d| d|d d|d d|d| d dg}| jd|d|d |d}|jdkrtd|j d |  td!|j d S )"Nz.csv)suffixr}   r   r   zinvalid file z from z files not supportedwrq   )newliner+  r*  r)  ra   rb)modez"/api/unstable/llm-obs/v1/datasets/z/records/upload?deduplicate=s   ----------boundary------s   
s   --s:   Content-Disposition: form-data; name="file"; filename="%s"r   s   Content-Type: text/%sr   r   z multipart/form-data; boundary=%s)r
  r   r  z$Failed to upload dataset from file: r  z"successfully uploaded with code %d)tempfileNamedTemporaryFiler   r   basenamer/   rsplitr   r  SUPPORTED_UPLOAD_EXTSopenr   writerwriterowr   r   rk   r   joinr   r  decoderM   r  r   r   )r   r  r  r3  tmp	file_namefile_name_partsfile_extcsv_filefield_namesri  r8  ffile_contentr   BOUNDARYCRLFr   r   rB   rB   rC   dataset_bulk_uploadm  sZ   





z+LLMObsExperimentsClient.dataset_bulk_uploadr/   c           	      C   s   | j d }|}|s| j dr| j S n|}d}| jd|dd|ddd	id
}|jdkr<td| d|j d|  | }|d d }|sStd||j|  t||d}||kr`|| _ |S )Nr/   rs   z!/api/unstable/llm-obs/v1/projectsr   r   projectsrq   r  r   r  r  zFailed to create project r  r  r  zAgot empty project ID for project %s in response, code=%d, resp=%srr   )	r{   rk   r   rM   r  r  r   r_   r'   )	r   r/   default_project_namer  r   r   r$  r#  r  rB   rB   rC   r"    s8   

 z-LLMObsExperimentsClient.project_create_or_getr  tag_overridesr%   c                 C   sp  d| }|  d|}|jdkr td| d|j d|  | }|dg }t|dk r7td	| |d
 d }|d }|d }	|d dg }
i }|
D ]}|dd}t|dkrg|d ||d
 < qQ|ro|| |d|}|d|	}t||d}t	|||	g d|d |d | d}t
|d t
j|g |||d |di d |d dd}|d |_||_||_|S )Nz*/api/v2/llm-obs/v1/experiments?filter[id]=rI  r  z!Failed to get experiment with ID r  r  r   r   zNo experiments found for ID r   r   r#  r  ra   r4   :r   r  r  rr   rq   dataset_version)r/   r  r  r  r  r  r  r   r   r  r	   	run_countT)r/   taskdataset
evaluatorsr  r4   r  r	   _llmobs_instancerunsis_distributedr/   )r   rM   r  r  rk   r   splitupdater'   r"   r%   _NO_OP_TASK	_run_namers   _project_id)r   r  rz  r   r   r$  experimentsr   r#  r  r4   	tags_dictrX  kvr  r  r  r  experiment_objrB   rB   rC   experiment_get  sd   

 


z&LLMObsExperimentsClient.experiment_getr   r   r|  
exp_configr  ensure_uniquec
                 C   s   d}
| j d|
dd||pd||||pi dtt|pg i|	|d	did	}|jd
kr9td| d|j d|  | }|d d }|d d d }||fS )Nz$/api/unstable/llm-obs/v1/experimentsr   r   r  rq   r4   )	r/   r  r  r#  r|  r	   ra   r  r}  r   r  r  zFailed to create experiment r  r  r  r   r/   )r   r   r&   rM   r  r  )r   r/   r  r#  r|  r  r4   r  r  r  r   r   r$  r`   experiment_run_namerB   rB   rC   experiment_create  s2   
 z)LLMObsExperimentsClient.experiment_creater`   rM   r_   c                 C   sr   d| }i }|d ur||d< |d ur||d< |sd S | j d|dd|did}|jd	kr7td
||j d S d S )N%/api/unstable/llm-obs/v1/experiments/rM   r_   PATCHr   r  r   r  r  z)Failed to update experiment %s status: %s)r   rM   r   r   )r   r`   rM   r_   r   r   r   rB   rB   rC   experiment_update*  s(   


z)LLMObsExperimentsClient.experiment_updater   c              
   C   s   d| d}| j d|dddttt |ttt |ddid}|jd	vr6td
| d|j d|  tdt	|| d S )Nr  z/eventsr   r   r  )scoper5   r4   r   r  )r     z1Failed to post experiment evaluation metrics for r  r  z,Sent %d experiment evaluation metrics for %s)
r   r   r@   r&   rM   r  r  r   r   r   )r   r`   r   r4   r   r   rB   rB   rC   experiment_eval_postE  s&   
z,LLMObsExperimentsClient.experiment_eval_post)r   )TT)NNNr;  re   )r   NNNr   T)NN)2r9   r:   r;   r   r   r   r   r   r   TIMEOUTr  rP  rg  r=   r&   r   r   r   ro   r   r   r?   r   r	  r   r  r  r   r"   r&  staticmethodr   r(   r$   rA   r/  r@   tuplerO   rG  r]  r#   rw  r'   r"  r  r  r  r\   r  rB   rB   rB   rC   r   Y  s     	" 
% "	
*

S3$%B
	


+
r   c                   @   sT   e Zd ZdZdZeZeZe	Z
deddfddZdee deeeef  fd	d
ZdS )LLMObsSpanWriterz/Writes span events to the LLMObs Span Endpoint.spanr   rc   Nc                 C   sl   t t|}d }|tk}|rtd| t|}t t|}t|| t||p*| | 	||p2| d S )NzTdropping event input/output because its size (%d) exceeds the event size limit (5MB))
r   r*   r   r   r   _truncate_span_eventr   record_span_event_raw_sizerecord_span_event_sizer   )r   r   raw_event_sizetruncated_event_sizeshould_truncaterB   rB   rC   r   g  s   zLLMObsSpanWriter.enqueuer   c                 C   sJ   g }|D ]}dt d|gd}|di ddkrd|d< || q|S )Nrawr  )z	_dd.stagez_dd.tracer_versionr   spansrN   r  r  z	_dd.scope)r-   rk   r   )r   r   r   r   
event_datarB   rB   rC   r   v  s   zLLMObsSpanWriter._data)r9   r:   r;   r<   r   r    r   r   r   r   r   rI   r   r@   r?   r=   r   r   rB   rB   rB   rC   r  _  s    &r  r   c                 C   s.   dt i| d d< dt i| d d< tg| d< | S )Nvaluer8   r,  outputrH   )r   r   )r   rB   rB   rC   r    s   
r  re   )Sr   r   r   r   rc  typingr   r   r   r   r   rM  urllib.parser   r   ddtracer	   ddtrace.internalr
   $ddtrace.internal.evp_proxy.constantsr   r   r   r   ddtrace.internal.loggerr   ddtrace.internal.periodicr    ddtrace.internal.settings._agentr   ddtrace.internal.threadsr   ddtrace.internal.utils.httpr   ddtrace.internal.utils.retryr   r   ddtrace.llmobsr   r   ddtrace.llmobs._constantsr   r   r   r   r   r   r   r   r   r    ddtrace.llmobs._experimentr!   r"   r#   r$   r%   r&   r'   r(   ddtrace.llmobs._httpr)   ddtrace.llmobs._utilsr*   ddtrace.llmobs.typesr+   r,   ddtrace.versionr-   r9   r   r.   rE   rI   rP   r\   rA   rn   ro   r   r   r  r  rB   rB   rB   rC   <module>   s    	 5    
&