ó
    ±"³jÓj  ã                  ó  • S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJrJrJr  S SKJr  S S	KJrJrJrJrJr  S S
K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S15      r$ \#" 1 Sk5      r% Sr&\
S'S j5       r' " S S5      r(            S(S jr)\" SSSS9 " S S5      5       r*\" SSSS9 " S S\*5      5       r+\" SSSS9 " S S \*5      5       r,S)S! jr-S)S" jr.\" SS#S$9 " S% S&5      5       r/g)*é    )ÚannotationsN)Úcopy)Ú	dataclass)ÚDecimal)Úcache)Ú	AnnotatedÚAnyÚcast)Úget_snapshot)ÚAliasChoicesÚBeforeValidatorÚFieldÚGetCoreSchemaHandlerÚTypeAdapter)ÚSchemaSerializerÚcore_schemaé   )Ú_utils)Úiter_provider_references)ÚCostNotFoundWarning)ÚUsageLimitExceeded)ÚRequestUsageÚRunUsageÚUsageLimitsÚinput_tokensÚoutput_tokens>   ÚrequestsÚtotal_tokensÚrequest_tokensÚresponse_tokens))r   r   )r   r    c                ó,   • [        U 5      R                  $ ©N)r   Ú
serializer)Ú
usage_types    ÚN/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pydantic_ai/usage.pyÚ_usage_serializerr&   #   s   € ä�zÓ"×-Ñ-Ð-ó    c                  ó   • \ rS rSrSS jrSrg)Ú_UsageSerializerDescriptoré(   c                ó   • [        U5      $ r"   )r&   )ÚselfÚinstanceÚowners      r%   Ú__get__Ú"_UsageSerializerDescriptor.__get__)   s   € Ü  Ó'Ð'r'   © N)r-   Úobjectr.   útype[object]Úreturnr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r/   Ú__static_attributes__r1   r'   r%   r)   r)   (   s   † ÷(r'   r)   Ú	UsageBasec               óÈ  • U" U 5      n[        U[        5      (       d   e[        [        [        [        4   U5      R                  5       nU R                  R                  5        VVs0 s H$  u  pxXs;  d  M  Uc  UR                  (       a  M"  Xx_M&     n	nn[        [        [        [        4   UR                  U	S[        [        UR                  5      [        [        UR                  5      UR                  UR                  UR                  UR                  UR                  UR                   UR"                  UR$                  S95      n	UR'                  U	5        U$ s  snnf )NÚpython)ÚmodeÚincludeÚexcludeÚby_aliasÚexclude_unsetÚexclude_defaultsÚexclude_noneÚexclude_computed_fieldsÚ
round_tripÚserialize_as_anyÚcontext)Ú
isinstanceÚdictr
   Ústrr	   r   Ú__dict__ÚitemsrC   Ú	to_pythonr>   r?   r@   rA   rB   rD   rE   rF   rG   Úupdate)
ÚvalueÚinnerÚinfoÚreserved_namesÚextra_serializerÚ
serializedÚresultÚkeyÚitemÚextras
             r%   Ú_serialize_usagerY   -   s1  € ñ �u“€JÜ�j¤$×'Ñ'Ð'Ð'Ü”$”sœC�x‘. *Ó-×2Ñ2Ó4€Fð Ÿ™×-Ñ-Ô/ôâ/‰IˆCØÑ$ó 	à*.Ñ*:À$×BSÕBSó 	ˆŠ	Ù/ð 
ñ ô
 ÜŒS”#ˆX‰Ø×"Ñ"ØàÜœ˜dŸl™lÓ+Üœ˜dŸl™lÓ+Ø—]‘]Ø×,Ñ,Ø!×2Ñ2Ø×*Ñ*Ø$(×$@Ñ$@Ø—‘Ø!×2Ñ2Ø—L‘Lð 	#ð 	
