
    `gj                       U d dl mZ d dl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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,       ed-      d d!d"#      d. e ed       ed/       ed       ed      d d0d1#      d2 e ed3       ed4       ed*       ed5      d d6d1#      d7 e ed8       ed3       ed9       ed%      d d0d:#      d; e ed       ed/       ed       ed      d d0d1#      d< e ed       ed/       ed       ed      d d0d1#      d= e ed       ed/       ed       ed      d d0d1#      d> e ed       ed/       ed       ed      d d0d1#      d? e ed@       ed&       edA       edB      d d0d1#      dC e ed@       ed&       edA       edB      d d0d1#      dD e ed       ed/       ed       ed      d d0d1#      dE e ed@       ed&       edA       edB      d d0d1#      dF e ed*       ed       ed,       ed-      d d0d1#      dG e ed&       edH       edI       edJ      d d0d1#      dK e ed@       ed&       edA       edB      d d0d1#      i dL e ed%       ed3       ed-      d dMdNO      dP e edQ       edR       edS      d dMdNO      dT e ed8       edU       ed      d dMdNO      dV e edW       edX       ed,      d dMdNO      dY e ed,       edW       edZ      d dMdNO      d[ e ed3       ed\       ed%      d dMdNO      d] e ed^       ed_       ed`      d dMdNO      da e ed@       ed&       edA       edB      d d0d1#      db e edc       edd       ede       ed*      d d0d1#      df e ed&       edH       edI       edJ      d d0d1#      dg e ed'       ed-       edh       edA      d d0d1#      di e edj       edk       edl      d dmdnO      do e edj       edk       edl      d dmdnO      dp e edq       edr       eds      d dmdnO      dt e edj       edk       edl      d dmdnO      du e ed-       ed3      d dvdwx      dy e edQ       edR      d dvdwx      i dz e ed,       edW      d dvdwx      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       ed      d d|d}#      d e ed@       ed&       edA       edB      d d|d#      d e ed@       ed&       edA       edB      d d|d#      d e ed@       ed&       edA       edB      d d|d#      d e edc       edd       ede       ed*      d d|d#      d e edc       ed      d d|dx      d e ed       ed      d d|dx      d e ed       edj      d d|dx      d e edA       ed      d d      d e edA       ed      d d      d e ed       edd       ed      d ddO      d e ed       edd       ed      d ddO      d e ed       ed_       edj      d ddO      d e ed       ed       ed      d ddO       e edj       edk       ed      d ddO       e edW       edX       ede      d ddO       e edA       ed       ed      d ddO       e edQ       edR       ed      d ddO       e ed       edA       ed      d ddO       e ed       ed_       ed      d ddO       e edA       ed       ed      d ddO       e ed8       edU       edA      d ddO       e ed8       edU       edA      d ddO       e ed       edU       ed      d ddO       e ed       ed       ed      d ddO       e ed       ed       ed      d ddO      dZded<   dD ]  Z ede f   ede  df<    [ ddZ!ddZ"	 	 d	 	 	 	 	 	 	 ddZ#ddZ$ddZ%ddZ&ddZ'	 	 	 	 	 	 	 	 	 	 ddZ(	 	 	 d	 	 	 	 	 	 	 	 	 ddZ)ddd	 	 	 	 	 	 	 ddZ*dddd	 	 	 	 	 	 	 	 	 	 	 ddZ+	 	 	 d	 	 	 	 	 	 	 	 	 ddZ,ddZ-ddZ.y)    )annotationsN)	dataclass)datetimetimezone)Decimal)AnyDictLiteralOptional)fetch_endpoint_model_metadatafetch_model_metadata)base_url_host_matchesg        )inputoutput01000000z)https://inference-api.nousresearch.com/v1)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    F/root/.hermes/venv/lib/python3.12/site-packages/agent/usage_pricing.pyprompt_tokenszCanonicalUsage.prompt_tokens(   s$      4#9#99D<S<SSS    c                4    | j                   | j                  z   S r+   )r/   r#   r,   s    r.   total_tokenszCanonicalUsage.total_tokens,   s    !!D$6$666r0   c           	     f   t        |t              st        S t        | j                  |j                  z   | j                  |j                  z   | j
                  |j
                  z   | j                  |j                  z   | j                  |j                  z   | j                  |j                  z   d      S )u0  Sum two usage buckets (e.g. MoA advisor fan-out + aggregator).

        ``raw_usage`` is dropped on the sum — it describes a single API
        response and cannot be meaningfully merged. ``request_count`` adds so
        callers can see how many underlying API calls a combined figure covers.
        N)r"   r#   r$   r%   r&   r(   r)   )	
