§
    ‰eîi>d  ã                  ó’
  — U d dl mZ d dl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 ddd	œZ ed
¦  «        Z e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i d e ed¦  «         ed¦  «         ed¦  «         ed¦  «        ddd ¬!¦  «        “d" e ed#¦  «         ed¦  «         ed$¦  «         ed%¦  «        ddd ¬!¦  «        “d& e ed'¦  «         ed(¦  «         ed)¦  «        dd*d+¬,¦  «        “d- e ed.¦  «         ed/¦  «         ed0¦  «        dd*d+¬,¦  «        “d1 e ed2¦  «         ed3¦  «         ed4¦  «        dd*d+¬,¦  «        “d5 e ed6¦  «         ed7¦  «         ed8¦  «        dd*d+¬,¦  «        “d9 e ed8¦  «         ed6¦  «         ed:¦  «        dd*d+¬,¦  «        “d; e ed(¦  «         ed<¦  «         ed'¦  «        dd*d+¬,¦  «        “d= e ed>¦  «         ed?¦  «         ed@¦  «        dd*d+¬,¦  «        “dA e ed#¦  «         ed¦  «         ed$¦  «         ed%¦  «        dddB¬!¦  «        “dC e edD¦  «         edE¦  «         edF¦  «         edG¦  «        dddB¬!¦  «        “dH e ed¦  «         ed¦  «         ed¦  «         ed¦  «        dddB¬!¦  «        “dI e edJ¦  «         ed)¦  «         edK¦  «         ed$¦  «        dddB¬!¦  «        “dL e edM¦  «         edN¦  «        ddOdP¬Q¦  «        “dR e ed@¦  «         edS¦  «        ddOdP¬Q¦  «        “dT e ed)¦  «         ed(¦  «        ddUdV¬Q¦  «        “dW e ed.¦  «         ed/¦  «        ddUdV¬Q¦  «        “ e ed8¦  «         ed6¦  «        ddUdV¬Q¦  «         e ed¦  «         ed¦  «        ddXdY¬Q¦  «         e ed#¦  «         ed¦  «        ddXdY¬Q¦  «         e ed#¦  «         ed¦  «        ddXdY¬Q¦  «         e edD¦  «         edE¦  «        ddXdY¬Q¦  «         e edD¦  «         edZ¦  «        ddXdY¬Q¦  «         e ed[¦  «         ed\¦  «        ddXdY¬Q¦  «         e ed]¦  «         edM¦  «        ddXdY¬Q¦  «        d^œ¥Zd_ed`<   dˆde„Zd‰dg„Z	 	 dŠd‹dn„Z dŒdq„Z!dŒdr„Z"d�dx„Z#	 	 	 dŽd�dz„Z$dhdhd{œd�d~„Z%dhdhdhdœd‘d�„Z&	 	 	 dŽd’dƒ„Z'd“d†„Z(d”d‡„Z)dhS )•é    )Úannotations)Ú	dataclass)ÚdatetimeÚtimezone)ÚDecimal)ÚAnyÚDictÚLiteralÚOptional)Úfetch_endpoint_model_metadataÚfetch_model_metadata)Úbase_url_host_matchesg        )ÚinputÚoutputÚ0Ú1000000)Ú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
S )ÚCanonicalUsager   ÚintÚinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensé   Úrequest_countNzOptional[dict[str, Any]]Ú	raw_usageÚreturnc                ó0   — | j         | j        z   | j        z   S ©N)r"   r$   r%   ©Úselfs    ú5/home/div/.hermes/hermes-agent/agent/usage_pricing.pyÚprompt_tokenszCanonicalUsage.prompt_tokens&   s   € àÔ  4Ô#9Ñ9¸DÔ<SÑSÐSó    c                ó    — | j         | j        z   S r,   )r0   r#   r-   s    r/   Útotal_tokenszCanonicalUsage.total_tokens*   s   € àÔ! DÔ$6Ñ6Ð6r1   )r*   r!   )Ú__name__Ú
__module__Ú__qualname__r"   Ú__annotations__r#   r$   r%   r&   r(   r)   Úpropertyr0   r3   © r1   r/   r    r       sÒ   € € € € € € à€LÐÐÐÑØ€MÐÐÐÑØÐÐÐÐÑØÐÐÐÐÑØÐÐÐÐÑØ€MÐÐÐÑØ*.€IÐ.Ð.Ð.Ñ.àðTð Tð Tñ „XðTð ð7ð 7ð 7ñ „Xð7ð 7ð 7r1   r    c                  ó@   — e Zd ZU ded<   ded<   dZded<   dZded<   dS )	ÚBillingRouteÚstrÚproviderÚmodelÚ Úbase_urlr   Úbilling_modeN)r4   r5   r6   r7   r@   rA   r9   r1   r/   r;   r;   /   sF   € € € € € € à€M€M�MØ€J€J�JØ€HÐÐÐÑØ!€LÐ!Ð!Ð!Ñ!Ð!Ð!r1   r;   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S )Ú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_at)r4   r5   r6   rE   r7   rF   rG   rH   rI   rK   rM   rN   rP   r9   r1   r/   rC   rC   7   s¯   € € € € € € à04ÐÐ4Ð4Ð4Ñ4Ø15ÐÐ5Ð5Ð5Ñ5Ø59ÐÐ9Ð9Ð9Ñ9Ø6:Ð Ð:Ð:Ð:Ñ:Ø&*€LÐ*Ð*Ð*Ñ*Ø€FÐÐÐÑØ $€JÐ$Ð$Ð$Ñ$Ø%)€OÐ)Ð)Ð)Ñ)Ø%)€JÐ)Ð)Ð)Ñ)Ð)Ð)r1   rC   c                  ób   — 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<   d	S )Ú
CostResultrD   Ú
amount_usdÚ
CostStatusÚstatusrJ   rK   r<   ÚlabelNrO   rP   rL   rN   r9   ztuple[str, ...]Únotes)r4   r5   r6   r7   rP   rN   rW   r9   r1   r/   rR   rR   D   sr   € € € € € € à!Ð!Ð!Ñ!ØÐÐÑØÐÐÑØ€J€J�JØ%)€JÐ)Ð)Ð)Ñ)Ø%)€OÐ)Ð)Ð)Ñ)Ø€EÐÐÐÑÐÐr1   rR   c                 ó>   — t          j        t          j        ¦  «        S r,   )r   Únowr   Úutcr9   r1   r/   ú<lambda>r[   O   s   € •8”<¥¤Ñ-Ô-€ r1   )Ú	anthropiczclaude-opus-4-20250514z15.00z75.00z1.50z18.75r   zChttps://docs.anthropic.com/en/docs/build-with-claude/prompt-cachingz#anthropic-prompt-caching-2026-03-16)rE   rF   rG   rH   rK   rM   rN   )r\   zclaude-sonnet-4-20250514z3.00z0.30z3.75)Úopenaizgpt-4oz2.50z10.00z1.25zhttps://openai.com/api/pricing/zopenai-pricing-2026-03-16)rE   rF   rG   rK   rM   rN   )r]   zgpt-4o-miniz0.15z0.60z0.075)r]   zgpt-4.1z2.00z8.00z0.50)r]   zgpt-4.1-miniz0.40z1.60z0.10)r]   zgpt-4.1-nanoz0.025)r]   Úo3z40.00)r]   zo3-miniz1.10z4.40z0.55)r\   zclaude-3-5-sonnet-20241022zanthropic-pricing-2026-03-16)r\   zclaude-3-5-haiku-20241022z0.80z4.00z0.08z1.00)r\   zclaude-3-opus-20240229)r\   zclaude-3-haiku-20240307z0.25z0.03)Údeepseekzdeepseek-chatz0.14z0.28z1https://api-docs.deepseek.com/quick_start/pricingzdeepseek-pricing-2026-03-16)rE   rF   rK   rM   rN   )r_   zdeepseek-reasonerz2.19)Úgooglezgemini-2.5-prozhttps://ai.google.dev/pricingzgoogle-pricing-2026-03-16)r`   zgemini-2.5-flashz'https://aws.amazon.com/bedrock/pricing/zbedrock-pricing-2026-04z3.20z0.06z0.24z0.035))r`   zgemini-2.0-flash)Úbedrockzanthropic.claude-opus-4-6)ra   zanthropic.claude-sonnet-4-6)ra   zanthropic.claude-sonnet-4-5)ra   zanthropic.claude-haiku-4-5)ra   zamazon.nova-pro)ra   zamazon.nova-lite)ra   zamazon.nova-microz#Dict[tuple[str, str], PricingEntry]Ú_OFFICIAL_DOCS_PRICINGÚvaluer   r*   rD   c                óf   — | €d S 	 t          t          | ¦  «        ¦  «        S # t          $ r Y d S w xY wr,   )r   r<   Ú	Exception©rc   s    r/   Ú_to_decimalrg   m  sG   € Ø€}ØˆtðÝ•s˜5‘z”zÑ"Ô"Ð"øÝð ð ð Øˆtˆtðøøøs   †" ¢
0¯0r!   c                óH   — 	 t          | pd¦  «        S # t          $ r Y dS w xY w)Nr   )r!   re   rf   s    r/   Ú_to_intri   v  s9   € ðÝ�5�:˜A‰ŒÐøÝð ð ð Øˆqˆqðøøøs   ‚ “
! !NÚ
model_namer<   r=   rL   r@   c                ó&  — |pd                      ¦   «                              ¦   «         }|pd                      ¦   «                              ¦   «         }| pd                      ¦   «         }|s%d|v r!|                     dd¦  «        \  }}|dv r|}|}|dk    rt          d||pdd¬¦  «        S |dk    st	          |pdd	¦  «        rt          d||pdd
¬¦  «        S |dk    r.t          d|                     d¦  «        d         |pdd¬¦  «        S |dk    r.t          d|                     d¦  «        d         |pdd¬¦  «        S |dv s|rd|v rt          |pd||pdd¬¦  «        S t          |pd|r|                     d¦  «        d         nd|pdd¬¦  «        S )Nr?   ú/r'   >   r`   r]   r\   zopenai-codexÚsubscription_included)r=   r>   r@   rA   Ú
openrouterzopenrouter.aiÚofficial_models_apir\   éÿÿÿÿr   r]   >   ÚlocalÚcustomÚ	localhostrr   r   )ÚstripÚlowerÚsplitr;   r   )rj   r=   r@   Úprovider_nameÚbaser>   Úinferred_providerÚ
bare_models           r/   Úresolve_billing_router{   }  s:  € ð
 �^ ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4€MØˆN˜×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+€DØÐ˜2×$Ò$Ñ&Ô&€EØð ˜S E˜\˜\Ø(-¯ª°C¸Ñ(;Ô(;Ñ%Ð˜:ØÐ AÐAÐAØ-ˆMØˆEà˜Ò&Ð&Ý ^¸5È8È>ÐWYÐhð  Añ  Aô  Að  	AØ˜Ò$Ð$Õ(=¸h¸nÈ"ÈoÑ(^Ô(^Ð$Ý \¸ÈÈÐUWÐf{Ð|Ñ|Ô|Ð|Ø˜Ò#Ð#Ý [¸¿ºÀCÑ8HÔ8HÈÔ8LÐW_ÐWeÐceð  uMð  Nñ  Nô  Nð  	NØ˜Ò Ð Ý X°U·[²[ÀÑ5EÔ5EÀbÔ5IÐT\ÐTbÐ`bð  rJð  Kñ  Kô  Kð  	KØÐ+Ð+Ð+°Ð+¸ÈÐ9LÐ9LÝ ]Ð%>°hÀeÐV^ÐVdÐbdÐs|Ð}Ñ}Ô}Ð}Ý Ð!;°)Ð[`ÐChÀ5Ç;Â;ÈsÑCSÔCSÐTVÔCWÐCWÐfhÐs{ð  tBð  @Bð  QZð  [ñ  [ô  [ð  [r1   ÚrouteúOptional[PricingEntry]c                ór   — t                                | j        | j                             ¦   «         f¦  «        S r,   )rb   Úgetr=   r>   ru   ©r|   s    r/   Ú_lookup_official_docs_pricingr�   ˜  s+   € Ý!×%Ò% u¤~°u´{×7HÒ7HÑ7JÔ7JÐ&KÑLÔLÐLr1   c                óJ   — t          t          ¦   «         | j        dd¬¦  «        S )Nz>https://openrouter.ai/docs/api/api-reference/models/get-modelszopenrouter-models-api©rM   rN   )Ú_pricing_entry_from_metadatar   r>   r€   s    r/   Ú_openrouter_pricing_entryr…   œ  s-   € Ý'ÝÑÔØŒØSØ/ð	ñ ô ð r1   ÚmetadataúDict[str, Dict[str, Any]]Úmodel_idrM   rN   c               óì  — || vrd S | |                               d¦  «        pi }t          |                      d¦  «        ¦  «        }t          |                      d¦  «        ¦  «        }t          |                      d¦  «        ¦  «        }t          |                      d¦  «        p)|                      d¦  «        p|                      d¦  «        ¦  «        }t          |                      d¦  «        p)|                      d	¦  «        p|                      d
¦  «        ¦  «        }	|€|€|€d S dd„}
t           |
|¦  «         |
|¦  «         |
|¦  «         |
|	¦  «        |d||t          ¦   «         ¬¦	  «	        S )NÚpricingÚpromptÚ
completionÚrequestÚ
cache_readÚcached_promptÚinput_cache_readÚcache_writeÚcache_creationÚinput_cache_writerc   rD   r*   c                ó   — | €d S | t           z  S r,   )Ú_ONE_MILLIONrf   s    r/   Ú_per_token_to_per_millionz?_pricing_entry_from_metadata.<locals>._per_token_to_per_million¿  s   € Øˆ=Ø�4Ø•|Ñ#Ð#r1   r   )	rE   rF   rG   rH   rI   rK   rM   rN   rP   )rc   rD   r*   rD   )r   rg   rC   Ú_UTC_NOW)r†   rˆ   rM   rN   rŠ   r‹   rŒ   r�   rŽ   r‘   r–   s              r/   r„   r„   ¥  sš  € ð �xÐÐØˆtØ�xÔ ×$Ò$ YÑ/Ô/Ð5°2€GÝ˜Ÿš XÑ.Ô.Ñ/Ô/€FÝ˜WŸ[š[¨Ñ6Ô6Ñ7Ô7€JÝ˜'Ÿ+š+ iÑ0Ô0Ñ1Ô1€GÝØ�Š�LÑ!Ô!ð 	+Ø�;Š;�Ñ'Ô'ð	+à�;Š;Ð)Ñ*Ô*ñô €Jõ
 Ø�Š�MÑ"Ô"ð 	,Ø�;Š;Ð'Ñ(Ô(ð	,à�;Š;Ð*Ñ+Ô+ñô €Kð
 €~˜*Ð,°°Øˆtð$ð $ð $ð $õ
 Ø8Ð8¸Ñ@Ô@Ø 9Ð 9¸*Ñ EÔ EØ$=Ð$=¸jÑ$IÔ$IØ%>Ð%>¸{Ñ%KÔ%KØØ$ØØ'Ý‘:”:ð
ñ 
ô 
ð 
r1   Úapi_keyc                óˆ  — t          | ||¬¦  «        }|j        dk    r)t          t          t          t          t          dd¬¦  «        S |j        dk    rt          |¦  «        S |j        rMt          t          |j        |pd¬¦  «        |j	        |j         
                    d	¦  «        › d
�d¬¦  «        }|r|S t          |¦  «        S )N©r=   r@   rm   r   úincluded-route)rE   rF   rG   rH   rK   rN   rn   r?   )r˜   rl   z/modelszopenai-compatible-models-apirƒ   )r{   rA   rC   Ú_ZEROr=   r…   r@   r„   r   r>   Úrstripr�   ©rj   r=   r@   r˜   r|   Úentrys         r/   Úget_pricing_entryr    Ñ  sâ   € õ " *°xÈ(ÐSÑSÔS€EØÔÐ4Ò4Ð4ÝÝ#(Ý$)Ý(-Ý).ØØ,ð
ñ 
ô 
ð 	
ð „~˜Ò%Ð%Ý(¨Ñ/Ô/Ð/Ø„~ð Ý,Ý)¨%¬.À'À-ÈRÐPÑPÔPØŒKØœ.×/Ò/°Ñ4Ô4Ð=Ð=Ð=Ø:ð	
ñ 
ô 
ˆð ð 	ØˆLÝ(¨Ñ/Ô/Ð/r1   )r=   Úapi_modeÚresponse_usager¡   c               ó†  — | st          ¦   «         S |pd                     ¦   «                              ¦   «         }|pd                     ¦   «                              ¦   «         }|dk    s|dk    rzt          t	          | dd¦  «        ¦  «        }t          t	          | dd¦  «        ¦  «        }t          t	          | dd¦  «        ¦  «        }t          t	          | dd¦  «        ¦  «        }�n•|d	k    r¨t          t	          | dd¦  «        ¦  «        }	t          t	          | dd¦  «        ¦  «        }t	          | d
d¦  «        }
t          |
rt	          |
dd¦  «        nd¦  «        }t          |
rt	          |
dd¦  «        nd¦  «        }t          d|	|z
  |z
  ¦  «        }nçt          t	          | dd¦  «        ¦  «        }t          t	          | dd¦  «        ¦  «        }t	          | dd¦  «        }
