o
    ưi                     @  sJ   d Z ddlm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 )z)Database access helpers for Focus export.    )annotations)datetime)AnyDictOptionalNc                   @  s6   e Zd ZdZdd ZdddddddZdddZdS )FocusLiteLLMDatabasez8Retrieves LiteLLM usage data for Focus export workflows.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   RuntimeError)selfr    r   Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/focus/database.py_ensure_prisma_client   s   z*FocusLiteLLMDatabase._ensure_prisma_clientN)limitstart_time_utcend_time_utcr   Optional[int]r   Optional[datetime]r   returnpl.DataFramec             
     sF  |   }g }g }d}|r|d| d || |d7 }|r3|d| d || |d7 }d}|r>dd| }d}	|durpzt|}
W n ttfy] } ztd	|d}~ww |
d
k rftdd| }	||
 d| d|	 d}z|jj|g|R  I dH }tj	|ddW S  t
y } ztd| |d}~ww )z+Return usage data for the requested window.   zdus.updated_at >= $z::timestamptzzdus.updated_at <= $ zWHERE z AND Nzlimit must be an integerr   zlimit must be non-negativez LIMIT $a  
        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
        z=
        ORDER BY dus.date DESC, dus.created_at DESC
        z	
        )Zinfer_schema_lengthzError retrieving usage data: )r   appendjoinint	TypeError
ValueErrordb	query_rawplZ	DataFrame	Exceptionr	   )r
   r   r   r   clientZwhere_clausesZquery_paramsZplaceholder_indexZwhere_clauseZlimit_clauseZlimit_valueexcqueryZdb_responser   r   r   get_usage_data   sP   




 z#FocusLiteLLMDatabase.get_usage_dataDict[str, Any]c              
     sV   |   }d}z|j|I dH }|ddW S  ty* } ztd| |d}~ww )z6Return metadata about the spend table for diagnostics.z
        SELECT column_name, data_type, is_nullable
        FROM information_schema.columns
        WHERE table_name = 'LiteLLM_DailyUserSpend'
        ORDER BY ordinal_position;
        NZLiteLLM_DailyUserSpend)columnsZ
table_namezError getting table info: )r   r   r   r   r	   )r
   r    Z
info_queryZcolumns_responser!   r   r   r   get_table_infoc   s   z#FocusLiteLLMDatabase.get_table_info)r   r   r   r   r   r   r   r   )r   r$   )__name__
__module____qualname____doc__r   r#   r&   r   r   r   r   r      s    Kr   )r*   
__future__r   r   typingr   r   r   Zpolarsr   r   r   r   r   r   <module>   s    