
    Pmj7A                       U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 dZ
dZd	Zd
ZdZdZdZdZdZ eh d          Zded<    eh d          Zded<    eh d          Zded<    eh d          Zded<    eh d          Zded<    eh d          Zded<    eh d          Zded<    eh d          Zded <    eh d!          Zded"<    eh d#          Zded$<    eh d%          Zded&<   e eeh          eeeed'eeed(eeeeeeeeeed)	iZ d*ed+<    ee           Z!ded,<    ej"        d-d.#                    d/  e$ed0hz
  d1 d23          D                       z   d4z             Z% eh d5          Z& ed6d7h          Z'ddd>Z(dedBZ)dfdDZ*dgdFZ+dhdHZ,didjdKZ-dkdQZ.dldSZ/dmdTZ0dndVZ1dgdWZ2dodZZ3 ed[\          dpd]            Z4dgd^Z5dqd`Z6dhdaZ7dgdbZ8dgdcZ9dS )rzCBounded product contract for the first Hermes shared-metrics slice.    )annotationsN)	lru_cache)Any)RUNTIME_INSTANCE_KEYzhermes.metrics.schema_versionzhermes.metrics.event.v1zhermes.model_callzhermes.task_runz hermes.nemo_relay.shared_metricsprimaryzhermes.model_call.countzhermes.task_run.startedzhermes.task_run.finished>
   apiclituibatchotherpythondesktopgatewayunknownscheduled_taskfrozenset[str]EXECUTION_SURFACES>   localcustomdirectr   
aggregatorPROVIDER_FAMILIES>   r   remoter   MODEL_LOCALITIES>   failedsuccess	cancelledMODEL_OUTCOMES>   r   r   r   r   	timed_outTASK_OUTCOMES>	   r   r   	completedr   system_aborteduser_cancelledapproval_deniediteration_limitguardrail_blockedTASK_END_REASONS>   noner   r   r"   r#   TASK_TERMINATIONS>
   r   r   r   r   r   	delegated
backgroundinteractiver   gateway_messageTASK_ENTRYPOINTS>   lt_1sgte_10m1s_to_5s	2m_to_10m	30s_to_2m	5s_to_30sDURATION_BUCKETS>   0123_to_5gte_116_to_10COUNT_BUCKETS>   o1o3o4glmgptgrokkimimimonovaqwenstepgemmallamaclaudegeminiminimaxmistraltrinityr   deepseeknemotronMODEL_FAMILIES	call_rolelocalitymodel_familyoutcomeprovider_family
entrypointexecution_surface)	duration_bucket
end_reasonrY   rZ   model_call_count_bucketrV   retry_count_bucketterminationtool_call_count_bucketz$dict[str, dict[str, frozenset[str]]]_COUNTER_DIMENSION_VALUESCOUNTER_METRICSz(?:^|[/_.:-])(|c              #  >   K   | ]}t          j        |          V  d S N)reescape).0familys     V/home/thesage/.hermes/hermes-agent/hermes_cli/observability/shared_metrics_contract.py	<genexpr>rk      s@         		&         r   c                     t          |           S re   )len)values    rj   <lambda>rp      s    c%jj rl   T)keyreversez)(?=$|[/_.:-]|\d)>   copilot-acpgithub-copilotmoanousmlxollamametric_namestr
dimensionsdict[str, Any]returnboolc                    t                               |           }| t                    t          |          k    rdS t          fd|                                D                       S )zBReturn whether dimensions match one closed shared-metric contract.NFc              3  h   K   | ],\  }}t          |         t                    o	|         |v V  -d S re   )
isinstancerz   )rh   fieldallowed_valuesr{   s      rj   rk   z/counter_dimensions_are_valid.<locals>.<genexpr>   s^         "E> 	:e$c** 	0u/     rl   )ra   getsetallitems)ry   r{   contracts    ` rj   counter_dimensions_are_validr      s}    
 ),,[99H3z??c(mm;;u     &.^^%5%5     rl   eventr   dict[str, str] | Nonec                x   t          | dd          }t          |t                    r#|                    t                    t
          k    rdS t          |          t          t          hz
  }|dhz
  s|                    dd          dvrdS t          t          | dd          pd          dk    sqt          t          | d	d          pd          d
