
    /cjR                         d Z ddlZddlZddlZddlmZ 	 ddlZn# e$ r dZY nw xY w	 ddlmZ n# e	$ r e
ZY nw xY w	 ddlmZ dZn# e	$ r e
ZdZY nw xY w G d d	e          Z G d
 derene
          ZdS )z
TTS and Omni callback classes for the Qwen Pipeline.

These bridge DashScope SDK events (which run on internal threads)
to the asyncio event loop via session queues.
    N)datetime)QwenTtsRealtimeCallback)OmniRealtimeCallbackTFc                   &    e Zd Zd Zd Zd Zd ZdS )TtsCallbackc                 |    || _         || _        t          d                                          | _        d| _        d S )N	threadingF)loopqueue
__import__Eventdone	cancelled)selfr
   r   s      G/home/m1-ai/DEPLOYMENTS/AI-PHONE/ZACK-UPDATE/fixing_leaked/callbacks.py__init__zTtsCallback.__init__#   s6    	
{++1133	    c                     d S N r   s    r   on_openzTtsCallback.on_open)   s    r   c                 8    | j                                          d S r   )r   set)r   argss     r   on_closezTtsCallback.on_close,   s    	r   c                    | j         r| j                                         d S 	 |                    dd          }|dk    rM|                    dd          }|r1| j         s,| j                            | j        j        d|d           d S d S d S |dk    r| j                                         d S d S # t          $ r}t          d|            Y d }~d S d }~ww xY w)	Ntype response.audio.deltadeltaaudio)r   datazsession.finishedz  [TTS callback] Error: )
r   r   r   getr
   call_soon_threadsafer   
put_nowait	Exceptionprint)r   responseetyper"   es        r   on_eventzTtsCallback.on_event/   s$   > 	IMMOOOF	2LL,,E... Wb11  I22
-!(%88       
 ,,,	 -, 	2 	2 	20Q00111111111	2s   A#B0 B0 0
C:CCN)__name__
__module____qualname__r   r   r   r,   r   r   r   r   r   "   sP              2 2 2 2 2r   r   c                   >    e Zd ZdZd Zd Zd
dZd Zd Zd Z	d	 Z
dS )OmniCallbackz~Bridges Omni SDK events (runs on DashScope's internal WebSocket thread)
    to the asyncio event loop via the session's queue.c                 D    || _         |j        | _        |j        | _        d S r   )sessionr
   r   )r   r3   s     r   r   zOmniCallback.__init__F   s    L	]


r   c                 $    t          d           d S )Nz[Omni] WebSocket connected)r(   r   s    r   r   zOmniCallback.on_openK   s    *+++++r   Nc                 H    t          d| d|            d| j        _        d S )Nz[Omni] WebSocket closed:  F)r(   r3   active)r   close_status_code	close_msgs      r   r   zOmniCallback.on_closeN   s2    I*;IIiIIJJJ#r   c                     | j         j        sdS 	 |                    dd          }|                     ||           dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)z:Dispatch Omni events. Runs on DashScope's internal thread.Nr   r   z  [Omni callback] Error: )r3   r7   r$   	_dispatchr'   r(   )r   eventr*   r+   s       r   r,   zOmniCallback.on_eventR   s    |" 	F	3IIfb))ENN5%((((( 	3 	3 	31a11222222222	3s   ,> 
A%A  A%c                    | j         }|dk    r|                    dd                                          }|rd|_        t	          j                    |_        ||_        | j                            | j	        j
        dd|d           |                    d|           |j        d                             d|d           |j                            t          |j                  d	z   t!          j                                        d
          |j        |j                            dd          d |j                            dg           D             |                                ddd           |                    |          \  }}|rb|j        dk    rYt-          d|d          d|d          d| d           t/          j        |                    ||          | j                   d S d S d S d S |dk    rO|j        rD|j        s?t-          d           t/          j        |                                | j                   d S d S d S |dk    r7|j        s.t/          j        |                                | j                   d S d S |dk    rv|j        rd S |                    dd          }|sd S t:          r-t;          j        |j        t          |          dz  dz             |j         r-tC          |dd          s|j"                            |           d S |j#        r,|j$        |j%        k    r|j&                            |           d S |xj'        t          |          dz  dz  z  c_'        tQ          |d          sd|_)        |xj)        d	z  c_)        |j)        d z  d	k    r0t-          d!|j)         d"|j         d#t          |           d           | j                            | j	        j
        d$||j%        d%           d S |d&k    r,|                    dd          }|r|xj*        |z  c_*        d S d S |d'k    rQ|                    dd          p|j*        }|rZd(|v sd)|v sd*|v sd+|v sd,|v sd-|v rBd.|v s"d/|v sd0|v sd1|v sd2|+                                v rt-          d3|d d4                     d }|r,|j         r%|j,        d5v rt-          d6|d d4                     d }|r#|j-        rt-          d7|d d4                     d }|r|j                            dd8          }	| j                            | j	        j
        dd9||	d:           |                    d9||	           |j        d                             d;|d           d S d S |d<k    r|xj.        |                    dd          z  c_.        |j         sd|_         t-          d=           |j#        r|j&        rD|j"        /                    |j&                   t-          d>t          |j&                   d?           g |_&        d|_#        |j0        (| j                            |j0        j1                   d S d S d S |d@k    r|                    dd          }