isinstancer    NotImplementedr"   r#   r$   r%   r&   r(   )r-   others     r.   __add__zCanonicalUsage.__add__0   s     %0!!**U-?-??,,u/B/BB"44u7N7NN#669Q9QQ!22U5K5KK,,u/B/BB
 	
r0   )returnr!   )r6   'CanonicalUsage'r8   r9   )__name__
__module____qualname__r"   __annotations__r#   r$   r%   r&   r(   r)   propertyr/   r2   r7    r0   r.   r    r       sy    L#M3scM3*.I'.T T 7 7
r0   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)r:   r;   r<   r=   rF   rG   r?   r0   r.   rA   rA   D   s     MJHc!L#!r0   rA   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<   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_at)r:   r;   r<   rK   r=   rL   rM   rN   rO   rQ   rS   rT   rV   r?   r0   r.   rI   rI   L   sf    04-415.559!296: "3:&*L#*FJ $J$%)O])%)J")r0   rI   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	)
CostResultrJ   
amount_usd
CostStatusstatusrP   rQ   rB   labelNrU   rV   rR   rT   r?   ztuple[str, ...]notes)r:   r;   r<   r=   rV   rT   r]   r?   r0   r.   rX   rX   Y   s8    !!J%)J")%)O])E?r0   rX   c                 H    t        j                  t        j                        S r+   )r   nowr   utcr?   r0   r.   <lambda>ra   d   s    8<<- r0   )openaigpt-5.6-solz5.00z30.00z0.50z6.25r   z0https://openai.com/index/previewing-gpt-5-6-sol/zopenai-gpt-5.6-2026-07)rK   rL   rM   rN   rQ   rS   rT   )rb   gpt-5.6-terraz2.50z15.00z0.25z3.125)rb   gpt-5.6-lunaz1.00z6.00z0.10z1.25)	anthropiczclaude-opus-4-8z25.00z8https://platform.claude.com/docs/en/about-claude/pricingzanthropic-pricing-2026-05)rf   zclaude-opus-4-8-fastz10.00z50.00z12.50z4https://openrouter.ai/anthropic/claude-opus-4.8-fast)rf   zclaude-sonnet-5z2.00z0.20zanthropic-pricing-2026-06-intro)rf   zclaude-opus-4-7)rf   zclaude-opus-4-7-20250507)rf   zclaude-opus-4-6)rf   zclaude-opus-4-6-20250414)rf   zclaude-sonnet-4-6z3.00z0.30z3.75)rf   zclaude-sonnet-4-6-20250414)rf   zclaude-opus-4-5)rf   zclaude-sonnet-4-5)rf   zclaude-haiku-4-5)rf   zclaude-opus-4-20250514z75.00z1.50z18.75)rf   zclaude-sonnet-4-20250514)rb   zgpt-4ozhttps://openai.com/api/pricing/zopenai-pricing-2026-03-16)rK   rL   rM   rQ   rS   rT   )rb   zgpt-4o-miniz0.15z0.60z0.075)rb   zgpt-4.1z8.00)rb   zgpt-4.1-miniz0.40z1.60)rb   zgpt-4.1-nanoz0.025)rb   o3z40.00)rb   zo3-miniz1.10z4.40z0.55)rf   zclaude-3-5-sonnet-20241022)rf   zclaude-3-5-haiku-20241022z0.80z4.00z0.08)rf   zclaude-3-opus-20240229)rf   zclaude-3-haiku-20240307z0.03)deepseekzdeepseek-chatz0.14z0.28z0.0028z1https://api-docs.deepseek.com/quick_start/pricingzdeepseek-pricing-2026-07)rh   zdeepseek-reasoner)rh   deepseek-v4-proz0.435z0.87z0.003625)rh   deepseek-v4-flash)googlezgemini-2.5-prozhttps://ai.google.dev/pricingzgoogle-pricing-2026-03-16)rK   rL   rQ   rS   rT   )rk   zgemini-2.5-flash)rk   zgemini-2.0-flash)bedrockzanthropic.claude-opus-4-8z'https://aws.amazon.com/bedrock/pricing/zanthropic-list-2026-07)rl   zanthropic.claude-opus-4-7)rl   zanthropic.claude-opus-4-6)rl   zanthropic.claude-sonnet-5zbedrock-pricing-2026-06)rl   zanthropic.claude-sonnet-4-6zbedrock-pricing-2026-04)rl   zanthropic.claude-sonnet-4-5)rl   zanthropic.claude-haiku-4-5)rl   zamazon.nova-proz3.20)rl   zamazon.nova-litez0.06z0.24)rl   zamazon.nova-microz0.035)minimaxminimax-m2.7z1.20zminimax-pricing-2026-04)rK   rL   rQ   rT   )
minimax-cnrn   )	fireworksz	kimi-k2p6z0.95z0.16z,https://docs.fireworks.ai/serverless/pricingzfireworks-pricing-2026-07)rp   zkimi-k2p7-codez0.19)rp   zglm-5p2z1.40)rp   ri   z1.74z3.48z0.145z0.028z0.015z0.07z0.26z1.90z0.38z2.10z6.60z0.21z2.80z8.80z0.52))rp   rj   )rp   zqwen3p7-plus)rp   z
minimax-m3)rp   zgpt-oss-120b)rp   zgpt-oss-20b)rp   zglm-5p1)rp   zminimax-m2p7)rp   zkimi-k2p6-fast)rp   zkimi-k2p6-turbo)rp   zkimi-k2p7-code-fast)rp   zglm-5p2-fast)rp   zglm-5p1-fastz#Dict[tuple[str, str], PricingEntry]_OFFICIAL_DOCS_PRICING)rc   rd   re   rb   z-proc                P    | y 	 t        t        |             S # t        $ r Y y w xY wr+   )r   rB   	Exceptionvalues    r.   _to_decimalrv   r  s0    }s5z"" s    	%%c                @    	 t        | xs d      S # t        $ r Y yw xY w)Nr   )r!   rs   rt   s    r.   _to_intrx   {  s'    5:A s    	c                N   |xs dj                         j                         }|xs dj                         j                         }| xs dj                         }|s!d|v r|j                  dd      \  }}|dv r|}|}|dk(  rt        d||xs dd      S |dk(  st	        |xs dd	      rt        d||xs dd
      S |dk(  st	        |xs dd      rt        d||xs t
        d
      S |dk(  r%t        d|j                  d      d   |xs dd      S |dv r%t        d|j                  d      d   |xs dd      S |dv r%t        ||j                  d      d   |xs dd      S |dk(  st	        |xs dd      r%t        d|j                  d      d   |xs dd      S |dk(  st	        |xs dd      r&t        d|j                  dd      d   |xs dd      S |dv s|rd|v rt        |xs d||xs dd      S t        |xs d|r|j                  d      d   nd|xs dd      S )NrE   /r'   >   rk   rb   rf   zopenai-codexsubscription_included)rC   rD   rF   rG   
openrouterzopenrouter.aiofficial_models_apinouszinference-api.nousresearch.comrf   r   >   
openai-apirb   rb   >   rm   ro   vertexzaiplatform.googleapis.comgeminirp   zapi.fireworks.ai>   localcustom	localhostr   r   )striplowersplitrA   r   _NOUS_DEFAULT_BASE_URLrsplit)
model_namerC   rF   provider_namebaserD   inferred_provider
bare_models           r.   resolve_billing_router     s   
 ^**,224MN!!#))+D2$$&ESE\(-C(;%: AA-ME&^58>WYh  A  	A$(=hn"o(^\UWf{||"7BHh"iV58CeOe  uJ  K  	K#[C8H8LW_Wece  uM  N  	N
 00XU[[5Eb5IT\Tb`b  rJ  K  	K11]%++c:J2:NYaYgeg  wO  P  	P  $9(.bJe$fXU[[5Eb5IT\Tb`b  rJ  K  	K#'<X^M_'` [S!8LR8P[c[igi  yQ  R  	R++9L]%>heV^Vdbds|}}!;)[`5;;sCSTVCWfhs{  tB  @B  QZ  [  [r0   c                J   | j                         j                         }dD ]#  }|j                  |      s|t        |      d } n t	        j
                  dd|      }t	        j
                  dd|      }t	        j
                  dd|      }t	        j
                  dd|      }|S )	u  Normalize a Bedrock model id to its bare foundation-model form.

    Bedrock cross-region inference profiles prefix the foundation model id
    with a region scope (``us.`` / ``global.`` / ``eu.`` / ``apac.`` / ``au.``
    / ...), e.g. ``us.anthropic.claude-opus-4-7`` or
    ``au.anthropic.claude-sonnet-4-5-20250929-v1:0``.  The pricing table is
    keyed on the bare ``anthropic.claude-*`` id, so the prefix must be
    stripped before the lookup or every cross-region session prices as
    unknown.  Note Asia-Pacific uses ``apac.`` (a bare ``ap.`` never matches
    an ``apac.*`` id) and Australia/New Zealand use ``au.``.  Also normalizes
    dot-notation version numbers (``4.7`` → ``4-7``) and the documented
    trailing date, revision, and profile components (``-20250514-v1:0``).
    )zglobal.zus.zeu.zapac.zap.zau.zjp.zca.zsa.zme.zaf.N(\d+)\.(\d+)\1-\2z:\d+$rE   z-v\d+$z-\d{8}$r   r   
