
    /j                       % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
Jr  S SKJrJr  S SKJrJr  S SKJr  S SKJr  S SKJrJrJrJr  S SKrS SK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K(J)r)  SSK*J+r+  SSK,J-r-J.r.J/r/  SSK0J1r1  SSK2J3r3J4r4  SSK5J6r6  SSK7J8r8J9r9J:r:J;r;  SSK+J<r<J=r=J>r>J?r?J@r@JArAJBrB  SSKCJDrDJErEJFrFJGrGJHrH  SrISrJSrKSrLSrMSrNSrOSrP " S S\"5      rQ\" S S S!9 " S" S#5      5       rR\" S S S!9 " S$ S%5      5       rS " S& S'\"5      rT\S" S S(9rU " S) S*5      rV " S+ S,5      rW " S- S.5      rX " S/ S05      rY " S1 S25      rZ\)R                  \V-  \W-  \X-  \Y-  \Z-  r\S3\]S4'    " S5 S6\)R                  \S7      5      r_ " S8 S9\
5      r` " S: S;\"5      ra " S< S=\`5      rb " S> S?\c\5      rd " S@ SA\"5      re " SB SC\"5      rf " SD SE\"5      rg " SF SG\"5      rh " SH SI\"5      ri " SJ SK\"5      rj " SL SM\"5      rk " SN SO\"5      rl\g\e-  \h-  \i-  \j-  \k-  \l-  rmS3\]SP'   \&" \\m\$" SQSR94   5      rnSS\]ST'    " SU SV\`5      ro\K4     SXSW jjrpg)Y    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator)	dataclassfield)Enum)perf_counter_ns)	AnnotatedAnyLiteral	TypeAlias)trace)	BaseModel
ConfigDictFieldSerializerFunctionWrapHandlerTypeAdaptermodel_serializer)rtc   )utils)APIConnectionErrorAPIErrorAPIStatusErrorlogger)InterruptionMetricsMetadata)trace_types)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)AudioArrayBufferBoundedDictaiohttp_contextis_givenlog_exceptions	shortuuid   )DEFAULT_INFERENCE_URLSTAGING_INFERENCE_URLcreate_access_tokenget_default_inference_urlget_inference_headersi>  g      ?g?   g?g      ?gffffff?(   c                      \ rS rSr% \" SS9rSrS\S'   \" \	R                  S9r
S\S	'   S
\S'   \" SSS9rS\S'   S\S'   Srg)InterruptionDetectionErrorA   Tarbitrary_types_allowedinterruption_detection_errorz'Literal['interruption_detection_error']typedefault_factoryfloat	timestampstrlabel.exclude	Exceptionerrorboolrecoverable N)__name__
__module____qualname____firstlineno__r   model_configr;   __annotations__r   timer?   rE   __static_attributes__rH       V/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/inference/interruption.pyr6   r6   A   sF    d;L4RD
1RTYY7Iu7JS$/E9/rQ   r6   T)slotskw_onlyc                      \ rS rSr% S\S'    S\S'    S\S'    S\S'    S\S'    S\S	'    S\S
'    S\S'   S\S'   S\S'   S\S'   Srg)InterruptionOptionsJ   intsample_rater>   	threshold
min_framesmax_audio_durationaudio_prefix_durationdetection_intervalinference_timeoutr@   base_urlapi_key
api_secretrF   	use_proxyrH   NrI   rJ   rK   rL   rN   rP   rH   rQ   rR   rV   rV   J   sW    BGOZv  [BJMLOO@rQ   rV   c                      \ rS rSr% Sr\" \R                  S9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SS jjrSSS jjrSSS jjrSSS jjrSrg)InterruptionCacheEntrya   z5Typed cache entry for interruption inference results.r<   rX   
created_atNnpt.NDArray[np.int16] | Nonespeech_inputfloat | Nonetotal_durationprediction_durationdetection_delaynpt.NDArray[np.float32] | Noneprobabilitieszbool | Noneis_interruptionc                8    U R                   b  U R                   $ U$ )zFRTT (Round Trip Time) time taken to perform the inference, in seconds.rl   selfdefaults     rR   get_total_duration)InterruptionCacheEntry.get_total_durationn   s    &*&9&9&Et""R7RrQ   c                8    U R                   b  U R                   $ U$ )zDTime taken to perform the inference from the model side, in seconds.)rm   rt   s     rR   get_prediction_duration.InterruptionCacheEntry.get_prediction_durationr   s    +/+C+C+Ot''\U\\rQ   c                8    U R                   b  U R                   $ U$ )zLTotal time from the onset of the speech to the final prediction, in seconds.)rn   rt   s     rR   get_detection_delay*InterruptionCacheEntry.get_detection_delayv   s    '+';';'Gt##TWTrQ   c                J    U R                   b  [        U R                   5      $ U$ )zAThe conservative estimated probability of the interruption event.)rp   _estimate_probabilityrt   s     rR   get_probability&InterruptionCacheEntry.get_probabilityz   s+     :>9K9K9W!$"4"45	
]d	
rQ   rH   )        )rv   r>   returnr>   )rI   rJ   rK   rL   __doc__r	   rO   r   rh   rN   rj   rl   rm   rn   rp   rq   rw   rz   r}   r   rP   rH   rQ   rR   rf   rf   a   sx    ?D,@,@AJAy15L.5#'NL'(,,$(O\(48M18#'O['S]U
 
rQ   rf   c                  h   \ rS rSr% Sr\" SS9rSrS\S'   \	" \
R                  S9rS	\S
'    \	" \
R                  S9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S9S$S  j5       r\SSS!.         S%S" jj5       rS#rg)&OverlappingSpeechEvent   zDRepresents an overlapping speech event detected during agent speech.Tr8   overlapping_speechzLiteral['overlapping_speech']r;   r<   r>   rh   detected_atFrF   rq   r   rl   rm   rn   Nrk   overlap_started_atri   rj   ro   rp   probabilityr   rX   num_requestswrap)modec                    U R                  SS9nUR                  UR                  4nSu  Ul        Ul         U" U5      nUu  Ul        Ul        U$ ! Uu  Ul        Ul        f = f)NT)deep)NN)
model_copyrj   rp   )ru   handlercopydata
serializeds        rR   serialize_model&OverlappingSpeechEvent.serialize_model   sr     D)  $"4"440:-4-	9 J481Dt1 591Dt1s   A A")
started_atended_atc                   U " SU=(       d    [         R                   " 5       UUUR                  UR                  UR                  5       UR	                  5       UR                  5       UR                  5       S9
$ )aC  Initialize the event from a cache entry.

Args:
    entry: The cache entry to initialize the event from.
    is_interruption: Whether the interruption is detected.
    started_at: The timestamp when the overlap speech started.
    ended_at: The timestamp when the overlap speech ended.

Returns:
    The initialized event.
r   )
r;   r   rq   r   rj   rp   rl   rn   rm   r   )rO   rj   rp   rw   r}   rz   r   )clsentryrq   r   r   s        rR   from_cache_entry'OverlappingSpeechEvent.from_cache_entry   sj    ( % /DIIK+)++-- 335!557 % = = ?--/
 	
rQ   rH   )r   r   r   r   )
r   rf   rq   rF   r   rk   r   rk   r   r   )rI   rJ   rK   rL   r   r   rM   r;   rN   r   rO   rh   r   rq   rl   rm   rn   r   rj   rp   r   r   r   r   classmethodr   rP   rH   rQ   rR   r   r      s$   Nd;L*>D
'>dii8J8<tyy9K9?!OT!+NEP!$$N OU V'++g15L.5:48M18?KKL#16"	 #	  $(!%
 &
 	

 !
 
 
 
 
rQ   r   rh   c                      \ rS rSrSrg)_AgentSpeechStartedSentinel   rH   NrI   rJ   rK   rL   rP   rH   rQ   rR   r   r          rQ   r   c                      \ rS rSrSrg)_AgentSpeechEndedSentinel   rH   Nr   rH   rQ   rR   r   r      r   rQ   r   c                  2    \ rS rSr S       SS jjrSrg)_OverlapSpeechStartedSentinel   Nc                (    Xl         X0l        X l        g N)_speech_duration_user_speaking_span_started_at)ru   speech_durationr   user_speaking_spans       rR   __init__&_OverlapSpeechStartedSentinel.__init__   s     !0#5 %rQ   )r   r   r   r   )r   r>   r   r>   r   ztrace.Span | Noner   NonerI   rJ   rK   rL   r   rP   rH   rQ   rR   r   r      s7    
 15	&& & .	&
 
& &rQ   r   c                      \ rS rSrSS jrSrg)_OverlapSpeechEndedSentinel   c                    Xl         g r   	_ended_at)ru   r   s     rR   r   $_OverlapSpeechEndedSentinel.__init__   s    !rQ   r   N)r   r>   r   r   r   rH   rQ   rR   r   r      s    "rQ   r   c                      \ rS rSrSrg)_FlushSentinel   rH   Nr   rH   rQ   rR   r   r      r   rQ   r   r   InterruptionDataFrameTypec                  
  ^  \ rS rSr\\\\\\	SSSSS.
                     SU 4S jjjr
\SS j5       r\SS j5       r\SS j5       r\SS j5       rSS	 jrSS
 jr\S.   SS jjr\\S.     SS jjrSrU =r$ )AdaptiveInterruptionDetectori  N)
rZ   min_interruption_durationr\   r]   r^   r_   r`   ra   rb   http_sessionc       
          > [         TU ]  5         US:  a  [        S5      eU(       a  UO[        R                  " S[        5       5      nU(       a  UOSnU	(       a  U	OSnU[        [        4;   nU(       a  U(       a  UO+[        R                  " S[        R                  " SS5      5      nU(       d  [        S5      eU	(       a  U	O+[        R                  " S[        R                  " S	S5      5      nU(       d  [        S
5      eSnOSn[        [        U[        R                  " U[        -  5      UUUUUUUUS9U l        [        U 5      R                   S[        U 5      R                    3U l        [        U l        Xl        [(        R*                  [,        [.        -     " 5       U l        [2        R4                  " SU R                  R6                  U R                  R8                  U R                  R:                  U R                  R<                  U R                  R>                  U R                  R@                  U R                  RB                  U R                  RD                  S.S9  g)aJ  
Initialize a AdaptiveInterruptionDetector instance.

Args:
    threshold (float, optional): The threshold for the interruption detection, defaults to 0.5.
    min_interruption_duration (float, optional): The minimum duration, in seconds, of the interruption event, defaults to 50ms.
    max_audio_duration (float, optional): The maximum audio duration, including the audio prefix, in seconds, for the interruption detection, defaults to 3s.
    audio_prefix_duration (float, optional): The audio prefix duration, in seconds, for the interruption detection, defaults to 0.5s.
    detection_interval (float, optional): The interval between detections, in seconds, for the interruption detection, defaults to 0.1s.
    inference_timeout (float, optional): The timeout for the interruption detection, defaults to 1 second.
    base_url (str, optional): The base URL for the interruption detection, defaults to the shared LIVEKIT_REMOTE_EOT_URL environment variable.
    api_key (str, optional): The API key for the interruption detection, defaults to the LIVEKIT_INFERENCE_API_KEY environment variable.
    api_secret (str, optional): The API secret for the interruption detection, defaults to the LIVEKIT_INFERENCE_API_SECRET environment variable.
    http_session (aiohttp.ClientSession, optional): The HTTP session to use for the interruption detection.
g      @z<max_audio_duration must be less than or equal to 3.0 secondsLIVEKIT_REMOTE_EOT_URL LIVEKIT_INFERENCE_API_KEYLIVEKIT_API_KEYzUapi_key is required, either as argument or set LIVEKIT_API_KEY environmental variableLIVEKIT_INFERENCE_API_SECRETLIVEKIT_API_SECRETz[api_secret is required, either as argument or set LIVEKIT_API_SECRET environmental variableTF)rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   .z*adaptive interruption detector initialized)r`   r^   r]   r\   r[   rZ   r_   rc   extraN)#superr   
ValueErrorosgetenvr1   r.   r/   rV   SAMPLE_RATEmathceil_FRAMES_PER_SECOND_optsr;   rJ   rI   _label_sample_rate_sessionweakrefWeakSetInterruptionHttpStreamInterruptionWebSocketStream_streamsr   infor`   r^   r]   r\   r[   rZ   r_   rc   )ru   rZ   r   r\   r]   r^   r_   r`   ra   rb   r   lk_base_url
lk_api_keylk_api_secretis_inference_urlrc   	__class__s                   rR   r   %AdaptiveInterruptionDetector.__init__  s   : 	#[\\  35N5PQ 	
 &-'"
+5Z2&+@BW*XX  YY:BIIFWY[<\] 
  k   YY=ryyI]_a?bc 
 ! q  II(#yy!:=O!OP1"71/ $

 d../qd1D1D0EF'$(>A\(\]_8 JJ//&*jj&C&C)-)I)I&*jj&C&C"jj33!ZZ11%)ZZ%A%A!ZZ11		
rQ   c                    g)Nzadaptive interruptionrH   ru   s    rR   model"AdaptiveInterruptionDetector.modelq  s    &rQ   c                    g)NlivekitrH   r   s    rR   provider%AdaptiveInterruptionDetector.provideru  s    rQ   c                    U R                   $ r   )r   r   s    rR   rA   "AdaptiveInterruptionDetector.labely  s    {{rQ   c                    U R                   $ r   )r   r   s    rR   rY   (AdaptiveInterruptionDetector.sample_rate}  s       rQ   c           	     N    U R                  S[        U R                  UUS95        g )NrE   )rA   rE   rG   )emitr6   r   ru   	api_errorrG   s      rR   _emit_error(AdaptiveInterruptionDetector._emit_error  s&    		&kk'	
rQ   c                p    U R                   (       d  [        R                  " 5       U l         U R                   $ r   )r   r)   r   r   s    rR   _ensure_session,AdaptiveInterruptionDetector._ensure_session  s#    }}(557DM}}rQ   )conn_optionsc                    U R                   R                  (       a
  [        XS9nO
[        XS9n U R                  R                  U5        U$ ! [         a  nU R                  USS9  e S nAff = f)Nr   r   FrG   )r   rc   r   r   rD   r   r   add)ru   r   streames       rR   r  #AdaptiveInterruptionDetector.stream  si    	zz##44[/dV 	&!	  	QE2	s   $A 	A 
A.A))A.rZ   r   c                   [        U5      (       a  XR                  l        [        U5      (       a,  [        R                  " U[
        -  5      U R                  l        U R                   H  nUR                  XS9  M     g )Nr  )	r*   r   rZ   r   r   r   r[   r   update_options)ru   rZ   r   r  s       rR   r  +AdaptiveInterruptionDetector.update_options  se     I#,JJ -..$(II.GJ\.\$]DJJ!mmF!!# "  $rQ   )r   r   r   r   r   )rZ   r>   r   r>   r\   r>   r]   r>   r^   r>   r_   r>   r`   
str | Nonera   r
  rb   r
  r   zaiohttp.ClientSession | Noner   r   )r   r@   )r   rX   r   rD   rG   rF   r   r   )r   zaiohttp.ClientSession)r   r$   r   z4InterruptionHttpStream | InterruptionWebSocketStreamrZ   NotGivenOr[float]r   r  r   r   )rI   rJ   rK   rL   	THRESHOLDMIN_INTERRUPTION_DURATIONMAX_AUDIO_DURATIONAUDIO_PREFIX_DURATIONDETECTION_INTERVALREMOTE_INFERENCE_TIMEOUTr   propertyr   r   rA   rY   r   r   r"   r  r#   r  rP   __classcell__r   s   @rR   r   r     sN    %+D$6'<$6#;#"!%59a
 a
 $)	a

 "a
  %a
 "a
 !a
 a
 a
 a
 3a
 
