+
    XcjR                        R t ^ RIt^ RIt^ RIt^ RIHt  ^ RIt ^ RIHt  ^ RIHt Rt ! R R]4      t ! R	 R
]'       d	   ]4      tR# ]
4      tR#   ] d    Rt LCi ; i  ]	 d    ]
t LKi ; i  ]	 d    ]
tRt LSi ; i)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                   8   a  ] tR t^"t o R tR tR tR tRtV t	R# )TtsCallbackc                h    Wn         W n        \        R 4      P                  4       V n        RV n        R# )	threadingFN)loopqueue
__import__Eventdone	cancelled)selfr	   r
   s   &&&callbacks.py__init__TtsCallback.__init__#   s(    	
{+113	    c                    R # N r   s   &r   on_openTtsCallback.on_open)   s    r   c                :    V P                   P                  4        R # r   )r   set)r   argss   &*r   on_closeTtsCallback.on_close,   s    		r   c                   V P                   '       d   V P                  P                  4        R #  VP                  RR4      pVR8X  dg   VP                  RR4      pV'       dK   V P                   '       g7   V P                  P                  V P                  P                  RRRV/4       R # R # R # VR8X  d   V P                  P                  4        R # R #   \         d   p\        RT 24        R p?R # R p?ii ; i)	Ntype response.audio.deltadeltaaudiodatazsession.finishedz  [TTS callback] Error: )
r   r   r   getr	   call_soon_threadsafer
   
put_nowait	Exceptionprint)r   responseetyper$   es   &&   r   on_eventTtsCallback.on_event/   s    >>>IIMMO	2LL,E.. Wb1II22

--&%8 "05
 ,,		 - 	2,QC011	2s)   2C #C 54C /!C C8C33C8)r   r   r	   r
   N)
__name__
__module____qualname____firstlineno__r   r   r   r.   __static_attributes____classdictcell____classdict__s   @r   r   r   "   s     2 2r   r   c                   R   a  ] tR t^Bt o RtR tR tRR ltR tR t	R t
R	 tR
tV tR# )OmniCallbackzzBridges Omni SDK events (runs on DashScope's internal WebSocket thread)
to the asyncio event loop via the session's queue.c                V    Wn         VP                  V n        VP                  V n        R # r   )sessionr	   r
   )r   r;   s   &&r   r   OmniCallback.__init__F   s    LL	]]
