feat(cloud): enforce host governance budgets
Tests / Test passed: 662

This commit is contained in:
2026-07-13 22:56:31 +08:00
parent 2cd314b183
commit b4803f90e6
28 changed files with 1311 additions and 14 deletions
@@ -0,0 +1,53 @@
"""Add Cloud-proxy token reservations and usage events."""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "0005_cloud_token_usage"
down_revision = "0004_cloud_governance"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"cloud_token_reservations",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("host_id", sa.String(), sa.ForeignKey("host_registrations.host_id", ondelete="CASCADE"), nullable=False),
sa.Column("usage_day", sa.String(), nullable=False),
sa.Column("reserved_tokens", sa.Integer(), nullable=False),
sa.Column("task_id", sa.String(), nullable=True),
sa.Column("attempt", sa.Integer(), nullable=True),
sa.Column("created_at", sa.String(), nullable=False),
sa.Column("expires_at", sa.String(), nullable=False),
)
op.create_index("ix_cloud_token_reservations_host_day", "cloud_token_reservations", ["host_id", "usage_day"])
op.create_index("ix_cloud_token_reservations_expires_at", "cloud_token_reservations", ["expires_at"])
op.create_table(
"cloud_token_usage_events",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("host_id", sa.String(), sa.ForeignKey("host_registrations.host_id", ondelete="CASCADE"), nullable=False),
sa.Column("usage_day", sa.String(), nullable=False),
sa.Column("task_id", sa.String(), nullable=True),
sa.Column("attempt", sa.Integer(), nullable=True),
sa.Column("provider", sa.String(), nullable=False),
sa.Column("model", sa.String(), nullable=False),
sa.Column("input_tokens", sa.Integer(), nullable=True),
sa.Column("output_tokens", sa.Integer(), nullable=True),
sa.Column("total_tokens", sa.Integer(), nullable=False),
sa.Column("occurred_at", sa.String(), nullable=False),
)
op.create_index("ix_cloud_token_usage_events_host_day", "cloud_token_usage_events", ["host_id", "usage_day"])
op.create_index("ix_cloud_token_usage_events_occurred_at", "cloud_token_usage_events", ["occurred_at"])
def downgrade() -> None:
op.drop_index("ix_cloud_token_usage_events_occurred_at", table_name="cloud_token_usage_events")
op.drop_index("ix_cloud_token_usage_events_host_day", table_name="cloud_token_usage_events")
op.drop_table("cloud_token_usage_events")
op.drop_index("ix_cloud_token_reservations_expires_at", table_name="cloud_token_reservations")
op.drop_index("ix_cloud_token_reservations_host_day", table_name="cloud_token_reservations")
op.drop_table("cloud_token_reservations")