
    /j
1                         S SK Jr  S SKJrJr  S SKJr  S SKJr  SSK	J
r
  Sr " S S	5      r " S
 S\5      rS\
S\4S jrg)   )logger)	NOT_GIVEN
NotGivenOr)is_given)	ExpFilter   )EndpointingOptionsg      ?c                       \ rS rSrS\S\4S jr\\S.S\\   S\\   SS4S jjr\	S\4S	 j5       r
\	S\4S
 j5       r\	S\4S j5       rSS\S\SS4S jjrSS\S\SS4S jjrS\SS4S jrS\SS4S jrSrg)BaseEndpointing
   	min_delay	max_delayc                 *    Xl         X l        SU l        g NF)
_min_delay
_max_delay_overlappingselfr   r   s      Q/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/voice/endpointing.py__init__BaseEndpointing.__init__   s    ##!    r   r   returnNc                ^    [        U5      (       a  Xl        [        U5      (       a  X l        g g N)r   r   r   r   s      r   update_optionsBaseEndpointing.update_options   s)     I'OI'O r   c                     U R                   $ r   )r   r   s    r   r   BaseEndpointing.min_delay       r   c                     U R                   $ r   )r   r!   s    r   r   BaseEndpointing.max_delay   r#   r   c                     U R                   $ r   r   r!   s    r   overlappingBaseEndpointing.overlapping    s       r   
started_atr(   c                     X l         g r   r'   r   r*   r(   s      r   on_start_of_speech"BaseEndpointing.on_start_of_speech$   s    'r   ended_atshould_ignorec                     SU l         g r   r'   )r   r/   r0   s      r   on_end_of_speech BaseEndpointing.on_end_of_speech'   s
    !r   c                     g r    r   r*   s     r   on_start_of_agent_speech(BaseEndpointing.on_start_of_agent_speech*       r   c                     g r   r5   r   r/   s     r   on_end_of_agent_speech&BaseEndpointing.on_end_of_agent_speech-   r9   r   )r   r   r   F)__name__
__module____qualname____firstlineno__floatr   r   r   r   propertyr   r   boolr(   r-   r2   r7   r<   __static_attributes__r5   r   r   r   r   
   s    "% "E " 1:Zc(&u-(FPQVFW(	( 5   5   !T ! !(U ( (RV (" "t "PT "5 T u  r   r   c                   B  ^  \ rS rSrSS\S\S\4U 4S jjjr\S\4S j5       r\S\4S j5       r\S\4S	 j5       r	\S\4S
 j5       r
\S\\\4   4S j5       rS\SS4S jrS\SS4S jrSS\S\SS4S jjrSS\S\SS4S jjr\\S.S\\   S\\   SS4S jjrSrU =r$ )DynamicEndpointing1   r   r   alphac                    > [         TU ]  XS9  [        X1XS9U l        [        X2XS9U l        SU l        SU l        SU l        SU l        SU l	        g)a  
Dynamically adjust the endpointing delay based on the speech activity.

Args:
    min_delay: Minimum delay in seconds.
    max_delay: Maximum delay in seconds.
    alpha: Exponential moving average coefficient. The higher the value, the more weight is given to the history. Defaults to 0.9.

The endpointing delay is adjusted based on the following information:

1. Pauses between utterances:

[utterance] [pause] [utterance] [pause] [utterance] (<- min delay should cover this)

2. Pauses between an utterance and next immediate interruption:

[utterance] [   pause   ] [immediate interruption] (<- this should be a false EOT, and min delay should cover this)
                [agent speech interrupted]

3. Pauses between a user utterance and agent speech:

[utterance] [pause]                  (<- max delay should cover this)
                   [agent speech]    (this could be interrupted later, but that would be the next turn)
r   )rJ   initialmin_valmax_valNF)
superr   r   _utterance_pause_turn_pause_utterance_started_at_utterance_ended_at_agent_speech_started_at_agent_speech_ended_at	_speaking)r   r   r   rJ   	__class__s       r   r   DynamicEndpointing.__init__2   sd    4 	9B )I!
 %I
 48"15 6:%48#r   r   c                 t    U R                   R                  b  U R                   R                  $ U R                  $ r   )rP   valuer   r!   s    r   r   DynamicEndpointing.min_delay[   s:     $$**6 !!''	
 	