r   c                    \        R 4       R# )z[Omni] WebSocket connectedN)r*   r   s   &r   r   OmniCallback.on_openK   s    *+r   Nc                J    \        R V RV 24       RV P                  n        R# )z[Omni] WebSocket closed:  FN)r*   r;   active)r   close_status_code	close_msgs   &&&r   r   OmniCallback.on_closeN   s&    )*;)<Ai[IJ#r   c                    V P                   P                  '       g   R#  VP                  RR4      pV P                  W!4       R#   \         d   p\        RT 24        Rp?R# Rp?ii ; i)z:Dispatch Omni events. Runs on DashScope's internal thread.Nr    r!   z  [Omni callback] Error: )r;   rA   r&   	_dispatchr)   r*   )r   eventr,   r-   s   &&  r   r.   OmniCallback.on_eventR   sY    ||"""	3IIfb)ENN5( 	3-aS122	3s   #A A)A$$A)c                4   V P                   pVR 8X  Ed   VP                  RR4      P                  4       pV'       Ed   ^ Vn        \        P                  ! 4       Vn        WCn        V P                  P                  V P                  P                  RRRRRV/4       VP                  RV4       VP                  R,          P                  RRR	V/4       VP                  P                  R
\        VP                  4      ^,           R\         P"                  ! 4       P%                  R4      RVP&                  RVP                  P                  RR4      RVP                  P                  R. 4       Uu. uF  p\)        V4      NK  	  upRVP+                  4       RRRR/4       VP-                  V4      w  rgV'       di   VP&                  R8X  dV   \/        RVR,           RVR,           RV R24       \0        P2                  ! VP5                  Wg4      V P                  4       R # R # R # R # VR8X  de   VP6                  '       dQ   VP8                  '       g=   \/        R4       \0        P2                  ! VP;                  4       V P                  4       R # R # R # VR8X  dF   VP8                  '       g2   \0        P2                  ! VP;                  4       V P                  4       R # R # VR8X  Ed   VP8                  '       d   R # VP                  R!R4      pV'       g   R # \<        '       d9   \<        P>                  ! VP@                  \        V4      ^,          ^,          4       VPB                  '       d1   \E        VR"R#4      '       g   VPF                  P                  V4       R # VPH                  '       d9   VPJ                  VPL                  8X  d   VPN                  P                  V4       R # V;PP                  \        V4      ^,          ^,          ,          un(        \S        VR$4      '       g   ^ Vn*        V;PT                  ^,          un*        VPT                  ^,          ^8X  d3   \/        R%VPT                   R&VP&                   R'\        V4       R24       V P                  P                  V P                  P                  RR(R)VR*VPL                  /4       R # VR+8X  d8   VP                  R!R4      p	V	'       d   V;PV                  V	,          un+        R # R # VR,8X  Ed   VP                  RR4      ;'       g    VPV                  pV'       ds   R-V9   g$   R.V9   g   R/V9   g   R0V9   g   R1V9   g   R2V9   dI   R3V9   g+   R4V9   g$   R5V9   g   R6V9   g   R7VPY                  4       9   d   \/        R8VR9,           24       R pV'       d;   VPB                  '       d)   VPZ                  Rf9   d   \/        R:VR9,           24       R pV'       d*   VP\                  '       d   \/        R;VR9,           24       R pV'       d   VP                  P                  RR<4      p
V P                  P                  V P                  P                  RRRR=RVRV
/4       VP                  R=WJ4       VP                  R,          P                  RR>R	V/4       R # R # VR?8X  Ed
   V;P^                  VP                  R!R4      ,          un/        VPB                  '       g   RVn!        \/        R@4       VPH                  '       d   VPN                  '       dH   VPF                  Pa                  VPN                  4       \/        RA\        VPN                  4       RB24       . Vn'        R#Vn$        VPb                  e2   V P                  P                  VPb                  Pd                  4       R # R # R # VRC8X  d   VP                  RR4      pVP                  RDR4      ;'       g    VP^                  pVP                  RER4      pWn-        Wn3        \/        RFV RGVR9,           R24       \0        P2                  ! VPi                  WV4      V P                  4       R # VRH8X  Ed   \/        RIVP&                   RJVPB                   R24       VPj                  '       d   R#Vn5        RVn.        \/        RK4       MR#Vn.        VPb                  e7   V P                  P                  VPb                  Pd                  4       R Vn1        VPH                  '       dC   VPN                  '       d#   \/        RL\        VPN                  4       RM24       . Vn'        R#Vn$        VPL                  pV;PL                  ^,          un&        V^ 8  dW   VPl                  '       gE   VP\                  '       g3   V P                  P                  V P                  P                  RRN/4       VPl                  pR#Vn6        RVn        R#Vn        VP\                  Vn!        ^ Vn(        \        P                  ! 4       Vn7        RVn+        RVn-        RVn/        RVn3        V P                  P                  VPp                  Pr                  4       V P                  P                  V P                  P                  RRORORP/4       V'       gr   VPt                  ^ 8  d_   RVn$        VPL                  Vn%        . Vn'        VPL                  pV P                  P                  V Pv                  VVPt                  4       R # R # R # VRQ8X  Ed   \/        RRVP&                   R24       R#Vn        R Vn<        R#Vn.        VPH                  '       Ed&   VPJ                  VPL                  8X  Ed
   VPN                  p. Vn'        R#Vn$        VPb                  e7   V P                  P                  VPb                  Pd                  4       R Vn1        V'       d   VPB                  '       g   \/        RS\        V4       RT24       V Fs  pV;PP                  \        V4      ^,          ^,          ,          un(        V P                  P                  V P                  P                  RR(R)VR*VPL                  /4       Ku  	  VPn                  '       d>   VPP                  ^ 8  d-   VPP                  Rg,          pVPn                  V,           Vn        M\        P                  ! 4       Vn        V P                  P                  VPp                  Pz                  4       V P                  P                  V P                  P                  RRORORU/4       VP                  p\        VP                  R. 4      4      ^8  d   VR,          RhR  VR&   VP                  RV/ 4      P                  RW/ 4      pV'       Ed   \/        RXV 24       VP                  RY/ 4      pVP                  RZ/ 4      pVP|                  R[;;,          VP                  R\^ 4      ,          uu&   VP|                  R];;,          VP                  R^^ 4      ,          uu&   VP|                  R_;;,          VP                  R\^ 4      ,          uu&   VP|                  R`;;,          VP                  R^^ 4      ,          uu&   VP|                  Ra;;,          ^,          uu&   R # R # VRb8X  d   VP                  Rb/ 4      p\        V\(        4      '       d   VP                  Rc\        V4      4      M
