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
}