Ë
    áß²jã  ã            !      ó  — U d dl mZ d dlZd dlZd dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZmZ d dlmZmZ  ej,                  e«      Z e
d	«      Z e
d
«      ZdZ e
d«      ZdZd¿d„Zed   Zed   Z  ed¬«       G d„ d«      «       Z! ed¬«       G d„ d«      «       Z" ed¬«       G d„ d«      «       Z# ed¬«       G d„ d«      «       Z$d„ Z% e#eeeedd¬«      Z&	 dÀddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÁd „Z'd!Z(d"Z)d#Z*d$Z+d%Z,d&d'd(d)d*d+d,œfd-e)d.e+e,d/d0d1d2d3œfd-d4d.d5d6ifd-e)d7d8d9ifd&d:d;d<d=d>d?d@dAdBdCœfdDdEdFdGdHdIœfdJdKdLdMdNifdJdKdOdPdQdRœfdJe*dSdTdUdVdWdXdYdZœfd[e(d\d]e+ifd[e(d^d_e,ifd[e(d`e,d1dadbdcddœfdeddfdgdhifdiddfdgdhifdjdkdldmdndodpdqdrdsdXdtdudsdvdwdxdydzœffZ-d{e.d|<   i Z/d}e.d~<   e-D ]B  \  Z0Z1Z2Z3e3ji                  «       D ](  \  Z5Z6 e'e6e2e1dœŽZ7 e8e5e9«      re5fne5D ]	  Z:e7e/e0e:f<   Œ Œ* ŒD [-[0[1[2[3[5[6[7[: e'd€d�d‚dƒd„d…d† e
d‡«       e
dˆ«       e
d‰«       e
dŠ«      ¬‹«      e/dŒ<   d�D ]?  \	  Z;Z<Z=Z>Z?Z@ZAZBZC e'e<e=e>e?dŽe;› �d�d† e
e@«       e
eA«       e
eB«       e
eC«      ¬‹«      e/d&e;f<   ŒA [;[<[=[>[?[@[A[B[C e'd‰d�d‘e*dSd’ e
d“«       e
d”«       e
d•«      ¬–«	      e/d—<    e'd˜d€d™e*dSd’ e
dš«       e
d›«      ¬œ«      e/d�<   [([)[*[+[,g dž„ dŸD «       ¢d ‘d¡‘­D ]  \  Z0ZDZEe/e0eEf   e/e0eDf<   Œ [0[D[EdÂd¢„ZFdÃd£„ZGdÄd¤„ZHd-d&d&dedid¥œZIh d¦£ZJ	 dÀ	 	 	 	 	 	 	 dÅd§„ZKd¨ZLd©ZMdÆdª„ZNdÇd«„ZOdÇd¬„ZPePeOd­œZQdÈd®„ZRdÈd¯„ZS	 	 	 	 	 	 	 	 	 	 dÉd°„ZT	 	 dÊ	 	 	 	 	 	 	 	 	 dËd±„ZUd²ZVd³ZWd´ZXdddµœ	 	 	 	 	 	 	 dÌd¶„ZYdÍd·„ZZdddd¸œ	 	 	 	 	 	 	 	 	 	 	 dÎd¹„Z[	 	 dÊ	 	 	 	 	 	 	 	 	 dÏdº„Z\dÐd»„Z]dÑd¼„Z^d½d½d¾œZ_y)Òé    )ÚannotationsN)Ú	dataclassÚfields)ÚdatetimeÚtimezone)ÚDecimal)ÚAnyÚDictÚLiteralÚOptional)Úfetch_endpoint_model_metadataÚfetch_model_metadata)Úbase_url_host_matchesÚbase_url_hostnameÚ0Ú1000000z)https://inference-api.nousresearch.com/v1ú0.01z4subscription-included; no provider invoice for usagec                óR   — | t         k(  ry| t        k  rd| d›�}|dk7  r|S dS d| d›�S )u†  Cost display label: zero â†’ "$0.00"; sub-cent â†’ "~$0.0046" (4 dp, or
    "~$<0.0001" when it rounds to 0.0000 so the label never reads as zero);
    else "~$1.23". Shared by per-response labels and insights cost buckets.

    This fixes #79220 where sub-cent per-turn costs on cheap models (DeepSeek, etc.) rendered as "$0.00"
    despite amount_usd carrying full Decimal precision.
    z$0.00z~$z.4fz~$0.0000z	~$<0.0001ú.2f)Ú_ZEROÚ_SUBCENT_THRESHOLD)ÚamountÚlabels     ú8/home/ubuntu/.hermes/hermes-agent/agent/usage_pricing.pyÚformat_cost_labelr      sH   € ð ”‚ØØÔ"Ò"Ø�V˜C�LÐ!ˆð
  Ò+ˆuÐ<°Ð<Ø��sˆ|ÐÐó    )ÚactualÚ	estimatedÚincludedÚunknown)Úprovider_cost_apiÚprovider_generation_apiÚprovider_models_apiÚofficial_docs_snapshotÚuser_overrideÚcustom_contractÚnoneT)Úfrozenc                  óœ   — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded	<   d
Z
ded<   edd„«       Zedd„«       Zdd„Zy
)ÚCanonicalUsager   ÚintÚinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensé   Úrequest_countNzOptional[dict[str, Any]]Ú	raw_usagec                óN   — | j                   | j                  z   | j                  z   S ©N)r,   r.   r/   ©Úselfs    r   Úprompt_tokenszCanonicalUsage.prompt_tokensA   s$   € à× Ñ  4×#9Ñ#9Ñ9¸D×<SÑ<SÑSÐSr   c                ó4   — | j                   | j                  z   S r5   )r8   r-   r6   s    r   Útotal_tokenszCanonicalUsage.total_tokensE   s   € à×!Ñ! D×$6Ñ$6Ñ6Ð6r   c                ó  — t        |t        «      st        S t        di t        t        «      D �ci c]I  }|j                  dk7  r8|j                  t        | |j                  «      t        ||j                  «      z   “ŒK c}¤ŽS c c}w )z¬Sum two usage buckets. ``raw_usage`` (single-response detail) is
        dropped; ``request_count`` adds so callers see how many API calls a
        combined figure covers.r3   © )Ú
