o
    ùT·j0.  ã                   @  s8  d dl mZ d dl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mZ d dlm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 e	dƒZ G dd„ deƒZ!eG dd„ dƒƒZ"G dd„ dee  ƒZ#d%dd „Z$G d!d"„ d"e#d ƒZ%G d#d$„ d$e#ded B  ƒZ&dS )&é    )ÚannotationsN)ÚTracebackType)ÚTypeVarÚCallableÚSequenceÚ	Awaitable)Údeque)Ú	dataclass)ÚSelfÚProtocolÚoverrideé   )ÚGroupingUpdateÚTranscriptGrouperOptions)ÚTranscriptListenersé   )ÚServerEvent)ÚOpenAIError)ÚTranscriptStateÚ_ReturnTc                   @  s   e Zd Zddd„ZdS )Ú_TimerÚreturnÚNonec                 C  s   d S ©N© ©Úselfr   r   úf/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/openai/lib/live/_transcript_grouper.pyÚcancel   s    z_Timer.cancelN©r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                   @  s2   e Zd ZU dZded< dZded< dZded	< dS )
Ú_DispatchRunNzasyncio.Task[None] | NoneÚtaskr   ÚintÚwaitersFÚboolÚobserved)r    r!   r"   r$   Ú__annotations__r&   r(   r   r   r   r   r#      s   
 r#   c                      sP   e Zd Zd‡ fdd„Zddd	„Zdd
d„Zddd„Zddd„Zddd„Z‡  Z	S )Ú_BaseTranscriptGrouperÚoptionsr   r   r   c                   s0   t ƒ  ¡  t|| jƒ| _tƒ | _d | _d| _d S )Nr   )	ÚsuperÚ__init__r   Ú_nowÚ_stater   Ú_updatesÚ_timerÚ_timer_generation)r   r+   ©Ú	__class__r   r   r-   "   s
   

z_BaseTranscriptGrouper.__init__Úfloatc                 C  s   t  ¡ d S ©Néè  )ÚtimeÚ	monotonicr   r   r   r   r.   )   s   z_BaseTranscriptGrouper._nowc                 C  s0   |  j d7  _ | jd ur| j ¡  d | _d S d S )Nr   )r2   r1   r   r   r   r   r   Ú_clear_timer,   s
   


þz#_BaseTranscriptGrouper._clear_timerc                   s@   ˆ  ¡  ˆj ¡ }|d urˆj‰ ˆ |‡ ‡fdd„¡ˆ_d S d S )Nc                     s
   ˆ  ˆ ¡S r   )Ú_timer_firedr   ©Ú
generationr   r   r   Ú<lambda>7   s   
 z2_BaseTranscriptGrouper._schedule.<locals>.<lambda>)r:   r/   Údelayr2   Ú_call_laterr1   )r   r?   r   r<   r   Ú	_schedule2   s   
þz _BaseTranscriptGrouper._scheduleÚdelay_msr%   ÚcallbackúCallable[[], None]r   c                 C  ó   t ‚r   ©ÚNotImplementedError©r   rB   rC   r   r   r   r@   9   ó   z"_BaseTranscriptGrouper._call_laterr=   c                 C  rE   r   rF   ©r   r=   r   r   r   r;   <   rI   z#_BaseTranscriptGrouper._timer_fired)r+   r   r   r   )r   r5   r   ©rB   r%   rC   rD   r   r   ©r=   r%   r   r   )
r    r!   r"   r-   r.   r:   rA   r@   r;   Ú__classcell__r   r   r3   r   r*   !   s    



r*   Úmin_turn_separation_msúfloat | NoneÚassistant_silence_msÚbackchannel_max_duration_msÚbackchannel_isolation_msÚadditional_acknowledgmentsúSequence[str] | Noner   r   c                 C  sH   t | d u rdn| |d u rdn||d u rdn||d u rdn|t|p!dƒƒS )Niô  iÐ  r7   r   )r   Útuple©rN   rP   rQ   rR   rS   r   r   r   Ú_options@   s   
ûrW   c                      s~   e Zd ZdZddddddœd,‡ fdd„Zd-dd„Zd.dd„Zd/dd„Zd0dd„Ze	d1d%d&„ƒZ
e	d2d(d)„ƒZd.d*d+„Z‡  ZS )3ÚTranscriptGrouperaX  Group public Live transcript events into immutable display segments.

    This is the TypeScript SDK's speaker/backchannel policy: only transcript
    additions and session.closed are consumed. It is not VAD, playback tracking,
    or a lossless transcript; brief overlapping acknowledgments may be suppressed.
    Set backchannel_max_duration_ms=0 to disable suppression.
    additional_acknowledgments extends the built-in phrases using the same timing
    thresholds. Phrases are copied at construction and normalized like transcript
    text: case, hyphens, whitespace, and surrounding punctuation are normalized.

    Use one instance per session. Call close() on disconnect or use a with block;
    the grouper never owns, closes or reconnects your transport. Delayed delivery
    can change grouping because monotonic local time supplies inactivity fallback.

    Callbacks are serialized and run outside the state lock. A timer-triggered
    callback may run on a daemon timer thread. Callback exceptions propagate to
    push/close callers, or to threading.excepthook for timer-triggered callbacks.
    NrV   rN   rO   rP   rQ   rR   rS   rT   r   r   c                  s,   t ƒ  t|||||ƒ¡ t ¡ | _d| _d S )NF)r,   r-   rW   Ú	threadingÚLockÚ_lockÚ_dispatching©r   rN   rP   rQ   rR   rS   r3   r   r   r-   d   s   	ûÿ
	