a
 a
F ' '     ! !
 4O0	=$ (17@	 % $5	
 
 rQ   r   )r   rE   metrics_collectedc                      \ rS rSr      SS jr\SS j5       r\" \S9SS j5       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S j5       rSS jrSS jr\R                  " \S9    SS j5       rSrg)InterruptionStreamBasei  c                 ^  UT l         UR                  T l        UR                  5       T l        [        R
                  [           " 5       T l        [        R
                  [           " 5       T l	        [        [        T R                  R                  T R                  R                  -  5      [        R                  T R                  R                  S9T l        ["        [        [$        4   " SS9T l        [        R(                  R+                  T R                  S5      T l        T R,                  u  T l        n[0        R2                  " T R5                  U5      SS9T l        [0        R2                  " T R9                  5       5      T l        T R:                  R=                  U 4S j5        ST l        UT l         T R                  R                  T l!        S T l"        S T l#        S	T l$        S	T l%        ST l&        ST l'        [        RP                  " SS
9T l)        [        T R                  RT                  T R                  R                  -  5      T l+        [        T R                  RX                  T R                  R                  -  5      T l-        g )N)buffer_sizedtyperY   
   )maxsizer   z$InterruptionStreamBase._metrics_task)namec                8   > TR                   R                  5       $ r   )	_event_chclose)_ru   s    rR   <lambda>1InterruptionStreamBase.__init__.<locals>.<lambda>  s    t~~/C/C/ErQ   r   F)initial)._modelr   r   r   r(   Chanr   	_input_chr   r!  r&   rX   r\   rY   npint16_audio_bufferr'   rf   _cache	itertoolstee
_tee_aiter_event_aiterasynciocreate_task_metrics_monitor_task_metrics_task
_main_task_taskadd_done_callback_num_retries_conn_optionsr   _overlap_started_at_user_speech_span_agent_speech_started_overlap_started_overlap_count_accumulated_samplesAsyncAtomicCounter_num_requestsr^   _batch_sizer]   _prefix_size)ru   r   r   monitor_aiters   `   rR   r   InterruptionStreamBase.__init__  s    [[
--/";<>"89;-DJJ99DJJ<R<RRS((

..

 "#'="=>rJ--++DNNA>+/??(=$00&&}5<b
 (():;


$$%EF) JJ2215 48+0"&+#$)*! 33A> #DJJ$A$ADJJDZDZ$Z [!$TZZ%E%E

H^H^%^!_rQ   c                   #    g 7fr   rH   r   s    rR   _runInterruptionStreamBase._run  s     "%s   r   c                .  #    U R                   R                  nU R                  U::  a   U R                  5       I S h  vN $ g  N! [         Ga  nUS:X  d  UR
                  (       d  U R                  USS9  e U R                  U:X  a*  U R                  USS9  [        SU R                   S35      UeU R                  USS9  U R                   R                  U R                  5      n[        R                  " SU S3UU R                  R                  U R                  S	.S
9  [        R                  " U5      I S h  vN    U =R                  S-  sl         S nAO&S nAf[         a  nU R                  USS9  e S nAff = fU R                  U::  a  GMk  g 7f)Nr   Fr  z$failed to detect interruption after z	 attemptsTz+failed to detect interruption, retrying in s)r   attempt)exc_infor   r-   )r:  	max_retryr9  rH  r   	retryabler   r   _interval_for_retryr   warningr'  r   r2  sleeprD   )ru   max_retriesr  retry_intervals       rR   r6  !InterruptionStreamBase._main_task  sy    ((22;.!YY[(( /( '!#1;;$$QE$:&&+5$$QE$:,>t?P?P>QQZ[ $$QD$9%)%7%7%K%KDL]L]%^NNNEnEUUVW!"%)[[%7%7'+'8'8 "--777!!Q&!!    69 ;.s]   'FA AA FA E>C+E;D><EFE>(E99E>>FFc                :    U R                   R                  X5        g r   )r'  r   r   s      rR   r   "InterruptionStreamBase._emit_error  s    	7rQ   c                z    U R                  5         U R                  5         U R                  R                  U5        g)z$Push some audio frame to be analyzedN)_check_input_not_ended_check_not_closedr)  send_nowait)ru   frames     rR   
push_frame!InterruptionStreamBase.push_frame   s,    ##% ""5)rQ   c                    U R                  5         U R                  5         U R                  R                  [	        5       5        g)z#Mark the end of the current segmentN)rY  rZ  r)  r[  r   r   s    rR   flushInterruptionStreamBase.flush  s/    ##% "">#34rQ   c                X    U R                  5         U R                  R                  5         g)z3Mark the end of input, no more audio will be pushedN)r`  r)  r"  r   s    rR   	end_input InterruptionStreamBase.end_input  s    

