forked from phoenix/litellm-mirror
fix(proxy/utils.py): fix resetting budget logic
This commit is contained in:
parent
be2f759881
commit
37ad5efc61
4 changed files with 28 additions and 9 deletions
|
@ -3464,7 +3464,7 @@ async def update_key_fn(request: Request, data: UpdateKeyRequest):
|
||||||
response = await prisma_client.update_data(
|
response = await prisma_client.update_data(
|
||||||
token=key, data={**non_default_values, "token": key}
|
token=key, data={**non_default_values, "token": key}
|
||||||
)
|
)
|
||||||
return {"key": key, **non_default_values}
|
return {"key": key, **response["data"]}
|
||||||
# update based on remaining passed in values
|
# update based on remaining passed in values
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if isinstance(e, HTTPException):
|
if isinstance(e, HTTPException):
|
||||||
|
|
|
@ -1140,7 +1140,13 @@ class PrismaClient:
|
||||||
+ f"DB Token Table update succeeded {response}"
|
+ f"DB Token Table update succeeded {response}"
|
||||||
+ "\033[0m"
|
+ "\033[0m"
|
||||||
)
|
)
|
||||||
return {"token": token, "data": db_data}
|
_data: dict = {}
|
||||||
|
if response is not None:
|
||||||
|
try:
|
||||||
|
_data = response.model_dump()
|
||||||
|
except:
|
||||||
|
_data = response.dict()
|
||||||
|
return {"token": token, "data": _data}
|
||||||
elif (
|
elif (
|
||||||
user_id is not None
|
user_id is not None
|
||||||
or (table_name is not None and table_name == "user")
|
or (table_name is not None and table_name == "user")
|
||||||
|
@ -1228,9 +1234,11 @@ class PrismaClient:
|
||||||
if t.token.startswith("sk-"): # type: ignore
|
if t.token.startswith("sk-"): # type: ignore
|
||||||
t.token = self.hash_token(token=t.token) # type: ignore
|
t.token = self.hash_token(token=t.token) # type: ignore
|
||||||
try:
|
try:
|
||||||
data_json = self.jsonify_object(data=t.model_dump())
|
data_json = self.jsonify_object(
|
||||||
|
data=t.model_dump(exclude_none=True)
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
data_json = self.jsonify_object(data=t.dict())
|
data_json = self.jsonify_object(data=t.dict(exclude_none=True))
|
||||||
batcher.litellm_verificationtoken.update(
|
batcher.litellm_verificationtoken.update(
|
||||||
where={"token": t.token}, # type: ignore
|
where={"token": t.token}, # type: ignore
|
||||||
data={**data_json}, # type: ignore
|
data={**data_json}, # type: ignore
|
||||||
|
|
|
@ -40,8 +40,8 @@ litellm_settings:
|
||||||
budget_duration: 30d
|
budget_duration: 30d
|
||||||
general_settings:
|
general_settings:
|
||||||
master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234)
|
master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234)
|
||||||
proxy_budget_rescheduler_min_time: 30
|
proxy_budget_rescheduler_min_time: 3
|
||||||
proxy_budget_rescheduler_max_time: 60
|
proxy_budget_rescheduler_max_time: 6
|
||||||
# database_url: "postgresql://<user>:<password>@<host>:<port>/<dbname>" # [OPTIONAL] use for token-based auth to proxy
|
# database_url: "postgresql://<user>:<password>@<host>:<port>/<dbname>" # [OPTIONAL] use for token-based auth to proxy
|
||||||
|
|
||||||
environment_variables:
|
environment_variables:
|
||||||
|
|
|
@ -438,6 +438,15 @@ async def test_key_with_budgets():
|
||||||
"""
|
"""
|
||||||
from litellm.proxy.utils import hash_token
|
from litellm.proxy.utils import hash_token
|
||||||
|
|
||||||
|
async def retry_request(func, *args, _max_attempts=5, **kwargs):
|
||||||
|
for attempt in range(_max_attempts):
|
||||||
|
try:
|
||||||
|
return await func(*args, **kwargs)
|
||||||
|
except aiohttp.client_exceptions.ClientOSError as e:
|
||||||
|
if attempt + 1 == _max_attempts:
|
||||||
|
raise # re-raise the last ClientOSError if all attempts failed
|
||||||
|
print(f"Attempt {attempt+1} failed, retrying...")
|
||||||
|
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
key_gen = await generate_key(
|
key_gen = await generate_key(
|
||||||
session=session, i=0, budget=10, budget_duration="5s"
|
session=session, i=0, budget=10, budget_duration="5s"
|
||||||
|
@ -449,9 +458,11 @@ async def test_key_with_budgets():
|
||||||
reset_at_init_value = key_info["info"]["budget_reset_at"]
|
reset_at_init_value = key_info["info"]["budget_reset_at"]
|
||||||
reset_at_new_value = None
|
reset_at_new_value = None
|
||||||
i = 0
|
i = 0
|
||||||
await asyncio.sleep(120)
|
await asyncio.sleep(10)
|
||||||
while i < 3:
|
for i in range(3):
|
||||||
key_info = await get_key_info(session=session, get_key=key, call_key=key)
|
key_info = await retry_request(
|
||||||
|
get_key_info, session=session, get_key=key, call_key=key
|
||||||
|
)
|
||||||
reset_at_new_value = key_info["info"]["budget_reset_at"]
|
reset_at_new_value = key_info["info"]["budget_reset_at"]
|
||||||
try:
|
try:
|
||||||
assert reset_at_init_value != reset_at_new_value
|
assert reset_at_init_value != reset_at_new_value
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue