From 39657ed64f7985660c7ec4c51d884053bb4fc52c Mon Sep 17 00:00:00 2001 From: Shroominic Date: Fri, 9 Jan 2026 17:36:04 +0800 Subject: [PATCH] reset reserved balance on startup --- routstr/core/db.py | 10 +++++++++- routstr/core/main.py | 4 ++++ routstr/core/settings.py | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/routstr/core/db.py b/routstr/core/db.py index c56163d0..4c236d3a 100644 --- a/routstr/core/db.py +++ b/routstr/core/db.py @@ -6,7 +6,7 @@ from typing import AsyncGenerator from alembic import command from alembic.config import Config from sqlalchemy.ext.asyncio.engine import create_async_engine -from sqlmodel import Field, Relationship, SQLModel, func, select +from sqlmodel import Field, Relationship, SQLModel, func, select, update from sqlmodel.ext.asyncio.session import AsyncSession from .logging import get_logger @@ -53,6 +53,14 @@ class ApiKey(SQLModel, table=True): # type: ignore return self.balance - self.reserved_balance +async def reset_all_reserved_balances(session: AsyncSession) -> None: + logger.info("Resetting all reserved balances to 0") + stmt = update(ApiKey).values(reserved_balance=0) + await session.exec(stmt) # type: ignore[call-overload] + await session.commit() + logger.info("Reserved balances reset successfully") + + class ModelRow(SQLModel, table=True): # type: ignore __tablename__ = "models" id: str = Field(primary_key=True) diff --git a/routstr/core/main.py b/routstr/core/main.py index 6ba783df..5bce5d32 100644 --- a/routstr/core/main.py +++ b/routstr/core/main.py @@ -61,6 +61,10 @@ async def lifespan(_: FastAPI) -> AsyncGenerator[None, None]: # Initialize application settings (env -> computed -> DB precedence) async with create_session() as session: s = await SettingsService.initialize(session) + if s.reset_reserved_balance_on_startup: + from .db import reset_all_reserved_balances + + await reset_all_reserved_balances(session) # Apply app metadata from settings try: diff --git a/routstr/core/settings.py b/routstr/core/settings.py index 52f6fae4..685f8970 100644 --- a/routstr/core/settings.py +++ b/routstr/core/settings.py @@ -61,6 +61,9 @@ class Settings(BaseSettings): tolerance_percentage: float = Field(default=1.0, env="TOLERANCE_PERCENTAGE") # Minimum per-request charge in millisatoshis when model pricing is free/zero min_request_msat: int = Field(default=1, env="MIN_REQUEST_MSAT") + reset_reserved_balance_on_startup: bool = Field( + default=True, env="RESET_RESERVED_BALANCE_ON_STARTUP" + ) # deactivate in horizontal scaling setups # Network cors_origins: list[str] = Field(default_factory=lambda: ["*"], env="CORS_ORIGINS")