rQ   c                  #    U R                   R                  5         [        R                  " U R                  5      I Sh  vN   U R
                  R                  5          U R                  I Sh  vN   U R                  R                  5       I Sh  vN   g NV N) N	! U R                  R                  5       I Sh  vN    f = f7f)zClose the stream immediatelyN)	r)  r"  r(   cancel_and_waitr7  r!  r5  r0  acloser   s    rR   rg  InterruptionStreamBase.aclose  s     !!$**---	+$$$$//((*** 	. %*$//((***sY   >C BC B /B0B 4CBCB CC;B><CCc                  #     U R                   R                  5       I S h  vN nU$  N! [         aJ    U R                  R	                  5       (       d#  U R                  R                  5       =n(       a  Ue[        S ef = f7fr   )r1  	__anext__StopAsyncIterationr7  	cancelled	exception)ru   valexcs      rR   rj   InterruptionStreamBase.__anext__  sr     	/))3355C 
 6! 	/::''))djj6J6J6L/Ls/L	$$.		/s&   B* (* B* AA>>Bc                    U $ r   rH   r   s    rR   	__aiter__ InterruptionStreamBase.__aiter__&  s    rQ   c                    U R                   R                  (       a0  [        U 5      n[        UR                   SUR
                   S35      eg )Nr   z
 is closed)r!  closedr;   RuntimeErrorrJ   rI   ru   r   s     rR   rZ  (InterruptionStreamBase._check_not_closed)  s>    >>  t*C#..!13<<.
KLL !rQ   c                    U R                   R                  (       a0  [        U 5      n[        UR                   SUR
                   S35      eg )Nr   z input ended)r)  ru  r;   rv  rJ   rI   rw  s     rR   rY  -InterruptionStreamBase._check_input_not_ended.  s>    >>  t*C#..!13<<.MNN !rQ   c                   U R                  [        R                  [        UR                  5      R                  5       5        U R                  [        R                  UR                  5       5        U R                  [        R                  UR                  5       5        U R                  [        R                  UR                  5       5        U R                  [        R                  UR                  5       5        g r   )set_attributer!   ATTR_IS_INTERRUPTIONr@   rq   lowerATTR_INTERRUPTION_PROBABILITYr    ATTR_INTERRUPTION_TOTAL_DURATIONrw   %ATTR_INTERRUPTION_PREDICTION_DURATIONrz   !ATTR_INTERRUPTION_DETECTION_DELAYr}   )user_speech_spanr   s     rR   _update_user_speech_span/InterruptionStreamBase._update_user_speech_span3  s     	&&,,c%2G2G.H.N.N.P	
 	&&55u7L7L7N	
 	&&88%:R:R:T	
 	&&==u?\?\?^	
 	&&995;T;T;V	
rQ   c           	        ^ #    SU 4S jjnT R                     Sh  vN nU=[        S` =b  u     M    ==[        S` =b  u   O  =[        S` =b  u   O    O(    U" 5       I Sh  vN   [	        U[        5      T l        Md  =[        S` =Gb  u   T R
                  (       a    UR                  T l        UR                  T l
        ST l        ST l        T =R                  S-  sl        T R                  S:X  aj  [        S[        T R                   5      [#        UR$                  T R&                  -  5      T R(                  -   -
  5      nT R                   R+                  U5        [,        R.                  " SST R                  0S	9  T R0                  R3                  5         GM    =[4        S` =b  u     T R                  (       a  T R                  b  [,        R.                  " S
5        ST l
        T R0                  R7                  S 5      u  pVUc  [,        R.                  " S5        [8        R;                  U=(       d    [<        ST R                  UR>                  S9nT R@                  RC                  5       I Sh  vN Ul"        T RG                  U5        ST l        ST l        ST l        GM    [H        RJ                  S` =b  u   T R
                  (       d  GM  T R                   RM                  U5      nT =R                  U-  sl        T R                  T RN                  :  aG  T R                  (       a3  URQ                  T R                   RS                  5       5        ST l        GMB  GME  GMH    GML   GNH GN N
 URU                  5         g7f)zMPreprocess the audio data and forward it to the output channel for inference.c                   >#    ST l         ST l        ST l        ST l        T R                  R                  S5      I S h  vN   T R                  R                  5         T R                  R                  5         S T l
        g  N@7f)NFr   )r=  r>  r?  r@  rB  setr,  resetr-  clearr<  r   s   rR   _reset_state:InterruptionStreamBase._forward_data.<locals>._reset_stateJ  so     ).D&$)D!"#D()D%$$((+++$$&KK%)D"	 ,s   ;BA?ABNrH   Tr   r-   z7overlap speech started, starting interruption inferenceoverlap_countr   z5overlap speech ended, stopping interruption inferencec                J    U R                   S L=(       a    U R                   S:  $ )Nr   rs   )r   s    rR   r$  6InterruptionStreamBase._forward_data.<locals>.<lambda>  s$     % 4 4D @ ]UEYEY\]E] ]rQ   z"no request made for overlap speechFr   rq   r   r   r   r   )+r)  r   r   r   
isinstancer=  r   r   r;  r   r<  r>  r@  r?  maxlenr,  rX   r   r   rD  shiftr   r   r-  r  r   pop_ifr   r   _EMPTY_CACHE_ENTRYr   rB  get_and_resetr   sendr   
AudioFramer]  rC  r[  readr"  )	ru   	output_chr  input_frame
shift_sizer#  
last_entryevsamples_writtens	   `        rR   _forward_data$InterruptionStreamBase._forward_dataG  s    		* "& B	6+%^% &P20225P5N5P5PP&.((1;#%@2D. 4248R8R4/:/F/FD,-8-L-LD*,0D)01D-''1,' **a/%( 2 23 #K$@$@4CTCT$T U"&"3"3!4&
 **00<LLQ+T-@-@ KK%%'5 56 302,,1I1I1U%\]15.(,(:(:)
 &-"LL)MN3DD","B0B,1'+'?'?%0%:%:	 E  150B0B0P0P0R*R		",1D)01D-/3D,- 30 ^^%)C)C)C&*&8&8&C&CK&PO--@-00D4D4DDI^I^!--d.@.@.E.E.GH451 J_D &{B	6
 )b +Sm "0H 	sS   M>M,M$M,A M> M'!HM>.M*/AM>BM>$M,'M>*M>,M>c                    U R                   R                  U5        U R                  R                  UR                  U5        g r   )r!  r[  r'  r   r;   )ru   events     rR   r  InterruptionStreamBase.send  s,    ""5)U+rQ   c                  #    U  S h  vN n[        [        R                  " 5       UR                  UR                  UR                  UR
                  (       a  SOSUR
                  (       d  SOSUR                  [        U R                  R                  U R                  R                  S9S9nU R                  R                  SU5        M   N
 g 7f)Nr-   r   )
model_namemodel_provider)r?   rl   rm   rn   num_interruptionsnum_backchannelsr   metadatar  )r   rO   rl   rm   rn   rq   r   r    r'  r   r   r   )ru   event_aiterr  metricss       rR   r4  ,InterruptionStreamBase._metrics_monitor_task  s      $ 	;")))+!00$&$:$: " 2 2')'9'9!q*,*<*<!__!#{{00AUAUG KK0':	;s&   CCCCC CCC)r@  r=  r,  rC  r-  r:  r1  r!  r)  r5  r'  rB  r9  r   r?  r>  r;  rD  r   r   r7  r0  r<  Nr   r   r   r$   r   r   r  r  )r\  r   r   r   )r   r   )r   z%AsyncIterator[OverlappingSpeechEvent])r  z
trace.Spanr   rf   r   r   )r  aio.Chan[npt.NDArray[np.int16]]r   r   )r  r   r   r   )r  z%AsyncIterable[OverlappingSpeechEvent]r   r   )rI   rJ   rK   rL   r   r   rH  r+   r   r6  r   r]  r`  rc  rg  rj  rr  rZ  rY  staticmethodr  r  r  r   r4  rP   rH   rQ   rR   r  r    s    #`4#`DU#`	#`J % %6"! #!F8*5
+	M
O
 