ó€Eð$ ‡M�M�%ÔØ€Mùó1s   Á(EÁ7EÂEF)ÚreprÚinitÚeqc                  óV  • \ rS rSr% \" 5       rSrS\S'    SrS\S'    Sr	S\S'    Sr
S\S	'    SrS\S
'    SrS\S'    SrS\S'    \R                  " \\\4   S9rS\S'    SrS\S'    SS.SS jjr\SS j5       rSS jr\S S j5       r\S!S j5       rS"S jrS rS#S jrS$S jrSr g)%r:   éS   r   zVAnnotated[int, Field(validation_alias=AliasChoices('input_tokens', 'request_tokens'))]r   ÚintÚcache_write_tokensÚcache_read_tokenszXAnnotated[int, Field(validation_alias=AliasChoices('output_tokens', 'response_tokens'))]r   Úinput_audio_tokensÚcache_audio_read_tokensÚoutput_audio_tokens©Údefault_factoryz=Annotated[dict[str, int], BeforeValidator(lambda d: d or {})]ÚdetailsNúDecimal | NoneÚcost©rg   c               ón   • U=(       d    0 U l         UR                  5        H  u  p4[        XU5        M     g r"   )rg   rL   Úsetattr)r,   rg   ÚkwargsÚkÚvs        r%   Ú__init__ÚUsageBase.__init__‹   s)   € Ø—} "ˆŒØ—L‘L–N‰DˆAÜ�D˜QÖò #r'   c           
     ó`  ^^• U" U5      n[        S [        R                  " U5       5       5      nU[        [        U5      5      -  [        -  m[        [        R                  " 5       5      mSU4S jjn        SUU4S jjn[        R                  " UU[        R                  " USUS9S9$ )	z>Preserve arbitrary usage fields across Pydantic serialization.c              3  ó8   #   • U  H  oR                   v •  M     g 7fr"   )Úname)Ú.0Úfields     r%   Ú	<genexpr>Ú9UsageBase.__get_pydantic_core_schema__.<locals>.<genexpr>”   s   é € ÐXÒ8W¨u§
¦
Ò8Wùs   ‚c                óÖ  >• [        U [        5      (       aq  [        [        [        [        4   U 5      nUR                  5       nUR                  S5      (       d  0 US'   [         H  u  pEXB;  d  M  XR;   d  M  X%   b  M  SX5'   M      OS n[        [        U 5      nU" U5      n[        U[        5      (       d   eUb-  UR                  5        H  u  pxUT	;  d  M  [        XgU5        M     U$ )Nrg   r   )rH   rI   r
   rJ   r	   r   ÚgetÚ_LEGACY_TOKEN_ALIASESr2   r:   rL   rl   )
rO   rP   Ú
value_dictÚinput_valueÚ
field_nameÚlegacy_namerU   rV   rW   rR   s
            €r%   ÚvalidateÚ8UsageBase.__get_pydantic_core_schema__.<locals>.validate˜   s×   ø€ Ü˜%¤×&Ñ&Ü!¤$¤s¬C x¡.°%Ó8�
Ø(Ÿo™oÓ/�Ø!—~‘~ i×0Ñ0Ø-/�K 	Ñ*ß/DÑ+�JØ!Õ3¸Õ8QÐV`ÑVmÓVuØ34˜Ó0ò 0Eð "�
Ü"¤6¨5Ó1�á˜;Ó'ˆFÜ˜f¤i×0Ñ0Ð0Ð0ØÑ%Ø!+×!1Ñ!1Ö!3‘I�CØ .Õ0Ü ¨TÖ2ñ "4ð ˆMr'   c                ó   >• [        U UUTTS9$ )N)rR   rS   )rY   )rO   rP   rQ   rS   rR   s      €€r%   Ú	serializeÚ9UsageBase.__get_pydantic_core_schema__.<locals>.serialize­   s!   ø€ ô
 $ØØØØ-Ø!1ñð r'   T)Úinfo_argÚschema)Úserialization)rO   r	   rP   z(core_schema.ValidatorFunctionWrapHandlerr4   r:   )rO   r:   rP   ú)core_schema.SerializerFunctionWrapHandlerrQ   úcore_schema.SerializationInfor4   r	   )
Ú	frozensetÚdataclassesÚfieldsÚdirÚ_LEGACY_USAGE_KEYSr   r   Ú
any_schemaÚno_info_wrap_validator_functionÚ#wrap_serializer_function_ser_schema)	ÚclsÚsource_typeÚhandlerr†   Úfield_namesr€   rƒ   rS   rR   s	          @@r%   Ú__get_pydantic_core_schema__Ú&UsageBase.__get_pydantic_core_schema__�   sº   ù€ ñ ˜Ó%ˆÜÑX¼×8JÒ8JÈ;Ô8WÓXÓXˆØ$¤y´°[Ó1AÓ'BÑBÔEWÑWˆÜ+¬K×,BÒ,BÓ,DÓEÐ÷	ð*	Øð	à<ð	ð 0ð	ð ÷		ð 	ô ×:Ò:ØØÜ%×IÒIÈ)Ð^bÐkqÑrñ
ð 	
r'   c                óÆ   • [        U 5      nUR                  U5      nUR                  R                  U R                  5        U R                  R                  5       Ul        U$ )z<Shallow copy that also copies mutable fields like `details`.)ÚtypeÚ__new__rK   rN   rg   r   )r,   r’   Únews      r%   Ú__copy__ÚUsageBase.__copy__À   sH   € ä�4‹jˆØ�k‰k˜#ÓˆØ�‰×Ñ˜DŸM™MÔ*Ø—l‘l×'Ñ'Ó)ˆŒØˆ
r'   c                ó4   • U R                   U R                  -   $ )z&Sum of `input_tokens + output_tokens`.)r   r   ©r,   s    r%   r   ÚUsageBase.total_tokensÈ   s   € ð × Ñ  4×#5Ñ#5Ñ5Ð5r'   c                óZ   • U R                   (       a  U R                  U R                   -  $ S$ )uÖ  Fraction of input tokens that were read from the provider's prompt cache.