k    sMt          t          | dd          pd          t          k    s$t          t          | dd          pd          dk    rdS t          | dd          }t          |t                    rt          |          dhk    rdS |                    d          }|t          vrdS t          | dd          }h d}t          |t                    rt          |          |k    rdS |                    d          |                    d          |                    d          |                    d          |                    d          d}t          t          |          sdS |S )zEReturn package dimensions for one valid primary model-call end event.metadataNotel.status_codeOK>   r   ERRORkind scopecategoryllmnamescope_categoryendcategory_profile
model_namedata>   rV   rT   rS   rU   rW   rS   rT   rU   rV   rW   rR   )getattrr   dictr   
SCHEMA_KEYSCHEMA_VERSIONr   r   rz   MODEL_CALL_SCOPErQ   r   MODEL_CALL_METRIC)r   r   relay_metadatar   event_model_familyr   expected_fieldsr{   s           rj   model_call_dimensionsr      sY   uj$//Hh%% j)A)A^)S)St]]j2F%GGN+,, D1 11 1 tGE62&&,"--88wuj"--344==wufb))/R004DDDwu.339r::eCCtu&8$??&-- 5E1F1FK 2 2 t)--l;;//t5&$''D  O dD!! SYY/%A%AtXXk**HHZ((0088I&&88$566 J ((9:FF trl   !tuple[str, dict[str, str]] | Nonec                `   t          | dd          }t          |t                    r#|                    t                    t
          k    rdS t          |          t          t          hz
  }|dhz
  s|                    dd          dvrdS t          t          | dd          pd          dk    sMt          t          | d	d          pd          d
k    s)t          t          | dd          pd          t          k    rdS t          | dd          dS t          t          | dd          pd          }t          | dd          |dk    ryddh}t          t                    rt                    |k    rdS                     d                              d          d}t          t          |          sdS t          |fS h d}|dk    s(t          t                    rt                    |k    rdS fdt          |          D             }t          t          |          sdS t          |fS )z:Return one validated task counter from a task scope event.r   Nr   r   >   r   r   r   r   r   r   functionr   r   r   r   startrY   rZ   rX   >	   rV   r\   rY   r_   r[   rZ   r^   r`   r]   r   c                <    i | ]}|                     |          S  )r   )rh   r   r   s     rj   
<dictcomp>z task_counter.<locals>.<dictcomp>!  s%    NNNU%%NNNrl   )r   r   r   r   r   r   r   r   rz   
TASK_SCOPEr   TASK_STARTED_METRICsortedTASK_FINISHED_METRIC)r   r   r   r   r   r{   r   s         @rj   task_counterr      sa   uj$//Hh%% j)A)A^)S)St]]j2F%GGN+,, D1 11 1 tGE62&&,"--88wuj"--344
BBwufb))/R00J>>tu($//;t(8"==CDDN5&$''D  ')<=$%% 	To)E)E4((<00!%*=!>!>
 

 ,,?LL 	4"J..
 
 
O 	%$%% 	 t99''tNNNNf_6M6MNNNJ'(<jII t++rl   kwargsc                Z   t          |                     d          p|                     d          pd                                                                          }|t          v r|S |dk    rdS |dv rdS 	 dd	lm} | |            v rd
S n# t          $ r Y nw xY w|dv rd
S |dk    rdndS )zENormalize the safe session surface carried by the parent Relay scope.rZ   platformr   
api_serverr   >   cron	scheduled	schedulerr   r   )get_all_platformsr   >   emailslackteamsdiscordtelegramwhatsappr   )rz   r   striplowerr   hermes_cli.platformsr   	Exception)r   ro   r   s      rj   rZ   rZ   '  s     	FJJ*++Rvzz*/E/ERSS		 

 """u222::::::%%''''9 (   NNNy**997s   8B 
BBdict[str, str]c                F    t          |           }t          | |          |dS )z>Build the bounded fields recorded on a task scope start event.rX   )rZ   task_entrypoint)r   surfaces     rj   task_start_fieldsr   @  s.    ''G%fg66$  rl   r   
str | Nonec           
     b   t          |                     d          pd                                                                          }|t          v r|S |pt          |           }|                     d          s|                     d          rdS ddddd	d
dddd	                    |d          S )zCNormalize the task dispatch owner without exporting source strings.rY   r   parent_task_idparent_session_idr*   r   r   r,   r-   r   r   r   )	r   r   r	   r   r   r   r   r
   r   r   )rz   r   r   r   r.   rZ   )r   r   declaredresolved_surfaces       rj   r   r   I  s    6::l++1r2288::@@BBH###;"3F";";zz"## vzz2E'F'F { $*
 
 
c
G$$
%rl   duration_msintmodel_call_counttool_call_countretry_countc          
         t          |           }t          |           \  }}}i |t          |          |t          |          |t          |          |t          |          dS )z6Build the bounded terminal payload for one task scope.)r[   r\   r]   rV   r^   r_   r`   )r   task_terminal_stater[   count_bucket)	r   r   r   r   r   start_fieldsrV   r\   r_   s	            rj   task_terminal_fieldsr   ^  s|     %V,,L':6'B'B$GZ	
	*;77 #/0@#A#A*;77""."?"?	 	 	 	rl   tuple[str, str, str]c                   t          |                     d          pd                                                                          }|                     d          sd|v sd|v rdS d|v sd|v rd	S d
