diff --git a/src/components/config/VisualConfigEditor.tsx b/src/components/config/VisualConfigEditor.tsx index 634b75c..f997c50 100644 --- a/src/components/config/VisualConfigEditor.tsx +++ b/src/components/config/VisualConfigEditor.tsx @@ -936,6 +936,15 @@ export function VisualConfigEditor({ disabled={disabled} onChange={(quotaSwitchPreviewModel) => onChange({ quotaSwitchPreviewModel })} /> + onChange({ quotaAntigravityCredits })} + /> diff --git a/src/hooks/useVisualConfig.ts b/src/hooks/useVisualConfig.ts index 10b97c1..d26c011 100644 --- a/src/hooks/useVisualConfig.ts +++ b/src/hooks/useVisualConfig.ts @@ -647,6 +647,12 @@ function getNextDirtyFields( nextValues.quotaSwitchPreviewModel === baselineValues.quotaSwitchPreviewModel ); } + if (Object.prototype.hasOwnProperty.call(patch, 'quotaAntigravityCredits')) { + updateDirty( + 'quotaAntigravityCredits', + nextValues.quotaAntigravityCredits === baselineValues.quotaAntigravityCredits + ); + } if (Object.prototype.hasOwnProperty.call(patch, 'routingStrategy')) { updateDirty('routingStrategy', nextValues.routingStrategy === baselineValues.routingStrategy); } @@ -827,6 +833,7 @@ export function useVisualConfig() { quotaSwitchProject: Boolean(quotaExceeded?.['switch-project'] ?? true), quotaSwitchPreviewModel: Boolean(quotaExceeded?.['switch-preview-model'] ?? true), + quotaAntigravityCredits: Boolean(quotaExceeded?.['antigravity-credits'] ?? true), routingStrategy: routing?.strategy === 'fill-first' ? 'fill-first' : 'round-robin', @@ -929,11 +936,16 @@ export function useVisualConfig() { if ( docHas(doc, ['quota-exceeded']) || !values.quotaSwitchProject || - !values.quotaSwitchPreviewModel + !values.quotaSwitchPreviewModel || + !values.quotaAntigravityCredits ) { ensureMapInDoc(doc, ['quota-exceeded']); doc.setIn(['quota-exceeded', 'switch-project'], values.quotaSwitchProject); doc.setIn(['quota-exceeded', 'switch-preview-model'], values.quotaSwitchPreviewModel); + doc.setIn( + ['quota-exceeded', 'antigravity-credits'], + values.quotaAntigravityCredits + ); deleteIfMapEmpty(doc, ['quota-exceeded']); } diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index ddd238b..18973d7 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -1270,7 +1270,9 @@ "switch_project": "Switch Project", "switch_project_desc": "Automatically switch to another project when quota is exceeded", "switch_preview_model": "Switch to Preview Model", - "switch_preview_model_desc": "Switch to preview model version when quota is exceeded" + "switch_preview_model_desc": "Switch to preview model version when quota is exceeded", + "antigravity_credits": "Antigravity Credits Retry", + "antigravity_credits_desc": "Retry once with enabledCreditTypes=[\"GOOGLE_ONE_AI\"] when Antigravity returns quota_exhausted 429" }, "streaming": { "title": "Streaming Configuration", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 8b54114..452e8bb 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -1269,7 +1269,9 @@ "switch_project": "Переключить проект", "switch_project_desc": "Автоматически переходить на другой проект при превышении квоты", "switch_preview_model": "Переключить на preview-модель", - "switch_preview_model_desc": "Переключаться на preview-версию модели при превышении квоты" + "switch_preview_model_desc": "Переключаться на preview-версию модели при превышении квоты", + "antigravity_credits": "Повтор Antigravity Credits", + "antigravity_credits_desc": "При ответе Antigravity quota_exhausted 429 повторять запрос один раз с enabledCreditTypes=[\"GOOGLE_ONE_AI\"]" }, "streaming": { "title": "Настройки стриминга", diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 665d04f..f0f2d0d 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -1270,7 +1270,9 @@ "switch_project": "切换项目", "switch_project_desc": "配额耗尽时自动切换到其他项目", "switch_preview_model": "切换预览模型", - "switch_preview_model_desc": "配额耗尽时切换到预览版本模型" + "switch_preview_model_desc": "配额耗尽时切换到预览版本模型", + "antigravity_credits": "Antigravity Credits 重试", + "antigravity_credits_desc": "Antigravity 返回 quota_exhausted 429 时,使用 enabledCreditTypes=[\"GOOGLE_ONE_AI\"] 重试一次" }, "streaming": { "title": "流式传输配置", diff --git a/src/services/api/transformers.ts b/src/services/api/transformers.ts index 08b21fe..929851d 100644 --- a/src/services/api/transformers.ts +++ b/src/services/api/transformers.ts @@ -366,7 +366,12 @@ export const normalizeConfigResponse = (raw: unknown): Config => { if (isRecord(quota)) { config.quotaExceeded = { switchProject: normalizeBoolean(quota['switch-project'] ?? quota.switchProject), - switchPreviewModel: normalizeBoolean(quota['switch-preview-model'] ?? quota.switchPreviewModel) + switchPreviewModel: normalizeBoolean( + quota['switch-preview-model'] ?? quota.switchPreviewModel + ), + antigravityCredits: normalizeBoolean( + quota['antigravity-credits'] ?? quota.antigravityCredits + ) }; } diff --git a/src/types/config.ts b/src/types/config.ts index a248efb..b9816d3 100644 --- a/src/types/config.ts +++ b/src/types/config.ts @@ -9,6 +9,7 @@ import type { AmpcodeConfig } from './ampcode'; export interface QuotaExceededConfig { switchProject?: boolean; switchPreviewModel?: boolean; + antigravityCredits?: boolean; } export interface Config { diff --git a/src/types/visualConfig.ts b/src/types/visualConfig.ts index 0e3c102..2f14181 100644 --- a/src/types/visualConfig.ts +++ b/src/types/visualConfig.ts @@ -75,6 +75,7 @@ export type VisualConfigValues = { maxRetryInterval: string; quotaSwitchProject: boolean; quotaSwitchPreviewModel: boolean; + quotaAntigravityCredits: boolean; routingStrategy: 'round-robin' | 'fill-first'; wsAuth: boolean; payloadDefaultRules: PayloadRule[]; @@ -114,6 +115,7 @@ export const DEFAULT_VISUAL_VALUES: VisualConfigValues = { maxRetryInterval: '', quotaSwitchProject: true, quotaSwitchPreviewModel: true, + quotaAntigravityCredits: true, routingStrategy: 'round-robin', wsAuth: false, payloadDefaultRules: [],