diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index 068771ac8c..c21ff57d98 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -250,7 +250,7 @@ func AccountFromServiceShallow(a *service.Account) *Account { } } - // 客户端亲和调度(仅 Anthropic OAuth/SetupToken 账号) + // 客户端亲和调度(Anthropic 和 Antigravity 账号) if a.IsClientAffinityEnabled() { enabled := true out.ClientAffinityEnabled = &enabled diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index a7e04cd2ea..3626bda982 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -188,7 +188,7 @@ type Account struct { CacheTTLOverrideEnabled *bool `json:"cache_ttl_override_enabled,omitempty"` CacheTTLOverrideTarget *string `json:"cache_ttl_override_target,omitempty"` - // 客户端亲和调度(仅 Anthropic OAuth/SetupToken 账号有效) + // 客户端亲和调度(Anthropic 和 Antigravity 账号有效) // 启用后新会话会优先调度到客户端之前使用过的账号 ClientAffinityEnabled *bool `json:"client_affinity_enabled,omitempty"` diff --git a/backend/internal/service/account.go b/backend/internal/service/account.go index d36f55978c..effcfeaa03 100644 --- a/backend/internal/service/account.go +++ b/backend/internal/service/account.go @@ -1100,10 +1100,10 @@ func (a *Account) IsSessionIDMaskingEnabled() bool { } // IsClientAffinityEnabled 检查是否启用客户端亲和调度 -// 仅适用于 Anthropic OAuth/SetupToken 账号(Claude Code) +// 适用于 Anthropic 和 Antigravity 账号 // 启用后,新会话会优先调度到之前使用过的账号 func (a *Account) IsClientAffinityEnabled() bool { - if !a.IsAnthropicOAuthOrSetupToken() { + if a.Platform != PlatformAnthropic && a.Platform != PlatformAntigravity { return false } if a.Extra == nil { diff --git a/frontend/src/components/account/EditAccountModal.vue b/frontend/src/components/account/EditAccountModal.vue index 0bc5f479cb..21144f3434 100644 --- a/frontend/src/components/account/EditAccountModal.vue +++ b/frontend/src/components/account/EditAccountModal.vue @@ -645,9 +645,9 @@ - +
@@ -1905,16 +1905,16 @@ function loadQuotaControlSettings(account: Account) { cacheTTLOverrideTarget.value = '5m' clientAffinityEnabled.value = false - // Only applies to Anthropic OAuth/SetupToken accounts - if (account.platform !== 'anthropic' || (account.type !== 'oauth' && account.type !== 'setup-token')) { - return - } - - // Client affinity (Anthropic OAuth/SetupToken only) + // Client affinity (Anthropic & Antigravity accounts) if (account.client_affinity_enabled === true) { clientAffinityEnabled.value = true } + // Remaining quota control settings only apply to Anthropic OAuth/SetupToken accounts + if (account.platform !== 'anthropic' || (account.type !== 'oauth' && account.type !== 'setup-token')) { + return + } + // Load from extra field (via backend DTO fields) if (account.window_cost_limit != null && account.window_cost_limit > 0) { windowCostEnabled.value = true @@ -2224,7 +2224,7 @@ const handleSubmit = async () => { updatePayload.credentials = newCredentials } - // For antigravity accounts, handle mixed_scheduling in extra + // For antigravity accounts, handle mixed_scheduling and client_affinity in extra if (props.account.platform === 'antigravity') { const currentExtra = (props.account.extra as Record) || {} const newExtra: Record = { ...currentExtra } @@ -2233,6 +2233,11 @@ const handleSubmit = async () => { } else { delete newExtra.mixed_scheduling } + if (clientAffinityEnabled.value) { + newExtra.client_affinity_enabled = true + } else { + delete newExtra.client_affinity_enabled + } updatePayload.extra = newExtra } @@ -2318,7 +2323,7 @@ const handleSubmit = async () => { updatePayload.extra = newExtra } - // For Anthropic API Key accounts, handle passthrough mode in extra + // For Anthropic API Key accounts, handle passthrough mode and client affinity in extra if (props.account.platform === 'anthropic' && props.account.type === 'apikey') { const currentExtra = (props.account.extra as Record) || {} const newExtra: Record = { ...currentExtra } @@ -2327,6 +2332,11 @@ const handleSubmit = async () => { } else { delete newExtra.anthropic_passthrough } + if (clientAffinityEnabled.value) { + newExtra.client_affinity_enabled = true + } else { + delete newExtra.client_affinity_enabled + } updatePayload.extra = newExtra }