|                    dAd          p|j.        }|                    dBd          }|
|_,        ||_2        t-          dC|
 dD|d d4          d           t/          j        |3                    |
||          | j                   d S |dEk    rt-          dF|j         dG|j          d           |j4        rd|_4        d|_-        t-          dH           nd|_-        |j0        +| j                            |j0        j1                   d |_0        |j#        r:|j&        r%t-          dIt          |j&                   dJ           g |_&        d|_#        |j%        }|xj%        d	z  c_%        |dk    r5|j5        s.|j-        s'| j                            | j	        j
        dKdLi           |j5        }d|_5        d|_        d|_        |j-        |_         d|_'        t	          j                    |_6        d|_*        d|_,        d|_.        d|_2        | j                            |j7        j8                   | j                            | j	        j
        dMdNdO           |sT|j9        dk    rKd|_#        |j%        |_$        g |_&        |j%        }| j                            | j:        ||j9                   d S d S d S |dPk    rt-          dQ|j         d           d|_        d |_;        d|_-        |j#        r|j$        |j%        k    r|j&        }g |_&        d|_#        |j0        +| j                            |j0        j1                   d |_0        |r}|j         svt-          dRt          |           dS           |D ]S}|xj'        t          |          dz  dz  z  c_'        | j                            | j	        j
        d$||j%        d%           T|j6        r%|j'        dk    r|j'        dTz  }|j6        |z   |_        nt	          j                    |_        | j                            |j7        j<                   | j                            | j	        j
        dMdUdO           |j        }t          |                    dg                     dVk    r|d         dWd          |d<   |                    dXi                               dYi           }|rt-          dZ|            |                    d[i           }|                    d\i           }|j=        d]xx         |                    d^d          z  cc<   |j=        d_xx         |                    d`d          z  cc<   |j=        daxx         |                    d^d          z  cc<   |j=        dbxx         |                    d`d          z  cc<   |j=        dcxx         d	z  cc<   d S d S |ddk    r|                    ddi           }t}          |t~                    r#|                    det          |                    nt          |          }t-          df|            | j                            | j	        j
        dddg| dh           d S d S )iNz5conversation.item.input_audio_transcription.completed