r   c                     U R                   R                  b  U R                   R                  OU R                  n[        XR                  5      $ r   )rQ   rZ   r   maxr   )r   turn_vals     r   r   DynamicEndpointing.max_delayc   s<    -1-=-=-C-C-O4##))UYUdUd8^^,,r   c                     U R                   c  gU R                  c  g[        SU R                  U R                   -
  5      $ N            )rS   rR   r]   r!   s    r   between_utterance_delay*DynamicEndpointing.between_utterance_delayh   s>    ##+%%-1d0043K3KKLLr   c                     U R                   c  gU R                  c  g[        SU R                   U R                  -
  5      $ ra   )rT   rS   r]   r!   s    r   between_turn_delay%DynamicEndpointing.between_turn_delayq   s>    ((0##+1d33d6N6NNOOr   c                     U R                   c  gU R                  c  gU R                  [        U R                  U R                  -
  5      4$ )z
Returns the two pauses in the following case:
[utterance] [first val][second val] [immediate interruption]
                       [agent speech interrupted]
)rb   rb   )rR   rT   rg   absrd   r!   s    r   immediate_interruption_delay/DynamicEndpointing.immediate_interruption_delayz   sP     %%-((0 ##,,t/F/FFG
 	
r   r*   Nc                 ,    Xl         S U l        SU l        g r   rT   rU   r   r6   s     r   r7   +DynamicEndpointing.on_start_of_agent_speech   s    (2%&*#!r   r/   c                     U R                   b-  U R                  b  U R                  U R                   :  a  Xl        SU l        g r   rn   r;   s     r   r<   )DynamicEndpointing.on_end_of_agent_speech   s>     ((4''/**T-J-JJ*2'!r   r(   c                 H   U R                   (       a  g U R                  bp  U R                  bc  U R                  bV  U R                  U R                  :  a<  U(       a5  U R                  S-
  U l        [        R
                  " SU R                  5        Xl        X l         SU l        g )NgMbP?zutterance ended at adjusted: %sT)r   rR   rS   rT   r   tracerV   r,   s      r   r-   %DynamicEndpointing.on_start_of_speech   s    
 &&2((4--9((4+E+EE'+'D'Dt'KD$LL1((
 &0"'r   r0   c                    U(       a  U R                   (       a  U R                  bt  U R                  bg  [        U R                  U R                  -
  5      [        :  a=  [
        R                  " S[        U R                  U R                  -
  5      [        5        OSU l         SU l        S U l        S U l        g U R                   (       d  U R                  GbT  U R                  GcF  U R                  u  p4SUs=:  a  U R                  ::  a  O  OSUs=:  a  U R                  ::  a{  O  OxU R                  =nS:  af  U R                  nU R                  R                  SU5        [
        R                   " SUU R                  SUUUU R                  U R                  S.S9  GOU R"                  =nS:  ax  U R                  nU R$                  R                  SU5        [
        R                   " S	UU R                  S
UU R                  U R                  U R                  U R"                  S.S9  GOU R"                  =nS:  ac  U R                  nU R$                  R                  SU5        [
        R                   " SUU R                  SUU R                  U R                  S.S9  OU R                  =nS:  a|  U R                  co  U R                  cb  U R                  nU R                  R                  SU5        [
        R                   " SUU R                  SUU R                  U R                  S.S9  Xl        S U l        S U l	        SU l        SU l         g )Nzlignoring should_ignore=True: user speech started within %.3fs of agent speech (within grace period of %.3fs)Frc   g      ?z'min endpointing delay updated: %s -> %szimmediate interruption)reasonpauseinterruption_delay
turn_delayr   r   )extraz'max endpointing delay updated: %s -> %sznew turn (interruption))rv   rw   r   r   rd   rg   z4max endpointing delay updated due to pause: %s -> %sznew turn)rv   rw   r   r   zpause between utterances)r   rR   rT   rj   *_AGENT_SPEECH_LEADING_SILENCE_GRACE_PERIODr   rs   rV   rS   rU   rk   r   r   rd   rP   applydebugrg   rQ   )r   r/   r0   ry   rx   rw   prev_vals          r   r2   #DynamicEndpointing.on_end_of_speech   s   T.. **611=22T5R5RRS<= 522T5R5RRS>	 %*!!&-1*+/())5$:U:U:] .2-N-N*J'94>>95t~~5":::Ua?>>%%++C7=NN":!&.@&0%)^^%)^^	  222%a7>>  &&sE2=NN";!&%)^^%)^^373O3O.2.E.E	 000A5>>  &&sE2JNN",!&%)^^%)^^		
 666!;//7119>>%%++C7=NN"<!&%)^^%)^^		
 $, (,%&*#!r   r   c                   [        U5      (       aW  Xl        U R                  R                  U R                  U R                  S9  U R                  R                  U R                  S9  [        U5      (       aX  X l        U R                  R                  U R
                  U R
                  S9  U R                  R                  U R
                  S9  g g )N)rL   rM   )rM   )rL   rN   )rN   )r   r   rP   resetrQ   r   r   s      r   r   !DynamicEndpointing.update_options   s     I'O!!'''Y""4??";I'O""4??DOO"T!!'''@ r   )
rU   rT   r   r   r   rV   rQ   rS   rP   rR   )g?r>   )r?   r@   rA   rB   rC   r   rD   r   r   rd   rg   tuplerk   r7   r<   rE   r-   r2   r   r   r   rF   __classcell__)rW   s   @r   rH   rH   1   sY   '% 'E '% ' 'R 
5 
 
 -5 - - M M M PE P P 
eE5L.A 
 
 "5 "T "
	"u 	" 	"U  RV 0k" k"t k"PT k"` (1'0	A e$A e$	A
 
A Ar   rH   optionsr   c                 p    U R                  SS5      S:X  a  [        U S   U S   S9$  [        U S   U S   S9$ )Nmodefixeddynamicr   r   r   )getrH   r   )r   s    r   create_endpointingr   1  sR    
++fg
&%!+.!+.  "!+.!+. r   N)logr   typesr   r   utilsr   utils.exp_filterr   turnr	   r{   r   rH   r   r5   r   r   <module>r      sJ     )  ( $-1 *$ $N}A }A@ 2  r   