ó
    °"³jÄ  ã                  óÚ   • % S SK Jr  S SKrS SKJrJr  S SKJrJrJ	r	  S SK
Jr  S SKJr  S SKJr  SS	KJr  S
rSqS\S'   SS jr\SS j5       rSS jr\ " S S5      5       rSS jrSS jrg)é    )ÚannotationsN)Ú	dataclassÚfield)ÚdatetimeÚ	timedeltaÚtimezone)Úcache)ÚAny)Úurlsplité   )Útypes)ÚDataSnapshotÚset_custom_snapshotúDataSnapshot | NoneÚ_custom_snapshotr   c                 ó0   • [         b  [         $ [        5       $ ©N)r   Ú_bundled_snapshot© ó    ÚW/home/mande/repo/quber/.venv/lib/python3.13/site-packages/genai_prices/data_snapshot.pyÚget_snapshotr      s   € ÜÑ#ÜÐÜÓÐr   c                 ó"   • SSK Jn   [        U SS9$ )Nr   ©Ú	providersF)r   Úfrom_auto_update)Údatar   r   r   s    r   r   r      s   € åäØØñð r   c                ó   • U q g r   )r   )Úsnapshots    r   r   r   "   s   € àÑr   c                  ó(  • \ rS rSr% S\S'   S\S'   \" S S9rS\S	'   \" S
 SS9rS\S'   \" \SS9r	S\S'   \" \
R                  S9rS\S'   SS jr            SS jr   S         SS jjr          SS jr        SS jrSrg) r   é'   úlist[types.Provider]r   Úboolr   c                 ó   • 0 $ r   r   r   r   r   Ú<lambda>ÚDataSnapshot.<lambda>,   ó   € ¡r   )Údefault_factoryzPdict[tuple[str | None, str | None, str], tuple[types.Provider, types.ModelInfo]]Ú_lookup_cachec                 ó   • 0 $ r   r   r   r   r   r%   r&   /   r'   r   F)r(   Úinitz?dict[tuple[str | None, str | None, str | None], types.Provider]Ú_provider_cachez.set[tuple[str | None, str | None, str | None]]Ú_provider_missesr   Ú	timestampc                óL   • U R                   U-   [        R                  " 5       :„  $ )zPCheck if the snapshot is "active" (e.g. hasn't expired) based on a time to live.)r.   r   Únow)ÚselfÚttls     r   ÚactiveÚDataSnapshot.active4   s   € à�~‰~ Ñ#¤h§l¢l£nÑ4Ð4r   c                óä   • U=(       d"    [         R                  " [        R                  S9nU R	                  USX45      u  pgUR                  UUUU R                  (       a  U R                  S9$ SS9$ )z(Calculate the price for the given usage.)ÚtzN)Úgenai_request_timestampÚauto_update_timestamp)r   r0   r   ÚutcÚfind_provider_modelÚ
calc_pricer   r.   )r1   ÚusageÚ	model_refÚprovider_idÚprovider_api_urlr7   ÚproviderÚmodels           r   ÚcalcÚDataSnapshot.calc8   sx   € ð #:×"Z¼X¿\º\ÌXÏ\É\Ñ=ZÐà×2Ñ2°9¸dÀKÓb‰ˆØ×ÑØØØ$;Ø48×4I×4I $§.¡.ð	  ð 
ð 	
ð PTð	  ð 
ð 	
r   Nc                ó²  • U R                  S X#5      nUR                  XS9u  pgUb  U R                  XeS S 5      u  p‰OdUR                  S:X  aR  UbO  [	        U5      R
                  R                  S5      S   =(       d    S nUb  UR                  X`R                  S9OS n	OS n	[        R                  " XyXPR                  (       a  U R                  5      $ S 5      $ )N)Ú
api_flavorÚ
cloudflarez/ai/run/é   ©Úall_providers)Úfind_providerÚextract_usager:   Úidr   ÚpathÚ	partitionÚ
find_modelr   r   ÚExtractedUsager   r.   )
r1   Úresponse_datar>   r?   rE   r@   r=   r<   Ú_rA   s
             r   rK   ÚDataSnapshot.extract_usageK   sÏ   € ð ×%Ñ% d¨KÓJˆØ#×1Ñ1°-Ð1ÐWÑˆ	ØÑ Ø×/Ñ/°	ÀTÈ4ÓP‰HˆAˆuØ�[‰[˜LÓ(Ð-=Ñ-IÜ Ð!1Ó2×7Ñ7×AÑAÀ*ÓMÈaÑP×XÐTXˆIØT]ÑTi�H×'Ñ'¨	ÇÁÐ'ÑPÐos‰EàˆEÜ×#Ò# E°(×Nc×Nc¸D¿N¹NÓnÐnÐimÓnÐnr   c                ób  • UR                  5       nU(       aT  UR                  5       S:X  a@  SU;   a:  UR                  SS5      u  pVU(       a  [        U R                  U5      (       a  UnUnU(       a4  UR                  SU4nU R
                  R                  U5      =n(       a  U$ O:X4U4nU R
                  R                  U5      =n(       a  U$ U R                  XU5      nUR                  XR                  S9=n	(       a  X)4=U R
                  U'   n
U
$ [        SU< SUR                   35      e)z[Find the provider and model for the given model reference and optional provider identifier.ÚlitellmÚ/r   NrH   z$Unable to find model with model_ref=z in )
ÚlowerÚsplitÚfind_provider_by_idr   rL   r)   ÚgetrJ   rO   ÚLookupError)r1   r=   r@   r>   r?   Úactual_provider_idÚactual_model_refÚ	cache_keyÚprovider_modelrA   Úrets              r   r:   Ú DataSnapshot.find_provider_model]   s1  € ð —O‘OÓ%ˆ	ö ˜;×,Ñ,Ó.°)Ó;ÀÀyÓ@PØ3<·?±?À3ÈÓ3JÑ0Ðæ!Ô&9¸$¿.¹.ÐJ\×&]Ñ&]Ø0�Ø,�	æØ!Ÿ™ d¨IÐ6ˆIØ!%×!3Ñ!3×!7Ñ!7¸	Ó!BÐBˆ~ÕBØ%Ð%ð Cð %¸	ÐBˆIØ!%×!3Ñ!3×!7Ñ!7¸	Ó!BÐBˆ~ÕBØ%Ð%à×)Ñ)¨)ÐBRÓSˆHà×'Ñ'¨	ÇÁÐ'ÐPÐPˆ5ÕPØ2:°/ÐAˆD×Ñ˜yÑ)¨CØˆJäÐ E¸9¹.ÈÈXÏ[É[ÈMÐZÓ[Ð[r   c                óL  • XU4nU R                   R                  U5      =n(       a  U$ X@R                  ;   a  [        XU5      eUbh  [	        U R
                  U5      =n(       a  XPR                   U'   U$ UR                  5       S:w  a'  U R                  R                  U5        [        XU5      eUbr  U R
                   H;  n[        R                  " UR                  U5      (       d  M+  XPR                   U'   Us  $    U R                  R                  U5        [        XU5      eU(       aT  U R
                   HD  nUR                  c  M  UR                  R                  U5      (       d  M4  XPR                   U'   Us  $    U R                  R                  U5        [        XU5      e)NrU   )r,   rZ   r-   Ú_provider_lookup_errorrY   r   rW   ÚaddÚreÚmatchÚapi_patternÚmodel_matchÚis_match)r1   r=   r>   r?   r^   r@   s         r   rJ   ÚDataSnapshot.find_provider€   sz  € ð Ð-=Ð>ˆ	Ø×+Ñ+×/Ñ/°	Ó:Ð:ˆ8Õ:ØˆOØ×-Ñ-Ó-Ü(¨ÐAQÓRÐRàÑ"Ü.¨t¯~©~¸{ÓKÐKˆxÕKØ2:×$Ñ$ YÑ/Ø�Ø× Ñ Ó" iÓ/Ø×%Ñ%×)Ñ)¨)Ô4Ü,¨YÐEUÓVÐVàÑ'Ø ŸNœN�Ü—8’8˜H×0Ñ0Ð2B×CÓCØ6>×(Ñ(¨Ñ3Ø#’Oñ +ð ×!Ñ!×%Ñ% iÔ0Ü(¨ÐAQÓRÐRæØ ŸNœN�Ø×'Ñ'Ó3¸×8LÑ8L×8UÑ8UÐV_×8`Ó8`Ø6>×(Ñ(¨Ñ3Ø#’Oñ +ð
 	×Ñ×!Ñ! )Ô,Ü$ YÐ=MÓNÐNr   r   )r2   r   Úreturnr#   )r<   ztypes.AbstractUsager=   Ústrr>   ú
str | Noner?   rm   r7   zdatetime | Nonerk   ztypes.PriceCalculation)NNÚdefault)
rQ   r
   r>   ztypes.ProviderID | str | Noner?   rm   rE   rl   rk   ztypes.ExtractedUsage)
r=   rl   r@   útypes.Provider | Noner>   rm   r?   rm   rk   z&tuple[types.Provider, types.ModelInfo])r=   rm   r>   rm   r?   rm   rk   ztypes.Provider)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   r)   r,   Úsetr-   r   r0   r.   r3   rB   rK   r:   rJ   Ú__static_attributes__r   r   r   r   r   '   sb  ‡ à#Ó#ØÓÙfkÙ"ñg€MÐcó ñ X]Ù"¨ñX€OÐTó ñ HMÐ]`ÐglÑGmÐÐDÓmÙ°·±Ñ=€IˆxÓ=ô5ð
à"ð
ð ð
ð  ð	
ð
 %ð
ð "1ð
ð 
 ô
ð, 6:Ø'+Ø#ðoàðoð 3ðoð %ð	oð
 ðoð 
õoð$!\àð!\ð (ð!\ð  ð	!\ð
 %ð!\ð 
0ô!\ðF#Oàð#Oð  ð#Oð %ð	#Oð
 
÷#Or   c                óú   • UR                  5       R                  5       nU  H  nUR                  U:X  d  M  Us  $    U  H:  nUR                  (       d  M  UR                  R	                  U5      (       d  M8  Us  $    g)zÂFind a provider by matching against provider_match logic.

Args:
    providers: List of available providers
    provider_id: The provider ID to match

Returns:
    The matching provider or None
N)rW   ÚstriprL   Úprovider_matchri   )r   r>   Únormalized_provider_idr@   s       r   rY   rY   ¦   sq   € ð )×.Ñ.Ó0×6Ñ6Ó8ÐãˆØ�;‰;Ð0Õ0ØŠOñ ó ˆØ×"×"Ñ" x×'>Ñ'>×'GÑ'GÐH^×'_Ó'_ØŠOñ ð r   c                ó�   • Ub#  UR                  5       S:w  a  [        SU< 35      $ Ub  [        SU< 35      $ [        SU < 35      $ )NrU   z$Unable to find provider provider_id=z)Unable to find provider provider_api_url=z,Unable to find provider with model matching )rW   r[   )r=   r>   r?   s      r   rc   rc   ½   sZ   € ØÑ ;×#4Ñ#4Ó#6¸)Ó#CÜÐB°kÑ5EÐFÓGÐGØÑ#ÜÐGÐ6FÑ5JÐKÓLÐLÜÐEÀiÁ]ÐSÓTÐTr   )rk   r   )r   r   )r   r"   r>   rl   rk   ro   )r=   rm   r>   rm   r?   rm   rk   r[   )Ú
__future__r   Ú_annotationsre   Údataclassesr   r   r   r   r   Ú	functoolsr	   Útypingr
   Úurllib.parser   Ú r   Ú__all__r   rt   r   r   r   r   rY   rc   r   r   r   Ú<module>r„      s|   ðÞ 2ã 	ß (ß 2Ñ 2Ý Ý Ý !å à
/€ð )-Ð Ð%Ó ,ôð óó ðô ð
 ÷{Oð {Oó ð{Oô|õ.Ur   