Commit Graph
2047 Commits
Author SHA1 Message Date
erio ed98145154 chore: bump version to 0.1.104.5 2026-03-24 20:41:04 +08:00
erio 2667f781da chore: adjust internal500 penalty durations to 30m / 2h 2026-03-24 20:39:21 +08:00
erio 2d22b80244 test: add unit tests for INTERNAL 500 progressive penalty
Cover isAntigravityInternalServerError body matching,
applyInternal500Penalty tier escalation, handleInternal500RetryExhausted
nil-safety and error handling, and resetInternal500Counter paths.
2026-03-24 20:37:21 +08:00
erio 4b64df2071 refactor: extract internal500 penalty logic to dedicated file
Move constants, detection, and penalty functions from
antigravity_gateway_service.go to antigravity_internal500_penalty.go.
Fix gofmt alignment and replace hardcoded duration strings with
constant references.
2026-03-24 20:33:11 +08:00
erio a80844558c fix: move internal500 counter reset to cover all success paths
Move the reset logic after urlFallbackLoop so it covers both direct
success and smart retry (429/503) success paths.
2026-03-24 20:24:06 +08:00
erio c668b96e15 feat(antigravity): progressive penalty for consecutive INTERNAL 500 errors
When an antigravity account returns 500 "Internal error encountered."
on all 3 retry attempts, increment a Redis counter and apply escalating
penalties:
- 1st round: temp unschedulable 10 minutes
- 2nd round: temp unschedulable 10 hours
- 3rd round: permanently mark as error

Counter resets on any successful response (< 400).
2026-03-24 20:18:49 +08:00
erio 7c0de8b1a1 fix: sync remaining test expectations for Sonnet 4.5 → 4.6 migration
Update model mapping tests, rate limit pre-check tests, thinking suffix
tests, and whitelist tests to reflect the new default mapping and
simplified applyThinkingModelSuffix behavior.
2026-03-24 19:45:03 +08:00
erio 8b31e00a14 fix: sync test rate limit keys and fix gofmt alignment
Update rate limit keys in credits overages tests from claude-sonnet-4-5
to claude-sonnet-4-6 to match the new default mapping. Fix gofmt
alignment in constants.go.
2026-03-24 19:44:50 +08:00
erio 21fd129dcc chore: bump version to 0.1.104.4 2026-03-24 17:53:08 +08:00
erio d27d6c1b24 fix: restore original 077 migration and create 078 for Sonnet 4.5→4.6
077 was modified after being applied to the production database,
causing a checksum mismatch and container restart loop.
Restore 077 to its original content and move the Sonnet 4.5→4.6
migration to a new 078 file.
2026-03-24 17:50:55 +08:00
erio 986d2bc8b8 feat: migrate Sonnet 4.5 → Sonnet 4.6 in default mapping and DB 2026-03-24 17:38:21 +08:00
erio c7168c1abc chore: bump version to 0.1.104.3 2026-03-24 16:47:20 +08:00
erio d6af2f8739 revert: rollback Sonnet→Opus migration, restore Sonnet→Sonnet mapping 2026-03-24 16:46:16 +08:00
erio be0c9fec9e Revert "feat: migrate all Sonnet targets to Opus 4.6-thinking"
This reverts commit 36d99d6399.
2026-03-24 16:42:54 +08:00
erio 90bd7d28ce chore: bump version to 0.1.104.2 2026-03-23 19:39:09 +08:00
erio 36d99d6399 feat: migrate all Sonnet targets to Opus 4.6-thinking
All Claude Sonnet models (claude-sonnet-4-5, claude-sonnet-4-5-thinking,
claude-sonnet-4-6) in Antigravity default mapping now redirect to
claude-opus-4-6-thinking. Includes DB migration script for existing accounts.
2026-03-23 19:38:55 +08:00
erio 8cbfe9dcc6 chore: bump version to 0.1.104.1 2026-03-22 06:03:34 +08:00
erio bda47a8166 Merge branch 'release/custom-0.1.103' into release/custom-0.1.104
# Conflicts:
#	backend/internal/service/user_service_test.go
#	frontend/src/components/account/AccountUsageCell.vue
#	frontend/src/components/common/DataTable.vue
2026-03-22 06:03:19 +08:00
shaw 4f7629a4cb fix: add max_claude_code_version to API contract test expected output 2026-03-20 09:17:32 +08:00
Wesley Liddick 9dccbe1b07 Merge pull request #1169 from touwaeriol/pr/credits-exhausted-fix
fix(antigravity): correctly mark credits exhausted on "Resource has been exhausted" 429
2026-03-20 09:12:55 +08:00
Wesley Liddick 9a88df7f28 Merge pull request #1167 from touwaeriol/pr/proxy-fast-fail
fix(antigravity): fast-fail on proxy unavailable, temp-unschedule account
2026-03-20 09:12:39 +08:00
Wesley Liddick 3529148455 Merge pull request #1151 from DaydreamCoding/feat/admin-user-group-filter
feat(admin): 用户管理新增分组列、分组筛选与专属分组一键替换
2026-03-20 09:10:38 +08:00
shaw 01d8286bd9 feat: add max_claude_code_version setting and disable auto-upgrade env var
Add maximum Claude Code version limit to complement the existing minimum
version check. Refactor the version cache from single-value to unified
bounds struct (min+max) with a single atomic.Value and singleflight group.

