o
    itK                     @  sR  U d dl m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	 d dl
mZm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 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! d dl"mZ# d dl$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z? ddl@mAZA ddlBmCZC erddlDmEZEmFZF ddlGmHZH ddlImJZJ G dd  d e4ZKeKd!ZLd eMd"< G d#d$ d$e/ZNG d%d& d&e'ZOG d'd( d(ejPZQdd)dRd0d1ZRd2d2d3dSd;d<ZSdTd@dAZTdUdEdFZUdVdNdOZVdWdPdQZWdS )X    )annotationsN)Iterator)datetime	timedeltatimezone)TYPE_CHECKINGAny)MessageToDict)contexttracer   )get_logger_providerset_logger_provider)SeverityNumber)Compression)OTLPLogExporter)OTLPSpanExporter)r   )LoggerProviderLoggingHandlerLogRecordProcessorReadWriteLogRecord)BatchLogRecordProcessor)SERVICE_NAMEResource)SpanProcessor)BatchSpanProcessor)SpanTracer)_agnosticcontextmanager)
AttributesAttributeValue)api)agent_pbmetrics   )logger   )trace_types)ChatContextChatItem)Tagger)SessionReportc                   @  s8   e Zd ZdddZdd	d
ZdddZedddZdS )_DynamicTracerinstrumenting_module_namestrreturnNonec                 C  s    || _ t | _t|| _d S N)_instrumenting_module_namer   get_tracer_provider_tracer_provider
get_tracer_tracer)selfr,    r7   a/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/telemetry/traces.py__init__0   s   
z_DynamicTracer.__init__tracer_providertrace_api.TracerProviderc                 C  s   || _ tj| j| j d| _d S )N)r:   )r3   r   r4   r1   r5   )r6   r:   r7   r7   r8   set_provider5   s
   z_DynamicTracer.set_providerargsr   kwargsr   c                 O  s   | j j|i |S r0   )r5   
start_spanr6   r=   r>   r7   r7   r8   r?   <   s   z_DynamicTracer.start_spanIterator[Span]c                 o  s@    | j j|i |}|V  W d    d S 1 sw   Y  d S r0   )r5   start_as_current_span)r6   r=   r>   spanr7   r7   r8   rB   ?   s   "z$_DynamicTracer.start_as_current_spanN)r,   r-   r.   r/   )r:   r;   r.   r/   )r=   r   r>   r   r.   r   )r=   r   r>   r   r.   rA   )__name__
__module____qualname__r9   r<   r?   r   rB   r7   r7   r7   r8   r+   /   s    


r+   livekit-agentstracerc                   @  s"   e Zd ZdddZddddZdS )_MetadataSpanProcessormetadatadict[str, AttributeValue]r.   r/   c                 C  
   || _ d S r0   	_metadatar6   rJ   r7   r7   r8   r9   I      
z_MetadataSpanProcessor.__init__NrC   r   parent_contextotel_context.Context | Nonec                 C  s   | | j d S r0   )set_attributesrN   )r6   rC   rQ   r7   r7   r8   on_startL      z_MetadataSpanProcessor.on_startrJ   rK   r.   r/   r0   )rC   r   rQ   rR   r.   r/   )rD   rE   rF   r9   rT   r7   r7   r7   r8   rI   H   s    
rI   c                   @  s6   e Zd ZdddZdd	d
ZdddZddddZdS )_MetadataLogProcessorrJ   rK   r.   r/   c                 C  rL   r0   rM   rO   r7   r7   r8   r9   Q   rP   z_MetadataLogProcessor.__init__log_datar   c                 C  sH   |j jr|j j| j n| j|j _|jr"|j jd|jji d S d S )Nzlogger.name)
log_record
attributesupdaterN   instrumentation_scopename)r6   rX   r7   r7   r8   on_emitT   s   

z_MetadataLogProcessor.on_emitc                 C  s   d S r0   r7   r6   r7   r7   r8   shutdown_      z_MetadataLogProcessor.shutdown0u  timeout_millisintboolc                 C  s   dS )NTr7   )r6   rc   r7   r7   r8   force_flushb   ra   z!_MetadataLogProcessor.force_flushNrV   )rX   r   r.   r/   r.   r/   )rb   )rc   rd   r.   re   )rD   rE   rF   r9   r^   r`   rf   r7   r7   r7   r8   rW   P   s
    


rW   c                      s,   e Zd ZdZd
 fddZddd	Z  ZS )_BufferingHandlerz<Buffers log records in memory for later replay through OTLP.r.   r/   c                   s   t    g | _d S r0   )superr9   bufferr_   	__class__r7   r8   r9   i      

z_BufferingHandler.__init__recordlogging.LogRecordc                 C  s   | j | d S r0   )rj   append)r6   rn   r7   r7   r8   emitm   rU   z_BufferingHandler.emitrg   )rn   ro   r.   r/   )rD   rE   rF   __doc__r9   rq   __classcell__r7   r7   rk   r8   rh   f   s    rh   )rJ   r:   r;   rJ    dict[str, AttributeValue] | Noner.   r/   c                C  s,   |rt | tjr| t| t|  dS )zSet the tracer provider for the livekit-agents.

    Args:
        tracer_provider (TracerProvider): The tracer provider to set.
        metadata (dict[str, AttributeValue] | None, optional): Metadata to set on all spans. Defaults to None.
    N)
isinstance	trace_sdkTracerProvideradd_span_processorrI   rH   r<   )r:   rJ   r7   r7   r8   set_tracer_providerq   s   	ry   T)enable_tracesenable_logsroom_idr-   job_idcloud_hostnamerz   re   r{   c                   st  t ddt dd G dd dtj}G  fddd}| }||}tj}	| |d	}
ttd
d| d|i}|r|tt	j
tjtjfrNtj|d}t| nt	j
}t|tjr]|j| td| d|	|d}t|tjr||t|
 |t| t }t|tst }t| td| d|	|d}|t|
 |t| |rttj |d}t! }|"| d S d S )N   hours   )minutesc                      s,   e Zd Zd fddZd fddZ  ZS )z3_setup_cloud_tracer.<locals>._AuthRefreshingSessionheader_provider_AuthHeaderProviderr.   r/   c                   s   t    || _d S r0   )ri   r9   _header_provider)r6   r   rk   r7   r8   r9      rm   z<_setup_cloud_tracer.<locals>._AuthRefreshingSession.__init__r=   r   r>   requests.Responsec                   s"   | j |   t j|i |S r0   )headersr[   r   ri   requestr@   rk   r7   r8   r      s   z;_setup_cloud_tracer.<locals>._AuthRefreshingSession.request)r   r   r.   r/   )r=   r   r>   r   r.   r   )rD   rE   rF   r9   r   rs   r7   r7   rk   r8   _AuthRefreshingSession   s    r   c                      s2   e Zd ZdddZdfddZd fdd	Zd
S )z0_setup_cloud_tracer.<locals>._AuthHeaderProviderr.   r/   c                 S  s.   t  | _d| _tjjtjd| _	| 
  d S )N )tzinfo)	threadingLock_lock_auth_headerr   minreplacer   utc_expires_at_refreshr_   r7   r7   r8   r9      s   
z9_setup_cloud_tracer.<locals>._AuthHeaderProvider.__init__c                   sB   t  t jdd }d|  | _tt	j
  | _d S )NTwriteBearer )r    AccessTokenwith_observability_grantsObservabilityGrantswith_ttlto_jwtr   r   nowr   r   r   )r6   access_token)	token_ttlr7   r8   r      s   z9_setup_cloud_tracer.<locals>._AuthHeaderProvider._refreshdict[str, str]c                   s`   t tj}|| j  kr+| j || j  kr|   W d    n1 s&w   Y  d| jiS )NAuthorization)r   r   r   r   r   r   r   r   )r6   r   )refresh_marginr7   r8   __call__   s   