|v sd|v rdS d|v r
d|v sd|v rdS d|v rdS |dk    rdS |                     d          du rdS |                     d          du s|r|dk    rdS dS )z=Map Hermes terminal state to bounded task outcome dimensions.turn_exit_reasonr   interrupted	interruptcancel)r   r#   r#   timeoutr   )r   r   r   max_iterationsbudget_exhausted)r   r%   r"   approvaldeniedrejected)r   r$   r(   	guardrail)r   r&   r"   r"   )r   r"   r"   r!   T)r   r!   r(   r   r   )r   r   r(   )r   r   r   )rz   r   r   r   )r   reasons     rj   r   r   u  s5   .//5266<<>>DDFFFzz-   ?K6$9$9X=O=O>>FkV33446!!%76%A%A<<VV!3!3zV7K7K22f>>!!!;;zz+$&&--zz(t###6Y3F3F))**rl   c                    t          dt          |                     }|dk     rdS |dk     rdS |dk     rdS |dk     rd	S |d
k     rdS dS )zGBucket a non-negative task duration into a fixed low-cardinality range.r   i  r/   i  r1   i0u  r4   i r3   i'	 r2   r0   )maxr   )r   ro   s     rj   r[   r[     sd    3{##$$Eu}}wu}}zv~~{w{w{9rl   countc                    t          dt          |                     }|dk    rt          |          S |dk    rdS |dk    rdS dS )z8Bucket a non-negative per-task count into a fixed range.r         r9   
   r;   r:   )r   r   rz   )r   ro   s     rj   r   r     sM    3u::Ezz5zzzzx{{y8rl   c                z   t          |                     d          pd                                                                                              dd          }|sdS |t
          v rdS |dk    s|                    d          rdS t          |          \  }}}|d	v rdS |s	|t          v rd
