Add a turn-scoped service tier override (#40616)

## What changed

- Add `serviceTierForTurn` to `turn/start` so a newly started turn can override the service tier without changing the thread's saved tier.
- Treat `"default"` as standard speed and omitted or `null` values as inheriting the thread tier.
- Keep `serviceTier` authoritative for subsequent turns when both fields are supplied, and ignore the turn-scoped override when steering an active turn.

## Testing

- Extend the app-server turn-start test to verify both the one-turn `"default"` override and inheritance on the following turn.

GitOrigin-RevId: 4c2c4db21d8d31617a7a6e6df65bf54834e72383
This commit is contained in:
chess
2026-08-25 14:04:32 +00:00
committed by copyberry
parent d7510aa4b4
commit ed42068c45
21 changed files with 86 additions and 3 deletions
@@ -4725,6 +4725,7 @@ fn turn_start_params_preserve_explicit_null_service_tier() {
permissions: None,
model: None,
service_tier: None,
service_tier_for_turn: None,
effort: None,
summary: None,
output_schema: None,
@@ -131,6 +131,11 @@ pub struct TurnStartParams {
)]
#[ts(optional = nullable)]
pub service_tier: Option<Option<String>>,
/// Override the service tier only when this request starts a new turn.
/// Use "default" for standard speed. Omitted or null inherits the thread's tier.
/// Does not change the thread's tier or a turn being steered.
#[ts(optional = nullable)]
pub service_tier_for_turn: Option<String>,
/// Override the reasoning effort for this turn and subsequent turns.
#[ts(optional = nullable)]
pub effort: Option<ReasoningEffort>,