refactor: use AI budget period from deployment config (#27117)

## Description

Read the AI budget period from the deployment config on both the RPC server and the `/users/{user}/ai/spend` endpoint, instead of hardcoding `month`. Drops the `period_start` RPC parameter that was incorrectly introduced in #26915: the period should have been derived from the deployment config from the start.

## Changes

- Add `codersdk.NewAIBudgetPeriodFromString`, mirroring `NewAIBudgetPolicyFromString`.
- `aibridgedserver.Server` takes a `quartz.Clock`, reads `BudgetPeriod` from the deployment config at construction, and computes the period window inside `IsBudgetExceeded`.
- Remove `period_start` from `IsBudgetExceededRequest` and stop sending it from the daemon.
- The `userAISpendStatus` endpoint reads the period from `AIBridgeConfig.BudgetPeriod` instead of hardcoding month.

> [!NOTE]
> Initially generated by Claude Opus 4.7, modified and reviewed by @ssncferreira
This commit is contained in:
Susana Ferreira
2026-07-13 17:52:45 +01:00
committed by GitHub
parent 199b5936c1
commit 6580cdcf7f
10 changed files with 237 additions and 249 deletions
+9
View File
@@ -612,6 +612,15 @@ var AIBudgetPeriods = []string{
string(AIBudgetPeriodMonth),
}
// NewAIBudgetPeriodFromString converts s to an AIBudgetPeriod, falling back to
// AIBudgetPeriodMonth when s is empty or not a recognized period.
func NewAIBudgetPeriodFromString(s string) AIBudgetPeriod {
if slices.Contains(AIBudgetPeriods, s) {
return AIBudgetPeriod(s)
}
return AIBudgetPeriodMonth
}
// DeploymentValues is the central configuration values the coder server.
type DeploymentValues struct {
Verbose serpent.Bool `json:"verbose,omitempty"`