litellm/tests/local_testing/test_update_spend.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

114 lines
3.2 KiB
Python
Raw Normal View History

# What is this?
## This tests the batch update spend logic on the proxy server
2024-06-22 07:52:42 +08:00
import asyncio
import os
import random
import sys
import time
import traceback
2024-06-22 07:52:42 +08:00
from datetime import datetime
from dotenv import load_dotenv
from fastapi import Request
load_dotenv()
import os
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
2024-06-22 07:52:42 +08:00
import asyncio
import logging
import pytest
2024-06-22 07:52:42 +08:00
import litellm
from litellm import Router, mock_completion
2024-06-22 07:52:42 +08:00
from litellm._logging import verbose_proxy_logger
from litellm.caching.caching import DualCache
2024-06-22 07:52:42 +08:00
from litellm.proxy._types import UserAPIKeyAuth
from litellm.proxy.management_endpoints.internal_user_endpoints import (
new_user,
user_info,
2024-06-22 07:52:42 +08:00
user_update,
)
2024-06-16 05:13:32 +08:00
from litellm.proxy.management_endpoints.key_management_endpoints import (
delete_key_fn,
generate_key_fn,
generate_key_helper_fn,
2024-06-22 07:52:42 +08:00
info_key_fn,
update_key_fn,
)
from litellm.proxy.proxy_server import user_api_key_auth
from litellm.proxy.management_endpoints.customer_endpoints import block_user
2024-06-22 07:52:42 +08:00
from litellm.proxy.spend_tracking.spend_management_endpoints import (
spend_key_fn,
spend_user_fn,
view_spend_logs,
2024-06-16 05:13:32 +08:00
)
from litellm.proxy.utils import PrismaClient, ProxyLogging, hash_token, update_spend
verbose_proxy_logger.setLevel(level=logging.DEBUG)
2024-06-22 07:52:42 +08:00
from starlette.datastructures import URL
from litellm.caching.caching import DualCache
from litellm.proxy._types import (
2024-06-22 07:52:42 +08:00
BlockUsers,
DynamoDBArgs,
2024-06-22 07:52:42 +08:00
GenerateKeyRequest,
KeyRequest,
2024-06-22 07:52:42 +08:00
NewUserRequest,
UpdateKeyRequest,
2025-04-01 22:12:29 +08:00
SpendUpdateQueueItem,
Litellm_EntityType,
)
proxy_logging_obj = ProxyLogging(user_api_key_cache=DualCache())
@pytest.fixture
def prisma_client():
from litellm.proxy.proxy_cli import append_query_params
### add connection pool + pool timeout args
params = {"connection_limit": 100, "pool_timeout": 60}
database_url = os.getenv("DATABASE_URL")
modified_url = append_query_params(database_url, params)
os.environ["DATABASE_URL"] = modified_url
# Assuming PrismaClient is a class that needs to be instantiated
prisma_client = PrismaClient(
database_url=os.environ["DATABASE_URL"], proxy_logging_obj=proxy_logging_obj
)
# Reset litellm.proxy.proxy_server.prisma_client to None
litellm.proxy.proxy_server.litellm_proxy_budget_name = (
f"litellm-proxy-budget-{time.time()}"
)
litellm.proxy.proxy_server.user_custom_key_generate = None
return prisma_client
@pytest.mark.asyncio
@pytest.mark.skip(reason="Requires reliable external DB connection (prisma).")
async def test_batch_update_spend(prisma_client):
2025-04-01 22:12:29 +08:00
await proxy_logging_obj.db_spend_update_writer.spend_update_queue.add_update(
SpendUpdateQueueItem(
entity_type=Litellm_EntityType.USER,
entity_id="test-litellm-user-5",
response_cost=23,
)
)
setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client)
setattr(litellm.proxy.proxy_server, "master_key", "sk-1234")
await litellm.proxy.proxy_server.prisma_client.connect()
await update_spend(
prisma_client=litellm.proxy.proxy_server.prisma_client,
db_writer_client=None,
proxy_logging_obj=proxy_logging_obj,
)