z9_setup_cloud_tracer.<locals>._AuthHeaderProvider.__call__Nrg   )r.   r   )rD   rE   rF   r9   r   r   r7   r   r   r7   r8   r      s    
	r   )r|   r}   rG   r|   r}   )resourcehttps://z/observability/traces/otlp/v0)endpointcompressionsessionz/observability/logs/otlp/v0)levellogger_provider)#r   requestsSessionr   Gzipr   creater   ru   rH   r3   	trace_apiProxyTracerProviderNoOpTracerProviderrv   rw   ry   r   merger   rx   rI   r   r   r   r   r   add_log_record_processorrW   r   r   loggingNOTSET	getLogger
addHandler)r|   r}   r~   rz   r{   r   r   r   r   otlp_compressionrJ   r   r:   span_exporterr   log_exporterhandlerrootr7   r   r8   _setup_cloud_tracer   s`   

	





r   chat_ctxr'   list[tuple[str, Attributes]]c                 C  s   t jt jt jd}g }| jD ]O}|jdkr*||j }r*||d|j	p%dif q|jdkrI|t jdt
|j|jd|jdd	gd
f q|jdkr]|t j|j|j|jdf q|S )N)systemuser	assistantmessagecontentr   function_callr   )r]   	argumentsfunction)r   idtype)role
tool_callsfunction_call_output)r   r]   r   )r&   EVENT_GEN_AI_SYSTEM_MESSAGEEVENT_GEN_AI_USER_MESSAGEEVENT_GEN_AI_ASSISTANT_MESSAGEitemsr   getr   rp   text_contentjsondumpsr]   r   call_idEVENT_GEN_AI_TOOL_MESSAGEoutput)r   role_to_eventeventsitem
event_namer7   r7   r8   _chat_ctx_to_otel_events   s<   


r   r   r(   dictc                 C  s  t jj }| jdkr|j}| j|_t jjt jjt jj	t jj
d}|| j |_| jD ]}t|tr9|j }||_q*| j|_| jd urG| j|_| j D ]\}}t||j|< qL| j}d|v rl|jjt|d d  d|v r}|jjt|d d  d|v r|d |j_d|v r|d |j_d|v r|d |j_d	|v r|d	 |j_d
|v r|d
 |j_d|v r|d |j_|j t| j d  t+|S | jdkr|j!}	| j|	_| j"|	_"| j#|	_#| j$|	_$|	j t| j d  t+|S | jdkr|j%}
| j|
_| j$|
_$| j"|
_"| j&|
_&| j'|
_'|
j t| j d  t+|S | jdkrA|j(}| j|_| j)d ur2| j)|_)| j*|_*|j t| j d  t+|S )Nr   )	developerr   r   r   started_speaking_at  stopped_speaking_attranscription_delayend_of_turn_delayon_user_turn_completed_delayllm_node_ttfttts_node_ttfbe2e_latencyr   r   agent_handoff),r!   agent_sessionr'   r(   r   r   r   	DEVELOPERSYSTEMUSER	ASSISTANTr   r   ru   r-   addtextinterruptedtranscript_confidenceextrar   r"   r   FromMillisecondsrd   r   r   r   r   r   r   r   
created_atr   r   r   r]   r   r   is_errorr   old_agent_idnew_agent_idr	   )r   item_pbmsgrole_mapr   
content_pbkeyvaluer"   fcfcoahr7   r7   r8   _to_proto_chat_item  s   






r  
agent_namereportr*   taggerr)   http_sessionaiohttp.ClientSessionc              	     s  dC fdd}t jdfdDdd}|d} j}t| r8||dt jp) jp)dd t j	 j| dd |d rj j
jD ])}	t|	}
t j}d}|	jdkrX|	jrXt j}d}||dt|	jd d|
i||d q@|d }|jr|jD ]$}t j}d}|d!d"krt j}d}||d#t jd d#|i||d qt|jr||d$t jd d$d%|jiid |d& o jo j}|d s|sd S t tjd'd(td)d*}| }tj jd+}|j !t jpdd,  |" }t#$d-}|%|}|j&d-d.d/d0 d1|j'd2< t(t)||j'd3< |d r7t*+ j
j,d4d5}|%|}|j&d-dd6d0 d7|j'd2< t(t)||j'd3< |r jrz+t-. jd84 I d H }|/ I d H }W d   I d H  n1 I d H scw   Y  W n t0yu   d9}Y nw |r|%|}|j&d-d&d:d0 d;|j'd2< t(t)||j'd3< d<| d=}d>| |j1d?}t23d@ |j4|||dA4 I d H }|5  W d   I d H  n1 I d H sw   Y  t23dB d S )ENr]   r-   r.   r   c                   s   t  j|  j j jddS )N)r|   r}   room)r]   rZ   )r   
get_loggerr|   r}   r	  )r]   r  r7   r8   _get_loggeri  s   z+_upload_session_report.<locals>._get_loggerunspecifiedotel_loggerbody	timestamprd   rZ   r   severityr   severity_textr/   c                 S  s   | j |||||d d S )N)r  r  rZ   severity_numberr  )rq   )r  r  r  rZ   r  r  r7   r7   r8   _logs  s   
z$_upload_session_report.<locals>._logchat_historyzsession reportr   g    eA)zsession.optionszsession.report_timestampr  )r  r  rZ   
transcriptr   errorz	chat itemz	chat.item)r  r  rZ   r  r  evaluationsverdictfail
evaluationoutcomereasonaudioTr   r   r   )r|   r   z	form-dataheaderzheader.binpb)r]   filenamezapplication/protobufContent-TypezContent-LengthF)exclude_timestampzchat_history.jsonzapplication/jsonrb    zrecording.oggz	audio/oggr   z/observability/recordings/v0r   )r   r!  z)uploading session report to LiveKit Cloud)datar   zfinished uploading)r]   r-   r.   r   )r  r   r  r-   r  rd   rZ   r   r  r   r  r-   r.   r/   )6r   UNSPECIFIEDrecording_optionsanyvaluesrd   
started_atr  varsoptionsr  r   r  r   r   ERRORr   r  r   outcome_reasonaudio_recording_pathaudio_recording_started_atr    r   r   r   r   r   r   proto_metricsMetricsRecordingHeaderr|   
start_timer   SerializeToStringaiohttpMultipartWriterrp   set_content_dispositionr   r-   lenr   r   to_dictaiofilesopenread	Exceptioncontent_typer$   debugpostraise_for_status)r  r~   r  r  r  r  r  chat_loggerr'  r   item_logr  r  eval_loggerr  	has_audior   jwt
header_msgheader_bytesmppartchat_history_jsonfaudio_bytesurlr   respr7   r  r8   _upload_session_reporta  s   	
	





*



*rP  c                  C  s   t tj } tjrtd |   |   t t	  }t
r@t }|jd d  D ]}t |tr5|| q)|  |  d S d S )Nz'shutting down telemetry tracer provider)ru   rH   r3   rv   rw   r$   r?  rf   r`   r   r   r   r   handlersr   removeHandler)r:   r   r   hr7   r7   r8   _shutdown_telemetry  s   