- Backend: new constant, struct field, cache refactor, validation (semver
  format + cross-validation max >= min), gateway enforcement, audit diff
- Frontend: settings UI input, TypeScript types, zh/en i18n
- Add CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 to all Claude Code
  tutorials on /keys page (unix/cmd/powershell/vscode settings.json)
2026-03-20 09:10:01 +08:00
erio 21b6f2d593 fix(antigravity): correctly mark credits exhausted on "Resource has been exhausted" 429
shouldMarkCreditsExhausted was blocked by isURLLevelRateLimit check when
credit overages retry returned "Resource has been exhausted (e.g. check quota).",
causing credits to never be marked as exhausted. This led to an infinite loop
where each request injected credits, bypassed model rate limits, and failed again.

- Remove isURLLevelRateLimit guard from shouldMarkCreditsExhausted (only called
  for credit retry responses — if credits retry fails, mark exhausted)
- Add "resource has been exhausted" to creditsExhaustedKeywords
- Update tests to match corrected behavior
2026-03-20 00:04:01 +08:00
erio 528ff5d28c fix(antigravity): fast-fail on proxy unavailable, temp-unschedule account
## Problem

When a proxy is unreachable, token refresh retries up to 4 times with
30s timeout each, causing requests to hang for ~2 minutes before
failing with a generic 502 error. The failed account is not marked,
so subsequent requests keep hitting it.

## Changes

### Proxy connection fast-fail
- Set TCP dial timeout to 5s and TLS handshake timeout to 5s on
  antigravity client, so proxy connectivity issues fail within 5s
  instead of 30s
- Reduce overall HTTP client timeout from 30s to 10s
- Export `IsConnectionError` for service-layer use
- Detect proxy connection errors in `RefreshToken` and return
  immediately with "proxy unavailable" error (no retries)

### Token refresh temp-unschedulable
- Add 8s context timeout for token refresh on request path
- Mark account as temp-unschedulable for 10min when refresh fails
  (both background `TokenRefreshService` and request-path
  `GetAccessToken`)
- Sync temp-unschedulable state to Redis cache for immediate
  scheduler effect
- Inject `TempUnschedCache` into `AntigravityTokenProvider`

### Account failover
- Return `UpstreamFailoverError` on `GetAccessToken` failure in
  `Forward`/`ForwardGemini` to trigger handler-level account switch
  instead of returning 502 directly

### Proxy probe alignment
- Apply same 5s dial/TLS timeout to shared `httpclient` pool
- Reduce proxy probe timeout from 30s to 10s
2026-03-19 23:48:37 +08:00
erio 0667cf3cac fix(antigravity): fast-fail on proxy unavailable, temp-unschedule account
- Set proxy TCP dial timeout to 5s and TLS handshake timeout to 5s
  for quick failure detection instead of waiting 30s
- Reduce overall HTTP client timeout from 30s to 10s
- Detect proxy connection errors (IsConnectionError) and skip retries
  immediately with clear "proxy unavailable" error
- Add 8s context timeout for token refresh on request path to cap
  total wait time
- Mark account as temp-unschedulable for 10min when token refresh
  fails (both background and request path)
- Sync temp-unschedulable state to Redis cache for immediate
  scheduler effect
- Return UpstreamFailoverError on GetAccessToken failure to trigger
  account failover instead of returning 502 directly
- Apply same 5s dial timeout to httpclient pool (proxy probe/test)
- Reduce proxy probe timeout from 30s to 10s
2026-03-19 23:20:14 +08:00
QTom ba7d2aecbb feat(admin): 用户管理新增分组列、分组筛选与专属分组一键替换
- 新增分组列:展示用户的专属/公开分组,支持 hover 查看详情
- 新增分组筛选:下拉选择或模糊搜索分组名过滤用户
- 专属分组替换:点击专属分组弹出操作菜单,选择目标分组后
  自动授予新分组权限、迁移绑定的 Key、移除旧分组权限
- 后端新增 POST /admin/users/:id/replace-group 端点,事务内
  完成分组替换并失效认证缓存