isinstancer*   ÚNotImplementedr   ÚnameÚgetattr)r7   ÚotherÚfs      r   Ú__add__zCanonicalUsage.__add__I   su   € ô ˜%¤Ô0Ü!Ð!Üñ äœNÓ+ö!
à¨q¯v©v¸Ò/Dð �F‰F”G˜D !§&¡&Ó)¬G°E¸1¿6¹6Ó,BÑBÑBò!
ñ ð 	ùò !
s   ¯AB)Úreturnr+   )rA   ú'CanonicalUsage'rD   rE   )Ú__name__Ú
__module__Ú__qualname__r,   Ú__annotations__r-   r.   r/   r0   r2   r3   Úpropertyr8   r:   rC   r<   r   r   r*   r*   7   sy   … à€L�#ÓØ€M�3ÓØÐ�sÓØÐ˜ÓØÐ�cÓØ€M�3ÓØ*.€IÐ'Ó.àòTó ðTð ò7ó ð7ô	r   r*   c                  ó>   — e Zd ZU ded<   ded<   dZded<   dZded<   y)	ÚBillingRouteÚstrÚproviderÚmodelÚ Úbase_urlr    Úbilling_modeN)rF   rG   rH   rI   rQ   rR   r<   r   r   rL   rL   U   s    … àƒMØƒJØ€HˆcÓØ!€L�#Ô!r   rL   c                  óÒ   — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	d	ed
<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   y)ÚPricingEntryNúOptional[Decimal]Úinput_cost_per_millionÚoutput_cost_per_millionÚcache_read_cost_per_millionÚcache_write_cost_per_millionÚrequest_costr'   Ú
CostSourceÚsourceúOptional[str]Ú
source_urlÚpricing_versionúOptional[datetime]Ú
fetched_atzOptional[int]Útier_threshold_tokensÚinput_cost_per_million_aboveÚoutput_cost_per_million_aboveÚ!cache_read_cost_per_million_aboveÚ"cache_write_cost_per_million_above)rF   rG   rH   rV   rI   rW   rX   rY   rZ   r\   r^   r_   ra   rb   rc   rd   re   rf   r<   r   r   rT   rT   ]   s£   … à04ÐÐ-Ó4Ø15ÐÐ.Ó5Ø59ÐÐ!2Ó9Ø6:Ð Ð"3Ó:Ø&*€LÐ#Ó*Ø€FˆJÓØ $€J�Ó$Ø%)€O�]Ó)Ø%)€JÐ"Ó)ð
 ,0Ð˜=Ó/Ø6:Ð Ð"3Ó:Ø7;Ð!Ð#4Ó;Ø;?Ð%Ð'8Ó?Ø<@Ð&Ð(9Ô@r   rT   c                  ó`   — e Zd ZU ded<   ded<   ded<   ded<   d	Zd