t          |
rt	          |
dd¦  «        nd¦  «        }|st          t	          | dd¦  «        ¦  «        }t          |
rt	          |
dd¦  «        nd¦  «        }|st          t	          | dd¦  «        ¦  «        }t          d||z
  |z
  ¦  «        }d}t	          | dd¦  «        }|rt          t	          |dd¦  «        ¦  «        }t          |||||¬¦  «        S )u…  Normalize raw API response usage into canonical token buckets.

    Handles three API shapes:
    - Anthropic: input_tokens/output_tokens/cache_read_input_tokens/cache_creation_input_tokens
    - Codex Responses: input_tokens includes cache tokens; input_tokens_details.cached_tokens separates them
    - OpenAI Chat Completions: prompt_tokens includes cache tokens; prompt_tokens_details.cached_tokens separates them

    In both Codex and OpenAI modes, input_tokens is derived by subtracting cache
    tokens from the total â€” the API contract is that input/prompt totals include
    cached tokens and the details object breaks them out.
    r?   Úanthropic_messagesr\   r"   r   r#   Úcache_read_input_tokensÚcache_creation_input_tokensÚcodex_responsesÚinput_tokens_detailsNÚcached_tokensÚcache_creation_tokensr0   Úcompletion_tokensÚprompt_tokens_detailsr%   Úoutput_tokens_detailsr&   )r"   r#   r$   r%   r&   )r    rt   ru   ri   ÚgetattrÚmax)r¢   r=   r¡   rw   Úmoder"   r#   r$   r%   Úinput_totalÚdetailsÚprompt_totalr&   Úoutput_detailss                 r/   Únormalize_usagerµ   ï  sÿ  € ð" ð  ÝÑÔÐà�^ ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4€MØˆN˜×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+€DàÐ#Ò#Ð# }¸Ò'CÐ'CÝ�w ~°~ÀqÑIÔIÑJÔJˆÝ¥¨¸ÈÑ KÔ KÑLÔLˆÝ#¥G¨NÐ<UÐWXÑ$YÔ$YÑZÔZÐÝ$¥W¨^Ð=ZÐ\]Ñ%^Ô%^Ñ_Ô_ÐÑØ	Ð"Ò	"Ð	"Ý�g n°nÀaÑHÔHÑIÔIˆÝ¥¨¸ÈÑ KÔ KÑLÔLˆÝ˜.Ð*@À$ÑGÔGˆÝ#ÈGÐ$Z¥G¨G°_ÀaÑ$HÔ$HÐ$HÐYZÑ[Ô[ÐÝ$Ø<CÐJ�G�GÐ4°aÑ8Ô8Ð8Èñ