$
-C
	
 
&Rh, (;@;	; );rQ   r  c                  X    \ rS rSr% \" SS9rS\S'   S\S'   S\S	'   \" S
SS9rS\S'   Sr	g)InterruptionResponsei  Tr8   rX   rh   rF   
is_bargeinr>   rm   .rB   znpt.NDArray[np.float32]rp   rH   N)
rI   rJ   rK   rL   r   rM   rN   r   rp   rP   rH   rQ   rR   r  r    s/    d;LO-23-EM*ErQ   r  c                  |   ^  \ rS rSr      S	U 4S jjr\\S.     S
S jjrSS jr\" \	S9SS j5       r
SrU =r$ )r   i  c                   > [         TU ]  XS9  g )Nr   )r   r   ru   r   r   r   s      rR   r   InterruptionHttpStream.__init__  s     	u@rQ   r  c                   [        U5      (       a  XR                  l        [        U5      (       a-  [        R                  " U[
        -  5      U R                  l        g g r   )r*   r   rZ   r   r   r   r[   ru   rZ   r   s      rR   r  %InterruptionHttpStream.update_options  sF     I#,JJ -..$(II.GJ\.\$]DJJ! /rQ   c                  ^ #    SU 4S jjn[         R                  [        R                  [        R
                        " 5       n[        R                  " T R                  U5      5      [        R                  " U" U5      5      /n [        R                  " U6 I S h  vN   [         R                  " U6 I S h  vN   g  N  N! [         R                  " U6 I S h  vN    f = f7f)Nc                   >#    U   S h  vN nTR                   =n b  TR                  (       d  M,  TR                  U5      I S h  vN nUR                  n[	        UUUR
                  [        R                  " 5       U-
  S-  [        R                  " 5       U-
  UR                  UR                  S9=TR                  U'   nUR                  (       d  M  TR                  (       d  M  [        R                  " S5        TR                  (       a#  TR                  TR                  U5        S Tl        [         R#                  USU[        R                  " 5       S9nTR%                  U5        STl        GMp   GNl GN3
 g 7f)N    eA)rh   rj   rm   rl   rn   rp   rq   zuser interruption detectedTr  F)r;  r>  predictrh   rf   rm   rO   r   rp   r  r-  rq   r   debugr<  r  r   r   r  )input_chr   r   resprh   r   r  ru   s          rR   
_send_task/InterruptionHttpStream._run.<locals>._send_task  sG    & 2d*.*B*BB&!%!6!6 48<<3E-E!__
2H)!%(,(@(@$($8$8$:Z$G3#N$(IIK2D$D"&"4"4$(OO3 J'% (((T-B-B-BLL!=>--55d6L6LeT15./@@#(,#5!%	 A B IIbM,1D)=2 .F 'sE   E>E<E6E<8E>E9B
E>E>(BE>6E<9E><E>)r  r  r   r   )r(   r(  nptNDArrayr*  r+  r2  r3  r  gatherrf  )ru   r  data_chtaskss   `   rR   rH  InterruptionHttpStream._run  s     	2B ((3;;rxx013 2 27 ;<
7 34
	...%(((%%u--- )-#%%u---sN   BC!C  B<C   C!6B>7C!<C  >C! CCCC!r   c                  #    [        5       n U R                  R                  U R                  R                   SU R                  R
                   S[        U R                  R                  5       S[        U5       3SS[        U R                  R                  U R                  R                  5       3S.UR                  5       [        R                  " U R                  R                  S9S9 IS h  vN n UR                  5         UR!                  5       I S h  vN n["        R%                  U[&        R                   " 5       U-
  S	-  [(        R*                  " UR-                  S
/ 5      [(        R.                  S9S.-  5      n[0        R2                  " SUUR4                  UR6                  S.S9  UsS S S 5      IS h  vN   $  N N N	! [8         ap  nUR;                  5       I S h  vN  n[=        U[        R>                  5      (       a  UR@                  OUR@                  n[C        SU 3UUUS:X  a  SS9UeS S9UeS nAff = f! , IS h  vN  (       d  f       g = f! [D        RF                   a  n[C        SU 3SSS9UeS nAf[        RH                   a  n[K        SU 35      UeS nAf[L         a  nUeS nAf[8         a  n[M        SU 35      UeS nAff = f7f)Nz/bargein?threshold=z&min_frames=z&created_at=zapplication/octet-streamBearer )zContent-TypeAuthorization)total)urlheadersr   timeoutr  rp   r  )rm   rp   interruption inference done)rh   rq   rm   r   z&error during interruption prediction:   F)bodystatus_coderO  z interruption inference timeout:   r  rO  z)interruption inference connection error: )'r   r   postr   r`   rZ   rX   r[   r0   ra   rb   tobytesaiohttpClientTimeoutr_   raise_for_statusjsonr  model_validaterO   r*  arraygetfloat32r   r   r  rm   rD   textr  ClientResponseErrorstatusr   r2  TimeoutErrorClientErrorr   r   )	ru   waveformrh   r  r   resultr  msgr  s	            rR   r  InterruptionHttpStream.predict  s    $&
6	P}}))zz**++>tzz?S?S>TT`adeieoeoezeza{`|  }I  JM  NX  JY  IZ  [$>'./B4::CUCUW[WaWaWlWl/m.n%o %%'--DJJ4P4PQ *    ))+15+<D1@@484H4H4JZ4W[^3^-/XX $" =RZZ.F LL5*4/5/@/@393M3M "=   ,=> ! 
 $		++C$.q'2M2M$N$NTXT_T_   )@D $/+6#+=%	
  DH	
 
?  T ## 	 21#6 	
 "" 	]$'PQRPS%TU[\\ 	G 	PCA3GHaO	Ps   KC%I# 3G4I# 7I	9#GGBG4I#  G
I# KI# G
I# 
II)G,*AIII		I II I# K I# #K7JKJ,,K9J;;KKKK)r>  r<  r  r  r  )r  z
np.ndarrayr   r  )rI   rJ   rK   rL   r   r#   r  rH  r+   r   r  rP   r  r  s   @rR   r   r     st    A4ADUA	A (17@		^ %	^ $5		^
 
	^*.X 6"8P #8PrQ   r   c                  0    \ rS rSrSrSrSrSrSrSr	Sr
S	rg
)InterruptionWSMessageTypei>  zsession.createzsession.closezsession.createdzsession.closedbargein_detectedinference_donerE   rH   N)rI   rJ   rK   rL   SESSION_CREATESESSION_CLOSESESSION_CREATEDSESSION_CLOSEDINTERRUPTION_DETECTEDINFERENCE_DONEERRORrP   rH   rQ   rR   r  r  >  s&    %N#M'O%N.%NErQ   r  c                  8    \ rS rSr% \R
                  rS\S'   Srg)#InterruptionWSSessionCreatedMessageiH  z2Literal[InterruptionWSMessageType.SESSION_CREATED]r;   rH   N)	rI   rJ   rK   rL   r  r  r;   rN   rP   rH   rQ   rR   r  r  H  s    !11 	
