o
    ocFj,(                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d>d
dZ
d?ddZd@ddZd@ddZddddAddZdBd#d$ZdCd)d*ZdDd-d.ZdEd0d1ZdFd4d5ZdGd7d8ZdHd9d:ZdId<d=ZdS )J    )annotationsN)Path)median)Any	build_dir
str | Pathreturnlist[dict[str, Any]]c                 C  s^   t | d }| sg S zt|jdd}W n tjy#   g  Y S w t|ts+g S t|S )Nzmanifest.jsonutf-8)encoding)	r   existsjsonloads	read_textJSONDecodeError
isinstancedict#provider_call_metrics_from_manifest)r   manifest_pathmanifest r   </opt/sixxie/releases/current/services/ai/provider_metrics.py$provider_call_metrics_from_build_dir
   s   
r   r   dict[str, Any]c                   sd  t | dtr| di ni }t|dpdt|dp dt |dtr0|di ni }g  t d fdd}|d|dpL|d|dd t |dtra|di ni }t |dtrq|di ni }| D ]8\}}t ||tr||g ng }t |tsqwt|D ]\}	}
|	t|k r||	 nd}|t|||
d qqw S )Nsourceimage_generation_providerunknownimage_model generation_usageactionstr
request_idr   usage_valuer   Nonec                   s   t |tsd S tt|pd}|p|  dt  }|v r d S | d| d|d}t|d}t|d}|d urSt|d |d	< |d	 |d
< d|d< n|d urit|d |d< |d |d
< d|d< |d urut|d |d<  	| d S )Nr   :image_generationok)providermodel	operationr    statusr"   actual_timeobserved_duration_seconds  observed_duration_msduration_msobservedduration_sourceprovider_reported_duration_msprovider_reported)
r   r   _base_request_idr!   lenadd_float_or_nonegetroundappend)r    r"   r#   base_request_idkeymetricprovider_secondsobserved_secondsmetricsr)   r(   seenr   r   
add_metric   s6   


z7provider_call_metrics_from_manifest.<locals>.add_metric	canonicalcanonical_request_idimage_request_id)r    r"   r#   actionsaction_request_ids)r    r!   r"   r   r#   r   r   r$   )	r   r9   r   r!   setitemslist	enumerater6   )r   r   usagerD   action_usagerI   r    usage_itemsrequest_idsindexr#   r"   r   rA   r   r      s.        
r   rB   r   user_idr!   pet_idbuild_id
created_atc                C  sp  t | tsg S g }| D ]}t |tsqt|}t|dpdd}||||t|dp,ddt|dp5ddt|d	p>ddt|d
pGd dkrOdnd|d	}	|d ur\||	d< t|d|dd}
t|d|dd}|
d ur~|
|	d< |d ur||	d< |drt|dd|	d< t|dpd}|rt	|
d d d |	d< ||	 q|S )Nr(   r   (   r)   r   P   r*   r&   r    r+   r'   failed)	rS   rT   rU   r(   r)   r*   r    r+   rV   r0   r3   "provider_reported_duration_seconds)r0   duration_secondsr/   r-   r2   r"   r
      request_id_hash)r   rL   r   _duration_ms_short_textr9   r!   lowerhashlibsha256encode	hexdigestr;   )rB   rS   rT   rU   rV   	sanitizeditemr0   r(   r>   r3   r/   r"   r   r   r   sanitize_provider_call_metricsN   sR   

 
 rg   c          	      C  sF  t | ||||d}g }t|D ]\}}|i ddt| d| d| d d d  d|d|d	|d
t|d
dt	|dpIddd|ddt
t|dp[dd|ddkrhdndd|dddddd|ddkrd nddt	|dpddt	|dpddd d!|d"| q|S )#N)rS   rT   rU   rV   provider_call_idpcm_r%   r
      rS   rT   rU   r(   r)   r   rX   provider_request_idr]   purposer    r+   r'   	succeededrY   