ô 
Ðõ ˜1˜kÐ,=Ñ=Ð@RÑRÑSÔSˆˆå�w ~°ÈÑJÔJÑKÔKˆÝ¥¨Ð8KÈQÑ OÔ OÑPÔPˆÝ˜.Ð*AÀ4ÑHÔHˆõ $ÈGÐ$Z¥G¨G°_ÀaÑ$HÔ$HÐ$HÐYZÑ[Ô[ÐØ ð 	_Ý '­°Ð@YÐ[\Ñ(]Ô(]Ñ ^Ô ^ÐÝ$Ø9@ÐG�G�GÐ1°1Ñ5Ô5Ð5Àañ
ô 
Ðð "ð 	Ý!(Ý˜Ð(EÀqÑIÔIñ"ô "Ðõ ˜1˜lÐ->Ñ>ÐASÑSÑTÔTˆàÐÝ˜^Ð-DÀdÑKÔK€NØð SÝ"¥7¨>Ð;MÈqÑ#QÔ#QÑRÔRÐåØ!Ø#Ø+Ø-Ø)ðñ ô ð r1   ©r=   r@   r˜   Úusagec               ó¶  — t          | ||¬¦  «        }|j        dk    rt          t          dddd¬¦  «        S t	          | |||¬¦  «        }|st          d ddd	¬
¦  «        S g }t          }|j        r|j        €t          d d|j        d	¬
¦  «        S |j        r|j	        €t          d d|j        d	¬
¦  «        S |j
        r |j        €t          d d|j        d	d¬¦  «        S |j        r |j        €t          d d|j        d	d¬¦  «        S |j        �'|t          |j        ¦  «        |j        z  t          z  z  }|j	        �'|t          |j        ¦  «        |j	        z  t          z  z  }|j        �'|t          |j
        ¦  «        |j        z  t          z  z  }|j        �'|t          |j        ¦  «        |j        z  t          z  z  }|j        �&|j        r|t          |j        ¦  «        |j        z  z  }d}	d|d›�}
|j        dk    r|t          k    rd}	d}
|j        dk    r|                     d¦  «         t          ||	|j        |
|j        |j        t-          |¦  «        ¬¦  «        S )Nrš   rm   r   r   r›   )rS   rU   rK   rV   rN   r¶   r   zn/a)rS   rU   rK   rV   )z(cache-read pricing unavailable for route)rS   rU   rK   rV   rW   )z)cache-write pricing unavailable for router   z~$ú.2frn   zBOpenRouter cost is estimated from the models API until reconciled.)rS   rU   rK   rV   rP   rN   rW   )r{   rA   rR   rœ   r    r"   rE   rK   r#   rF   r$   rG   r%   rH   r   r•   rI   r(   r=   ÚappendrP   rN   Útuple)rj   r·   r=   r@   r˜   r|   rŸ   rW   ÚamountrU   rV   s              r/   Úestimate_usage_costr½   8  sÔ  € õ " *°xÈ(ÐSÑSÔS€EØÔÐ4Ò4Ð4ÝÝØØØØ,ð
ñ 
ô 
ð 	
õ ˜j°8ÀhÐX_Ð`Ñ`Ô`€EØð YÝ T°)ÀFÐRWÐXÑXÔXÐXà€EÝ€FàÔð _˜eÔ:ÐBÝ T°)ÀEÄLÐX]Ð^Ñ^Ô^Ð^ØÔð _˜uÔ<ÐDÝ T°)ÀEÄLÐX]Ð^Ñ^Ô^Ð^ØÔð ØÔ,Ð4ÝØØ Ø”|ØØCðñ ô ð ð Ôð ØÔ-Ð5ÝØØ Ø”|ØØDðñ ô ð ð Ô#Ð/Ø•'˜%Ô,Ñ-Ô-°Ô0LÑLÍ|Ñ[Ñ[ˆØÔ$Ð0Ø•'˜%Ô-Ñ.Ô.°Ô1NÑNÕQ]Ñ]Ñ]ˆØÔ(Ð4Ø•'˜%Ô1Ñ2Ô2°UÔ5VÑVÕYeÑeÑeˆØÔ)Ð5Ø•'˜%Ô2Ñ3Ô3°eÔ6XÑXÕ[gÑgÑgˆØÔÐ%¨%Ô*=Ð%Ø•'˜%Ô-Ñ.Ô.°Ô1CÑCÑCˆà$€FØ�ÐÐÐ€EØ„|�vÒÐ &­E¢/ /ØˆØˆà„~˜Ò%Ð%Ø�ŠÐYÑZÔZÐZåØØØŒ|ØØÔ#ØÔ-Ý�E‰lŒlðñ ô ð r1   Úboolc                ón   — t          | ||¬¦  «        }|j        dk    rdS t          | |||¬¦  «        }|duS )uÏ   Check whether we have pricing data for this model+route.

    Uses direct lookup instead of routing through the full estimation
    pipeline â€” avoids creating dummy usage objects just to check status.
    rš   rm   Tr¶   N)r{   rA   r    rž   s         r/   Úhas_known_pricingrÀ   ‡  sN   € õ " *°xÈ(ÐSÑSÔS€EØÔÐ4Ò4Ð4ØˆtÝ˜j°8ÀhÐX_Ð`Ñ`Ô`€EØ˜ÐÐr1   ÚsecondsÚfloatc                óÞ   — | 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�nt          |¦  «        › d�S |dz  }|d›d	�S )
