o
    i                     @  s   U d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZ d dlmZ ddlmZ d	Zdad
ed< dddZedddZdddZeG dd dZdddZdS )     )annotationsN)	dataclassfield)datetime	timedeltatimezone)cache)Any   )types)DataSnapshotset_custom_snapshotDataSnapshot | None_custom_snapshotreturnr   c                   C  s   t d urt S t S N)r   _bundled_snapshot r   r   `/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/genai_prices/data_snapshot.pyget_snapshot   s   r   c                  C  s   ddl m}  t| ddS )Nr
   	providersF)r   from_auto_update)datar   r   r   r   r   r   r      s   r   snapshotc                 C  s   | a d S r   )r   )r   r   r   r   r      s   r   c                   @  s   e Zd ZU ded< ded< edd dZded	< eejdZd
ed< d.ddZ	d/ddZ
			d0d1d$d%Zd2d)d*Zd3d,d-ZdS )4r   list[types.Provider]r   boolr   c                   C  s   i S r   r   r   r   r   r   <lambda>(   s    zDataSnapshot.<lambda>)default_factoryzPdict[tuple[str | None, str | None, str], tuple[types.Provider, types.ModelInfo]]_lookup_cacher   	timestampttlr   r   c                 C  s   | j | t kS )zPCheck if the snapshot is "active" (e.g. hasn't expired) based on a time to live.)r    r   now)selfr!   r   r   r   active,   s   zDataSnapshot.activeusagetypes.AbstractUsage	model_refstrprovider_id
str | Noneprovider_api_urlgenai_request_timestampdatetime | Nonetypes.PriceCalculationc                 C  sH   |pt jtjd}| |d||\}}|j|||| jr | jdS ddS )z(Calculate the price for the given usage.)tzN)r,   auto_update_timestamp)r   r"   r   utcfind_provider_model
calc_pricer   r    )r#   r%   r'   r)   r+   r,   providermodelr   r   r   calc0   s   	
zDataSnapshot.calcNdefaultresponse_datar	   types.ProviderID | str | None
api_flavortypes.ExtractedUsagec           
      C  s`   |  d ||}|j||d\}}|d ur| ||d d \}}	nd }	t||	|| jr-| jS d S )N)r:   )find_providerextract_usager2   r   ExtractedUsager   r    )
r#   r8   r)   r+   r:   r4   r'   r%   _r5   r   r   r   r=   C   s   zDataSnapshot.extract_usager4   types.Provider | None&tuple[types.Provider, types.ModelInfo]c                 C  s   |  }|r| j|jd|f }r|S n| j|||f }r"|S | |||}|| }r>||f | j|||f< }|S td|d|j )z[Find the provider and model for the given model reference and optional provider identifier.Nz$Unable to find model with model_ref=z in )lowerr   getidr<   
find_modelLookupError)r#   r'   r4   r)   r+   provider_modelr5   retr   r   r   r2   R   s   z DataSnapshot.find_provider_modeltypes.Providerc                 C  s   |d urt | j| }r|S td||d ur1| jD ]}t|j|r)|  S qtd||rH| jD ]}|jd urG|j|rG|  S q6td|)Nz$Unable to find provider provider_id=z)Unable to find provider provider_api_url=z,Unable to find provider with model matching )find_provider_by_idr   rF   rematchapi_patternmodel_matchis_match)r#   r'   r)   r+   r4   r   r   r   r<   j   s    

zDataSnapshot.find_provider)r!   r   r   r   )r%   r&   r'   r(   r)   r*   r+   r*   r,   r-   r   r.   )NNr7   )
r8   r	   r)   r9   r+   r*   r:   r(   r   r;   )
r'   r(   r4   r@   r)   r*   r+   r*   r   rA   )r'   r*   r)   r*   r+   r*   r   rI   )__name__
__module____qualname____annotations__r   r   r   r"   r    r$   r6   r=   r2   r<   r   r   r   r   r   #   s   
 


r   r   r)   r(   r@   c                 C  sP   |   }| D ]}|j|kr|  S q| D ]}|jr%|j|r%|  S qdS )zFind a provider by matching against provider_match logic.

    Args:
        providers: List of available providers
        provider_id: The provider ID to match

    Returns:
        The matching provider or None
    N)rB   striprD   provider_matchrO   )r   r)   normalized_provider_idr4   r   r   r   rJ      s   

rJ   )r   r   )r   r   )r   r   r)   r(   r   r@   )
__future__r   _annotationsrK   dataclassesr   r   r   r   r   	functoolsr   typingr	    r   __all__r   rS   r   r   r   r   rJ   r   r   r   r   <module>   s     

_