Source code for openwebui_token_tracking.sponsored
import os
from typing import Iterable
from sqlalchemy.orm import Session
from openwebui_token_tracking.db import (
init_db,
SponsoredAllowance,
SponsoredAllowanceBaseModels,
)
[docs]
def create_sponsored_allowance(
database_url: str,
sponsor_id: str,
name: str,
models: Iterable[str],
total_credit_limit: int,
daily_credit_limit: int,
):
if database_url is None:
database_url = os.environ["DATABASE_URL"]
engine = init_db(database_url)
with Session(engine) as session:
sponsored_allowance = SponsoredAllowance(
sponsor_id=sponsor_id,
name=name,
total_credit_limit=total_credit_limit,
daily_credit_limit=daily_credit_limit,
)
# Create the base model associations
for base_model_id in models:
association = SponsoredAllowanceBaseModels(
sponsored_allowance=sponsored_allowance, base_model_id=base_model_id
)
sponsored_allowance.base_models.append(association)
session.add(sponsored_allowance)
session.commit()
[docs]
def delete_sponsored_allowance(
database_url: str = None,
allowance_id: str = None,
name: str = None,
):
"""Delete a sponsored allowance by ID or name.
:param database_url: The database connection URL. If None, uses the DATABASE_URL environment variable.
:type database_url: str, optional
:param allowance_id: The ID of the sponsored allowance to delete.
:type allowance_id: str, optional
:param name: The name of the sponsored allowance to delete.
:type name: str, optional
:raises ValueError: If neither allowance_id nor name is provided.
:raises ValueError: If no sponsored allowance is found with the given ID or name.
"""
if allowance_id is None and name is None:
raise ValueError("Either allowance_id or name must be provided")
if database_url is None:
database_url = os.environ["DATABASE_URL"]
engine = init_db(database_url)
with Session(engine) as session:
query = session.query(SponsoredAllowance)
if allowance_id is not None:
query = query.filter(SponsoredAllowance.id == allowance_id)
else:
query = query.filter(SponsoredAllowance.name == name)
sponsored_allowance = query.first()
if sponsored_allowance is None:
raise ValueError(
f"No sponsored allowance found with the given {'ID' if allowance_id else 'name'}"
)
session.query(SponsoredAllowanceBaseModels).filter(
SponsoredAllowanceBaseModels.sponsored_allowance_id
== sponsored_allowance.id
).delete(synchronize_session=False)
session.delete(sponsored_allowance)
session.commit()
[docs]
def get_sponsored_allowance(
database_url: str = None,
name: str = None,
id: str = None,
):
"""Get a single sponsored allowance by name or ID.
:param database_url: The database connection URL. If None, uses the DATABASE_URL environment variable.
:type database_url: str, optional
:param name: The name of the allowance to retrieve.
:type name: str, optional
:param id: The ID of the allowance to retrieve.
:type id: str, optional
:return: The sponsored allowance as a dictionary.
:rtype: dict
:raises KeyError: If no allowance is found with the given name or ID.
"""
if database_url is None:
database_url = os.environ["DATABASE_URL"]
if name is None and id is None:
raise ValueError("Either name or id must be provided")
engine = init_db(database_url)
with Session(engine) as session:
query = session.query(SponsoredAllowance)
if name is not None:
query = query.filter(SponsoredAllowance.name == name)
if id is not None:
query = query.filter(SponsoredAllowance.id == id)
sponsored_allowance = query.first()
if sponsored_allowance is None:
raise KeyError(f"Could not find sponsored allowance: {id=}, {name=}")
return {
"id": str(sponsored_allowance.id),
"name": sponsored_allowance.name,
"sponsor_id": sponsored_allowance.sponsor_id,
"total_credit_limit": sponsored_allowance.total_credit_limit,
"daily_credit_limit": sponsored_allowance.daily_credit_limit,
"base_models": sponsored_allowance.base_models,
}
[docs]
def get_sponsored_allowances(
database_url: str = None,
sponsor_id: str = None,
):
"""Get all sponsored allowances, optionally filtered by sponsor ID.
:param database_url: The database connection URL. If None, uses the DATABASE_URL environment variable.
:type database_url: str, optional
:param sponsor_id: Filter allowances by sponsor ID.
:type sponsor_id: str, optional
:return: List of sponsored allowances, each as a dictionary.
:rtype: list[dict]
"""
if database_url is None:
database_url = os.environ["DATABASE_URL"]
engine = init_db(database_url)
with Session(engine) as session:
query = session.query(SponsoredAllowance)
if sponsor_id is not None:
query = query.filter(SponsoredAllowance.sponsor_id == sponsor_id)
# Order by name for consistent results
query = query.order_by(SponsoredAllowance.name)
sponsored_allowances = query.all()
result = []
for allowance in sponsored_allowances:
result.append(
{
"id": str(allowance.id),
"name": allowance.name,
"sponsor_id": allowance.sponsor_id,
"total_credit_limit": allowance.total_credit_limit,
"daily_credit_limit": allowance.daily_credit_limit,
"base_models": allowance.base_models,
}
)
return result
[docs]
def update_sponsored_allowance(
database_url: str = None,
allowance_id: str = None,
name: str = None,
new_name: str = None,
sponsor_id: str = None,
models: Iterable[str] = None,
total_credit_limit: int = None,
daily_credit_limit: int = None,
):
"""Update a sponsored allowance by ID or name.
:param database_url: The database connection URL. If None, uses the DATABASE_URL environment variable.
:type database_url: str, optional
:param allowance_id: The ID of the sponsored allowance to update.
:type allowance_id: str, optional
:param name: The name of the sponsored allowance to update.
:type name: str, optional
:param new_name: The new name for the sponsored allowance.
:type new_name: str, optional
:param sponsor_id: The new sponsor ID for the sponsored allowance.
:type sponsor_id: str, optional
:param models: The new list of base model IDs.
:type models: Iterable[str], optional
:param total_credit_limit: The new total credit limit.
:type total_credit_limit: int, optional
:param daily_credit_limit: The new daily credit limit.
:type daily_credit_limit: int, optional
:raises ValueError: If neither allowance_id nor name is provided.
:raises ValueError: If no sponsored allowance is found with the given ID or name.
"""
if allowance_id is None and name is None:
raise ValueError("Either allowance_id or name must be provided")
if database_url is None:
database_url = os.environ["DATABASE_URL"]
engine = init_db(database_url)
with Session(engine) as session:
query = session.query(SponsoredAllowance)
if allowance_id is not None:
query = query.filter(SponsoredAllowance.id == allowance_id)
else:
query = query.filter(SponsoredAllowance.name == name)
sponsored_allowance = query.first()
if sponsored_allowance is None:
raise ValueError(
f"No sponsored allowance found with the given {'ID' if allowance_id else 'name'}"
)
if new_name is not None:
sponsored_allowance.name = new_name
if sponsor_id is not None:
sponsored_allowance.sponsor_id = sponsor_id
if total_credit_limit is not None:
sponsored_allowance.total_credit_limit = total_credit_limit
if daily_credit_limit is not None:
sponsored_allowance.daily_credit_limit = daily_credit_limit
if models is not None:
# Delete existing model associations
session.query(SponsoredAllowanceBaseModels).filter(
SponsoredAllowanceBaseModels.sponsored_allowance_id
== sponsored_allowance.id
).delete(synchronize_session=False)
# Create new model associations
for base_model_id in models:
association = SponsoredAllowanceBaseModels(
sponsored_allowance=sponsored_allowance, base_model_id=base_model_id
)
sponsored_allowance.base_models.append(association)
session.commit()