Né<   ú.0fÚsÚmé   zh Úhú.1fÚd)r!   )rÁ   ÚminutesÚhoursÚremaining_minÚdayss        r/   Úformat_duration_compactrÐ   š  s±   € Ø�‚|€|ØÐ Ð Ð Ð Ð Ø˜‰l€GØ�‚|€|ØÐ Ð Ð Ð Ð Ø�b‰L€EØˆr‚z€zÝ˜G b™LÑ)Ô)ˆØ4AÐW•#�e‘*”*Ð0Ð0 Ð0Ð0Ð0Ð0Í#ÈeÉ*Ì*ÐGWÐGWÐGWÐWØ�2‰:€DØˆ>ˆ>ˆ>ˆ>Ðr1   c                ód  — t          t          | ¦  «        ¦  «        }|dk     rt          t          | ¦  «        ¦  «        S | dk     rdnd}d}|D ]`\  }}||k    rU||z  }|dk     r|d›}n|dk     r|d	›}n|d
›}d|v r(|                     d¦  «                             d¦  «        }|› |› |› �c S Œa| d›S )Néè  r   Ú-r?   ))i Êš;ÚB)i@B ÚM)rÒ   ÚKé
   r¹   éd   rÊ   rÅ   ú.r   Ú,)Úabsr!   r<   r�   )rc   Ú	abs_valueÚsignÚunitsÚ	thresholdÚsuffixÚscaledÚtexts           r/   Úformat_token_count_compactrã   ¨  sõ   € Ý•C˜‘J”J‘”€IØ�5ÒÐÝ•3�u‘:”:‰ŒÐà˜!’)�)ˆ3ˆ3 €DØB€EØ"ð +ð +Ñˆ	�6Ø˜	Ò!Ð!Ø Ñ*ˆFØ˜Š{ˆ{Ø ����Ø˜#’�Ø ����à ���Ø�dˆ{ˆ{Ø—{’{ 3Ñ'Ô'×.Ò.¨sÑ3Ô3�ØÐ*˜DÐ* &Ð*Ð*Ð*Ð*Ð*ð "ð ˆ<ˆ<Ðr1   )rc   r   r*   rD   )rc   r   r*   r!   )NN)rj   r<   r=   rL   r@   rL   r*   r;   )r|   r;   r*   r}   )
r†   r‡   rˆ   r<   rM   r<   rN   r<   r*   r}   )NNN)
rj   r<   r=   rL   r@   rL   r˜   rL   r*   r}   )r¢   r   r=   rL   r¡   rL   r*   r    )rj   r<   r·   r    r=   rL   r@   rL   r˜   rL   r*   rR   )
rj   r<   r=   rL   r@   rL   r˜   rL   r*   r¾   )rÁ   rÂ   r*   r<   )rc   r!   r*   r<   )*Ú
__future__r   Údataclassesr   r   r   Údecimalr   Útypingr   r	   r
   r   Úagent.model_metadatar   r   Úutilsr   ÚDEFAULT_PRICINGrœ   r•   rT   rJ   r    r;   rC   rR   r—   rb   r7   rg   ri   r{   r�   r…   r„   r    rµ   r½   rÀ   rÐ   rã   r9   r1   r/   ú<module>rë      s‘
  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ 'Ð 'Ð 'Ð 'Ð 'Ð 'à¨3Ð/Ð/€àˆ�‰Œ€Øˆw�yÑ!Ô!€àÐAÔB€
Øðô€
ð €�$ÐÑÔð7ð 7ð 7ð 7ð 7ñ 7ô 7ñ Ôð7ð$ €�$ÐÑÔð"ð "ð "ð "ð "ñ "ô "ñ Ôð"ð €�$ÐÑÔð	*ð 	*ð 	*ð 	*ð 	*ñ 	*ô 	*ñ Ôð	*ð €�$ÐÑÔð ð  ð  ð  ð  ñ  ô  ñ Ôð ð .Ð-€ð
V?ðð €|Ø&˜w wÑ/Ô/Ø ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ%, W¨WÑ%5Ô%5Ø'ØXØ=ðñ ô ð	V?ðð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ%, W¨V¡_¤_Ø'ØXØ=ðñ ô ð!V?ð4ð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ'Ø4Ø3ðñ ô ð;V?ðJð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨GÑ$4Ô$4Ø'Ø4Ø3ðñ ô ðQV?ð`ð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨F¡O¤OØ'Ø4Ø3ðñ ô ðgV?ðvð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨F¡O¤OØ'Ø4Ø3ðñ ô ð}V?ðLð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨GÑ$4Ô$4Ø'Ø4Ø3ðñ ô ðSV?ðbð €|Ø&˜w wÑ/Ô/Ø ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ'Ø4Ø3ðñ ô ðiV?ðxð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨F¡O¤OØ'Ø4Ø3ðñ ô ðV?ðPð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ%, W¨V¡_¤_Ø'ØXØ6ðñ ô ðWV?ðhð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨F¡O¤OØ%, W¨V¡_¤_Ø'ØXØ6ðñ ô ðoV?ð@ð €|Ø&˜w wÑ/Ô/Ø ' ¨Ñ 0Ô 0Ø$+ G¨F¡O¤OØ%, W¨WÑ%5Ô%5Ø'ØXØ6ðñ ô ðGV?ðXð €|Ø&˜w v™œØ ' ¨¡¤Ø$+ G¨F¡O¤OØ%, W¨V¡_¤_Ø'ØXØ6ðñ ô ð_V?ðrð €|Ø&˜w v™œØ ' ¨¡¤Ø'ØFØ5ðñ ô ðyV?ðFð €|Ø&˜w v™œØ ' ¨¡¤Ø'ØFØ5ðñ ô ðMV?ð\ð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø'Ø2Ø3ðñ ô ðcV?ðpð €|Ø&˜w v™œØ ' ¨¡¤Ø'Ø2Ø3ðñ ô ðwV?ðJ €|Ø&˜w v™œØ ' ¨¡¤Ø'Ø2Ø3ðñ ô ð €|Ø&˜w wÑ/Ô/Ø ' ¨Ñ 0Ô 0Ø'Ø<Ø1ðñ ô ð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø'Ø<Ø1ðñ ô ð €|Ø&˜w v™œØ ' ¨Ñ 0Ô 0Ø'Ø<Ø1ðñ ô ð €|Ø&˜w v™œØ ' ¨¡¤Ø'Ø<Ø1ðñ ô ð €|Ø&˜w v™œØ ' ¨¡¤Ø'Ø<Ø1ðñ ô ð €|Ø&˜w v™œØ ' ¨¡¤Ø'Ø<Ø1ðñ ô ð €|Ø&˜w wÑ/Ô/Ø ' ¨¡¤Ø'Ø<Ø1ðñ ô ð_V?ð V?ð V?Ð ð Vð Vð Vñ Vðrð ð ð ðð ð ð ð #Ø"ð[ð [ð [ð [ð [ð6Mð Mð Mð Mðð ð ð ð)ð )ð )ð )ð\ #Ø"Ø!ð	0ð 0ð 0ð 0ð 0ðB #Ø"ð	Fð Fð Fð Fð Fð FðZ #Ø"Ø!ðLð Lð Lð Lð Lð Lðb #Ø"Ø!ð	ð ð ð ð ð&ð ð ð ðð ð ð ð ð r1   