Computed as `cache_read_tokens / input_tokens`. Both counts span all modalities â€” cached audio tokens are
included in `cache_read_tokens` just as audio input tokens are included in `input_tokens` â€” and
`input_tokens` includes cached reads for every provider, so the ratio is comparable across providers:
`0.0` means no prompt-cache hits, while values approaching `1.0` mean nearly the entire prompt was served
from cache. Returns `0.0` when there are no input tokens.

On [`RequestUsage`][pydantic_ai.usage.RequestUsage] this is the hit ratio of a single request; on
[`RunUsage`][pydantic_ai.usage.RunUsage] it aggregates all requests in the run.
g        )r   ra   rŸ   s    r%   Úcache_hit_ratioÚUsageBase.cache_hit_ratioÍ   s*   € ð >B×=N×=Nˆt×%Ñ%¨×(9Ñ(9Ñ9ÐWÐTWÐWr'   c                ó¬  • 0 nU R                   (       a  U R                   US'   U R                  (       a  U R                  US'   U R                  R                  5       nU R                  (       a  U R                  US'   U R                  US'   U R
                  (       a  U R
                  US'   U R
                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US	'   U(       a2  S
nUR                  5        H  u  pEU[        ;   a  M  Uc  M  XQX4-   '   M     U$ )z7Get the token usage values as OpenTelemetry attributes.zgen_ai.usage.input_tokenszgen_ai.usage.output_tokensz(gen_ai.usage.cache_creation.input_tokensr`   z$gen_ai.usage.cache_read.input_tokensra   rb   rc   rd   zgen_ai.usage.details.)r   r   rg   r   r`   ra   rb   rc   rd   rL   Ú_FIRST_CLASS_TOKEN_DETAIL_KEYS)r,   rU   rg   ÚprefixrV   rO   s         r%   Úopentelemetry_attributesÚ"UsageBase.opentelemetry_attributesÜ   s2  € à!#ˆØ××Ø26×2CÑ2CˆFÐ.Ñ/Ø××Ø37×3EÑ3EˆFÐ/Ñ0à—,‘,×#Ñ#Ó%ˆØ×"×"ØAE×AXÑAXˆFÐ=Ñ>à,0×,CÑ,CˆGÐ(Ñ)Ø×!×!Ø=A×=SÑ=SˆFÐ9Ñ:à+/×+AÑ+AˆGÐ'Ñ(Ø×"×"Ø,0×,CÑ,CˆGÐ(Ñ)Ø×'×'Ø15×1MÑ1MˆGÐ-Ñ.Ø×#×#Ø-1×-EÑ-EˆGÐ)Ñ*ÞØ,ˆFØ%Ÿm™mžo‘
�ð Ô8Ó8Ùð Ó$Ø+0˜6™<Ó(ñ .ð ˆr'   c                ó¬   • S [        U R                  R                  5       5       5       nU R                  R                   SSR                  U5       S3$ )Nc              3  óH   #   • U  H  u  pU(       d  M  U S U< 3v •  M     g7f)Ú=Nr1   )ru   rt   rO   s      r%   rw   Ú%UsageBase.__repr__.<locals>.<genexpr>  s%   é € ÐbÒ;X©K¨DÔ\aÓ'�t�f˜A˜e™YÕ'Ò;Xùs   ‚"“"Ú(z, Ú))ÚsortedrK   rL   Ú	__class__r7   Újoin)r,   Úkv_pairss     r%   Ú__repr__ÚUsageBase.__repr__  sF   € Ùb¼6À$Ç-Á-×BUÑBUÓBWÔ;XÓbˆØ—.‘.×-Ñ-Ð.¨a°·	±	¸(Ó0CÐ/DÀAÐFÐFr'   c               óî   ^ ^^• [        T 5      [        T5      L aV  [        5       mT R                  R                  5       TR                  R                  5       -  n[	        UU U4S jU 5       5      $ [
        $ )Nc              3  óZ   >#   • U  H   n[        TUT5      [        TUT5      :H  v •  M"     g 7fr"   )Úgetattr)ru   rV   Úmissingr,   rO   s     €€€r%   rw   Ú#UsageBase.__eq__.<locals>.<genexpr>	  s+   øé € ÐcÒ^bÐWZ”w˜t S¨'Ó2´g¸eÀSÈ'Ó6RÖRÒ^bùs   ƒ(+)r™   r2   rK   ÚkeysÚallÚNotImplemented)r,   rO   rº   r¸   s   `` @r%   Ú__eq__ÚUsageBase.__eq__  sV   ú€ Ü�‹:œ˜e›Ò$Ü“hˆGØ—=‘=×%Ñ%Ó'¨%¯.©.×*=Ñ*=Ó*?Ñ?ˆDÜÖcÑ^bÓcÓcÐcÜÐr'   c                óª   • [        U R                  R                  5       5      =(       d*    [        S U R                  R	                  5        5       5      $ )z(Whether any values are set and non-zero.c              3  ó:   #   • U  H  u  pUS :w  d  M  Uv •  M     g7f)rg   Nr1   )ru   rn   ro   s      r%   rw   Ú'UsageBase.has_values.<locals>.<genexpr>  s   é € Ð0gÒ?T±t°qÐXYÐ]fÑXf·±Ò?Tùs   ‚’	)Úanyrg   ÚvaluesrK   rL   rŸ   s    r%   Ú
has_valuesÚUsageBase.has_values  s7   € ä�4—<‘<×&Ñ&Ó(Ó)×g¬SÑ0g¸t¿}¹}×?RÑ?RÔ?TÓ0gÓ-gÐgr'   )rg   zdict[str, int] | Nonerm   r	   )r“   r	   r”   r   r4   zcore_schema.CoreSchema)r4   r:   )r4   r_   )r4   Úfloat)r4   údict[str, int])rO   r2   r4   Úbool©r4   rÈ   )!r5   r6   r7   r8   r)   Ú__pydantic_serializer__r   Ú__annotations__r`   ra   r   rb   rc   rd   r‹   rv   rI   rJ   r_   rg   ri   rp   Úclassmethodr–   rœ   Úpropertyr   r¢   r§   r³   r½   rÄ   r9   r1   r'   r%   r:   r:   S   s*  ‡ ñ 9Ó:Ðð 	
ð	 ð ó 
ð
ð  Ð˜ÓØLØÐ�sÓðð 	
ð	 ð ó 
ð
 .àÐ˜ÓØCØ#$Ð˜SÓ$ØoØ Ð˜Ó ØEð 	×Ò¨$¨s°C¨x©.Ñ9ð	 ð ó :ð
 3à€Dˆ.Óðð <@÷  ð
 ó-
ó ð-
ô^ð ó6ó ð6ð óXó ðXô#òJGô÷hr'   c                  ót   • \ rS rSrSr\S 5       rSS jrSS jr\	SSS.             SS	 jj5       r
S
rg)r   i  zåLLM usage associated with a single request.

This is an implementation of `genai_prices.types.AbstractUsage` so it can be used to calculate the price of the
request using [genai-prices](https://github.com/pydantic/genai-prices).
c                ó   • g)Nr   r1   rŸ   s    r%   r   ÚRequestUsage.requests  s   € àr'   c                ó0   • [        X5        [        X5        g©zPIncrement the usage in place.

Args:
    incr_usage: The usage to increment by.
N)Ú_incr_usage_tokensÚ_incr_usage_cost©r,   Ú
incr_usages     r%   ÚincrÚRequestUsage.incr  s   € ô 	˜4Ô,Ü˜Õ*r'   c                ó>   • [        U 5      nUR                  U5        U$ )zåAdd two RequestUsages together.

This is provided so it's trivial to sum usage information from multiple parts of a response.

**WARNING:** this CANNOT be used to sum multiple requests without breaking some pricing calculations.
©r   r×   ©r,   ÚotherÚ	new_usages      r%   Ú__add__ÚRequestUsage.__add__&  s   € ô ˜“Jˆ	Ø�‰�uÔØÐr'   ÚdefaultN)Ú
api_flavorrg   c               óL  • U=(       d    0 n[        X2US9 Ho  u  px [        5       R                  SXx5      n	U	R                  XS9u  p«U " S0 UR                  R                  5        VVs0 s H  u  pÍUc  M
  XÍ_M     snnDSU0D6s  $    U " US9$ s  snnf ! [         a     MŒ  f = f)an  Extract usage information from the response data using genai-prices.

Args:
    data: The response data from the model API.
    provider: The actual provider ID
    provider_url: The provider base_url
    provider_fallback: The fallback provider ID to use if the actual provider is not found in genai-prices.
        For example, an OpenAI model should set this to "openai" in case it has an obscure provider ID.
    api_flavor: The API flavor to use when extracting usage information,
        e.g. 'chat' or 'responses' for OpenAI.
    details: Becomes the `details` field on the returned `RequestUsage` for convenience.
)Úprovider_api_urlÚprovider_idÚprovider_fallbackN)rá   rg   rj   r1   )r   r   Úfind_providerÚextract_usagerK   rL   Ú	Exception)r’   ÚdataÚproviderÚprovider_urlrå   rá   rg   rä   rã   Úprovider_objÚ
_model_refÚextracted_usagern   ro   s                 r%   ÚextractÚRequestUsage.extract1  s¶   € ð. —-˜RˆÜ-EØ)ÐSdô.
Ñ)ˆKðÜ+›~×;Ñ;¸DÀ+Ó`�Ø.:×.HÑ.HÈÐ.HÐ.eÑ+�
ÙÑs¨×/GÑ/G×/MÑ/MÔ/OÔaÒ/O¡t qÐST›d˜ašdÑ/OÒaÑsÐkrÒsÒsñ.
ñ ˜7Ñ#Ð#ùó bøÜó Úðús*   œABÁ(	BÁ5BÁ;	BÂBÂ
B#Â"B#r1   )rÖ   r   r4   ÚNone)rÜ   r   r4   r   )ré   r	   rê   rJ   rë   rJ   rå   rJ   rá   rJ   rg   zdict[str, Any] | Noner4   r   )r5   r6   r7   r8   Ú__doc__rÍ   r   r×   rÞ   rÌ   rï   r9   r1   r'   r%   r   r     s…   † ñð ñó ðô+ô	ð ð $Ø)-ñ $àð $ð ð	 $ð
 ð $ð ð $ð ð $ð 'ð $ð 
ô $ó ó $r'   r   c                  óî   • \ rS rSr% SrSrS\S'    SrS\S'    SrS\S'    Sr	S\S'    Sr
S\S	'    SrS\S
'    SrS\S'    SrS\S'    \R                  " \\\4   S9rS\S'    SS jrSS jrSS jrSrg)r   iU  z¦LLM usage associated with an agent run.

Responsibility for calculating request usage is on the model; Pydantic AI simply sums the usage information across requests.
r   r_   r   Ú
tool_callsr   r`   ra   rb   rc   r   re   rÇ   rg   c                óÖ   • [        U[        5      (       a>  U =R                  UR                  -  sl        U =R                  UR                  -  sl        [	        X5        [        X5        grÒ   )rH   r   r   rô   rÓ   rÔ   rÕ   s     r%   r×   ÚRunUsage.incrw  sI   € ô �j¤(×+Ñ+Ø�MŠM˜Z×0Ñ0Ñ0�MØ�OŠO˜z×4Ñ4Ñ4�OÜ˜4Ô,Ü˜Õ*r'   c                ó>   • [        U 5      nUR                  U5        U$ )zkAdd two RunUsages together.

This is provided so it's trivial to sum usage information from multiple runs.
rÚ   rÛ   s      r%   rÞ   ÚRunUsage.__add__ƒ  s   € ô
 ˜“Jˆ	Ø�‰�uÔØÐr'   c                ó&  • U R                   UR                   -   Vs0 s H<  o"U R                   R                  US5      UR                   R                  US5      -
  _M>     nn[        U R                  UR                  -
  U R                  UR                  -
  U R
                  UR
                  -
  U R                  UR                  -
  U R                  UR                  -
  U R                  UR                  -
  U R                  UR                  -
  U R                  UR                  -
  U R                  UR                  -
  UU R                  b>  U R                  UR                  :w  a$  U R                  UR                  =(       d    S-
  S9$ SS9$ s  snf )a8  Return the field-by-field usage accumulated since `other`.

This is useful when a nested operation shares a run's mutable usage object and needs to
report only the requests, tool calls, tokens, details, and cost added by that operation.
Unknown costs remain `None`; an unchanged known cost also produces `None`.
r   N)r   rô   r   r`   ra   r   rb   rc   rd   rg   ri   )rg   rz   r   r   rô   r   r`   ra   r   rb   rc   rd   ri   )r,   rÜ   rt   rg   s       r%   Ú__sub__ÚRunUsage.__sub__Œ  sd  € ð VZ×UaÑUaÐdi×dqÑdqÒUqó
ÚUqÈT�$—,‘,×"Ñ" 4¨Ó+¨e¯m©m×.?Ñ.?ÀÀaÓ.HÑHÒHÑUqð 	ð 
ô Ø—]‘] U§^¡^Ñ3Ø—‘¨×)9Ñ)9Ñ9Ø×*Ñ*¨U×-?Ñ-?Ñ?Ø#×6Ñ6¸×9QÑ9QÑQØ"×4Ñ4°u×7NÑ7NÑNØ×,Ñ,¨u×/BÑ/BÑBØ#×6Ñ6¸×9QÑ9QÑQØ$(×$@Ñ$@À5×C`ÑC`Ñ$`Ø $× 8Ñ 8¸5×;TÑ;TÑ TØØ26·)±)Ñ2GÈDÏIÉIÐY^×YcÑYcÓLc�—‘˜eŸj™jŸo¨AÑ.ñ
ð 	
ð jnñ
ð 	
ùò
s   œAFr1   N)rÖ   úRunUsage | RequestUsager4   rñ   )rÜ   rü   r4   r   )rÜ   r   r4   r   )r5   r6   r7   r8   rò   r   rË   rô   r   r`   ra   rb   rc   r   r‹   rv   rI   rJ   r_   rg   r×   rÞ   rú   r9   r1   r'   r%   r   r   U  s¤   ‡ ñð
 €HˆcÓØ1à€J�ÓØBà€L�#ÓØ.àÐ˜ÓØ6àÐ�sÓØ5àÐ˜ÓØ-à#$Ð˜SÓ$Ø;à€M�3ÓØ3à)×/Ò/ÀÀSÈ#ÀXÁÑO€Gˆ^ÓOØ2ô
+ô÷
r'   r   c                ón   • UR                   b(  U R                   =(       d    SUR                   -   U l         g g )Nr   )ri   )ÚslfrÖ   s     r%   rÔ   rÔ   ¥  s)   € Ø‡�Ñ"Ø—H‘H—M  Z§_¡_Ñ4ˆ�ð #r'   c                ó  • U R                   R                  5       UR                   R                  5       -  1 Sk-
   Hc  n[        XS5      n[        XS5      n[        U[        [
        45      (       d  M8  [        U[        [
        45      (       d  MU  [        XX4-   5        Me     UR                  R                  5        HN  u  pV[        U[        [
        45      (       d  M"  U R                  R                  US5      U-   U R                  U'   MP     g)zqIncrement the usage in place.

Args:
    slf: The usage to increment.
    incr_usage: The usage to increment by.
>   ri   rg   r   rô   r   N)
rK   rº   r·   rH   r_   rÆ   rl   rg   rL   rz   )rþ   rÖ   rn   Ú	slf_valueÚ
incr_valuerV   rO   s          r%   rÓ   rÓ   ª  sÍ   € ð �l‰l×ÑÓ! J×$7Ñ$7×$<Ñ$<Ó$>Ñ>ÒBoÔoˆÜ˜C AÓ&ˆ	Ü˜Z¨AÓ.ˆ
Ü�i¤#¤u ×.Ó.´:¸jÌ3ÔPUÈ,×3WÓ3WÜ�C˜IÑ2Ö3ñ	 pð !×(Ñ(×.Ñ.Ö0‰
ˆä�eœc¤5˜\×*Ó*Ø"Ÿ{™{Ÿ™¨s°AÓ6¸Ñ>ˆC�K‰K˜Óò 1r'   T)rZ   Úkw_onlyc                  ó   • \ rS rSr% SrSrS\S'    SrS\S'    SrS\S	'    Sr	S\S
'    Sr
S\S'    SrS\S'    SrS\S'    SrS\S'    SS jrSS jrSS.SS jjrSS jrSS jrSS jrSS jr\R,                  rSrg) r   i½  a5  Limits on model usage.

The request count is tracked by pydantic_ai, and the request limit is checked before each request to the model.
Token counts are provided in responses from the model, and the token limits are checked after each response.

Each of the limits can be set to `None` to disable that limit.
Nrh   Ú
cost_limité2   z
int | NoneÚrequest_limitÚtool_calls_limitÚinput_tokens_limitÚoutput_tokens_limitÚtotal_tokens_limitÚper_request_input_tokens_limitFrÈ   Úcount_tokens_before_requestc                ó~   • [        S U R                  U R                  U R                  U R                  4 5       5      $ )a~  Returns `True` if this instance places any limits on token counts.

If this returns `False`, the `check_tokens` and `check_per_request_input_tokens` methods will never raise an error.

This is useful because if we have token limits, we need to check them after receiving each streamed message.
If there are no limits, we can skip that processing in the streaming response iterator.
c              3  ó*   #   • U  H	  nUS Lv •  M     g 7fr"   r1   )ru   Úlimits     r%   rw   Ú/UsageLimits.has_token_limits.<locals>.<genexpr>þ  s    é € ð 
ò�ð ˜Õòùs   ‚)rÂ   r  r	  r
  r  rŸ   s    r%   Úhas_token_limitsÚUsageLimits.has_token_limitsö  sF   € ô ñ 
ð ×'Ñ'Ø×(Ñ(Ø×'Ñ'Ø×3Ñ3ñ	ó
ó 
ð 	
r'   c                ó  • U R                   nUb  UR                  U:¼  a  [        SU 35      eUR                  nU R                  b,  X0R                  :”  a  [        SU R                   SU< S35      eUR
                  nU R                  b,  X@R                  :”  a  [        SU R                   SU< S35      eUR                  nUb;  U R                  b-  XPR                  :”  a  [        SU R                   S	U< S35      eggg)
z[Raises a `UsageLimitExceeded` exception if the next request would exceed any of the limits.Nz3The next request would exceed the request_limit of z8The next request would exceed the input_tokens_limit of ú (input_tokens=r®   z8The next request would exceed the total_tokens_limit of ú (total_tokens=z2The next request would exceed the `cost_limit` of z	 (`cost`=)	r  r   r   r   r  r   r
  ri   r  )r,   Úusager  r   r   ri   s         r%   Úcheck_before_requestÚ UsageLimits.check_before_request  s%  € à×*Ñ*ˆØÑ$¨¯©¸=Ó)HÜ$Ð'ZÐ[hÐZiÐ%jÓkÐkà×)Ñ)ˆØ×"Ñ"Ñ.°<×BYÑBYÓ3YÜ$ØJÈ4×KbÑKbÐJcÐcsÐfrÑetÐtuÐvóð ð ×)Ñ)ˆØ×"Ñ"Ñ.°<×BYÑBYÓ3YÜ$ØJÈ4×KbÑKbÐJcÐcsÐfrÑetÐtuÐvóð ð �z‰zˆØÑ §¡Ñ ;ÀÇÁÓ@VÜ$ØDÀTÇ_Á_ÐDUÐU^Ð_cÑ^fÐfgÐhóð ð AWÐ ;Ðr'   T)Úwarn_if_cost_unavailablec               óî   • U(       a  U R                  U5        UR                  bP  U R                  bB  UR                  U R                  :”  a'  [        SU R                   SUR                  < S35      eggg)zÇCheck whether usage exceeds the cost limit.

Args:
    usage: The accumulated run usage to check.
    warn_if_cost_unavailable: Whether to warn when a `cost_limit` is set but no cost was calculated.
NzExceeded the `cost_limit` of z (`usage.cost`=r®   )Ú_warn_if_cost_unavailableri   r  r   )r,   r  r  s      r%   Ú
check_costÚUsageLimits.check_cost   sq   € ö $Ø×*Ñ*¨5Ô1Ø�:‰:Ñ! d§o¡oÑ&AÀeÇjÁjÐSW×SbÑSbÓFbÜ$Ð'DÀTÇ_Á_ÐDUÐUdÐej×eoÑeoÑdrÐrsÐ%tÓuÐuð GcÐ&AÐ!r'   c                óz   • U R                   b.  UR                  c   [        R                  " [	        S5      5        g g g )Na  A `cost_limit` is set but cannot be enforced because no cost was calculated for this run. This usually means there is no pricing data for the model or provider in use. If the model is newer than your install, `pydantic_ai.prices.update_in_background()` can download current prices.)r  ri   ÚwarningsÚwarnr   )r,   r  s     r%   r  Ú%UsageLimits._warn_if_cost_unavailable,  s7   € Ø�?‰?Ñ&¨5¯:©:Ñ+=Ü�MŠMÜ#ðróõð ,>Ð&r'   c                ó¤  • UR                   nU R                  b,  X R                  :”  a  [        SU R                   SU< S35      eUR                  nU R                  b,  X0R                  :”  a  [        SU R                   SU< S35      eUR
                  nU R                  b-  X@R                  :”  a  [        SU R                   SU< S35      egg)	zURaises a `UsageLimitExceeded` exception if the usage exceeds any of the token limits.Nz#Exceeded the input_tokens_limit of r  r®   z$Exceeded the output_tokens_limit of z (output_tokens=z#Exceeded the total_tokens_limit of r  )r   r  r   r   r	  r   r
  )r,   r  r   r   r   s        r%   Úcheck_tokensÚUsageLimits.check_tokens6  sé   € à×)Ñ)ˆØ×"Ñ"Ñ.°<×BYÑBYÓ3YÜ$Ð'JÈ4×KbÑKbÐJcÐcsÐfrÑetÐtuÐ%vÓwÐwà×+Ñ+ˆØ×#Ñ#Ñ/°M×D\ÑD\Ó4\Ü$Ø6°t×7OÑ7OÐ6PÐPaÐS`ÑRbÐbcÐdóð ð ×)Ñ)ˆØ×"Ñ"Ñ.°<×BYÑBYÓ3YÜ$Ð'JÈ4×KbÑKbÐJcÐcsÐfrÑetÐtuÐ%vÓwÐwð 4ZÐ.r'   c                ól   • U R                   nUR                  nUb  X2:”  a  [        SU SU< S35      egg)zbRaises a `UsageLimitExceeded` exception if the next tool call(s) would exceed the tool call limit.Nz;The next tool call(s) would exceed the tool_calls_limit of z (tool_calls=z).)r  rô   r   )r,   Úprojected_usager  rô   s       r%   Úcheck_before_tool_callÚ"UsageLimits.check_before_tool_callF  sR   € à×0Ñ0ÐØ$×/Ñ/ˆ