transcriptr   r   user)r   speakertexthistory)rolecontent   z%H:%M:%Snamec                 ,    g | ]}t          |          S r   )dict).0ms     r   
<listcomp>z*OmniCallback._dispatch.<locals>.<listcomp>r   s     N N NQa N N Nr   T	user_turn)turn	timestampagent
agent_namemessagestools	omni_mode
omni_eventaz  [Omni KEYWORD] "keywordu   " matched → transferring to z ()z!input_audio_buffer.speech_startedz6  [Omni BARGE-IN] speech_started event during responsezresponse.audio.interruptedr    r!         _omni_swallowingF_dbg_audio_count   z  [Omni CB] audio.delta #z (agent=z, len=r"   r   r#   _genzresponse.audio_transcript.deltazresponse.audio_transcript.donetransfer_calltransfer_backselect_languagechange_languageend_call	call_backz"type"z"department"z"reason"z
"language"functionz*  [Omni] Suppressed tool-call transcript: d   )r_   r`   z+  [Omni] Suppressed muted transfer speech: z8  [Omni] Suppressed swallowed auto-response transcript: AIai)r   r@   rA   rO   	assistantz&response.function_call_arguments.deltaz5  [Omni] Tool call streaming, muting new audio deltasz  [Omni] Moved z5 pre-emit chunks to muted buffer (tool call detected)z%response.function_call_arguments.done	argumentscall_idz  [Omni] Tool call: (zresponse.createdz$  [Omni CB] response.created (agent=z, mute_was=z;  [Omni CB] Swallowing auto-response (muted, no transcript)z  [Omni CB] Discarding z- pre-emit audio chunks (new response started)r   barge_instatusspeaking)r   rn   zresponse.donez!  [Omni CB] response.done (agent=  [Omni] Flushing z! pre-emit chunks on response.donei  	listening   ir)   usagez  [Omni] Usage: input_tokens_detailsoutput_tokens_detailsinput_text_tokenstext_tokensinput_audio_tokensaudio_tokensoutput_text_tokensoutput_audio_tokensturnserrormessagez  [Omni] Error: zOmni error: )r   r~   )Ar3   r$   strip_idle_prompt_counttime_last_activity_time_omni_user_transcriptr
   r%   r   r&   _log_message_agentappend
prompt_loglenr   nowstrftimeactive_agent_build_omni_tools_check_keyword_triggerr(   asynciorun_coroutine_threadsafe_omni_keyword_transfer_omni_responding_omni_barge_in_omni_trigger_barge_inaudio_timing_tracerecord_recv
session_id_omni_tool_call_audio_mutegetattr_omni_muted_audio_buffer_omni_pre_emit_buffering_omni_pre_emit_gen_omni_audio_gen_omni_pre_emit_buffer_omni_response_audio_byteshasattrr[   _omni_response_textlower_omni_tool_namerZ   _omni_tool_argsextend_omni_pre_emit_timercancel_omni_tool_call_id_handle_omni_tool_call_omni_swallow_next_response_omni_suppress_flush_omni_response_start_time_omni_response_done_eventclear_omni_audio_buffer_delay_schedule_pre_emit_flush_omni_barge_in_speech_startr   _omni_usage_totals
isinstancerH   str)r   r*   r<   sr>   kw_keykw_agentr"   r!   rP   rF   r   rk   prev_genis_server_initiatedcurrent_genchunksaudio_durationrO   rs   inpouterrerr_msgs                           r   r;   zOmniCallback._dispatch\   s   L KKK<44::<<J O'($(,	%*4'	..J))fjQQ   vz222#**Fz+R+RSSS##--1!)!8!8!D!D^"#(,,vr":": N N!(,,y"2M2M N N N0022!%"-	% 	% 	 	 	 $%#;#;J#G#G  Oan33 Ox	/B O O19&1AO OEKO O O P P P400BBDIO O O O O5O O.O O33 999! ;!*: ;NOOO0,,..	; ; ; ; ;; ; ; ; 222# ;0,,..	; ; ; ; ;; ;
 ,,, IIgr**E ! R".q|SZZ!^q=PQQQ+ 
 q"4e<< =.55e<<<) a.BaFW.W.W'..u555((CJJNa,??((1011 '%&"!#!B&!++ D!2D D D !D D69%jjD D D E E EI**
% %9JKK     777IIgr**E /%%.%%%%/ / 666<44M8MJ ":--J1N1N$
226G:6U6U++{j/H/Hz))^z-I-I J..,*2L2L J$4$4$6$666U:dsdCSUUVVV!
  "q; ")-OOO ,#DSD), , - - -!
  "a0 " ,#DSD), , - - -!
 	BX\\&$77
	..J))d'*> >  
 tZ<<<#**(Z@@B B B B B	B 	B >>>7B!7!77 / O/3,MNNN ) R* S.55a6MNNN RC0G,H,H R R R S S S*,'-2*)5I2213I3PQQQQQR R 65 ===99VR((D99["--B1BDii	2..G $A#*A ===TcT
===>>>,((tW==	     (((sssTUTpsssttt , +05-%)"STTTT%*"%1	..q/E/LMMM)-&
 ) 3* K JC8O4P4P J J J K K K*,'-2* (H"
 !||A$:|1CU|	..J)Z(  
 #$"8%*A"!%A$A+,+=A(+,A(*.)++A'$&A! "A "A#%A I**1+F+LMMMI**
%!Z88  
 ' 1+E+I+I-1*'('8$*,'/	..1;.     +I+I o%%GanGGGHHH!&A,0A)!&A ) a.BaFW.W.W0*,'-2*)5I2213I3PQQQ-1A* !"> ]s6{{]]]^^^!'  44E

Q!8KK44	66 J1%,eQEVWW   
 * 4q/Ka/O/O!"!=!K()(Cn(T%%(,	%I**1+F+JKKKI**
%![99  
 HE599Y++,,q00#(#3BCC#8i IIj"--11'2>>E 3000111ii 6;;ii 7<<$%8999SWW]TU=V=VV999$%9:::cggnVW>X>XX:::$%9:::cggmUV>W>WW:::$%:;;;sww~WX?Y?YY;;;$W---2-----3 3 g))GR((C6@d6K6KYcggiS222QTUXQYQYG*S**+++I**
% -EG-E-EFF    	 r   c                     | j         }|j        |j                                         | j                            || j        |          |_        dS )zSchedule a pre-emit buffer flush after `delay` seconds.
        Must be called on the event loop thread (via call_soon_threadsafe).N)r3   r   r   r
   
call_later_flush_pre_emit_buffer)r   gendelayr   s       r   r   z%OmniCallback._schedule_pre_emit_flush  sS     L!-"))+++!%!5!54."
 "
r   c                    | j         }d|_        |j        sdS |j        |k    rdS |j        r^|j        rG|j                            |j                   t          dt          |j                   d| d           g |_        d|_        dS |j        }g |_        d|_        |rit          dt          |           d| d           |D ]E}|xj
        t          |          dz  d	z  z  c_
        | j                            d
||d           DdS dS )zoFlush buffered audio to client if still valid.
        Runs on the event loop thread (scheduled by call_later).Nz  [Omni] Pre-emit flush: moved z. chunks to muted buffer (tool call muted, gen=rW   Frp   z pre-emit audio chunks (gen=rX   rY   r"   r]   )r3   r   r   r   r   r   r   r   r(   r   r   r   r&   )r   r   r   r   r"   s        r   r   z#OmniCallback._flush_pre_emit_buffer  s    L!%) 	F3&&F' 	& N*11!2IJJJ MA<S8T8T M MFIM M M N N N&(A#).A&F("$%*" 	Vs6{{VVPSVVVWWW  ,,E

Q!0CC,,
%%$eSAA   		 	 r   )NN)r-   r.   r/   __doc__r   r   r   r,   r;   r   r   r   r   r   r1   r1   B   s        : :# # #
, , ,$ $ $ $3 3 3a a aH	
 
 
    r   r1   )r   r   jsonr   r   r   r'   !dashscope.audio.qwen_tts_realtimer   ImportErrorobjectdashscope.audio.qwen_omnir   OMNI_SDK_AVAILABLEr   r1   r   r   r   <module>r      s}               %IIIIIII % % %$%>>>>>>   !2 2 2 2 2) 2 2 2@c c c c c+=I''6 c c c c cs)    %%0 ::A 	AA