latency_msr0   estimated_cost_centsr   actual_cost_centssanitized_failure_codeprovider_errorsafe_metadatarW   r2   )r    r2   rV   completed_at)rg   rM   r;   ra   rb   rc   rd   _cloud_providerr9   r_   _cloud_metric_purposer!   )	rB   rS   rT   rU   rV   local_metricscloud_metricsrR   rf   r   r   r   $sanitize_cloud_provider_call_metrics   s`   2
	

ry   )r(   rU   r(   
str | Nonec             	     sV   dd  D }|p
d|t  tdd  D t| fddtdd	  D D d
S )Nc                 S  s(   g | ]}t |d trt|d  qS )r0   )r   r9   int.0rf   r   r   r   
<listcomp>   s   ( z3summarize_provider_call_metrics.<locals>.<listcomp>allc                 s  s"    | ]}| d dkrdV  qdS )r+   r'      N)r9   r|   r   r   r   	<genexpr>   s     z2summarize_provider_call_metrics.<locals>.<genexpr>c                   s$   i | ]  t  fd dD qS )c                   s6   g | ]}| d  krt| dtrt|d qS )r(   r0   )r9   r   r{   r|   provider_keyr   r   r~      s
    
z>summarize_provider_call_metrics.<locals>.<dictcomp>.<listcomp>)_duration_summary)r}   rB   r   r   
<dictcomp>   s    
z3summarize_provider_call_metrics.<locals>.<dictcomp>c                 S  s   h | ]}t |d pdqS )r(   r   )r!   r9   r|   r   r   r   	<setcomp>   s    z2summarize_provider_call_metrics.<locals>.<setcomp>)r(   rU   
call_countfailure_countr0   by_provider)r6   sumr   sorted)rB   r(   rU   	durationsr   r   r   summarize_provider_call_metrics   s   
r   values	list[int]dict[str, int | None]c                 C  sR   | s
d d d d d dS t | }tt|t| tt|t|d|d |d dS )N)avgp50p95minmaxgffffff?r   )r   r:   r   r6   r   _nearest_rank)r   orderedr   r   r   r      s   
r   ordered_values
percentilefloatr{   c              	   C  s8   t dtt| d tt|t|  d d }| | S )Nr   r   gB?)r   r   r6   r{   r:   )r   r   rR   r   r   r   r      s   0r   rf   
int | Nonec                 C  s   t | d}|d urt|S t | d}|d urt|S t | d}|d ur-t|S t | d}|d u r?t | d}|d urIt|d S d S )Nr0   r/   r3   r[   r-   r.   )r8   r9   r:   )rf   explicit_msobserved_msprovider_reported_mssecondsr   r   r   r^      s   r^   r"   c                 C  s   |  ddd  ddd S )Nz:frame-r   r   z:copy-fallback)split)r"   r   r   r   r5      s   r5   valuefloat | Nonec              	   C  s$   zt | W S  ttfy   Y d S w )N)r   	TypeError
ValueError)r   r   r   r   r8      s
   
r8   limitc                 C  s   t | pd d | S )Nr   )r!   strip)r   r   r   r   r   r_      s   r_   c                 C  s$   t | pd  }|dv r|S dS )Nopenai>   qwenr   apimart)r!   r`   r   )r   r(   r   r   r   ru      s   ru   r    c                 C  s(   | dkrdS | dv rdS | dkrdS dS )NrE   canonical_image>   style_reviewvisual_reviewsemantic_reviewr   revisionaction_framer   )r    r   r   r   rv     s   rv   )r   r   r   r	   )r   r   r   r	   )rB   r   rS   r!   rT   r!   rU   r!   rV   r!   r   r	   )rB   r	   r(   rz   rU   rz   r   r   )r   r   r   r   )r   r   r   r   r   r{   )rf   r   r   r   )r"   r!   r   r!   )r   r   r   r   )r   r   r   r{   r   r!   )r   r   r   r!   )r    r!   r   r!   )
__future__r   ra   r   pathlibr   
statisticsr   typingr   r   r   rg   ry   r   r   r   r^   r5   r8   r_   ru   rv   r   r   r   r   <module>   s*    


7
6.