ØÑ'¨JÓ,IÜ$ØMÐN^ÐM_Ð_mÐblÑanÐnpÐqóð ð -JÐ'r'   c                óT   • U R                   nUb  X:”  a  [        SU SU< S35      egg)uß   Raises a `UsageLimitExceeded` if the per-request input tokens exceed the limit.

This checks a single request's input token count â€” not the cumulative
`RunUsage.input_tokens` â€” against `per_request_input_tokens_limit`.
Nz/Exceeded the per_request_input_tokens_limit of z (request_input_tokens=r®   )r  r   )r,   Úrequest_input_tokensr  s      r%   Úcheck_per_request_input_tokensÚ*UsageLimits.check_per_request_input_tokensO  sF   € ð ×3Ñ3ˆØÑÐ!5Ó!=Ü$ØAÀ%ÀÐH`ÐK_ÑJaÐabÐcóð ð ">Ðr'   r1   rÉ   )r  r   r4   rñ   )r  r   r  rÈ   r4   rñ   )r&  r   r4   rñ   )r*  r_   r4   rñ   )r5   r6   r7   r8   rò   r  rË   r  r  r  r	  r
  r  r  r  r  r  r  r#  r'  r+  r   Údataclasses_no_defaults_reprr³   r9   r1   r'   r%   r   r   ½  s¶   ‡ ñð "&€J�Ó%Ø*Ø "€M�:Ó"Ø>Ø#'Ð�jÓ'ØMØ%)Ð˜
Ó)Ø<Ø&*Ð˜Ó*Ø?Ø%)Ð˜
Ó)ØRØ15Ð" JÓ5ðð& ).Ð Ó-ðô
ô$ð0 OS÷ 
vôôxô ô
ð ×2Ñ2ƒHr'   r   )r$   r3   r4   r   )rO   r:   rP   rˆ   rQ   r‰   rR   zfrozenset[str]rS   r   r4   zdict[str, Any])rþ   rü   rÖ   rü   r4   rñ   )0Ú
__future__r   Ú_annotationsr‹   r  r   r   Údecimalr   Ú	functoolsr   Útypingr   r	   r
   Úgenai_prices.data_snapshotr   Úpydanticr   r   r   r   r   Úpydantic_corer   r   Ú r   Ú_genai_pricesr   Ú	_warningsr   Ú
exceptionsr   Ú__all__rŠ   r¥   rŽ   r{   r&   r)   rY   r:   r   r   rÔ   rÓ   r   r1   r'   r%   Ú<module>r;     sl  ðÝ 2ã Û Ý Ý !Ý Ý ß 'Ñ 'å 3ß \Õ \ß 7å Ý 3Ý *Ý *à
3€á!*¨N¸OÐ+LÓ!MÐ ðnñ Ò`ÓaÐ Ø kàbÐ ð ó.ó ð.÷(ñ (ð
#Øð#à4ð#ð (ð#ð
 #ð#ð 'ð#ð ô#ñL �˜E eÑ,÷zhð zhó -ðzhñz �˜E eÑ,ô@$�9ó @$ó -ð@$ñF �˜E eÑ,ôL
ˆyó L
ó -ðL
ô^5ô
?ñ& �˜tÑ$÷]3ð ]3ó %ñ]3r'   