rT  )r:   r;   rJ   rt   r.   r/   )r|   r-   r}   r-   r~   r-   rz   re   r{   re   r.   r/   )r   r'   r.   r   )r   r(   r.   r   )r  r-   r~   r-   r  r*   r  r)   r  r  r.   r/   rg   )X
__future__r   r   r   r   collections.abcr   r   r   r   typingr   r   r:  r5  r   google.protobuf.json_formatr	   opentelemetryr
   otel_contextr   r   opentelemetry._logsr   r   opentelemetry._logs.severityr   &opentelemetry.exporter.otlp.proto.httpr   4opentelemetry.exporter.otlp.proto.http._log_exporterr   5opentelemetry.exporter.otlp.proto.http.trace_exporterr   opentelemetry.sdkrv   opentelemetry.sdk._logsr   r   r   r   opentelemetry.sdk._logs.exportr   opentelemetry.sdk.resourcesr   r   opentelemetry.sdk.tracer   opentelemetry.sdk.trace.exportr   opentelemetry.tracer   r   opentelemetry.util._decoratorr   opentelemetry.util.typesr   r   livekitr    livekit.protocolr!   r"   r1  logr$   r   r&   llmr'   r(   observabilityr)   voice.reportr*   r+   rH   __annotations__rI   rW   Handlerrh   ry   r   r   r  rP  rT  r7   r7   r7   r8   <module>   sb    
j
(
O 