ó
    °"³j  ã                  óÆ   • S SK Jr  S SKJrJrJr  S SKJrJr  Sr	Sr
SS jrSS jrSS jr        SS	 jrSS
 jrSS jrSS jrSS jr      SS jrSS jrSS jrg)é    )Úannotations)Ú
CollectionÚIterableÚSequence)ÚUnitDefÚUnitRegistryÚcompletion_tokensÚoutput_reasoning_tokensc                ó¬   • U  Vs1 s H  n[        X!5      b  M  UiM     nnU(       a(  SR                  [        U5      5      n[        SU 35      eg s  snf ©Nú, zUnknown price key: )Ú_unit_for_price_keyÚjoinÚsortedÚ
ValueError)Ú
price_keysÚregistryÚ	price_keyÚunknown_price_keysÚbad_keyss        ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/genai_prices/validation.pyÚvalidate_price_keysr      sU   € Ù5?Ót²Z¨	ÔCVÐW`ÓCkŸ)±ZÐÐtÞØ—9‘9œVÐ$6Ó7Ó8ˆÜÐ.¨x¨jÐ9Ó:Ð:ð ùò us
   …A™Ac                ó´   • [        U 5       HI  nUR                  U5      U -
  nU(       d  M   SR                  [        U5      5      n[        SU SU 35      e   g )Nr   zMissing ancestor price for ú: )r   Úancestor_usage_keysr   r   )Úpriced_usage_keysr   Ú	usage_keyÚmissing_ancestorsr   s        r   Úvalidate_ancestor_coverager      s\   € ÜÐ-Ö.ˆ	Ø$×8Ñ8¸ÓCÐFWÑWÐßÐØ—y‘y¤Ð(9Ó!:Ó;ˆHÜÐ:¸9¸+ÀRÈÀzÐRÓSÐSò	 /ó    c                ó2   • [        X5      n[        X U5        g ©N)Ú_priced_unitsÚ_validate_join_coverage_units)r   r   Úpriced_unitss      r   Úvalidate_join_coverager&      s   € Ü Ð!2Ó=€Lä! ,À8ÕLr    c           
     ó„  • [        U S S9n[        U5       H¦  u  pEX4S-   S   H–  nUR                  U5      (       d  M  UR                  XV5      nUc%  [	        SUR
                   SUR
                   35      eUR
                  U;  d  Mf  [	        SUR
                   SUR
                   SUR
                   35      e   M¨     g )Nc                ó   • U R                   $ r"   )r   )Úunits    r   Ú<lambda>Ú/_validate_join_coverage_units.<locals>.<lambda>#   s   € ÀÇÂr    )Úkeyé   z.Missing registered join unit for priced units z and zMissing join price for r   )r   Ú	enumerateÚis_compatible_withÚ	find_joinr   r   )r%   r   r   Úordered_priced_unitsÚindexÚ
first_unitÚsecond_unitr   s           r   r$   r$       s×   € ô " ,Ñ4OÑPÐä&Ð';Ö<ÑˆØ/¸±	°Ó<ˆKØ×0Ñ0°×=Ñ=Ùà×%Ñ% jÓ>ˆDØ‰|Ü ØDÀZ×EYÑEYÐDZÐZ_Ð`k×`uÑ`uÐ_vÐwóð ð �~‰~Ð%6Õ6Ü Ø-¨j×.BÑ.BÐ-CÀ5È×I^ÑI^ÐH_Ð_aÐbf×bpÑbpÐaqÐróð ó =ò =r    c                ó\   • [        U 5       Vs/ s H  o!R                  U   PM     sn$ s  snf r"   )r   Úunits)r   r   r   s      r   r#   r#   6   s)   € Ü7=Ð>OÔ7PÓQÒ7P¨)�N‰N˜9Ô%Ñ7PÑQÐQùÒQs   Ž)c                ó  • / n[        5       nU  H5  n[        XA5      nUc  UR                  U5        M$  UR                  U5        M7     U(       a(  SR	                  [        U5      5      n[        SU 35      e[        X!5        g r   )Úsetr   ÚaddÚappendr   r   r   Úvalidate_priced_units)r   r   r%   r   r   r)   r   s          r   Úvalidate_model_pricer<   :   sx   € Ø"$€LÜ#&£5ÐÛˆ	Ü" 9Ó7ˆØ‰<Ø×"Ñ" 9Ö-à×Ñ Ö%ñ  ö Ø—9‘9œVÐ$6Ó7Ó8ˆÜÐ.¨x¨jÐ9Ó:Ð:ä˜,Õ1r    c                ór   • U  Vs1 s H  o"R                   iM     nn[        X15        [        XU5        gs  snf )zFValidate ancestor and join coverage for already-resolved priced units.N)r   r   r$   )r%   r   r)   r   s       r   r;   r;   K   s2   € á4@ÓA²L¨DŸœ±LÐÐAäÐ0Ô;Ü! ,À8ÕLùò Bs   …4c                ój   • X-
  nU(       a(  SR                  [        U5      5      n[        SU 35      eg )Nr   zInvalid extractor destination: )r   r   r   )Ú	dest_keysÚreported_usage_keysÚinvalid_destinationsr   s       r   Úvalidate_extractor_destinationsrB   S   s:   € Ø$Ñ:ÐÞØ—9‘9œVÐ$8Ó9Ó:ˆÜÐ:¸8¸*ÐEÓFÐFð r    c                ó|   • [         U;   a  g[        S U  5       5      (       a  [        S[          S[         S35      eg)ay  Require an extractor that reads top-level `completion_tokens` to also map reasoning tokens.

OpenAI-compatible chat responses count reasoning tokens inside `completion_tokens` and report the
breakdown under `completion_tokens_details.reasoning_tokens`. An unmapped response field is dropped
without a warning, so an extractor missing that mapping silently loses the breakdown.
Nc              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr"   )Ú_reads_completion_tokens)Ú.0Úsource_paths     r   Ú	<genexpr>Ú8validate_extractor_reasoning_coverage.<locals>.<genexpr>f   s   é € Ð
QÂL°[Ô# K×0Ð0ÂLùs   ‚zMissing z mapping: extractors reading z must also map reasoning tokens)Ú_OUTPUT_REASONING_TOKENSÚanyr   Ú_COMPLETION_TOKENS)Úsource_pathsr?   s     r   Ú%validate_extractor_reasoning_coveragerN   Z   sP   € ô   9Ó,Øä
Ñ
QÁLÓ
Q×QÑQÜØÔ/Ð0ð 1"Ü"4Ð!5Ð5TðVó
ð 	
ð Rr    c                ó€   • [        U [        5      (       a	  U [        :H  $ [        U 5      S:H  =(       a    U S   [        :H  $ )Nr-   r   )Ú
isinstanceÚstrrL   Úlen)rG   s    r   rE   rE   m   s:   € Ü�+œs×#Ñ#ØÔ0Ñ0Ð0Üˆ{Ó˜qÑ ×I [°¡^Ô7IÑ%IÐIr    c                óF   •  UR                  U 5      $ ! [         a     g f = fr"   )Úunit_for_price_keyÚKeyError)r   r   s     r   r   r   s   s*   € ðØ×*Ñ*¨9Ó5Ð5øÜó Ùðús   ‚ “
 Ÿ N)r   úset[str]r   r   ÚreturnÚNone)r   rV   r   r   rW   rX   )r%   úCollection[UnitDef]r   rV   r   r   rW   rX   )r   rV   r   r   rW   zlist[UnitDef])r%   rY   r   r   rW   rX   )r?   rV   r@   zset[str] | frozenset[str]rW   rX   )rM   z Iterable[str | Sequence[object]]r?   zCollection[str]rW   rX   )rG   zstr | Sequence[object]rW   Úbool)r   rQ   r   r   rW   zUnitDef | None)Ú
__future__r   Úcollections.abcr   r   r   Úgenai_prices.unitsr   r   rL   rJ   r   r   r&   r$   r#   r<   r;   rB   rN   rE   r   © r    r   Ú<module>r_      s’   ðÝ "ç :Ñ :ç 4à(Ð Ø4Ð ô;ôTôMðØ%ðØ:BðØNZðà	ôô,Rô2ô"MôGð
Ø2ð
Ø?Nð
à	ô
ô&Jõr    