< rQ   r  c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   S
rg)#InterruptionWSSessionCreateSettingsiN  rX   rY   num_channelsr>   rZ   r[   zLiteral['s16le']encodingrH   Nrd   rH   rQ   rR   r  r  N  s    OrQ   r  c                  B    \ rS rSr% \R
                  rS\S'   S\S'   Srg)"InterruptionWSSessionCreateMessageiV  z1Literal[InterruptionWSMessageType.SESSION_CREATE]r;   r  settingsrH   N)	rI   rJ   rK   rL   r  r  r;   rN   rP   rH   rQ   rR   r  r  V  s     !00 	
;  21rQ   r  c                  8    \ rS rSr% \R
                  rS\S'   Srg)!InterruptionWSSessionCloseMessagei]  z0Literal[InterruptionWSMessageType.SESSION_CLOSE]r;   rH   N)	rI   rJ   rK   rL   r  r  r;   rN   rP   rH   rQ   rR   r  r  ]  s    =V=d=dD
:drQ   r  c                  8    \ rS rSr% \R
                  rS\S'   Srg)"InterruptionWSSessionClosedMessageia  z1Literal[InterruptionWSMessageType.SESSION_CLOSED]r;   rH   N)	rI   rJ   rK   rL   r  r  r;   rN   rP   rH   rQ   rR   r  r  a  s    !00 	