zTranscriptGrouper.__init__Úeventr   c                 C  sl   | j �% | j |¡}|du r	 W d  ƒ dS | j |¡ |  ¡  W d  ƒ n1 s+w   Y  |  ¡  dS )zâConsume one typed Live event; duplicates and unrelated events are ignored.

        Invalid transcript fields or use after close raise OpenAIError before
        changing state. Empty text does not restart inactivity.
        N)r[   r/   Úpushr0   ÚextendrA   Ú	_dispatch©r   r^   Úupdatesr   r   r   r_   y   s   ý
ûzTranscriptGrouper.pushc                 C  sN   | j � | j | j d¡¡ |  ¡  W d  ƒ n1 sw   Y  |  ¡  dS )zÓFlush/finalize once and cancel timers, without closing the transport.

        Already-running callbacks finish in order, including when close is called
        from a callback. Further push calls fail.
        ÚmanualN)r[   r0   r`   r/   Úfinishr:   ra   r   r   r   r   Úclose‡   s
   
þzTranscriptGrouper.closer
   c                 C  s   | S r   r   r   r   r   r   Ú	__enter__’   rI   zTranscriptGrouper.__enter__Úexc_typeútype[BaseException] | NoneÚexcúBaseException | NoneÚ	tracebackúTracebackType | Nonec                 C  s   |   ¡  d S r   ©rf   ©r   rh   rj   rl   r   r   r   Ú__exit__•   s   zTranscriptGrouper.__exit__rB   r%   rC   rD   r   c                 C  s"   t  |d |¡}d|_| ¡  |S )Nr7   T)rY   ÚTimerÚdaemonÚstart)r   rB   rC   Útimerr   r   r   r@   š   s   zTranscriptGrouper._call_laterr=   c                 C  sv   | j �* || jks| jjr	 W d   ƒ d S d | _| j | j ¡ ¡ |  ¡  W d   ƒ n1 s0w   Y  |  	¡  d S r   )
r[   r2   r/   Úclosedr1   r0   r`   ÚtickrA   ra   rJ   r   r   r   r;   ¡   s   þ
ûzTranscriptGrouper._timer_firedc                 C  sî   | j � | jr	 W d   ƒ d S d| _W d   ƒ n1 sw   Y  z6	 | j � | js8d| _	 W d   ƒ W d S | j ¡ }W d   ƒ n1 sGw   Y  |  |¡D ]}||ƒ qQq$ tyv   | j � d| _W d   ƒ ‚ 1 spw   Y  ‚ w )NTF)r[   r\   r0   ÚpopleftÚ	_handlersÚBaseException)r   ÚupdateÚhandlerr   r   r   ra   «   s4   þýýü
ù
ÿþýzTranscriptGrouper._dispatch©rN   rO   rP   rO   rQ   rO   rR   rO   rS   rT   r   r   ©r^   r   r   r   r   ©r   r
   ©rh   ri   rj   rk   rl   rm   r   r   rK   rL   )r    r!   r"   Ú__doc__r-   r_   rf   rg   rp   r   r@   r;   ra   rM   r   r   r3   r   rX   P   s"    ù



	rX   c                      s¦   e Zd ZdZddddddœd:‡ fdd„Zd;dd„Zd<dd„Zd=dd„Zd>dd„Zd?d!d"„Z	e
d@d(d)„ƒZe
dAd+d,„ƒZdBd1d2„ZdCd4d5„Zd=d6d7„ZdDd8d9„Z‡  ZS )EÚAsyncTranscriptGroupera  Asyncio counterpart of TranscriptGrouper, sharing exactly the same policy.

    additional_acknowledgments extends the built-in phrases with the same
    normalization and timing thresholds as TranscriptGrouper.

    Use async with, await push(event), and await close(). Register synchronous
    or asynchronous callbacks with on/once. Handlers run sequentially on the
    owning event loop; timer callbacks never run on a worker thread. Exceptions
    from timer-triggered handlers go to the event loop's exception handler.
    NrV   rN   rO   rP   rQ   rR   rS   rT   r   r   c                  s(   t ƒ  t|||||ƒ¡ d | _d | _d S r   )r,   r-   rW   Ú_loopÚ_dispatch_runr]   r3   r   r   r-   Ë   s   	ûÿ	