startswithlenresub)rD   nameprefixs      r.   _normalize_bedrock_model_namer     s     ;;= D  ??6"F%D  66/8T2D 66(B%D66)R&D66*b$'DKr0   c                    | j                         j                         }|j                  d      r|t        d      d }t	        j
                  dd|      }|S )u   Normalize Anthropic model name variants to canonical form.

    Handles:
      - Dot notation: claude-opus-4.7 → claude-opus-4-7
      - Short aliases: claude-opus-4.7 → claude-opus-4-7
      - Strips anthropic/ prefix if present
    z
anthropic/Nr   r   r   )rD   r   s     r.   _normalize_anthropic_model_namer     sO     ;;= D|$C%&' 66/8T2DKr0   c                   | j                   j                         }t        j                  | j                  |f      }|r|S | j                  dk(  r5t        |      }||k7  r%t        j                  | j                  |f      }|r|S | j                  dk(  r5t        |      }||k7  r%t        j                  | j                  |f      }|r|S y )Nrf   rl   )rD   r   rq   getrC   r   r   )routerD   entry
normalizeds       r.   _lookup_official_docs_pricingr     s    KKE"&&'>?E~~$4U;
*..
/KLE ~~"259
*..
/KLEr0   c                D    t        t               | j                  dd      S )Nz>https://openrouter.ai/docs/api/api-reference/models/get-modelszopenrouter-models-apirS   rT   )_pricing_entry_from_metadatar   rD   )r   s    r.   _openrouter_pricing_entryr      s"    'S/	 r0   c               V   || vry | |   j                  d      xs i }t        |j                  d            }t        |j                  d            }t        |j                  d            }t        |j                  d      xs$ |j                  d      xs |j                  d            }t        |j                  d      xs$ |j                  d	      xs |j                  d
            }	|||y dd}