S |dk    rdS |rdndS )z4Map a Hermes provider to a bounded product category.providerr   _-r   r   r   )zcustom-zcustom:>   r   lmstudior   r   )	rz   r   r   r   replace_LOCAL_CUSTOM_PROVIDER_ALIASES
startswith_provider_metadata_TELEMETRY_AGGREGATOR_OVERRIDES)r   raw_providerr   is_aggregatoris_knowns        rj   rW   rW     s    vzz*--344::<<BBDDLLSRUVVL y555wx<#:#:;Q#R#Rx(:<(H(H%HmX(((w $CCC|8x.88Y.rl   r   tuple[str, bool, bool]c                    	 ddl m} ddlm}m}  | ||                     }|                    |          }|t          |o|j                  |t                      v fS # t          $ r | ddfcY S w xY w)zFResolve provider identity without refreshing remote provider metadata.r   )normalize_provider)HERMES_OVERLAYSr   F)	hermes_cli.modelsr   hermes_cli.providersr   r   r~   r   _known_provider_idsr   )r   normalize_model_providerr   r   	canonicaloverlays         rj   r   r     s    &TTTTTTLLLLLLLL&&'?'?'I'IJJ	!%%i002W233,...
 	

  & & &%%%%&s   AA   A21A2   )maxsizec                 z    	 ddl m}  t           |                       S # t          $ r t                      cY S w xY w)z@Cache Hermes's static provider catalog for the process lifetime.r   provider_catalog_by_slug)hermes_cli.provider_catalogr	  	frozensetr   r  s    rj   r  r    s\    HHHHHH1133444   {{s    ::c                <    t          | t          |                     S )z5Classify local endpoints without exporting their URL.)_model_localityrW   )r   s    rj   model_localityr    s    6?6#:#:;;;rl   provider_categoryc                    |                      d          }t          |t                    r'|r%	 ddlm}  ||          rdS n# t
          $ r Y nw xY w|dk    rdS |dv rdS dS )Nbase_urlr   )is_local_endpointr   >   r   r   r   r   )r   r   rz   agent.model_metadatar  r   )r   r  r  r  s       rj   r  r    s    zz*%%H(C   X 	>>>>>>  ** w 	 	 	D	G##w444x9s   A 
AAc                n    t          |           }t          t          | |          t          |           |dS )z=Build the bounded producer fields for one logical model call.)rS   rT   rU   rW   )rW   PRIMARY_MODEL_CALL_ROLEr  rU   )r   r  s     rj   model_call_fieldsr    s>    '//,#F,=>>$V,,,	  rl   c                   t          |                     d          pd                                                                          }|t          dhz
  v r|S t          |                     d          p|                     d          pd                                          }t
                              |          }||                    d          ndS )z4Map a raw model identifier to an allowlisted family.rU   r   r   response_modelmodelNr  )rz   r   r   r   rQ   _MODEL_FAMILY_PATTERNsearchgroup)r   declared_familyr  matchs       rj   rU   rU     s    &**^44:;;AACCIIKKO.I;666

+,,I

70C0CIrJJPPRRE!((//E".5;;q>>>I=rl   c                    t          |                     d          pd                                          }|t          v r|ndS )zAFail closed when a terminal model-call outcome is not recognized.rV   r   r   )rz   r   r   r   )r   ro   s     rj   model_call_outcomer     s@    

9%%+,,2244E^++559rl   )ry   rz   r{   r|   r}   r~   )r   r   r}   r   )r   r   r}   r   )r   r|   r}   rz   )r   r|   r}   r   re   )r   r|   r   r   r}   rz   )r   r|   r   r   r   r   r   r   r   r   r}   r   )r   r|   r}   r   )r   r   r}   rz   )r   r   r}   rz   )r   rz   r}   r   )r}   r   )r   r|   r  rz   r}   rz   ):__doc__
__future__r   rf   	functoolsr   typingr   agent.relay_runtimer   r   r   r   r   SUBSCRIBER_NAMEr  r   r   r   r  r   __annotations__r   r   r   r    r'   r)   r.   r5   r<   rQ   ra   rb   compilejoinr   r  r   r   r   r   r   rZ   r   r   r   r   r[   r   rW   r   r  r  r  r  rU   r   r   rl   rj   <module>r*     s   I I I " " " " " " 				             4 4 4 4 4 4,
*& 
4# - / 1 %.Y 0 0 0 & &      %.I / / / % %      $-9-K-K-K#L#L  L L L L!*+M+M+M!N!N N N N N )	 + + + ! !     $-9 
. 
. 
. 
$ 
$  
 
 
 
 %.I / / / % %      $-9 . . . $ $      $-9 . . . $ $      !*	 + + + ! !     "+ , , , " "    2 Y 7899$&!,  &/  +&&/#0 +("/
 
C     0 #,),E"F"F F F F F"
	hh  fi[(((
 
 
     	    #,) - - - # #  "+E8+<!=!=    , , , ,^5, 5, 5, 5,p8 8 8 82   % % % % %*   .+ + + +,    	 	 	 	/ / / /&& & & &" 1   < < < <
   "   > > > >: : : : : :rl   