+
    ~j                       ^ RI Ht ^ RIHt ^ RIHt ^RIHtH	t	H
t
HtHtHtHt ]'       d   ^RIHtHtHt ]P&                  ! R4      t]P+                  RRR	R
7      t]P+                  RRRR
7      t]P+                  RRRR
7      t]P+                  RRRR
7      t]P+                  RRRR
7      t]P+                  RRRR
7      t]P9                  R4      t]P9                  R4      t]P9                  R4      t]P9                  R4      t ]P9                  R4      t!]P9                  R4      t"]P9                  R4      t#]P9                  RRR7      t$]P9                  R4      t%]P9                  RRR7      t&]P9                  R RR7      t']P9                  R!4      t(]P+                  R"RR#R
7      t)R$ R% lt*R& R' lt+R( R) lt,R* R+ lt-R, R- lt.R.# )/    )annotations)TYPE_CHECKING)metrics)AgentMetricsInterruptionMetrics
LLMMetricsMetadataRealtimeModelMetrics
STTMetrics
TTSMetrics)ChatContextMetricsMetadataMetricsReportzlivekit-agentszlk.agents.turn.e2e_latencyszEnd-to-end turn latency)unitdescriptionzlk.agents.turn.llm_ttftz&Pipeline-level LLM time to first tokenzlk.agents.turn.tts_ttfbz%Pipeline-level TTS time to first bytez"lk.agents.turn.transcription_delayz/Time from end of speech to transcript availablez lk.agents.turn.end_of_turn_delayz(Time from end of speech to turn decisionz+lk.agents.turn.on_user_turn_completed_delayz2Time to invoke the on_user_turn_completed callbackz lk.agents.usage.llm_input_tokensz'lk.agents.usage.llm_input_cached_tokensz!lk.agents.usage.llm_output_tokensz&lk.agents.usage.llm_input_audio_tokensz%lk.agents.usage.llm_input_text_tokensz'lk.agents.usage.llm_output_audio_tokensz&lk.agents.usage.llm_output_text_tokensz$lk.agents.usage.llm_session_duration)r   zlk.agents.usage.tts_charactersz"lk.agents.usage.tts_audio_durationz"lk.agents.usage.stt_audio_durationz)lk.agents.usage.interruption_num_requestsz!lk.agents.connection.acquire_timez-Time to acquire a connection (WebSocket only)c                    V ^8  d   QhRRRR/# )   metadatazMetadata | Nonereturndict[str, str] )formats   "z/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/telemetry/otel_metrics.py__annotate__r   U   s      ? ~     c                    / pV '       dC   V P                   '       d   V P                   VR &   V P                  '       d   V P                  VR&   V# model_provider
model_namer   r   attrss   & r   _model_attrsr#   U   sH    E"""&.&=&=E"#"*"5"5E,Lr   c                    V ^8  d   QhRRRR/# )r   chat_ctxr   r   Noner   )r   s   "r   r   r   _   s     * * * *r   c                ^    V P                  4        F  p\        VP                  4       K  	  R# )zNEmit per-turn latency histograms from the chat history. Called at session end.N)messages_record_turn_metricsr   )r%   msgs   & r   flush_turn_metricsr+   _   s!      "S[[) #r   c                    V ^8  d   QhRRRR/# )r   r   r   r   r   r   )r   s   "r   r   r   e   s       ^ r   c                V    / pR V 9   d   V R ,          VR &   RV 9   d   V R,          VR&   V# )r    r   r   r!   s   & r   _metadata_to_attrsr.   e   s<    Ex&|4l8#"*+;"<Lr   c                    V ^8  d   QhRRRR/# )r   reportr   r   r&   r   )r   s   "r   r   r   n   s     
 
 
4 
r   c                h   R V 9   d   \        V R ,          4      M/ pRV 9   d   \        V R,          4      M/ pRV 9   d   \        V R,          4      M/ pRV 9   d   \        P                  V R,          VR7       RV 9   d   \        P                  V R,          VR7       RV 9   d   \        P                  V R,          VR7       RV 9   d   \
        P                  V R,          VR7       RV 9   d   \        P                  V R,          VR7       R	V 9   d!   \        P                  V R	,          VR7       R