t         |
|       |
|       |
|       |
|	      |d||t               	      S )Npricingprompt
completionrequest
cache_readcached_promptinput_cache_readcache_writecache_creationinput_cache_writec                    | y | t         z  S r+   )_ONE_MILLIONrt   s    r.   _per_token_to_per_millionz?_pricing_entry_from_metadata.<locals>._per_token_to_per_million#  s    =|##r0   r   )	rK   rL   rM   rN   rO   rQ   rS   rT   rV   )ru   rJ   r8   rJ   )r   rv   rI   _UTC_NOW)metadatamodel_idrS   rT   r   r   r   r   r   r   r   s              r.   r   r   	  s/    xx $$Y/52GX./FW[[67J'++i01GL! 	+;;'	+;;)*J
 M" 	,;;'(	,;;*+K
 ~*,$
 8@ 9* E$=j$I%>{%K$':
 
r0   c                   t        | ||      }|j                  dk(  r!t        t        t        t        t        dd      S |j                  dk(  rt        |      S |j                  rRt        t        |j                  |xs d      |j                  |j                  j                  d	       d
d      }|r|S t        |      S )NrC   rF   r{   r   included-route)rK   rL   rM   rN   rQ   rT   r|   rE   )api_keyrz   z/modelszopenai-compatible-models-apir   )r   rG   rI   _ZEROrC   r   rF   r   r   rD   rstripr   r   rC   rF   r   r   r   s         r.   get_pricing_entryr   5  s     "*x(SE44#($)(-).,
 	
 ~~%(//~~,)%..'-RPKK..//45W=:	
 L(//r0   )rC   api_modec                  | s
t               S |xs dj                         j                         }|xs dj                         j                         }|dk(  s|dk(  rZt        t	        | dd            }t        t	        | dd            }t        t	        | dd            }t        t	        | dd            }nL|d	k(  rt        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
        }nt        t	        | dd            }t        t	        | dd            }t	        | dd      }
