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 |
|