\        V4      p\/        RdV 24       V P                  P                  V P                  P                  RRbRcReV 2/4       R # R # u upi )iz5conversation.item.input_audio_transcription.completed
transcriptr!   r    speakerusertexthistoryrolecontentturn	timestampz%H:%M:%Sagent
agent_namenamemessagestools	omni_modeT
omni_event	user_turn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"   Nr#   _omni_swallowingF_dbg_audio_countz  [Omni CB] audio.delta #z (agent=z, len=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: :Nd   Nz+  [Omni] Suppressed muted transfer speech: z8  [Omni] Suppressed swallowed auto-response transcript: AIai	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)barge_instatusspeakingzresponse.donez!  [Omni CB] response.done (agent=  [Omni] Flushing z! pre-emit chunks on response.done	listeningr+   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: )ra   rb   i  i)Ar;   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dict_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_namer^   _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
isinstancestr)r   r,   rG   srJ   mkw_keykw_agentr$   r#   rT   rU   r   rm   prev_genis_server_initiatedcurrent_genchunksaudio_durationrS   rt   inpouterrerr_msgs   &&&                      r   rF   OmniCallback._dispatch\   s   LL KK<4::<Jz'($(,		%*4'		..JJ))\9ffjQ vz2#**FFIz+RS##C-1!8!8!DQ^^ !((,,vr":!((,,y"2M N2MQa2M NQ002 +	% 	 $%#;#;J#G ann3.x	/B.C D119&1A0B"VHAO P4400BDIIO 46/ < 99!!!!*:*:*:NO00,,.		; +;! 22###00,,.		; $
 ,,IIgr*E!!"..q||SZ!^q=PQ+++ q"4e<<..55e<)))a.B.BaFWFW.W''..u5((CJNa,??(1011%&"!#!!B&!+1!2D2D1E F  !/vc%j\D EII**

%%&%9J9JK 77IIgr*E%%.%  66<4MM8M8MJ:-J1N$
26G:6U+{j/Hz)^z-I J.,*2L J$4$4$66B:dCSBTUV!
 q;;;))-OOC#D)*, -!
 a000P#D)*, -!
XX\\&$7
		..JJ))\9dZ*>
 tZ<#**[)Z@B  >>7B!77 ////3,MN )))***..55a6M6MNOC0G0G,H+I JQ R S*,'-2*))5II2213I3I3P3PQ 6 * ==99VR(D99["-BB1B1BDii	2.G $#* (aT
|1=>,,((W=		 ((88HTUTpTpSqqrst ,,,05-%)"ST%*"%%1		..q/E/E/L/LM)-&
 )))***3C8O8O4P3Q RI J K*,'-2* ((H"
 !|A$:$:$:1CUCUCU		..JJ))Z(
 #$"8"8%*A"!%A$A+,+=+=A(+,A(*.))+A'$&A! "A "A#%A II**1+F+F+L+LMII**

%%8Z8
 '1+E+E+I-1*'('8'8$*,'//		..11;.. ,J& o%5ann5EQGH!&A,0A)!&A )))a.B.BaFWFW.W00*,'-2*))5II2213I3I3P3PQ-1A*!">">">.s6{m;\]^!'44E
Q!8KK4		66 JJ11#WfeVQEVEVW "( ***q/K/Ka/O!"!=!=!K()(C(Cn(T%(,		%II**1+F+F+J+JKII**

%%8[9
 HHE599Y+,q0#(#3BC#8i IIj"-11'2>Eu(01ii 6;ii 7<$$%89SWW]TU=VV9$$%9:cggnVW>XX:$$%9:cggmUV>WW:$$%:;sww~WX?YY;$$W-2-  g))GR(C6@d6K6KcggiS2QTUXQYG$SE*+II**

%%)|G9-EF	 I !Os   /~c                    V P                   pVP                  e   VP                  P                  4        V P                  P	                  W P
                  V4      Vn        R# )z{Schedule a pre-emit buffer flush after `delay` seconds.
Must be called on the event loop thread (via call_soon_threadsafe).N)r;   r   r   r	   
call_later_flush_pre_emit_buffer)r   gendelayr   s   &&& r   r   %OmniCallback._schedule_pre_emit_flush  sM     LL!!-""))+!%!5!5.."
r   c           	        V P                   pRVn        VP                  '       g   R# VP                  V8w  d   R# VP                  '       dm   VP
                  '       dK   VP                  P                  VP
                  4       \        R\        VP
                  4       RV R24       . Vn        RVn        R# VP
                  p. Vn        RVn        V'       dx   \        R\        V4       RV R24       V FT  pV;P                  \        V4      ^,          ^,          ,          un
        V P                  P                  RR	R
VRV/4       KV  	  R# R# )zgFlush 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=r]   Frr   z pre-emit audio chunks (gen=r    r$   r%   r`   )r;   r   r   r   r   r   r   r   r*   r   r   r
   r(   )r   r   r   r   r$   s   &&   r   r   #OmniCallback._flush_pre_emit_buffer  s6    LL!%)))3&'''&&&**11!2I2IJ7A<S<S8T7U VFFIU!M N&(A#).A&(("$%*"&s6{m3OPSuTUVW,,E
Q!0CC,

%%WfeVSA   r   )r	   r
   r;   )NN)r0   r1   r2   r3   __doc__r   r   r   r.   rF   r   r   r4   r5   r6   s   @r   r9   r9   B   s4     :#
,$3aH	
 r   r9   )r   r   jsonr   r   r   r)   !dashscope.audio.qwen_tts_realtimer   ImportErrorobjectdashscope.audio.qwen_omnir   OMNI_SDK_AVAILABLEr   r9   r   r   r   <module>r      s       
%I>2) 2@c+=' c6 ce    %$%  !s3   A A! A0 	AA!	A-,A-0A>=A>