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
@@ -10,6 +10,14 @@ class TaskSubmissionPolicyError(PermissionError):
"""Raised when a human user's policy disallows a task submission."""
class GovernancePolicyConflictError(RuntimeError):
"""Raised when a policy write was based on an obsolete revision."""
class TokenBudgetExceededError(RuntimeError):
"""Raised before a Cloud-proxied call would exceed a Host's token budget."""
@dataclass(frozen=True)
class UserSubmissionPolicy:
user_id: str
@@ -30,6 +38,48 @@ class HostGovernancePolicy:
updated_at: datetime
@dataclass(frozen=True)
class TokenReservation:
id: str
host_id: str
usage_day: str
reserved_tokens: int
task_id: str | None
attempt: int | None
created_at: datetime
expires_at: datetime
@dataclass(frozen=True)
class TokenUsageEvent:
id: str
host_id: str
usage_day: str
task_id: str | None
attempt: int | None
provider: str
model: str
input_tokens: int | None
output_tokens: int | None
total_tokens: int
occurred_at: datetime
@dataclass(frozen=True)
class TokenUsageSummary:
host_id: str
usage_day: str
daily_token_budget: int | None
used_tokens: int
reserved_tokens: int
@property
def remaining_tokens(self) -> int | None:
if self.daily_token_budget is None:
return None
return max(0, self.daily_token_budget - self.used_tokens - self.reserved_tokens)
def enforce_user_submission_policy(
policy: UserSubmissionPolicy | None,
*,