# R
# )llm_metadatatts_metadatastt_metadatae2e_latency
attributesllm_node_ttfttts_node_ttfbtranscription_delayend_of_turn_delayon_user_turn_completed_delayN)r.   _turn_e2e_latencyrecord_turn_llm_ttft_turn_tts_ttfb_turn_transcription_delay_turn_end_of_turn_delay"_turn_on_user_turn_completed_delay)r0   	llm_attrs	tts_attrs	stt_attrss   &   r   r)   r)   n   s!   >LPV>V"6.#9:\^I>LPV>V"6.#9:\^I>LPV>V"6.#9:\^I  !69 M& f_5)L& f_5)L&!((0E)FS\(]f$&&v.A'By&Y%/*1112y 	2 	
 0r   c                    V ^8  d   QhRRRR/# )r   evr   r   r&   r   )r   s   "r   r   r      s     4T 4Tl 4Tt 4Tr   c                	   \        V \        4      '       d   \        V P                  4      pV P                  '       d"   \
        P                  V P                  VR7       V P                  '       d"   \        P                  V P                  VR7       V P                  '       d"   \        P                  V P                  VR7       EMy\        V \        4      '       Ed   \        V P                  4      pV P                  '       d"   \
        P                  V P                  VR7       V P                  P                  '       d,   \        P                  V P                  P                  VR7       V P                  '       d"   \        P                  V P                  VR7       V P                  P                   '       d,   \"        P                  V P                  P                   VR7       V P                  P$                  '       d,   \&        P                  V P                  P$                  VR7       V P(                  P                   '       d,   \*        P                  V P(                  P                   VR7       V P(                  P$                  '       d,   \,        P                  V P(                  P$                  VR7       V P.                  '       d"   \0        P                  V P.                  VR7       EMO\        V \2        4      '       d}   \        V P                  4      pV P4                  '       d"   \6        P                  V P4                  VR7       V P8                  '       d"   \:        P                  V P8                  VR7       M\        V \<        4      '       dJ   \        V P                  4      pV P8                  '       d"   \>        P                  V P8                  VR7       M^\        V \@        4      '       dI   \        V P                  4      pV PB                  '       d"   \D        P                  V PB                  VR7       \        V \<        \2        \        34      '       dr   V PF                  ^ 8  d_   \        V P                  4      p\I        V PJ                  4      PM                  4       VR&   \N        PQ                  V PF                  VR7       R# R# R# )z7Record usage counters directly from each metrics event.r6   connection_reusedN))
isinstancer   r#   r   prompt_tokens_llm_input_tokensaddprompt_cached_tokens_llm_input_cached_tokenscompletion_tokens_llm_output_tokensr
   input_tokensinput_token_detailscached_tokensoutput_tokensaudio_tokens_llm_input_audio_tokenstext_tokens_llm_input_text_tokensoutput_token_details_llm_output_audio_tokens_llm_output_text_tokenssession_duration_llm_session_durationr   characters_count_tts_charactersaudio_duration_tts_audio_durationr   _stt_audio_durationr   num_requests_interruption_num_requestsacquire_timestrrJ   lower_connection_acquire_timer>   )rH   r"   
conn_attrss   &  r   collect_usagerl      sc   "j!!R[[)!!""2"2u!E"""$(()@)@U(S""2#7#7E"J	B,	-	-R[[)???!!"//e!D!!///$(()?)?)M)MZ_(`""2#3#3"F!!...#''(>(>(K(KX]'^!!---"&&r'='='I'IV[&\""///$(()@)@)M)MZ_(`""...#''(?(?(K(KX]'^!%%b&9&9e%L	B
	#	#R[[) 3 3F##B$5$5%#H	B
	#	#R[[)##B$5$5%#H	B+	,	,R[[)???&**2??u*M "z:/CDEE??Q%bkk2J.1"2F2F.G.M.M.OJ*+$++BOO
+S  Fr   N)/
__future__r   typingr   opentelemetryr   metrics_apimetrics.baser   r   r   r	   r
   r   r   llm.chat_contextr   r   r   	get_meter_metercreate_histogramr=   r?   r@   rA   rB   rC   create_counterrM   rP   rR   rX   rZ   r\   r]   r_   ra   rc   rd   rf   rj   r#   r+   r.   r)   rl   r   r   r   <module>rw      s5   "   0   NN			/	0 ++ 	) ,  
 ((	8 ) 
 ((	7 ) 
 #33(	A 4  
 !11&	: 2  
 &,%<%<1	D &= & " ))*LM !001Z[ **+NO  //0XY ../VW !001Z[  //0XY --*	 .   ''(HI++(	 ,   ++(	 ,   $223^_  "22'	? 3  *
*4Tr   