2026-03-19 22:27:55 +08:00
Wesley Liddick 0236b97d49 Merge pull request #1134 from yasu-dev221/fix/openai-compat-prompt-cache-key
fix(openai): add fallback prompt_cache_key for compat codex OAuth requests
2026-03-19 22:02:08 +08:00
Wesley Liddick 26f6b1eeff Merge pull request #1142 from StarryKira/fix/failover-exhausted-upstream-status-code
fix: record original upstream status code when failover exhausted (#1128)
2026-03-19 21:56:58 +08:00
Wesley Liddick dc447ccebe Merge pull request #1153 from hging/main
feat: add ungrouped filter to account
2026-03-19 21:55:28 +08:00
Wesley Liddick 550b979ac5 Merge pull request #1146 from DaydreamCoding/fix/test-403-error-status
fix(test): 测试连接收到 403 时将账号标记为 error 状态
2026-03-19 21:44:57 +08:00
Rose DingandClaude Opus 4.6 e443a6a1ea fix: 移除 staticcheck S1005 警告的多余 blank identifier
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:14:29 +08:00
Rose DingandClaude Opus 4.6 963494ec6f fix: Anthropic tool schema 转 Responses API 时补充缺失的 properties 字段
当 Claude Code 发来的 MCP tool 的 input_schema 为 {"type":"object"} 且缺少
properties 字段时,OpenAI Codex 后端会拒绝并报错:
Invalid schema for function '...': object schema missing properties.

新增 normalizeToolParameters 函数,在 convertAnthropicToolsToResponses 中
对每个 tool 的 InputSchema 做规范化处理后再赋给 Parameters。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:08:20 +08:00
erio 26da801d29 chore: bump version to 0.1.103.4 2026-03-19 20:58:19 +08:00
erio 602a0c1cbd chore: bump version to 0.1.103.3 2026-03-19 20:29:15 +08:00
erio 0eb639d2a4 fix(antigravity): correctly mark credits exhausted on "Resource has been exhausted" 429
shouldMarkCreditsExhausted was blocked by isURLLevelRateLimit check when
credit overages retry returned "Resource has been exhausted (e.g. check quota).",
causing credits to never be marked as exhausted. This led to an infinite loop
where each request injected credits, bypassed model rate limits, and failed again.

- Remove isURLLevelRateLimit guard from shouldMarkCreditsExhausted (only called
  for credit retry responses — if credits retry fails, mark exhausted)
- Add "resource has been exhausted" to creditsExhaustedKeywords
- Update tests to match corrected behavior
2026-03-19 20:29:01 +08:00
shaw 525cdb8830 feat: Anthropic 账号被动用量采样,页面默认展示被动数据
从上游 /v1/messages 响应头被动采集 5h/7d utilization 并存储到
Account.Extra,页面加载时直接读取本地数据而非调用外部 Usage API。
用户可点击"查询"按钮主动拉取最新数据,主动查询结果自动回写被动缓存。

后端:
- UpdateSessionWindow 合并采集 5h + 7d headers 为单次 DB 写入
- 新增 GetPassiveUsage 从 Extra 构建 UsageInfo (复用 estimateSetupTokenUsage)
- GetUsage 主动查询后 syncActiveToPassive 回写被动缓存
- passive_usage_ 前缀注册为 scheduler-neutral

前端:
- Anthropic 账号 mount/refresh 默认 source=passive
- 新增"被动采样"标签和"查询"按钮 (带 loading 动画)
2026-03-19 17:42:59 +08:00
shaw a6764e82f2 修复 OAuth/SetupToken 转发请求体重排并增加调试开关 2026-03-19 16:56:18 +08:00
Hg 8027531d07 feat: add ungrouped filter to account 2026-03-19 15:42:21 +08:00
QTomandClaude Opus 4.6 c1717c9a6c fix(test): 测试连接收到 403 时将账号标记为 error 状态
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:36:40 +08:00
harukaandClaude Opus 4.6 1fd1a58a7a fix: record original upstream status code when failover exhausted (#1128)
When all failover accounts are exhausted, handleFailoverExhausted maps
the upstream status code (e.g. 403) to a client-facing code (e.g. 502)
but did not write the original code to the gin context. This caused ops
error logs to show the mapped code instead of the real upstream code.

Call SetOpsUpstreamError before mapUpstreamError in all failover-
exhausted paths so that ops_error_logger captures the true upstream
status code and message.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:15:02 +08:00
jimmy-coder fad07507be fix(openai): inject stable compat prompt_cache_key for codex oauth chat-completions path 2026-03-19 03:24:31 +08:00
erio 10e302a5d0 chore: bump version to 0.1.103.2 2026-03-18 23:14:32 +08:00
erio e3dbae9ad4 chore: bump version to 0.1.103.1 2026-03-18 23:00:22 +08:00
erio 64ba5ac1cc Merge branch 'release/custom-0.1.102' into release/custom-0.1.103
# Conflicts:
#	backend/go.sum
2026-03-18 22:43:48 +08:00
erio 305f673634 chore: bump version to 0.1.102.5 2026-03-18 22:29:05 +08:00
erio 5eb6f190bd chore: bump version to 0.1.102.4 2026-03-18 19:27:58 +08:00
erio ca1e7c8959 chore: bump version to 0.1.102.3 2026-03-18 19:04:12 +08:00
Wesley Liddick 9f6ab6b817 Merge pull request #1090 from laukkw/main
fix(setup): align install validation and expose backend errors
2026-03-18 16:23:06 +08:00
shaw bf3d6c0e6e feat: add 529 overload cooldown toggle and duration settings in admin gateway page
Move 529 overload cooldown configuration from config file to admin
settings UI. Adds an enable/disable toggle and configurable cooldown
duration (1-120 min) under /admin/settings gateway tab, stored as
JSON in the settings table.

When disabled, 529 errors are logged but accounts are no longer
paused from scheduling. Falls back to config file value when DB
is unreachable or settingService is nil.
2026-03-18 16:22:19 +08:00