o
    ưi6                     @   s>   d Z ddlmZ ddlmZmZmZ ddlZG dd dZdS )z4Database connection and data extraction for LiteLLM.    )datetime)AnyOptionalListNc                	   @   sH   e Zd ZdZdd Z			ddee dee dee dej	fd	d
Z
dS )LiteLLMDatabasez;Handle LiteLLM PostgreSQL database connections and queries.c                 C   s"   ddl m} 	 |d u rtd|S )Nr   )prisma_clientzDatabase not connected. Connect a database to your proxy - https://docs.litellm.ai/docs/simple_proxy#managing-auth---virtual-keys)Zlitellm.proxy.proxy_serverr   	Exception)selfr    r
   ^/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/cloudzero/database.py_ensure_prisma_client   s   z%LiteLLMDatabase._ensure_prisma_clientNlimitstart_time_utcend_time_utcreturnc           	   
      s   |   }d}||g}|dur*z	|t| W n ttfy%   tdw |d7 }z|jj|g|R  I dH }tj|ddW S  t	yT } z	t	dt
| d}~ww )z8Retrieve usage data from LiteLLM daily user spend table.aj  
        SELECT
            dus.id,
            dus.date,
            dus.user_id,
            dus.api_key,
            dus.model,
            dus.model_group,
            dus.custom_llm_provider,
            dus.prompt_tokens,
            dus.completion_tokens,
            dus.spend,
            dus.api_requests,
            dus.successful_requests,
            dus.failed_requests,
            dus.cache_creation_input_tokens,
            dus.cache_read_input_tokens,
            dus.created_at,
            dus.updated_at,
            vt.team_id,
            vt.key_alias as api_key_alias,
            tt.team_alias,
            ut.user_email as user_email
        FROM "LiteLLM_DailyUserSpend" dus
        LEFT JOIN "LiteLLM_VerificationToken" vt ON dus.api_key = vt.token
        LEFT JOIN "LiteLLM_TeamTable" tt ON vt.team_id = tt.team_id
        LEFT JOIN "LiteLLM_UserTable" ut ON dus.user_id = ut.user_id
        WHERE ($1::timestamptz IS NULL OR dus.updated_at >= $1::timestamptz)
          AND ($2::timestamptz IS NULL OR dus.updated_at <= $2::timestamptz)
        ORDER BY dus.date DESC, dus.created_at DESC
        Nzlimit must be an integerz	 LIMIT $3)Zinfer_schema_lengthzError retrieving usage data: )r   appendint	TypeError
ValueErrordbZ	query_rawpl	DataFramer   str)	r	   r   r   r   clientqueryparamsZdb_responseer
   r
   r   get_usage_data(   s(   !zLiteLLMDatabase.get_usage_data)NNN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r
   r
   r
   r   r      s    r   )	r!   r   typingr   r   r   Zpolarsr   r   r
   r
   r
   r   <module>   s
   