
    sj                    :   U d Z ddlm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
 ddlmZ  ej        e          ZdZ e            Ze G d d	                      Z ej                    Zi ad
ed<   d%dZd&dZd'dZd(d)dZd*dZd+d Zd,d!Zd,d"Zd,d#Z d(d-d$Z!dS ).zDAsynchronous per-consumer plugin observers for streaming LLM output.    )annotationsN)	dataclass)AnyCallable)OBSERVER_SCHEMA_VERSIONi   c                  <    e Zd ZU ded<   ded<   ded<   dZded	<   dS )
_ConsumerDispatcherstr	hook_nameCallable[..., Any]callbackz&'queue.Queue[dict[str, Any] | object]'eventsNzthreading.Thread | Nonethread)__name__
__module____qualname____annotations__r        =/home/agent/.hermes/hermes-agent/agent/plugin_stream_hooks.pyr	   r	      sD         NNN    2222&*F******r   r	   z*dict[tuple[str, int], _ConsumerDispatcher]_dispatchersr   r   returnr
   c                >    t          | dt          |                     S )Nr   )getattrrepr)r   s    r   _callback_namer      s    8Zh888r   
dispatcherNonec                   	 | j                                         }	 |t          u r	 | j                                          d S t	          |          }|                    dt                     	  | j        di | nK# t          $ r>}t          
                    d| j        t          | j                  |           Y d }~nd }~ww xY w| j                                          n# | j                                          w xY w)NTtelemetry_schema_versionz Hook '%s' callback %s raised: %sr   )r   get_STOP	task_donedict
setdefaultr   r   	Exceptionloggerwarningr   r   )r   itempayloadexcs       r   _workerr,   #   s1   * $$&&	*u}} ''))))) 4jjG9;RSSS#
#..g....   6(":#677	        ''))))J''))))#*s;   	C *C ,A: 9C :
C4B=8C =CC C:r   tuple[Callable[..., Any], ...]c                    	 ddl m} |                    |           S # t          $ r! t                              d| d           Y dS w xY w)Nr   )pluginsz-plugin stream hook callback lookup failed: %sTexc_infor   )
hermes_clir/   iter_hook_callbacksr&   r'   debug)r   r/   s     r   _registered_callbacksr5   8   si    &&&&&&**9555   DiZ^___rrs    'AA      ?timeoutfloatc                   	 | j                             t                     n# t          j        $ r 	 | j                                          | j                                          n# t          j        $ r Y nw xY w	 | j                             t                     n# t          j        $ r Y nw xY wY nw xY w| j        | j        	                    |           d S d S )Nr7   )
r   
put_nowaitr"   queueFull
get_nowaitr#   Emptyr   join)r   r7   s     r   _stop_dispatcherrA   B   s   $$U++++: 	 	 		((***'')))){ 	 	 	D		((////z 	 	 	D		 $w///// %$sV   " B32A%$B3%A74B36A77B3;BB3B-*B3,B--B32B3list[_ConsumerDispatcher]c           	     @   t          |           }|sg S d |D             }g }g }t          5  t          t                                                    D ]A\  }}|\  }}|| k    r1||vr-|                    t                              |                     B|D ]}	| t          |	          f}t                              |          }| |j	        |j	        
                                sut          j        t                    }
t          | |	|
          }t          j        t"          |fdd|            |_	        |j	                                         |t          |<   |                    |           	 d d d            n# 1 swxY w Y   |D ]}t'          |d           |S )	Nc                ,    h | ]}t          |          S r   )id).0r   s     r   	<setcomp>z#_dispatchers_for.<locals>.<setcomp>X   s    ;;;XBxLL;;;r   )maxsize)r   r   r   Tzplugin-stream-hook:)targetargsdaemonnameg?r:   )r5   _dispatcher_locklistr   itemsappendpoprE   r!   r   is_aliver<   Queue_QUEUE_SIZEr	   	threadingThreadr,   startrA   )r   	callbackscallback_idsstalereadykeyr   key_hook_namecallback_idr   r   s              r   _dispatchers_forr_   S   s   %i00I 	;;;;;L')E')E	 % %#L$6$6$8$899 	4 	4OC),&M;	))k.M.M\--c22333! 	% 	%Hbll+C%))#..J!Z%6%>jFWF`F`FbFb%>AFU`AaAaAa0'%!  

 %.$4"$:y::	% % %
! !'')))$.S!LL$$$$%	%% % % % % % % % % % % % % % %4  2 2
S11111Ls   EE==FFr*   r   boolc           	        d}t          |          }t          |           D ]}	 |j                            |           d} # t          j        $ rL 	 |j                                         |j                                         n# t          j        $ r Y nw xY wY nw xY w	 |j                            |           d}# t          j        $ r1 t          
                    d| t          |j                             Y w xY w|S )zLQueue an observer hook for each consumer without running plugin code inline.FTz?plugin stream hook queue full after drop-oldest: %s callback=%s)r$   r_   r   r;   r<   r=   r>   r#   r?   r'   r4   r   r   )r   r*   queuedr)   r   s        r   enqueue_plugin_stream_hookrc   z   s;   F==D&y11  
		((...Fz 	 	 	!,,...!++----;   			((...FFz 	 	 	LLQz233    	 MsG   AB2BBBBBBB B===C=<C=c                 4    t          d dD                       S )Nc              3  4   K   | ]}t          |          V  d S )N)r5   )rF   rL   s     r   	<genexpr>z,has_stream_observer_hooks.<locals>.<genexpr>   s+      oot$T**oooooor   )on_stream_starton_stream_deltaon_stream_end)anyr   r   r   has_stream_observer_hooksrk      s     oo7noooooor   c                 V    t                      ot          t          d                    S )Nrh   )stream_reasoning_deltas_enabledr`   r5   r   r   r   #has_reasoning_stream_observer_hooksrn      s%    *,,_6KL]6^6^1_1__r   c                     	 ddl m}  |                                 }t          |                     |ddd                    S # t
          $ r  t                              dd	           Y dS w xY w)
zCReturn True only when the user opted plugins into reasoning deltas.r   )configr/   stream_reasoning_deltasF)defaultz.failed to read plugins.stream_reasoning_deltasTr0   )r2   rp   load_configr`   cfg_getr&   r'   r4   )
config_modrp   s     r   rm   rm      s    333333''))J&&vy:S]b&ccddd   EPTUUUuus   ?A &A,+A,c                    t           5  t          t                                                    }i addd           n# 1 swxY w Y   |D ]}t	          ||            dS )zPStop background stream hook dispatchers; used by tests and clean shutdown paths.Nr:   )rM   rN   r   valuesrA   )r7   dispatchersr   s      r   &shutdown_plugin_stream_hook_dispatcherry      s     
  <..0011               " 6 6
W555556 6s   )=AA)r   r   r   r
   )r   r	   r   r   )r   r
   r   r-   )r6   )r   r	   r7   r8   r   r   )r   r
   r   rB   )r   r
   r*   r   r   r`   )r   r`   )r7   r8   r   r   )"__doc__
__future__r   loggingr<   rU   dataclassesr   typingr   r   hermes_cli.middlewarer   	getLoggerr   r'   rT   objectr"   r	   LockrM   r   r   r   r,   r5   rA   r_   rc   rk   rn   rm   ry   r   r   r   <module>r      s   J J J " " " " " "       ! ! ! ! ! !                 9 9 9 9 9 9		8	$	$ + + + + + + + + "9>## ;= = = = =9 9 9 9* * * **   0 0 0 0 0"$ $ $ $N   6p p p p` ` ` `	 	 	 	6 6 6 6 6 6 6r   