; rQ   r  c                  n    \ rS rSr% \R
                  rS\S'   S\S'   \" SS9r	S\S	'   \" \
S
9rS\S'   Srg)InterruptionWSDetectedMessageig  z8Literal[InterruptionWSMessageType.INTERRUPTION_DETECTED]r;   rX   rh   r   rv   r>   rm   r<   list[float]rp   rH   N)rI   rJ   rK   rL   r  r  r;   rN   r   rm   listrp   rP   rH   rQ   rR   r  r  g  s>    !77 	
B  O!&s!33!&t!<M;<rQ   r  c                  n    \ rS rSr% \R
                  rS\S'   S\S'   \" SS9r	S\S	'   \" \
S
9rS\S'   Srg)"InterruptionWSInferenceDoneMessageip  z1Literal[InterruptionWSMessageType.INFERENCE_DONE]r;   rX   rh   r   r  r>   rm   r<   r  rp   rH   N)rI   rJ   rK   rL   r  r  r;   rN   r   rm   r	  rp   rP   rH   rQ   rR   r  r  p  s>    !00 	
;  O!&s!33!&t!<M;<rQ   r  c                  V    \ rS rSr% \R
                  rS\S'   S\S'   S\S'   S\S'   S	rg
)InterruptionWSErrorMessageiy  z(Literal[InterruptionWSMessageType.ERROR]r;   r@   messagerX   code
session_idrH   N)	rI   rJ   rK   rL   r  r  r;   rN   rP   rH   rQ   rR   r  r  y  s"    5N5T5TD
2TL
IOrQ   r  AnyInterruptionWSMessager;   )discriminatorz%TypeAdapter[AnyInterruptionWSMessage]InterruptionWSMessagec                  j   ^  \ rS rSr      SU 4S jjr\\S.     S	S jjrS
S jrSS jrSr	U =r
$ )r   i  c                  > [         TU ]  XS9  [        [        S5      5      U l        [
        R                  " 5       U l        g )Nr   interruption_request_)r   r   r@   r,   _request_idr2  Event_reconnect_eventr  s      rR   r   $InterruptionWebSocketStream.__init__  s6     	u@y)@AB 'rQ   r  c                   [        U5      (       a  XR                  l        [        U5      (       a,  [        R                  " U[
        -  5      U R                  l        U R                  R                  5         g r   )	r*   r   rZ   r   r   r   r[   r  r  r  s      rR   r  *InterruptionWebSocketStream.update_options  sS     I#,JJ -..$(II.GJ\.\$]DJJ!!!#rQ   c                  ^ ^#    Sm      SUU 4S jjnSUU 4S jjnS n [         R                  [        R                  [        R
                        " 5       n SmT R                  5       I S h  vN n[        R                  " T R                  U5      5      [        R                  " U" X45      5      [        R                  " U" U5      5      /n[        R                  " U6 n[        R                  " T R                  R                  5       5      n [        R                  " Xg4[        R                  S9I S h  vN u  pU H  n
X:w  d  M
  U
R                  5         M     Xx;  a   SmUb+  UR                  (       d  UR!                  5       I S h  vN   S n[         R"                  " / UQUP76 I S h  vN   UR%                  5          UR'                  5         SmUb+  UR                  (       d  UR!                  5       I S h  vN   g g g T R                  R+                  5         SmUb+  UR                  (       d  UR!                  5       I S h  vN   S n[         R"                  " / UQUP76 I S h  vN   UR%                  5          UR'                  5         SmUb)  UR                  (       d  UR!                  5       I S h  vN   GM   GNU GN GN; GN! [        R(                   a     GNf = f N N N! [        R(                   a     Ntf = f! SmUb,  UR                  (       d  UR!                  5       I S h  vN    S n[         R"                  " / UQUP76 I S h  vN    UR%                  5          UR'                  5         f ! [        R(                   a     f f = f= f N! SmUb,  UR                  (       d  UR!                  5       I S h  vN    f f f = f7f)NFc                  >#    [        TR                  R                  S-  5      nU  S h  vN n[        5       nTR                  R                  5        HE  u  pVUR                  b  M  XFR                  -
  U:  a  [        SXFR                  -
  S-  S S3SSS9e  O   TR                  R                  5       I S h  vN   [        5       n[        R                  " SU5      nU R                  XR                  5       -   5      I S h  vN   [        UUS	9TR                  U'   M   N Ni N!
 S
m
[!        ["        R$                  S9n	U R'                  U	R)                  5       5      I S h  vN    g 7f)Nr  z'interruption inference timed out after z.1fzs (ws)r  Fr  z<Q)rh   rj   T)r;   )rX   r   r_   r   r-  itemsrl   rh   r   rB  	incrementstructpack
send_bytesr  rf   r  r  r  send_strmodel_dump_json)wsr  
timeout_ns
audio_datanow_keyr   rh   headerr  
closing_wsru   s             rR   	send_task3InterruptionWebSocketStream._run.<locals>.send_task  sZ     TZZ99C?@J$, j%'#';;#4#4#6KD++7 ---
:,E #&6&6 6#=cB&J(+&+	   $7 ((22444,.
T:6mmF-?-?-A$ABBB*@)!++J'% 5 C# %-. J3.<<C ++c113444sW   %E,D)D#D)BE,;D%<A	E,D'E,#D)%E,'E,)<E,%E(&E,c                	  >#     U R                  5       I S h  vN nUR                  [        R                  R                  [        R                  R
                  [        R                  R                  4;   aj  T(       d  T	R                  R                  (       a  g [        SUR                   3U R                  =(       d    SSUR                  < SUR                  < 3S9eUR                  [        R                  R                  :w  a$  [        R                  " SUR                  5        GM*  [         R"                  " UR                  5      n[$        R'                  U5      nU==[(        S` =b  u   O  =[*        S` =b  u   O    O    GO=[,        S` =Gb  u     UR.                  nT	R0                  =n Gb  T	R2                  (       Ga  T	R4                  R7                  UU4S	 j[9        5       U-
  S
-  [:        R<                  " UR>                  [:        R@                  S9SURB                  [D        RD                  " 5       U-
  S9nT	RF                  (       a#  T	RI                  T	RF                  U5        S T	l#        [        RJ                  " SURM                  5       URO                  5       URQ                  5       URS                  5       S.S9  [T        RW                  USU[D        RD                  " 5       S9nT	RX                  R[                  5       I S h  vN Ul.        T	R_                  U5        ST	l        GOP  =[`        S` =b  u     UR.                  nT	R0                  =n Gb$  T	R2                  (       Ga  T	R4                  R7                  UU4S j[9        5       U-
  S
-  URB                  [:        R<                  " UR>                  [:        R@                  S9S[D        RD                  " 5       U-
  S9n[        Rb                  " SURM                  5       URO                  5       URS                  5       S.S9  OR  [d        S` =b.  u   [        SURf                   3URh                  URf                  S9e   [        R                  " SU5        GM   GNn GNz7f)NTz>LiveKit Adaptive Interruption connection closed unexpectedly: zws_msg.data=z ws_msg.extra=)r  r  r  z8unexpected LiveKit Adaptive Interruption message type %srH   c                    [        U S9$ Nr   rf   cs    rR   r$  EInterruptionWebSocketStream._run.<locals>.recv_task.<locals>.<lambda>      5KWX5YrQ   r  r  )rl   rp   rq   rm   rn   zinterruption detected)rl   rm   rn   r   r   r  Fc                    [        U S9$ r2  r3  r4  s    rR   r$  r6    r7  rQ   )rl   rm   rp   rq   rn   r  )rl   rm   r   z.LiveKit Adaptive Interruption returned error: )r  r  zBreceived unexpected message from LiveKit Adaptive Interruption: %s)5receiver;   r  	WSMsgTypeCLOSEDCLOSECLOSINGr   ru  r   r   
close_coder   TEXTr   rQ  r  loadsr  validate_pythonr  r  r  rh   r;  r>  r-  set_or_updater   r*  r  rp   r  rm   rO   r<  r  r  rw   rz   r}   r   r   r   rB  r  r   r  r  r   r  r  r  )
r&  ws_msgr   r  rh   r   r   r  r,  ru   s
           rR   	recv_task3InterruptionWebSocketStream._run.<locals>.recv_task  s     !zz|+;;%%,,%%++%%--# 
 "T]]%9%9("`agalal`m n$&MM$7R ,~_v||o>  ;;'"3"3"8"88NNRTZT_T_ zz&++.0E0U0UVZ0[d=;==@d@b@d@dd8688%(^^
262J2JJ.!%&*.*?*?*?$(KK$=$= *)3 Y0?0AJ0NRU/U.0hhs7H7HPRPZPZ.[04474K4K04		>P0P %> %E  $55 $ = =d>T>TV[ \9= 6"LL 76;6N6N6P;@;X;X;Z7<7P7P7R383H3H3J	'" "8!H!H&+04+=)-	 "I "B 594F4F4T4T4V.VBO IIbM49D1E 9F >;=%(^^
262J2JJ.!%&*.*?*?*?$(KK$=$= *)3 Y0?0AJ0NRU/U474K4K.0hhs7H7HPRPZPZ.[0504		>P0P %> %E #LL =6;6N6N6P;@;X;X;Z383H3H3J'" >, 45,LSXXJW!$(+  6 ` { +x /Ws=   RRFR5RERR	ARR1DR	RT)return_when)r&  aiohttp.ClientWebSocketResponser  r  r   r   )r&  rG  r   r   )r(   r(  r  r  r*  r+  _connect_wsr2  r3  r  r  r  waitFIRST_COMPLETEDr  ru  r"  gracefully_cancelcancelrm  CancelledErrorr  )ru   r-  rD  r&  r  r  tasks_groupwait_reconnect_taskdoner#  taskr,  s   `          @rR   rH   InterruptionWebSocketStream._run  s\    
!	5/!	5;Z!	5!	5 !	5Fc	 c	J 6:hhs{{288457G'%"
++--''(:(:7(CD''	"(>?''	"6
 &nne4&-&9&9$:O:O:T:T:V&W#$+LL$:$+$;$;% GD
 !%6 KKM !% +6 "&J~bii hhj((!//LL8KLLL&&(#--/ "
>"))((*$$ +4> ))//1!%J~bii hhj((!//LL8KLLL&&(#--/ "
>"))((*$$S  .  )L #11 
 % )L #11  "&J~bii hhj((!//LL8KLLL&&(#--/"11 
 % "
>"))((*$$ +4>sc  AON /K0B!N 'L 9K:L L &)N K
!N 1K2N K )O K+OL ")N K-!N -K/.N K1 )O<N=ON L 
N N K($N 'K((N +O-N /N 1LN LN *N5L86"NMN/N ?N NNNNN O*O	O
OOc                  #    [        U R                  R                  SU R                  R                  U R                  R                  R
                  SS9nU R                  R                  nUR                  S5      (       a  UR                  SSS5      n0 [        5       ESS[        U R                  R                  U R                  R                  5       30En [        R                  " U R                  R!                  U S	3US
9U R"                  R$                  5      I Sh  vN n [7        [8        R:                  US9nUR=                  UR?                  5       5      I Sh  vN   U$  NF! [&        R(                  [        R*                  [&        R,                  4 a  n[/        U[&        R,                  5      (       a&  UR0                  S:X  a  [3        SUR0                  SS9Ue[/        U[        R*                  5      (       a  [5        SSS9Ue[5        S5      UeSnAff = f N! [@         a*  nURC                  5       I Sh  vN    [5        S5      UeSnAff = f7f)z7Connect to the LiveKit Adaptive Interruption WebSocket.r-   s16le)rY   r  rZ   r[   r  )zhttp://zhttps://httpr&  r  r  z/bargein)r  Nr  z,LiveKit Adaptive Interruption quota exceededFr  z;failed to connect to LiveKit Adaptive Interruption: timeout)rO  z2failed to connect to LiveKit Adaptive Interruption)r;   r   zFfailed to send session.create message to LiveKit Adaptive Interruption)"r  r   rY   rZ   r'  r[   r`   
startswithreplacer2   r0   ra   rb   r2  wait_forr   
ws_connectr:  r  r  ClientConnectorErrorr  r  r  r  r   r   r  r  r  r$  r%  rD   r"  )ru   r   r`   r  r&  r  r  s          rR   rH  'InterruptionWebSocketStream._connect_ws\  s)    6

..jj**{{((33
 ::&&677''a8H
#%
w':4::;M;MtzzOdOd'e&fg
	b''((H:X)>(P""** B,
	4.==!C ++c113444 	E
 ((  ''
 	b
 !W8899ahh#o$B !# 	
 Aw3344(Q#  %%YZ`aa!	b. 5 	((*$X	sz   CIA	E- $E+%E- *:H% $H#%H% )I+E- -3H  A;HH  I#H% %
I/IIIII)r>  r  r  r<  r  r  r  )r   rG  )rI   rJ   rK   rL   r   r#   r  rH  rH  rP   r  r  s   @rR   r   r     s\    040DU0	0 (17@	
$ %
$ $5	
$
 

$v%p4 4rQ   r   c                    U c  g[         R                  " US-  5      n[        U 5      U:  a  g[        [        R
                  " X* 5      U*    5      $ )z
Estimate the probability of the interruption event based on the probabilities of the frames.
The estimated probability is the maximum of the minimum of every window_size consecutive frames.
r   g?)r   r   r  r>   r*  	partition)rp   window_sizen_ths      rR   r   r     sO     99[5()D
=D  mU3TE:;;rQ   )rp   ro   r^  r>   r   r>   )q
__future__r   r2  r  r   r   r!  rO   r   abcr   r   collections.abcr   r   dataclassesr   r	   enumr
   r   typingr   r   r   r   r  numpyr*  numpy.typingr  opentelemetryr   pydanticr   r   r   r   r   r   r   r   r   r   _exceptionsr   r   r   logr   metrics.baser   r    	telemetryr!   typesr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   _utilsr.   r/   r0   r1   r2   r   r  r  r  r  r  r  r   r6   rV   rf   r   r  r   r   r   r   r   r  r   rN   EventEmitterr   r  r  r   r@   r  r  r  r  r  r  r  r  r  r  r  r   r   rH   rQ   rR   <module>rq     s   "    	    # 8 (    5 5        F F  8 # Y Y    	%        t$A A %A, t$
 
 %
>S
Y S
n ,q9 	 		 		& 	&" "
	 	 NN!"  $$ "	"
  9 h!	
hV@;S @;LF9 FvP3 vP@T ) ) 2 2e	 e =I == =  ')*'( )) $	$
 )) !! )  @K&F(CCD@ < @"8 @N Ib<1<@E<
<rQ   