ed<   d	Zded<   dZded<   y	)Ú
CostResultrU   Ú
amount_usdÚ
CostStatusÚstatusr[   r\   rM   r   Nr`   ra   r]   r_   r<   útuple[str, ...]Únotes)rF   rG   rH   rI   ra   r_   rm   r<   r   r   rh   rh   s   s8   … à!Ó!ØÓØÓØƒJØ%)€JÐ"Ó)Ø%)€O�]Ó)Ø€Eˆ?Ôr   rh   c                 óH   — t        j                  t        j                  «      S r5   )r   Únowr   Úutcr<   r   r   ú<lambda>rq   ~   s   € ”8—<‘<¤§¡Ó-€ r   r'   úincluded-route)rV   rW   rX   rY   r\   r_   )Úurlc               ó€   — t        dt        | «      t        |«      |�t        |«      nd|�t        |«      ndd||dœ|¤ŽS )zHBuild an official-docs snapshot entry from per-million USD rate strings.Nr$   )rV   rW   rX   rY   r\   r^   r_   r<   )rT   r   )ÚinpÚoutÚ
cache_readÚcache_writeÚversionrs   Útierss          r   Ú_snapr{   …   sV   € ô
 ð Ü& s›|ÄWÈSÃ\Ø;EÐ;Q¤G¨JÔ$7ÐW[Ø=HÐ=T¤W¨[Ô%9ÐZ^Ø'°CÈñ	ð UZñ	ð r   z'https://aws.amazon.com/bedrock/pricing/z8https://platform.claude.com/docs/en/about-claude/pricingzhttps://ai.google.dev/pricing)ú5.00ú25.00ú0.50ú6.25)ú3.00ú15.00ú0.30ú3.75Úopenaiz0https://openai.com/index/previewing-gpt-5-6-sol/zopenai-gpt-5.6-2026-07)r|   z30.00r~   r   )ú2.50r�   ú0.25z3.125)ú1.00z6.00ú0.10ú1.25)úgpt-5.6-solúgpt-5.6-terraúgpt-5.6-lunaÚ	anthropiczanthropic-pricing-2026-05)r‡   r|   rˆ   r‰   )r�   ú75.00ú1.50z18.75)ú0.80ú4.00ú0.08r‡   )r†   r‰   ú0.03r‚   ))zclaude-opus-4-8zclaude-opus-4-7zclaude-opus-4-7-20250507zclaude-opus-4-6zclaude-opus-4-6-20250414zclaude-opus-4-5)zclaude-sonnet-4-6zclaude-sonnet-4-6-20250414zclaude-sonnet-4-5zclaude-sonnet-4-20250514zclaude-3-5-sonnet-20241022zclaude-haiku-4-5)zclaude-opus-4-20250514zclaude-3-opus-20240229zclaude-3-5-haiku-20241022zclaude-3-haiku-20240307z4https://openrouter.ai/anthropic/claude-opus-4.8-fastzclaude-opus-4-8-fast)ú10.00ú50.00r‡   ú12.50zanthropic-pricing-2026-06-introzclaude-sonnet-5)ú2.00r”   ú0.20r…   zhttps://openai.com/api/pricing/zopenai-pricing-2026-03-16)r…   r”   r‰   )ú0.15ú0.60ú0.075)r—   ú8.00r~   )ú0.40ú1.60rˆ   )rˆ   r�   ú0.025)r”   z40.00r…   )z1.10ú4.40z0.55)zgpt-4ozgpt-4o-minizgpt-4.1zgpt-4.1-minizgpt-4.1-nanoÚo3zo3-miniÚdeepseekz1https://api-docs.deepseek.com/quick_start/pricingzdeepseek-pricing-2026-09-10)r™   rš   z0.003)z0.66z1.98z0.022))zdeepseek-flashúdeepseek-v4-flashzdeepseek-chatzdeepseek-reasonerúdeepseek-v4-proÚgooglez-https://ai.google.dev/gemini-api/docs/pricingzgoogle-pricing-2026-09-02)zgemini-3.8-flashzgemini-3.7-flash)ú0.75rƒ   r›   zgoogle-pricing-2026-07-28)r�   z7.50r™   )r‚   r…   r“   )zgemini-3.6-flashzgemini-3.5-flash-litezgoogle-pricing-2026-07-07)r�   z9.00r™   )r†   r�   rŸ   )r—   ú12.00r˜   )r~   r€   z0.05)r™   rš   z0.015)rˆ   r�   r   )zgemini-3.5-flashúgemini-3.1-flash-litezgemini-3-pro-previewzgemini-3-flash-previewzgemini-2.5-flashzgemini-2.0-flashÚbedrockzanthropic-list-2026-07)zanthropic.claude-opus-4-8zanthropic.claude-opus-4-7zanthropic.claude-opus-4-6zbedrock-pricing-2026-06zanthropic.claude-sonnet-5zbedrock-pricing-2026-04)r�   z3.20)ú0.06z0.24)ú0.035ú0.14))zanthropic.claude-sonnet-4-6zanthropic.claude-sonnet-4-5zanthropic.claude-haiku-4-5zamazon.nova-prozamazon.nova-litezamazon.nova-microÚminimaxzminimax-pricing-2026-04zminimax-m2.7)r‚   ú1.20ú
minimax-cnÚ	fireworksz,https://docs.fireworks.ai/serverless/pricingzfireworks-pricing-2026-07)ú0.95r‘   z0.16)r±   r‘   z0.19)ú1.40r    r¬   )z1.74z3.48z0.145)r¬   z0.28z0.028)r�   rž   r’   )r‚   r®   rª   )z0.07r‚   r«   )r²   r    z0.26)r—   rœ   r‚   )z1.90rœ   z0.38)z2.10z6.60z0.21)z2.80z8.80z0.52)z	kimi-k2p6zkimi-k2p7-codezglm-5p2r¤   r£   zqwen3p7-plusz
minimax-m3zgpt-oss-120bzgpt-oss-20bzglm-5p1zminimax-m2p7)zkimi-k2p6-fastzkimi-k2p6-turbozkimi-k2p7-code-fastzglm-5p2-fastzglm-5p1-fastz0tuple[tuple[str, Optional[str], str, dict], ...]Ú
_SNAPSHOTSz#Dict[tuple[str, str], PricingEntry]Ú_OFFICIAL_DOCS_PRICING)ry   rs   r”   r•   r‡   r–   z9https://developers.openai.com/api/docs/models/gpt-6-astrazopenai-gpt-6-astra-2026-09i€& z20.00rŽ   r—   r}   )rs   ry   rb   rc   rd   re   rf   )r„   zgpt-6-astra))	ú	gpt-6-solr—   r”   r˜   r…   r‘   r�   r�   r|   )	ú
gpt-6-lunarˆ   r~   r   ú0.125r˜   r¦   z0.02r†   z.https://developers.openai.com/api/docs/models/zopenai-gpt-6-tiers-2026-09r§   r˜   i@ r‘   z18.00r�   )rs   ry   rb   rc   rd   re   )r¥   úgemini-3.1-pror‰   r·   r…   r�   )rs   ry   rb   rc   rd   )r¥   zgemini-2.5-proc              #  ó>   K  — | ]  }d D ]  }d|› d|› �|f–— Œ Œ y­w))ÚproÚ900kr„   Ú-Nr<   )Ú.0ÚmÚsuffixs      r   ú	<genexpr>rÀ   *  s<   è ø€ ò &ØØ$ò&àð 	�Q�C�q˜˜�/ 1Ô%ð &Ð%ñ &ùs   ‚)rŠ   r‹   rŒ   rµ   r¶   )r¥   zgemini-3.1-pro-previewr¸   )r¥   zgemini-3.1-flash-lite-previewr¨   c                óR   — 	 | €d S t        t        | «      «      S # t        $ r Y y w xY wr5   )r   rM   Ú	Exception)Úvalues    r   Ú_to_decimalrÄ   4  s1   € ðØ�}ˆtÐ=¬'´#°e³*Ó*=Ð=øÜò Ùðús   ‚ † š	&¥&c                óÈ   — |D ]5  }| s yt        | t        «      r| j                  |d«      nt        | |d«      } Œ7 	 t	        dt        | xs d«      «      S # t        $ r Y yw xY w)a	  Non-negative int at ``obj.path[0].path[1]...``; 0 if any hop is falsy or
    non-numeric. Hops read dicts and attribute objects alike (the Responses API
    returns either); negative counters from providers are clamped so they cannot
    corrupt session accounting.r   )r=   ÚdictÚgetr@   Úmaxr+   rÂ   )ÚobjÚpathÚhops      r   Ú_usage_fieldrÌ   ;  sj   € ð
 ò QˆÙÙÜ!+¨C´Ô!6ˆc�g‰g�c˜1Œo¼GÀCÈÈaÓ<P‰ðQðÜ�1”c˜#š( “mÓ$Ð$øÜò Ùðús   ¼A Á	A!Á A!c                ó<   ‡ — t        d„ ˆ fd„|D «       D «       d«      S )z?First non-zero ``_usage_field`` across candidate paths, else 0.c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wr5   r<   )r½   Úvs     r   rÀ   z!_first_nonzero.<locals>.<genexpr>L  s   è ø€ ÒN�qÊA”ÑNùs   ‚Šc              3  ó6   •K  — | ]  }t        ‰g|¢­Ž –— Œ y ­wr5   )rÌ   )r½   rÊ   rÉ   s     €r   rÀ   z!_first_nonzero.<locals>.<genexpr>L  s   øè ø€ ÒH¸$œ\¨#Ð5°Ö5ÑHùó   ƒr   ©Únext)rÉ   Úpathss   ` r   Ú_first_nonzerorÕ   J  s   ø€ äÑNÓHÀ%ÔHÔNÐPQÓRÐRr   )r�   r„   z