t        |
rt	        |
dd      nd      }|st        t	        | d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            }|s%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.
    rE   anthropic_messagesrf   r"   r   r#   cache_read_input_tokenscache_creation_input_tokenscodex_responsesinput_tokens_detailsNcached_tokenscache_creation_tokensr/   completion_tokensprompt_tokens_detailsprompt_cache_hit_tokensr%   output_tokens_detailsr&   completion_tokens_details)r"   r#   r$   r%   r&   )r    r   r   rx   getattrmax)response_usagerC   r   r   moder"   r#   r$   r%   input_totaldetailsprompt_totalr&   output_detailscompletion_detailss                  r.   normalize_usager   S  s   " ^**,224MN!!#))+D##}'Cw~~qIJ KL#GN<UWX$YZ$W^=Z\]%^_	"	"gnnaHI KL.*@$G#GGG_a$HYZ[$<CGG4a8
 1k,==@RRSw~JK8KQ OP.*A4H $GGG_a$HYZ[  '@Y[\(] ^  !((A1E! %9@GG115a
 "!((EqI" 1l->>ASST ^-DdKN"7>;Mq#QR$^5PRVW&*,>B  !#+-) r0   rC   rF   r   c               t   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                   1|j"                  r%|t        |j"                        |j                   z  z  }d}	d|d}
|j                  dk(  r|t        k(  rd}	d}
|j$                  dk(  r|j'                  d       t        ||	|j                  |
|j(                  |j*                  t-        |            S )Nr   r{   r   r   r   )rY   r[   rQ   r\   rT   r   r   zn/a)rY   r[   rQ   r\   )z(cache-read pricing unavailable for route)rY   r[   rQ   r\   r]   )z)cache-write pricing unavailable for router   z~$.2fr|   zBOpenRouter cost is estimated from the models API until reconciled.)rY   r[   rQ   r\   rV   rT   r]   )r   rG   rX   r   r   r"   rK   rQ   r#   rL   r$   rM   r%   rN   r   r   rO   r(   rC   appendrV   rT   tuple)r   usagerC   rF   r   r   r   r]   amountr[   r\   s              r.   estimate_usage_costr     s    "*x(SE44,
 	
 j8hX_`ET)FRWXXEFe::BT)ELLX]^^u<<DT)ELLX]^^,,4 ||C  --5 ||D  ##/'%,,-0L0LL|[[$$0'%--.1N1NNQ]]]((4'%112U5V5VVYeee))5'%223e6X6XX[ggg%%*=*='%--.1C1CCC$FE||v&E/~~%YZ||##--El r0   c                d    t        | ||      }|j                  dk(  ry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   r{   Tr   N)r   rG   r   r   s         r.   has_known_pricingr     s@     "*x(SE44j8hX_`Er0   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sm   zh h.1fd)r!   )secondsminuteshoursremaining_mindayss        r.   format_duration_compactr     s    |#a  lG|#a  bLErzGbL)4A#e*Ra0W#e*UVGWW2:D3Zq>r0   c                .   t        t        |             }|dk  rt        t        |             S | dk  rdnd}d}|D ]U  \  }}||k\  s||z  }|dk  r|d}n|dk  r|d	}n|d
}d|v r |j                  d      j                  d      }| | | c S  | dS )N  r   -rE   ))i ʚ;B)i@B M)r   K
   r   d   r   r   .r   ,)absr!   rB   r   )ru   	abs_valuesignunits	thresholdsuffixscaledtexts           r.   format_token_count_compactr  "  s    CJI53u:!)3DBE" +	6	!*F{ #  d{{{3'..s3VD6&**+ AYr0   )ru   r   r8   rJ   )ru   r   r8   r!   )NN)r   rB   rC   rR   rF   rR   r8   rA   )rD   rB   r8   rB   )r   rA   r8   Optional[PricingEntry])
r   zDict[str, Dict[str, Any]]r   rB   rS   rB   rT   rB   r8   r  )NNN)
r   rB   rC   rR   rF   rR   r   rR   r8   r  )r   r   rC   rR   r   rR   r8   r    )r   rB   r   r    rC   rR   rF   rR   r   rR   r8   rX   )
r   rB   rC   rR   rF   rR   r   rR   r8   bool)r   floatr8   rB   )ru   r!   r8   rB   )/
__future__r   r   dataclassesr   r   r   decimalr   typingr   r	   r
   r   agent.model_metadatar   r   utilsr   DEFAULT_PRICINGr   r   r   rZ   rP   r    rA   rI   rX   r   rq   r=   _base_56rv   rx   r   r   r   r   r   r   r   r   r   r   r   r  r?   r0   r.   <module>r     s   " 	 ! '  / / T '3/y!D AB

 $"
 "
 "
