
    /jn%                       S SK Jr  S SKJr  S SKJr  S SKJr  SSKJ	r	J
r
JrJrJrJr   " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r\\-  \-  \-  r \ " S S5      5       r " S S5      rg)    )annotations)	dataclass)Literal)	BaseModel   )AgentMetricsInterruptionMetrics
LLMMetricsRealtimeModelMetrics
STTMetrics
TTSMetricsc                      \ rS rSrSS jrSrg)_BaseModelUsage   c                   U R                  5       R                  5        VVs0 s H  u  pUS:w  d  M  US:w  d  M  X_M     nnnSR                  S UR                  5        5       5      nU R                  R                   SU S3$ s  snnf )Nr           z, c              3  6   #    U  H  u  pU S U< 3v   M     g7f)=N ).0kvs      M/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/metrics/usage.py	<genexpr>+_BaseModelUsage.__repr__.<locals>.<genexpr>   s     G!AaU|s   ())
model_dumpitemsjoin	__class____name__)selfr   r   fields
fields_strs        r   __repr___BaseModelUsage.__repr__   s{    #'??#4#:#:#<T#<41Q$1PS8$!$#<TYYGGG
..))*!J<q99 Us   BBBr   N)returnstr)r"   
__module____qualname____firstlineno__r&   __static_attributes__r       r   r   r      s    :r.   r   c                      \ rS rSr% SrSrS\S'   S\S'    S\S'    S	rS
\S'    S	rS
\S'    S	r	S
\S'    S	r
S
\S'    S	rS
\S'    S	rS
\S'    S	rS
\S'    S	rS
\S'    S	rS
\S'    S	rS
\S'    S	rS
\S'    SrS\S'   Srg)LLMModelUsage   zUsage summary for LLM models.	llm_usagezLiteral['llm_usage']typer)   providermodelr   intinput_tokensinput_cached_tokensinput_audio_tokensinput_cached_audio_tokensinput_text_tokensinput_cached_text_tokensinput_image_tokensinput_cached_image_tokensoutput_tokensoutput_audio_tokensoutput_text_tokensr   floatsession_durationr   N)r"   r*   r+   r,   __doc__r3   __annotations__r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rC   r-   r   r.   r   r0   r0      s    '!,D
,M:J?L#  )5%&s&$s$%c%#5%&s&$M3  6!e!\r.   r0   c                  ~    \ rS rSr% SrSrS\S'   S\S'    S\S'    S	rS
\S'    S	rS
\S'    S	r	S
\S'    Sr
S\S'   Srg)TTSModelUsage?   zUsage summary for TTS models.	tts_usagezLiteral['tts_usage']r3   r)   r4   r5   r   r6   r7   r?   characters_countr   rB   audio_durationr   N)r"   r*   r+   r,   rD   r3   rE   r7   r?   rJ   rK   r-   r   r.   r   rG   rG   ?   sU    '!,D
,M=J<L#LM3NcMNE1r.   rG   c                  n    \ rS rSr% SrSrS\S'   S\S'    S\S'    S	rS
\S'    S	rS
\S'    Sr	S\S'   Sr
g)STTModelUsageR   zUsage summary for STT models.	stt_usagezLiteral['stt_usage']r3   r)   r4   r5   r   r6   r7   r?   r   rB   rK   r   N)r"   r*   r+   r,   rD   r3   rE   r7   r?   rK   r-   r   r.   r   rM   rM   R   sG    '!,D
,M=J2L#;M3;NE1r.   rM   c                  N    \ rS rSr% SrSrS\S'   S\S'    S\S'    S	rS
\S'   Srg)InterruptionModelUsagec   z0Usage summary for interruption detection models.interruption_usagezLiteral['interruption_usage']r3   r)   r4   r5   r   r6   total_requestsr   N)	r"   r*   r+   r,   rD   r3   rE   rT   r-   r   r.   r   rQ   rQ   c   s-    :*>D
'>M.J,NCLr.   rQ   c                       \ rS rSr% S\S'   Srg)AgentSessionUsages   list[ModelUsage]model_usager   N)r"   r*   r+   r,   rE   r-   r   r.   r   rV   rV   s   s    !!r.   rV   c                  z    \ rS rSrSrSS jrSS jr    SS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSrg)ModelUsageCollectorx   zECollects and aggregates usage metrics per model/provider combination.c                <    0 U l         0 U l        0 U l        0 U l        g N)
_llm_usage
_tts_usage
_stt_usage_interruption_usage)r#   s    r   __init__ModelUsageCollector.__init__{   s    @B@B@BRT r.   c                &    U R                  U5        g r^   )collect)r#   metricss     r   __call__ModelUsageCollector.__call__   s    Wr.   c                    SnSnUR                   (       a>  UR                   R                  =(       d    SnUR                   R                  =(       d    SnX#4$ )z1Extract provider and model from metrics metadata. )metadatamodel_provider
model_name)r#   rg   r4   r5   s       r   _extract_provider_model+ModelUsageCollector._extract_provider_model   sK    
 ''66<"H$$//52Er.   c                p    X4nX0R                   ;  a  [        XS9U R                   U'   U R                   U   $ )zHGet or create an LLMModelUsage for the given provider/model combination.r4   r5   )r_   r0   r#   r4   r5   keys       r   _get_llm_usage"ModelUsageCollector._get_llm_usage   6    oo%#0(#PDOOC s##r.   c                p    X4nX0R                   ;  a  [        XS9U R                   U'   U R                   U   $ )zGGet or create a TTSModelUsage for the given provider/model combination.rr   )r`   rG   rs   s       r   _get_tts_usage"ModelUsageCollector._get_tts_usage   rw   r.   c                p    X4nX0R                   ;  a  [        XS9U R                   U'   U R                   U   $ )zHGet or create an STTModelUsage for the given provider/model combination.rr   )ra   rM   rs   s       r   _get_stt_usage"ModelUsageCollector._get_stt_usage   rw   r.   c                p    X4nX0R                   ;  a  [        XS9U R                   U'   U R                   U   $ )zQGet or create an InterruptionModelUsage for the given provider/model combination.rr   )rb   rQ   rs   s       r   _get_interruption_usage+ModelUsageCollector._get_interruption_usage   s<    ...,BH,bD$$S)'',,r.   c                z	   [        U[        5      (       a  U R                  U5      u  p#U R                  X#5      nU=R                  UR
                  -  sl        U=R                  UR                  -  sl        U=R                  UR                  -  sl        g [        U[        5      (       Gah  U R                  U5      u  p#U R                  X#5      nU=R                  UR                  -  sl        U=R                  UR                  R                  -  sl        U=R                  UR                  R                  -  sl        U=R                  UR                  R                   (       a   UR                  R                   R                  OS-  sl        U=R"                  UR                  R$                  -  sl        U=R&                  UR                  R                   (       a   UR                  R                   R$                  OS-  sl        U=R(                  UR                  R*                  -  sl        U=R,                  UR                  R                   (       a   UR                  R                   R*                  OS-  sl        U=R.                  UR0                  R                  -  sl        U=R2                  UR0                  R*                  -  sl        U=R                  UR                  -  sl        U=R4                  UR4                  -  sl        g [        U[6        5      (       a  U R                  U5      u  p#U R9                  X#5      nU=R                  UR                  -  sl        U=R                  UR                  -  sl        U=R:                  UR:                  -  sl        U=R<                  UR<                  -  sl        g [        U[>        5      (       a  U R                  U5      u  p#U RA                  X#5      nU=R                  UR                  -  sl        U=R                  UR                  -  sl        U=R<                  UR<                  -  sl        g [        U[B        5      (       aD  U R                  U5      u  p#U RE                  X#5      nU=RF                  URH                  -  sl#        g g )Nr   )%
isinstancer
   ro   ru   r7   prompt_tokensr8   prompt_cached_tokensr?   completion_tokensr   input_token_detailscached_tokensr;   text_tokensr<   cached_tokens_detailsr=   image_tokensr>   r9   audio_tokensr:   rA   output_token_detailsr@   rC   r   ry   rJ   rK   r   r|   r	   r   rT   num_requests)r#   rg   r4   r5   usagerI   rO   rS   s           r   rf   ModelUsageCollector.collect   s   gz**"::7COH''8E'"7"77%%)E)EE%7#<#<<!566"::7COH''8E'"6"66%%)D)D)R)RR%##w'B'B'N'NN#**..DD ++AAMM*
 $$(C(C(P(PP$++..DD ++AANN+
 $$(C(C(P(PP$++..DD ++AANN+ $$(D(D(P(PP$%%)E)E)R)RR%7#8#88""g&>&>>",,"::7COH++H<I""g&:&::"##w'<'<<#&&'*B*BB&$$(>(>>$,,"::7COH++H<I""g&:&::"##w'<'<<#$$(>(>>$!455"::7COH!%!=!=h!N--1E1EE- 6r.   c                   / nUR                  S U R                  R                  5        5       5        UR                  S U R                  R                  5        5       5        UR                  S U R                  R                  5        5       5        UR                  S U R
                  R                  5        5       5        U$ )zFReturns a list of usage summaries, one per model/provider combination.c              3  >   #    U  H  oR                  S S9v   M     g7fT)deepN
model_copyr   us     r   r   .ModelUsageCollector.flatten.<locals>.<genexpr>        P7O!lll-7O   c              3  >   #    U  H  oR                  S S9v   M     g7fr   r   r   s     r   r   r      r   r   c              3  >   #    U  H  oR                  S S9v   M     g7fr   r   r   s     r   r   r      r   r   c              3  >   #    U  H  oR                  S S9v   M     g7fr   r   r   s     r   r   r      s     Y7X!lll-7Xr   )extendr_   valuesr`   ra   rb   )r#   results     r   flattenModelUsageCollector.flatten   s    #%Pt7M7M7OPPPt7M7M7OPPPt7M7M7OPPYt7O7O7V7V7XYYr.   )rb   r_   ra   r`   N)r(   None)rg   r   r(   r   )rg   zQLLMMetrics | STTMetrics | TTSMetrics | RealtimeModelMetrics | InterruptionMetricsr(   ztuple[str, str])r4   r)   r5   r)   r(   r0   )r4   r)   r5   r)   r(   rG   )r4   r)   r5   r)   r(   rM   )r4   r)   r5   r)   r(   rQ   )r(   rX   )r"   r*   r+   r,   rD   rc   rh   ro   ru   ry   r|   r   rf   r   r-   r   r.   r   r[   r[   x   sG    OU
b
 

$$$-7Frr.   r[   N)
__future__r   dataclassesr   typingr   pydanticr   baser   r	   r
   r   r   r   r   r0   rG   rM   rQ   
ModelUsagerV   r[   r   r.   r   <module>r      s    " !   :i :"]O "]J2O 2&2O 2"	M_ 	M ]*]:=SS
 + " " "t tr.   