openai-apir­   r¯   >   ú	vertex-aiúgoogle-geminiúgoogle-vertexúgoogle-ai-studioÚgeminir¥   Úvertexc                ó   ‡— |xs dj                  «       j                  «       }|xs dj                  «       j                  «       }| xs dj                  «       }|s!d|v r|j                  dd«      \  }}|dv r|}|}|xs dŠ|j                  d«      d   }dˆfd„}	|dk(  rt        d|‰d¬	«      S |d
k(  s |	d«      rt        d
|‰d¬	«      S |dk(  s |	d«      rt        d||xs t        d¬	«      S t
        j                  |«      }
|
€*|t        v s |	d«      s |	d«      rd}
n|dk(  s |	d«      rd}
|
rt        |
|‰d¬	«      S |dv s|r t        |«      dv rt        |xs d|‰d¬	«      S t        |xs d|r|nd‰d¬	«      S )NrP   ú/r1   >   r¥   r„   r�   éÿÿÿÿc                ó   •— t        ‰| «      S r5   )r   )r?   rs   s    €r   Úhostz#resolve_billing_route.<locals>.hostj  s   ø€ Ü$ S¨$Ó/Ð/r   zopenai-codexÚsubscription_included)rN   rO   rQ   rR   Ú
openrouterzopenrouter.aiÚofficial_models_apiÚnouszinference-api.nousresearch.comzaiplatform.googleapis.comz!generativelanguage.googleapis.comr¥   r°   zapi.fireworks.air$   >   ÚlocalÚcustom)Ú	localhostz	127.0.0.1ræ   r    )r?   rM   rD   Úbool)	ÚstripÚlowerÚsplitrL   Ú_NOUS_DEFAULT_BASE_URLÚ_SNAPSHOT_PROVIDER_ALIASESrÇ   Ú_GOOGLE_PROVIDER_NAMESr   )Ú
model_namerN   rQ   Úprovider_nameÚbaserO   Úinferred_providerÚ
bare_modelÚbarerà   Úsnapshot_providerrs   s              @r   Úresolve_billing_routerö   Y  sÃ  ø€ ð ’^ ×*Ñ*Ó,×2Ñ2Ó4€MØŠN˜×!Ñ!Ó#×)Ñ)Ó+€DØÒ˜2×$Ñ$Ó&€EÙ˜S E™\Ø(-¯©°C¸Ó(;Ñ%Ð˜:ØÐ AÑAØ-ˆMØˆEà
Š.�b€Cð �;‰;�sÓ˜BÑ€Dõ0ð ˜Ò&Ü ^¸5È3Ð]tÔuÐuØ˜Ò$©¨_Ô(=Ü \¸ÈÐ[pÔqÐqØ˜Ò¡$Ð'GÔ"HÜ V°5À8ÒCeÔOeð  uJô  Kð  	KÜ2×6Ñ6°}ÓEÐØÐ àÔ3Ñ3ÙÐ/Ô0±DÐ9\Ô4]à (ÑØ˜kÒ)©TÐ2DÔ-EØ +ÐÙÜÐ%6¸dÈSÐ_wÔxÐxØÐ+Ñ+±Ô9JÈ4Ó9PÐTnÑ9nÜ ]Ò%>°hÀeÐVYÐhqÔrÐrÜ Ò!;°)É5Á4ÐVXÐcfÐu~ÔÐr   )zglobal.zus.zeu.zapac.zap.zau.zjp.zca.zsa.zme.zaf.)z:\d+$z-v\d+$z-\d{8}$c                ó.   ‡ — t        ˆ fd„|D «       ‰ «      S )zMDrop the first matching prefix (at most one), else return ``name`` unchanged.c              3  ó^   •K  — | ]$  }‰j                  |«      sŒ‰t        |«      d  –— Œ& y ­wr5   )Ú
startswithÚlen)r½   Úpr?   s     €r   rÀ   z _strip_prefix.<locals>.<genexpr>Š  s&   øè ø€ ÒG 1°D·O±OÀAÕ4F�”c˜!“f�g”ÑGùs   ƒ-š-rÒ   )r?   Úprefixess   ` r   Ú_strip_prefixrý   ˆ  s   ø€ äÓG¨ÔGÈÓNÐNr   c                óÌ   — t        j                  ddt        | j                  «       j	                  «       t
        «      «      }t        D ]  }t        j                  |d|«      }Œ |S )uÐ   Bare foundation-model id: strip the cross-region inference-profile scope
    (``us.``/``global.``/...), map dotted versions (``4.7`` â†’ ``4-7``), then
    strip the trailing date/revision/profile components.ú(\d+)\.(\d+)ú\1-\2rP   )ÚreÚsubrý   rê   ré   Ú_BEDROCK_REGION_PREFIXESÚ_BEDROCK_TRAILERS)rO   r?   Úpatterns      r   Ú_normalize_bedrock_model_namer  �  sS   € ô �6‰6�/ 8¬]¸5¿;¹;»=×;NÑ;NÓ;PÔRjÓ-kÓl€DÜ$ò )ˆÜ�v‰v�g˜r 4Ó(‰ð)à€Kr   c                ó|   — t        j                  ddt        | j                  «       j	                  «       d«      «      S )uE   Strip an ``anthropic/`` prefix and map dotted versions (4.7 â†’ 4-7).rÿ   r   )z
anthropic/)r  r  rý   rê   ré   )rO   s    r   Ú_normalize_anthropic_model_namer  —  s,   € ä�6‰6�/ 8¬]¸5¿;¹;»=×;NÑ;NÓ;PÐRaÓ-bÓcÐcr   )r�   r©   c                ó&  — | j                   j                  «       }t        j                  | j                  |f«      }|r|S t
        j                  | j                  «      }|r ||«      n|}||k7  r!t        j                  | j                  |f«      S d S r5   )rO   rê   r´   rÇ   rN   Ú_MODEL_NORMALIZERS)ÚrouterO   ÚentryÚ	normalizeÚ
normalizeds        r   Ú_lookup_official_docs_pricingr  ¡  s€   € Ø�K‰K×ÑÓ€EÜ"×&Ñ&¨¯©¸Ð'>Ó?€EÙØˆÜ"×&Ñ& u§~¡~Ó6€IÙ%.‘˜5Ô!°E€JØGQÐUZÒGZÔ!×%Ñ% u§~¡~°zÐ&BÓCÐdÐ`dÐdr   c                óD   — t        t        «       | j                  dd¬«      S )Nz>https://openrouter.ai/docs/api/api-reference/models/get-modelszopenrouter-models-api©r^   r_   )Ú_pricing_entry_from_metadatar   rO   )r  s    r   Ú_openrouter_pricing_entryr  «  s!   € Ü'ÜÓ §¡ØSØ/ôð r   c               ó  ‡— || vry | |   j                  d«      xs i Šdˆfd„} |d«      } |d«      }t        ‰j                  d«      «      }|€|€|€y t        || |ddd«       |d	d
d«      |d||t        «       ¬«	      S )NÚpricingc                óŽ   •— ‰j                  | «      }|D ]  }|xs ‰j                  |«      }Œ t        |«      }|€d S |t        z  S r5   )rÇ   rÄ   Ú_ONE_MILLION)ÚkeyÚaliasesÚrawÚaliasrÃ   r  s        €r   Úper_millionz1_pricing_entry_from_metadata.<locals>.per_millionº  sQ   ø€ Ø�k‰k˜#ÓˆØò 	,ˆEØÒ+˜Ÿ™ UÓ+‰Cð	,ä˜CÓ ˆØ�}ˆtÐ>¨%´,Ñ*>Ð>r   ÚpromptÚ
completionÚrequestrw   Úcached_promptÚinput_cache_readrx   Úcache_creationÚinput_cache_writer#   )	rV   rW   rX   rY   rZ   r\   r^   r_   ra   )r  rM   r  rM   rD   rU   )rÇ   rÄ   rT   Ú_UTC_NOW)	ÚmetadataÚmodel_idr^   r_   r  r  r  r  r  s	           @r   r  r  ³  s¥   ø€ ð �xÑØØ�xÑ ×$Ñ$ YÓ/Ò5°2€Gõ?ñ ˜Ó"€FÙ˜\Ó*€JÜ˜'Ÿ+™+ iÓ0Ó1€GØ€~˜*Ð,°°ØÜØ%¸zÙ$/°¸oÐOaÓ$bÙ%0°Ð@PÐReÓ%fØÐ%:ÀzØ'´H³Jôð r   c                óX  — t        | ||¬«      }|j                  dk(  rt        S |j                  dk(  rt	        |«      S t        |«      }|r|S |j                  rRt        t        |j                  |xs d¬«      |j                  |j                  j                  d«      › d�d¬	«      }|r|S y )
N©rN   rQ   rá   râ   rP   )Úapi_keyrÝ   z/modelszopenai-compatible-models-apir  )rö   rR   Ú_INCLUDED_ENTRYrN   r  r  rQ   r  r   rO   Úrstrip)rï   rN   rQ   r)  r  Úbundled_entryr  s          r   Úget_pricing_entryr-  Ï  s§   € ô " *°xÈ(ÔS€EØ×ÑÐ4Ò4ÜÐØ‡~�~˜Ò%Ü(¨Ó/Ð/ä1°%Ó8€MÙØÐØ‡~‚~Ü,Ü)¨%¯.©.À'Â-ÈRÔPÐRW×R]ÑR]ØŸ.™.×/Ñ/°Ó4Ð5°WÐ=Ø:ô
ˆñ
 ØˆLØr   )©©r,   ©©r-   )©Úcache_read_input_tokens)©Úcache_creation_input_tokens)r.  r0  ))Úinput_tokens_detailsÚcached_tokens))r6  r/   )r6  Úcache_creation_tokens)))r8   r/  ))Úcompletion_tokensr1  ))Úprompt_tokens_detailsr7  r2  )Úprompt_cache_hit_tokens)r7  ))r:  r/   )r:  r5  r4  )r/   )rN   Úapi_modec               ó`  ‡— | s
t        «       S |xs dj                  «       j                  «       }|xs dj                  «       j                  «       }| Š|dk(  s|dk(  rt        }n|dk(  rt        }nt
        }ˆfd„|D «       \  }}}}	|t        u r|nt        d||z
  |	z
  «      }
t        ‰dd«      }|d	v r |dk(  rt        j                  d
|||
|||	«       t        |
|||	|t        ‰t        «      rt        ‰«      ¬«      S t        t        ‰dd«      «      r‰j                  «       ¬«      S d¬«      S )z�Normalize raw API response usage into canonical token buckets (Anthropic,
    Codex Responses, or OpenAI Chat Completions shape).rP   Úanthropic_messagesr�   Úcodex_responsesc              3  ó6   •K  — | ]  }t        ‰g|¢­Ž –— Œ y ­wr5   )rÕ   )r½   rÔ   Úus     €r   rÀ   z"normalize_usage.<locals>.<genexpr>  s"   øè ø€ ò JØ&+Œ�qÐ!˜5Ö!ñJùrÑ   r   )Úoutput_tokens_detailsr0   )Úcompletion_tokens_detailsr0   >   r­   r¯   u  cache_observability provider=%s mode=%s input_tokens=%s output_tokens=%s cache_read_tokens=%s cache_write_tokens=%s (note: on MiniMax-M3 cache_read carries a +128 constant floor and is not a reliable hit signal â€” track input_tokens drops across calls instead)Ú
model_dumpN)r,   r-   r.   r/   r0   r3   )r*   ré   rê   Ú_ANTHROPIC_USAGE_SHAPEÚ_CODEX_USAGE_SHAPEÚ_CHAT_USAGE_SHAPErÈ   rÕ   ÚloggerÚdebugr=   rÆ   Úcallabler@   rD  )Úresponse_usagerN   r<  rð   ÚmodeÚshapeÚprompt_totalr-   r.   r/   r,   r0   rA  s               @r   Únormalize_usagerO    sl  ø€ ñ
 ÜÓÐà’^ ×*Ñ*Ó,×2Ñ2Ó4€MØŠN˜×!Ñ!Ó#×)Ñ)Ó+€DØ€AàÐ#Ò# }¸Ò'CÜ&‰Ø	Ð"Ò	"Ü"‰ä!ˆóJØ/4ôJÑF€L�-Ð!2Ð4Fð
 $)Ô,BÑ#B‘<ÌØ	ˆ<Ð+Ñ+Ð.@Ñ@óI€Lô &Ø	Ð8Ð:kóÐð Ð1Ñ1°dÐ>RÒ6RÜ�‰ð*ð
 ˜4 ¨}ØÐ1ô	
ô Ø!°ÐRcØ-Ð@PÜ'¨¬4Ô0”$�q“'ôð ô JRÔRYÐZ[Ð]iÐkoÓRpÔIq°q·|±|³~ôð ð x|ôð r   c                ó"   — t        d d| d|¬«      S )Nr    zn/a)ri   rk   r\   r   rm   )rh   )r\   rm   s     r   Ú_unknown_costrQ  :  s   € Ü ¨iÀÈeÐ[`ÔaÐar   ©rN   rQ   r)  c               ó°  — ddl m}  ||xs d«      }|r|j                  | |«      nd }|�|S t        | ||¬«      }|j                  dk(  rt        t        ddddt        f¬	«      S t        | |||¬
«      }	|	st        d«      S |	j                  d uxr |j                  |	j                  kD  }
t        }|j                  |	j                  |	j                  df|j                  |	j                   |	j"                  df|j$                  |	j&                  |	j(                  df|j*                  |	j,                  |	j.                  dffD ]B  \  }}}}|
r|�|}|€|rt        |	j0                  g|¢­Ž c S Œ+|t3        |«      |z  t4        z  z  }ŒD |	j6                  �1|j8                  r%|t3        |j8                  «      |	j6                  z  z  }g }d}t;        |«      }|	j0                  dk(  r"|t        k(  rd}d}|j=                  t        «       |j>                  dk(  r|j=                  d«       t        |||	j0                  ||	j@                  |	jB                  tE        |«      ¬«      S )Nr   )Úget_provider_profilerP   r(  rá   r   r'   rr   )ri   rk   r\   r   r_   rm   rR  r<   )z(cache-read pricing unavailable for route)z)cache-write pricing unavailable for router   râ   zBOpenRouter cost is estimated from the models API until reconciled.)ri   rk   r\   r   ra   r_   rm   )#Ú	providersrT  Úget_usage_coströ   rR   rh   r   Ú_INCLUDED_NOTEr-  rQ  rb   r8   r,   rV   rc   r-   rW   rd   r.   rX   re   r/   rY   rf   r\   r   r  rZ   r2   r   ÚappendrN   ra   r_   Útuple)rï   ÚusagerN   rQ   r)  rT  ÚprofileÚreportedr  r  Úabover   ÚtokensÚrateÚ
rate_aboveÚnoterm   rk   r   s                      r   Úestimate_usage_costrb  >  s^  € õ /Ù" 8¢>¨rÓ2€GÙ<Cˆw×%Ñ% j°%Ô8È€HØÐØˆÜ! *°xÈ(ÔS€EØ×ÑÐ4Ò4ÜÜ Z¸ÀjØ,´^Ð4Eô
ð 	
ô
 ˜j°8ÀhÐX_Ô`€EÙÜ˜VÓ$Ð$ð ×'Ñ'¨tÐ3Òi¸×8KÑ8KÈe×NiÑNiÑ8i€EÜ€Fà	×	Ñ	˜U×9Ñ9¸5×;]Ñ;]Ð_aÐbØ	×	Ñ	˜e×;Ñ;¸U×=`Ñ=`ÐbdÐeØ	×	 Ñ	  %×"CÑ"CÀU×ElÑElØ	6ð	8à	×	!Ñ	! 5×#EÑ#EÀu×GoÑGoØ	7ð	9ð+ò 8Ñ&ˆ��j $ñ �ZÐ+ØˆDØˆ<ÙÜ$ U§\¡\Ð9°DÒ9Ò9ØØ”'˜&“/ DÑ(¬<Ñ7Ñ7‰ð8ð ×ÑÐ%¨%×*=Ò*=Ø”'˜%×-Ñ-Ó.°×1CÑ1CÑCÑCˆà€EØ$€FÜ˜fÓ%€EØ‡|�|�vÒ &¬E¢/ØˆØˆØ�‰”^Ô$à‡~�~˜Ò%Ø�‰ÐYÔZäØ &°·±ÀUØ×#Ñ#°U×5JÑ5JÔRWÐX]ÓR^ôð r   c                ó$   — t        | |||¬«      duS )zQTrue if pricing data exists for this model+route (direct lookup, no dummy usage).rR  N)r-  )rï   rN   rQ   r)  s       r   Úhas_known_pricingrd  y  s   € ô
 ˜Z°(ÀXÐW^Ô_ÐgkÐkÐkr   c                ó¼   — | dk  r| d›d�S | dz  }|dk  r|d›d�S |dz  }|dk  r/t        |dz  «      }|rt        |«      › d|› d�S t        |«      › d�S |dz  d›d	�S )
Né<   ú.0fÚsr¾   é   zh Úhú.1fÚd)r+   )ÚsecondsÚminutesÚhoursÚremaining_mins       r   Úformat_duration_compactrq  �  s“   € Ø�‚|Ø˜#�˜aÐ Ð Ø˜‰l€GØ�‚|Ø˜#�˜aÐ Ð Ø�b‰L€EØˆr‚zÜ˜G b™LÓ)ˆÙ4A”#�e“*�˜R ˜¨aÐ0ÐWÌ#ÈeË*ÈÐUVÐGWÐWØ�b‰j˜Ð˜QÐÐr   c                ó,  ‡— t        t        | «      «      Š‰dk  rt        t        | «      «      S | dk  rdnd}t        ˆfd„dD «       «      \  }}‰|z  }|dk  r|d›n|d	k  r|d
›n|d›}d|v r |j	                  d«      j	                  d«      }|› |› |› �S )Néè  r   r¼   rP   c              3  ó8   •K  — | ]  \  }}‰|k\  sŒ||f–— Œ y ­wr5   r<   )r½   ÚtÚsfxÚ	abs_values      €r   rÀ   z-format_token_count_compact.<locals>.<genexpr>”  s"   øè ø€ Ò}©&¨!¨SÐnwÐ{|Ón|˜a œXÑ}ùs   ƒ‘	))i Êš;ÚB)i@B ÚM)rs  ÚKé
   r   éd   rk  rg  ú.r   )Úabsr+   rM   rÓ   r+  )rÃ   ÚsignÚ	thresholdr¿   ÚscaledÚtextrw  s         @r   Úformat_token_count_compactrƒ  Ž  sª   ø€ Ü”C˜“J“€IØ�5ÒÜ”3�u“:‹Ðà˜!’)‰3 €DÜÓ}Ð4jÔ}Ó}Ñ€IˆvØ˜Ñ"€FØ$ rškˆf�S‰\À&È3Â,°&¸±ÐW]Ð^aÐVb€DØ
ˆd�{Ø�{‰{˜3Ó×&Ñ& sÓ+ˆØˆV�D�6˜&˜Ð"Ð"r   g        )ÚinputÚoutput)r   r   rD   rM   )NN)ru   rM   rv   rM   rw   r]   rx   r]   ry   rM   rs   r]   rz   r	   rD   rT   )rÃ   r	   rD   rU   )rÉ   r	   rÊ   rM   rD   r+   )rÉ   r	   rÔ   rl   rD   r+   )rï   rM   rN   r]   rQ   r]   rD   rL   )r?   rM   rü   rl   rD   rM   )rO   rM   rD   rM   )r  rL   rD   úOptional[PricingEntry])
r%  zDict[str, Dict[str, Any]]r&  rM   r^   rM   r_   rM   rD   r†  )NNN)
rï   rM   rN   r]   rQ   r]   r)  r]   rD   r†  )rK  r	   rN   r]   r<  r]   rD   r*   )r\   r[   rm   rM   rD   rh   )rï   rM   rZ  r*   rN   r]   rQ   r]   r)  r]   rD   rh   )
rï   rM   rN   r]   rQ   r]   r)  r]   rD   rè   )rm  ÚfloatrD   rM   )rÃ   r+   rD   rM   )`Ú
__future__r   Úloggingr  Údataclassesr   r   r   r   Údecimalr   Útypingr	   r
   r   r   Úagent.model_metadatar   r   Úutilsr   r   Ú	getLoggerrF   rH  r   r  rì   r   rW  r   rj   r[   r*   rL   rT   rh   r$  r*  r{   Ú_BEDROCK_URLÚ_ANTHROPIC_URLÚ_GOOGLE_URLÚ_OPUSÚ_SONNETr³   rI   r´   Ú	_providerÚ_urlÚ_versionÚ_rowsÚitemsÚ_modelsÚ_ratesÚ_entryr=   rM   Ú_modelÚ_slugÚ_inpÚ_outÚ_readÚ_writeÚ
_inp_aboveÚ
_out_aboveÚ_read_aboveÚ_write_aboveÚ_aliasÚ
_canonicalrÄ   rÌ   rÕ   rí   rî   rö   r  r  rý   r  r  r
  r  r  r  r-  rE  rF  rG  rO  rQ  rb  rd  rq  rƒ  ÚDEFAULT_PRICINGr<   r   r   ú<module>rª     sª  ðÞ "ã Û 	ß )ß 'Ý ß /Ó /ç Tß :à	ˆ×	Ñ	˜8Ó	$€á�‹€Ù�yÓ!€ØDÐ ñ
 ˜V“_Ð ð H€óð& ÐAÑB€
Øð0ñ€
ñ �$Ô÷ð ó ðñ: �$Ô÷"ð "ó ð"ñ �$Ô÷Að Aó ðAñ* �$Ô÷ ð  ó ð ñ .€ÙØ ¸%Ð]bØ!&¨vÐGWô€ð X\ð
à'+ñ
Ø	ð
Øð
Ø$1ð
ØGTð
àð
à$ð
à69ð
ð ó
ð" 9€ØK€Ø-€Ø)€Ø
+€ð
 ÐAÐC[Ø8ÐKmØ8ñ^ð ð
 �.Ð"=à9>à(/Ø<Ø>aØ%EØ#Cñ	@ð 	ð ÐHÐJeØÐ Cðhð ð
 �.Ð"CØÐ<ðFð ð Ð0Ð2MØ+Ð<UØ+Ð=UØ1Ð9SØ+ñ	Pð ð ÐDÐFcØWpØ4ñfð ð Ð>Ð@[Ø0Ð2Kð^ð ð Ð>Ð@[Ø4ÐOgñ^ð ð ˆ{Ð7Ø4ÐOhØ 9ÐUmØ5ÐKcñ:ð ð �Ð6Ø_Ðafð9ð ð �Ð7Ð:UÐW^Ð9_Ð`Ø�Ð7ØHOØ&FØ+ÐAQÐhyñ:ð ð
 �Ð/°.ÐBRÐ1SÐTØ�4Ð2°^ÐEUÐ4VÐWð
 Ð@ÐB]Ø-ÐAYØ+Ð@YØ6ÐH`Ø.Ð@YØ0Ð=UØ0Ø/GØ7ÐIaØ0ñ
`ð 
ðKP@€
Ð<ó Pðd ?AÐ Ð;Ó @Ø(2ò AÑ$€Iˆt�X˜uØ Ÿ;™;›=ò A‰ˆ�Ù˜¨°dÒ;ˆÙ%/°¸Ô%=˜‘zÀ7ò 	AˆFØ:@Ð" I¨vÐ#6Ò7ñ	AñAðAð
 �	˜4 ¨5°'¸6À6È6ñ
 5:ØˆW�f˜gØCØ(Ø!Ù!(¨Ó!1Ù")¨'Ó"2Ù&-¨f£oÙ'.¨wÓ'7ô	5Ð Ð0Ñ 1ð\ò ÑW€Eˆ4��u˜f j°*¸kÈ<ñ 16Øˆd�E˜6Ø<¸U¸GÐDØ,Ø%Ù%,¨ZÓ%8Ù&-¨jÓ&9Ù*1°+Ó*>Ù+2°<Ó+@ô	1Ð˜H eÐ,Ò-ð	ð 
ˆ4��u˜f j°*¸kÈ<ñ 8=Ø
ˆG�V Ð6QØ!ÁÈÃÙ")¨'Ó"2ÑV]Ð^dÓVeô8Ð Ð3Ñ 4ñ
 8=Ø
ˆG�W +Ð7RØ!ÁÈÃÙ")¨'Ó"2ô8Ð Ð3Ñ 4ð
 �. +¨u°gð&ñ&Ø[ô&ð&ð ;ð	&ð
 Iñ&ò bÑ!€Iˆv�zð 3IÈ)ÐU_ÐI`Ñ2aÐ˜I vÐ.Ò/ðbð ˆv�zóóóSð ¨ÀÐU^ÐnzñÐ ò
 {Ð ð PTð'@Øð'@Ø,ð'@Ø?Lð'@àó'@ðT oÐ à5Ð óOó
ódð $CÐOlÑmÐ óeóðØ'ðØ36ðØGJðØ]`ðàóð: PTØ!ðØðØ,ðØ?Lðàðð óð4Ð ð
Ð ðÐ ð 7;ÐVZñ5Øð5Ø&3ð5ØFSð5àó5ópbð
 JNØ"¸Tñ8Øð8Ø*ð8Ø9Fð8àð8à-:ð8ð ó8ðx PTØ!ðlØðlØ,ðlØ?Lðlàðlð 
óló
 ó#ð&  ¨3Ñ/�r   