zAsyncTranscriptGrouper.__init__úasyncio.AbstractEventLoopc                 C  s2   t  ¡ }| jd u r|| _|S | j|urtdƒ‚|S )NzBThe async transcript grouper must be used on its owning event loop)ÚasyncioÚget_running_loopr‚   r   )r   Úloopr   r   r   Ú	_get_loopà   s   

þz AsyncTranscriptGrouper._get_loopr^   r   c                 Ã  sH   �|   ¡  | j |¡}|du rdS | j |¡ |  ¡  |  ¡ I dH  dS )zJConsume one event and dispatch its updates; await async handlers in order.N)rˆ   r/   r_   r0   r`   rA   ra   rb   r   r   r   r_   è   s   €zAsyncTranscriptGrouper.pushc                 Ã  s8   �|   ¡  | j | j d¡¡ |  ¡  |  ¡ I dH  dS )zIFinalize the projection and cancel timers. Idempotent; owns no transport.rd   N)rˆ   r0   r`   r/   re   r:   ra   r   r   r   r   rf   ò   s
   €zAsyncTranscriptGrouper.closer
   c                 Ã  s   �|   ¡  | S r   )rˆ   r   r   r   r   Ú
__aenter__ù   s   €z!AsyncTranscriptGrouper.__aenter__rh   ri   rj   rk   rl   rm   c                 Ã  s   �|   ¡ I d H  d S r   rn   ro   r   r   r   Ú	__aexit__ý   s   €z AsyncTranscriptGrouper.__aexit__rB   r%   rC   rD   r   c                 C  s   |   ¡  |d |¡S r6   )rˆ   Ú
call_laterrH   r   r   r   r@     s   z"AsyncTranscriptGrouper._call_laterr=   c                 C  sB   || j ks	| jjrd S d | _| j | j ¡ ¡ |  ¡  |  ¡  d S r   )	r2   r/   ru   r1   r0   r`   rv   rA   Ú_start_dispatchrJ   r   r   r   r;     s   z#AsyncTranscriptGrouper._timer_firedÚrunr#   r$   úasyncio.Task[None]c                 C  s^   | j |u rd | _ | ¡ rd S | ¡ }|d ur)|js+|js-|  ¡  d||dœ¡ d S d S d S d S )NzLive transcript callback failed)ÚmessageÚ	exceptionr$   )rƒ   Ú	cancelledr�   r&   r(   rˆ   Úcall_exception_handler)r   r�   r$   Úerrorr   r   r   Ú_dispatch_finished  s   

ÿÿz)AsyncTranscriptGrouper._dispatch_finishedú_DispatchRun | Nonec                   sl   ˆj ‰ ˆ d urˆ jd urˆ j ¡ sˆ S ˆjsd S tƒ ‰ ˆ ˆ_ ˆ ¡  ˆ ˆ ¡¡ˆ _ˆ j ‡ ‡fdd„¡ ˆ S )Nc                   s   ˆ  ˆ | ¡S r   )r”   )r$   ©r�   r   r   r   r>   #  s    z8AsyncTranscriptGrouper._start_dispatch.<locals>.<lambda>)	rƒ   r$   Údoner0   r#   rˆ   Úcreate_taskÚ_dispatch_updatesÚadd_done_callbackr   r   r–   r   rŒ     s   z&AsyncTranscriptGrouper._start_dispatchc              	   Ã  s¼   �| j }|d ur|jt ¡ u rd S |  ¡ }|d u rd S |jd us"J ‚| jd7  _z,zt |j¡I d H  W n tjy>   ‚  tyH   d|_	‚ w d|_	W | jd8  _d S | jd8  _w )Nr   T)
rƒ   r$   r…   Úcurrent_taskrŒ   r&   ÚshieldÚCancelledErrorry   r(   )r   r�   r   r   r   ra   &  s&   €þ"z AsyncTranscriptGrouper._dispatchc                 Ã  sV   �t  ¡ |_| jr)| j ¡ }|  |¡D ]}||ƒ}t |¡r#|I d H  q| js	d S d S r   )r…   r›   r$   r0   rw   rx   ÚinspectÚisawaitable)r   r�   rz   r{   Úresultr   r   r   r™   =  s   €



€ûz(AsyncTranscriptGrouper._dispatch_updatesr|   )r   r„   r}   r   r~   r   rK   rL   )r�   r#   r$   rŽ   r   r   )r   r•   )r�   r#   r   r   )r    r!   r"   r€   r-   rˆ   r_   rf   r‰   rŠ   r   r@   r;   r”   rŒ   ra   r™   rM   r   r   r3   r   r�   ¿   s*    ù








r�   )rN   rO   rP   rO   rQ   rO   rR   rO   rS   rT   r   r   )'Ú
__future__r   r8   r…   rž   rY   Útypesr   Útypingr   r   r   r   Úcollectionsr   Údataclassesr	   Útyping_extensionsr
   r   r   Ú_typesr   r   Ú
_listenersr   Ú
types.liver   Ú_exceptionsr   Ú_transcript_stater   r   r   r#   r*   rW   rX   r�   r   r   r   r   Ú<module>   s.    
 o