J $" " " $	* 	* 	* $      .
}? &v ' 0$+FO%,V_'E0!}?2 &v ' 0$+FO%,W%5'E09}?J &v '$+FO%,V_'E0Q}?j &v ' 0$+FO%,V_'M3q}?B &w/ ' 0$+FO%,W%5'I3I}?d &v ' 0$+FO%,V_'M9k}?D &v ' 0$+FO%,V_'M3K}?\ &v ' 0$+FO%,V_'M3c}?v &v ' 0$+FO%,V_'M3}}?N &v ' 0$+FO%,V_'M3U}?f &v ' 0$+FO%,V_'M3m}?~ &v ' 0$+FO%,V_'M3E}?X &v ' 0$+FO%,V_'M3_}?p &v ' 0$+FO%,V_'M3w}?H &v '$+FO%,V_'M3O}?b &w/ ' 0$+FO%,W%5'M3i}?z &v ' 0$+FO%,V_'M3A}?T &v ' 0$+FO'43[}?j &v '$+G$4'43q}?@ &v '$+FO'43G}?V &v '$+FO'43]}?l &v '$+G$4'43s}?B	 &w/ ' 0$+FO'43I	}?X	 &v '$+FO'43_	}?p	 &v ' 0$+FO%,V_'M3w	}?H
 &v '$+FO%,V_'M3O
}?`
 &w/ ' 0$+FO%,W%5'M3g
}?x
 &v '$+FO%,V_'M3
}?X &v '$+H$5'F2_}?n &v '$+H$5'F2u}?D &w/ '$+J$7'F2K}?Z &v '$+H$5'F2a}?r &v ' 0'23y}?F &v ''23M}?Z &v ''23a}?B &v ' 0$+FO%,V_'<0I}?Z &v ' 0$+FO%,V_'<0a}?r &v ' 0$+FO%,V_'<0y}?J &v ' 0$+FO%,V_'<1Q}?b &v ' 0$+FO%,V_'<1i}?z &v ' 0$+FO%,V_'<1A}?R &v '$+FO%,V_'<1Y}?j &v ''<1q}?~ &v ''<1E}?R &w/ ''<1Y}?h &v ''1	o}?z &v ''1	A}?V &v '$+FO'A3]}?l &v '$+FO'A3s}?B &v '$+FO'A3I}?X &v '$+G$4'A3_}?t &v '$+G$4'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+G$4'A3 &v '$+G$4'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+FO'A3 &v '$+FO'A3k}? ; }D A H<R	8=H
$&789  #")[)[)[ )[ 	)[X&R"0)')) 	)
 ) )\ #"!	000 0 	0
 0B #"	\\ \ 	\
 \F #"!LLL 	L
 L L Lb #"!	  	
 
&r0   