
    AHj                    P    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      Z
y)z)Database access helpers for Focus export.    )annotations)datetime)AnyDictOptionalNc                  >    e Zd ZdZd Zdddd	 	 	 	 	 	 	 ddZddZy)	FocusLiteLLMDatabasez8Retrieves LiteLLM usage data for Focus export workflows.c                ,    ddl m} |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)litellm.proxy.proxy_serverr   RuntimeError)selfr   s     [/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/focus/database.py_ensure_prisma_clientz*FocusLiteLLMDatabase._ensure_prisma_client   s&    < Y      N)limitstart_time_utcend_time_utcc                 K   | j                         }g }g }d}|r+|j                  d| d       |j                  |       |dz  }|r+|j                  d| d       |j                  |       |dz  }d}|rddj                  |      z   }d}	|2	 t        |      }
|
d
k  rt        d      d| }	|j                  |
       d| d|	 d}	  |j                  j                  |g|  d{   }t        j                  |d      S # t        t
        f$ r}t        d	      |d}~ww xY w7 ># t        $ r}t        d|       |d}~ww xY 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	
        )infer_schema_lengthzError retrieving usage data: )r   appendjoinint	TypeError
ValueErrordb	query_rawpl	DataFrame	Exceptionr   )r   r   r   r   clientwhere_clausesquery_paramsplaceholder_indexwhere_clauselimit_clauselimit_valueexcquerydb_responses                 r   get_usage_dataz#FocusLiteLLMDatabase.get_usage_data   s     ++-#%"$  #67H6I!WX/"  #67H6I!WX-"#gll=&AALF!%j Q !=>>%&7%89L,	6 
 		 	;@	O 3		 3 3E IL IIK<<FFS z* F !;<#EFP J 	O!>seDE3N	Os`   BED /E D, +D*,D, ED'D""D''E*D, ,	E	5EE		Ec                   K   | j                         }d}	 |j                  j                  |       d{   }|ddS 7 	# t        $ r}t	        d|       |d}~ww xY 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;
        NLiteLLM_DailyUserSpend)columns
table_namezError getting table info: )r   r   r   r"   r   )r   r#   
info_querycolumns_responser*   s        r   get_table_infoz#FocusLiteLLMDatabase.get_table_infoc   sq     ++-
	L%+YY%8%8%DD/?WXX  E 	L!;C5ABK	Ls5   A A  >A  A A   	A	AAA )r   zOptional[int]r   Optional[datetime]r   r5   returnzpl.DataFrame)r6   zDict[str, Any])__name__
__module____qualname____doc__r   r-   r4    r   r   r	   r	      sS    B  $-1+/IO IO +	IO
 )IO 
IOVLr   r	   )r:   
__future__r   r   typingr   r   r   polarsr    r	   r;   r   r   <module>r?      s%    / "  & & fL fLr   