Commit Graph
100 Commits
Author SHA1 Message Date
song b161312183 test(antigravity): 更新单URL策略下的重试断言 2026-02-10 14:36:09 +08:00
song 1f647b120a feat(antigravity): 转发与测试支持daily/prod单URL切换 2026-02-10 13:51:29 +08:00
song 0707f3d963 chore: gofmt 2026-02-03 17:03:54 +08:00
song 976d6fb03f chore: update antigravity example url 2026-02-03 17:00:46 +08:00
song f1aafbc06f chore: gofmt 2026-02-03 16:55:13 +08:00
song 7cb5444dbb fix: update tests for group fallback 2026-02-03 16:48:52 +08:00
song 3bede6e65f merge upstream main 2026-02-03 16:21:58 +08:00
song 2220fd18ca merge upstream main 2026-02-03 15:36:17 +08:00
song 11ff73b578 fix: align migration checksum and import formatTime 2026-02-03 14:04:11 +08:00
song 3ecadf4aad chore: apply stashed changes 2026-02-02 22:20:08 +08:00
song 0170d19fa7 merge upstream main 2026-02-02 22:13:50 +08:00
song 7ade9baa15 fix(gateway): 过滤 Gemini 请求中 parts 为空的消息
Gemini API 不接受 contents 数组中 parts 为空的消息,会返回 400 INVALID_ARGUMENT 错误。
添加 filterEmptyPartsFromGeminiRequest 函数在转发前过滤这类消息。

影响范围:ForwardGemini (antigravity) 和 ForwardNative (gemini)
2026-01-29 21:09:33 +08:00
song 5b787334c8 antigravity: 转发优先 daily 2026-01-28 11:17:39 +08:00
song f761afb1ef antigravity: 区分切换后重试次数 2026-01-28 00:01:03 +08:00
song 877c17251d feat(group): 添加 MCP XML 注入开关
- Group 新增 mcp_xml_inject 字段,控制 Antigravity 平台的 MCP XML 协议注入
- 默认启用,可在分组设置中关闭
- 修复 GetByKeyForAuth 遗漏查询 mcp_xml_inject 字段导致认证缓存值始终为 false 的问题
2026-01-27 13:09:56 +08:00
song 66f49b67d6 feat(accounts): 账号列表显示 Antigravity scope 级别限流状态
- 后端 DTO 新增 scope_rate_limits 字段,从 extra 提取限流信息
- 前端状态列显示 scope 级限流徽章(Claude/Gemini/Image)
- 清除速率限制时同时清除账号级和 scope 级限流(已有实现)
2026-01-27 11:04:41 +08:00
song 08d6dc5227 feat(ops): 运维界面展示 Antigravity 账号 scope 级别限流统计
在运维监控的并发/排队卡片中,为 Antigravity 平台账号显示各 scope
(claude/gemini_text/gemini_image) 的限流数量统计,便于管理员了解
哪些 scope 正在被限流。
2026-01-27 09:34:10 +08:00
song 7cea6b6fc9 feat(gemini): 为 Gemini 原生平台添加图片计费支持
对齐 Antigravity 平台的图片计费逻辑:
- 添加 extractImageSize() 方法提取图片尺寸
- Forward() 和 ForwardNative() 返回 ImageCount/ImageSize
- 支持分组自定义图片价格和倍率
2026-01-27 00:33:48 +08:00
song 4b57e80e6a fix: jsonb_set 嵌套路径无法创建多层 key 的问题
PostgreSQL jsonb_set 在 create_if_missing=true 时无法一次性创建多层嵌套路径。
例如设置 {antigravity_quota_scopes,gemini_image} 时,如果 antigravity_quota_scopes 不存在,
jsonb_set 不会自动创建外层 key,导致更新静默失败(affected=1 但数据未变)。

修复方案:嵌套两次 jsonb_set,先确保外层 key 存在,再设置内层值。

影响范围:
- SetAntigravityQuotaScopeLimit: Antigravity 平台按模型 scope 限流
- SetModelRateLimit: Anthropic 平台 Sonnet 模型限流
2026-01-26 23:40:48 +08:00
song 0059a232a6 feat(gemini): 为 Gemini 原生平台添加图片计费支持
对齐 Antigravity 平台的图片计费逻辑:
- 添加 extractImageSize() 方法提取图片尺寸
- Forward() 和 ForwardNative() 返回 ImageCount/ImageSize
- 支持分组自定义图片价格和倍率
2026-01-26 20:51:40 +08:00
song e316a923d4 fix(ops): count failover kinds with suffix 2026-01-24 01:14:44 +08:00
song fd0370c07a Add invalid-request fallback routing 2026-01-23 22:24:46 +08:00
song 316f2fee21 feat(ops): add account switch metrics and trend 2026-01-23 19:39:48 +08:00
song 3002c7a17f Clamp Claude maxOutputTokens to 64000 2026-01-23 10:44:21 +08:00
song 207e09500a feat(antigravity): 支持按模型类型配置重试次数
新增环境变量:
- GATEWAY_ANTIGRAVITY_MAX_RETRIES_CLAUDE
- GATEWAY_ANTIGRAVITY_MAX_RETRIES_GEMINI_TEXT
- GATEWAY_ANTIGRAVITY_MAX_RETRIES_GEMINI_IMAGE

未设置时回退到平台级 GATEWAY_ANTIGRAVITY_MAX_RETRIES
2026-01-21 20:48:36 +08:00
song 52c745bc62 feat: 为 Antigravity 平台启用拦截预热请求功能 2026-01-21 20:40:45 +08:00
song 3a31fa4768 fix: 429 限流时更新账号 last_used_at
在设置限流标记时同时更新 last_used_at,使得刚触发 429 的账号
在后续调度中优先级降低,让其他账号有更多被选中的机会。
2026-01-21 11:50:38 +08:00
song 549c134bb8 chore: gofmt antigravity gateway service 2026-01-20 19:16:43 +08:00
song d206721fc1 feat: make antigravity max retries configurable 2026-01-20 19:12:19 +08:00
song 64795a03e3 新增账号凭证邮箱查询接口 2026-01-20 14:17:10 +08:00
song 86d63f919d feat(antigravity): 支持秒级 fallback 冷却时间 2026-01-20 11:38:40 +08:00
song c43aa22cdb feat(antigravity): 支持按映射模型计费 2026-01-20 11:02:08 +08:00
song d1a6303e49 fix(antigravity): 修复 Claude 非流式响应丢失 2026-01-20 00:52:27 +08:00
song c115c9e048 fix: address lint errors 2026-01-18 01:22:40 +08:00
song 6941315432 feat: add antigravity web search support 2026-01-18 01:09:40 +08:00
song 8b071cc665 fix(antigravity): restore signature retry and base order 2026-01-17 22:50:50 +08:00
song 959f6c538a fix(antigravity): remove thinking sanitation 2026-01-17 22:21:48 +08:00
song 217b3b59c0 fix(antigravity): drop MarkUnavailable 2026-01-17 21:59:32 +08:00
song ec916a3197 fix(antigravity): remove signature retry 2026-01-17 21:56:57 +08:00
song 22eb72e0f9 fix(antigravity): restore url fallback behavior 2026-01-17 21:50:09 +08:00
song 07ba64c666 fix(antigravity): handle url-level 429 without failover 2026-01-17 21:37:32 +08:00
song f22bc59fe3 fix(antigravity): route signature retry through url fallback 2026-01-17 21:15:33 +08:00
song 0ce8666cc0 Revert "Revert "fix(antigravity): Claude 模型透传 tool_use 的 signature""
This reverts commit 5427a9e422.
2026-01-17 21:09:59 +08:00
song 5427a9e422 Revert "fix(antigravity): Claude 模型透传 tool_use 的 signature"
This reverts commit 81b865b89d.
2026-01-17 20:41:06 +08:00
song 5e9f5efbe3 chore: log antigravity signature retry 429 2026-01-17 18:22:53 +08:00
song a7a0017aa8 chore: gofmt antigravity gateway service 2026-01-17 18:22:43 +08:00
song 9078b17a41 test: add antigravity rate limit coverage 2026-01-17 18:15:45 +08:00
song 14a3694a9a chore: set antigravity fallback cooldown default to 1 2026-01-17 18:03:45 +08:00
song b9b4db3df5 Merge upstream/main 2026-01-17 18:00:07 +08:00
song 5a6f60a954 fix(antigravity): 区分 URL 级别和账户配额级别的 429 限流
- "Resource has been exhausted" → URL 级别限流,立即切换 URL
- "exhausted your capacity on this model" → 账户配额限流,重试 3 次(指数退避)后标记限流
2026-01-17 11:11:18 +08:00
song 31933c8a60 fix: 删除未使用的字段修复 lint 错误 2026-01-17 10:40:28 +08:00
song 78bccd032d refactor(antigravity): 提取公共重试循环函数减少重复代码
- 新增 antigravityRetryLoop 函数统一处理 Forward 和 ForwardGemini 的重试逻辑
- 429 日志增加 base_url 字段便于调试
- 删除重复的 shouldRetryUpstreamError 方法
2026-01-17 10:28:31 +08:00
song ac7503d95f fix(antigravity): 429 时也切换 URL 重试
- 429 优先切换到下一个 URL 重试
- 只有所有 URL 都返回 429 时才限流账户并返回错误
- 与 client.go 中的逻辑保持一致
2026-01-17 02:14:57 +08:00
song 69c4b17a9b feat(antigravity): 动态 URL 排序,最近成功的优先使用
- URLAvailability 新增 lastSuccess 字段追踪最近成功的 URL
- GetAvailableURLs 返回列表时优先放置 lastSuccess
- 所有 Antigravity API 调用成功后调用 MarkSuccess 更新优先级
2026-01-17 01:54:14 +08:00
song cc0fca35ec feat(antigravity): 同步 Antigravity-Manager 的请求逻辑
- System Prompt: 改为简短版,添加 OpenCode 过滤、MCP XML 协议注入、SYSTEM_PROMPT_END 标记
- HTTP Headers: 只保留 Content-Type/Authorization/User-Agent,移除 Accept 和 Host
- User-Agent: 改为 antigravity/1.11.9 windows/amd64
- requestType: 动态判断 (agent/web_search/image_gen)
- BaseURLs: 添加 daily sandbox 备用 URL
- Fallback: 扩展触发条件 (429/408/404/5xx)
2026-01-17 01:49:42 +08:00
song 1be3eacad5 feat(scheduling): 兜底层账户选择策略可配置
- gateway.scheduling.fallback_selection_mode: "last_used"(默认) 或 "random"
- last_used: 按最后使用时间排序(轮询效果)
- random: 同优先级内随机选择
2026-01-16 20:47:07 +08:00
song 34d6b0a601 feat(gateway): 账户切换次数和 Antigravity 限流时间可配置
- gateway.max_account_switches: 账户切换最大次数,默认 10
- gateway.max_account_switches_gemini: Gemini 账户切换次数,默认 3
- gateway.antigravity_fallback_cooldown_minutes: Antigravity 429 fallback 限流时间,默认 5 分钟
- Antigravity 429 不再重试,直接标记账户限流
2026-01-16 20:18:30 +08:00
song 2055a60bcb fix(antigravity): 429 重试3次后限流账户
- 收到429后重试最多3次(指数退避)
- 3次都失败后调用 handleUpstreamError 限流账户
- 移除无效的 URL fallback 逻辑(当前只有一个URL)
2026-01-16 18:51:07 +08:00
song cc892744bc fix(antigravity): 429 fallback 改为 5 分钟并限流整个账户
- fallback 时间从 1 分钟改为 5 分钟
- fallback 时直接限流整个账户而非仅限制 quota scope
2026-01-16 18:09:34 +08:00
song fba3d21a35 fix: 使用 Contains 匹配 missing_project_id 并修复测试 mock 2026-01-16 14:18:12 +08:00
song 455576300c fix(antigravity): 使用 Contains 匹配 missing_project_id 错误信息 2026-01-16 14:03:25 +08:00
song 821968903c feat(antigravity): 手动刷新令牌时自动恢复 missing_project_id 错误账户状态
- 当手动刷新成功获取到 project_id,且之前错误为 missing_project_id 时,自动清除错误状态
- 后台自动刷新时同样支持状态恢复
2026-01-16 13:18:00 +08:00
song 95fe1e818f fix: Antigravity 刷新 token 时检测 project_id 缺失
- 刷新 token 后调用 LoadCodeAssist 获取 project_id
- 如果获取失败,保留原有 project_id,标记账户为 error
- token 仍会正常更新,不影响凭证刷新
- 错误信息:账户缺少project id,可能无法使用Antigravity
2026-01-16 12:13:54 +08:00
song a61042bca0 fix: Antigravity project_id 获取优化
- API URL 改为只使用 prod 端点
- 刷新 token 时每次调用 LoadCodeAssist 更新 project_id
- 移除随机生成 project_id 的兜底逻辑
2026-01-16 11:57:14 +08:00
song b4abfae4de fix: Antigravity 测试连接使用最小 token 消耗
- buildGeminiTestRequest: 输入 "." + maxOutputTokens: 1
- buildClaudeTestRequest: 输入 "." + MaxTokens: 1
- buildGenerationConfig: 支持透传 MaxTokens 参数
2026-01-16 10:31:55 +08:00
song 9a22d1a690 refactor: 提取 getOrCreateGeminiParts 减少重复代码
将两个 merge 函数中重复的 Gemini 响应结构访问逻辑提取为公共函数。
2026-01-13 13:25:55 +08:00
song c9d21d53e6 fix: 修复 Antigravity 非流式响应文本丢失问题
Gemini 流式响应是增量的,需要累积所有 chunk 的文本内容。
原代码只保留最后一个有 parts 的 chunk,导致实际文本被空
text + thoughtSignature 的最终 chunk 覆盖。

添加 collectedTextParts 收集所有文本片段,返回前合并。
2026-01-13 13:04:03 +08:00
song e1015c2759 fix: 修复 Antigravity 图片生成响应丢失问题
流式转非流式时,图片数据在中间 chunk 返回,最后一个 chunk 只有
finishReason,导致只保留最后 chunk 时图片丢失。

添加 collectedImageParts 收集所有图片 parts,并在返回前合并。
2026-01-13 12:58:05 +08:00
song f0ece82111 feat: 在 dashboard 右上角添加文档链接 2026-01-12 17:01:57 +08:00
Song SiyuandGitHub 7d1fe818be feat: antigravity 配额域限流 + SSE 上限 (#222)
* fix: 添加 gemini-3-flash 前缀映射支持 gemini-3-flash-preview

* feat(antigravity): 增强请求参数和注入 Antigravity 身份 system prompt

* feat: antigravity 配额域限流

* chore: 调整 SSE 单行上限到 25MB

* chore: 提升 SSE 单行上限到 40MB
2026-01-09 22:00:14 +08:00
song 11bfc807d7 merge upstream/main 2026-01-09 21:37:27 +08:00
song c2a6ca8d3a chore: 提升 SSE 单行上限到 40MB 2026-01-09 20:57:06 +08:00
song 7b1cf2c495 chore: 调整 SSE 单行上限到 25MB 2026-01-09 20:47:13 +08:00
song da1f3d61be feat: antigravity 配额域限流 2026-01-09 17:35:02 +08:00
song dc3cd62125 Merge remote-tracking branch 'upstream/main' 2026-01-08 22:52:18 +08:00
song bc404d4fc1 merge: 合并 upstream/main 使用上游版本解决冲突 2026-01-08 18:01:29 +08:00
song a4a0c0e2cc feat(antigravity): 增强请求参数和注入 Antigravity 身份 system prompt 2026-01-08 13:07:20 +08:00
song c7abfe67b5 Merge remote-tracking branch 'upstream/main' 2026-01-08 12:17:56 +08:00
song 4e3476a669 fix: 添加 gemini-3-flash 前缀映射支持 gemini-3-flash-preview 2026-01-06 15:09:21 +08:00
song 195e227c04 merge: 合并 upstream/main 并保留本地图片计费功能 2026-01-06 10:49:26 +08:00
song 6fa704d6fc fix: Antigravity 账户刷新 token 500 错误
AccountHandler.Refresh 方法缺少对 Antigravity 平台的处理分支,
导致刷新时错误地走进 Claude 刷新逻辑。
2026-01-05 18:29:37 +08:00
song 0400fcdca4 fix: 更新 API 合同测试,添加 image_count 和 image_size 字段 2026-01-05 17:31:23 +08:00
song 5b1907fe61 fix: 图片计费代码审查问题修复
- isImageGenerationModel 改为精确匹配/前缀匹配,避免误匹配
- 新增 normalizePrice 函数,支持负数清除价格配置
- 更新注释说明 Gemini API 每次请求只生成一张图片
- 添加测试用例验证不会误匹配自定义模型名
2026-01-05 17:14:06 +08:00
song d4c2b723a5 feat: 图片生成计费功能
- 新增 Group 图片价格配置(image_price_1k/2k/4k)
- BillingService 新增 CalculateImageCost 方法
- AntigravityGatewayService 支持识别图片生成模型并按次计费
- UsageLog 新增 image_count 和 image_size 字段
- 前端分组管理支持配置图片价格(antigravity 和 gemini 平台)
- 图片计费复用通用计费能力(余额检查、扣费、倍率、订阅限额)
2026-01-05 17:07:29 +08:00
song 63453fbfa0 style: gofmt 2026-01-04 16:58:51 +08:00
song 50f9272850 feat(antigravity): gemini-2.5-flash-image 转发到 gemini-3-pro-image 2026-01-04 16:53:35 +08:00
song 3932bf0353 fix: 转发失败日志添加账户ID信息 2026-01-04 16:45:11 +08:00
song ce2422324c fix(antigravity): 增加流式读取错误日志的账户信息 2026-01-04 15:59:21 +08:00
song 0aa216915b fix(antigravity): 减少 API 转发最大重试次数至 3 2026-01-04 15:59:21 +08:00
song 60afc7f3ed fix: 恢复 thinking block 处理逻辑
- 修复合并冲突导致的逻辑错误
- Gemini 模型使用 dummy signature
- Claude 模型跳过无 signature 的 thinking block
- 删除未使用的 isValidThoughtSignature 函数
2026-01-04 15:59:21 +08:00
song 1dd3521190 fix(antigravity): 优化 token 刷新错误处理
- 不可重试错误(invalid_grant等)直接标记 error,不重试
- 其他错误仅记录日志,不标记 error(可能是临时网络问题)
- 仅影响 Antigravity 账户,其他平台保持原有逻辑
2026-01-04 15:59:21 +08:00
song 44785a9a8c feat(ci): 支持通过 repository variable 控制 SIMPLE_RELEASE 2026-01-04 15:59:21 +08:00
song e91fba82a8 fix(ci): simple release 也构建前端 2026-01-04 15:59:21 +08:00
song 84d6480b4e fix(ci): simple release 不嵌入前端 2026-01-04 15:59:21 +08:00
song c0e296f4a9 feat(ci): 增加 SIMPLE_RELEASE 参数支持简化发布 2026-01-04 15:59:21 +08:00
song 0dc4b113d8 fix(antigravity): 统一转发日志格式,添加 session_id 追踪 2026-01-04 15:59:21 +08:00
song c8e55ab2ac fix: 移除 antigravity 模块中的 [Debug] 日志
这些调试日志不应在生产环境中输出。
2026-01-04 15:59:21 +08:00
song fb9930004c ci: DockerHub 配置可选,未配置时自动跳过 2026-01-04 15:59:21 +08:00
song d2aaf0b491 refactor(service): 将 AccountUsageService 的包级缓存改为依赖注入 2026-01-03 13:10:43 +08:00
song 0452f32003 feat(antigravity): 支持 Gemini cachedContentTokenCount 映射到 Claude cache_read_input_tokens
- 在 GeminiUsageMetadata 添加 CachedContentTokenCount 字段
- 修正 token 映射:Gemini promptTokenCount 包含缓存,Claude input_tokens 不包含
- 流式和非流式响应均已支持
2026-01-03 01:26:18 +08:00