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 |
|
shaw
|
34415db7ed
|
fix: 修复 api_contract_test 缺少 SessionLimitCache 参数的问题
|
2026-01-16 23:53:54 +08:00 |
|
shaw
|
7379423325
|
feat: 添加5h窗口费用控制和会话数量限制
- 支持Anthropic OAuth/SetupToken账号的5h窗口费用阈值控制
- 支持账号级别的并发会话数量限制
- 使用Redis缓存窗口费用(30秒TTL)减少数据库压力
- 费用计算基于标准费用(不含账号倍率)
|
2026-01-16 23:36:52 +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 |
|
Wesley Liddick
|
04811c00cb
|
Merge pull request #313 from mt21625457/main
fix(ci): 修复各类bug
|
2026-01-16 19:30:07 +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 |
|
longgexx
|
577ee16108
|
Merge branch 'main' of github.com:longgexx/sub2api
|
2026-01-16 17:35:44 +08:00 |
|
longgexx
|
392a8ac7ea
|
修复格式问题。
|
2026-01-16 17:35:17 +08:00 |
|
longgexx
|
226920064b
|
Merge branch 'Wei-Shaw:main' into main
|
2026-01-16 17:26:54 +08:00 |
|
longgexx
|
19865b865f
|
feat(group): 添加分组级别模型路由配置功能
支持为分组配置模型路由规则,可以指定特定模型模式优先使用的账号列表。
- 新增 model_routing 字段存储路由配置(JSONB格式,支持通配符匹配)
- 新增 model_routing_enabled 字段控制是否启用路由
- 更新后端 handler/service/repository 支持路由配置的增删改查
- 更新前端 GroupsView 添加路由配置界面
- 添加数据库迁移脚本 040/041
|
2026-01-16 17:26:05 +08:00 |
|
yangjianbo
|
e3f812c2fe
|
fix(安全): CSP 策略自动增强,无需配置文件修改即可生效
- 添加 enhanceCSPPolicy() 自动增强任何 CSP 策略
- 自动添加 nonce 占位符(如果策略中没有)
- 自动添加 Cloudflare Insights 域名
- 即使配置文件使用旧策略也能正常工作
- 添加 enhanceCSPPolicy 和 addToDirective 单元测试
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-16 17:20:39 +08:00 |
|
yangjianbo
|
c9f79dee66
|
feat(安全): 实现 CSP nonce 支持解决内联脚本安全问题
- 添加 GenerateNonce() 生成加密安全的随机 nonce
- SecurityHeaders 中间件为每个请求生成唯一 nonce
- CSP 策略支持 __CSP_NONCE__ 占位符动态替换
- embed_on.go 注入的内联脚本添加 nonce 属性
- 添加 Cloudflare Insights 域名到 CSP 允许列表
- 添加完整单元测试,覆盖率达到 89.8%
解决的问题:
- 内联脚本违反 CSP script-src 指令
- Cloudflare Insights beacon.min.js 加载被阻止
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-16 17:05:49 +08:00 |
|
yangjianbo
|
aeb987ceb1
|
Merge branch 'dev'
|
2026-01-16 15:35:38 +08:00 |
|
yangjianbo
|
fe71ee57b3
|
fix(定时轮): 初始化失败返回错误并补充单测
- NewTimingWheelService 改为返回 error,避免 panic
- ProvideTimingWheelService 透传 error 并更新 wire 生成代码
- 补充定时任务调度/取消/周期任务相关单元测试
|
2026-01-16 15:25:33 +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 |
|
wfunc
|
452fa53c0d
|
feat: Claude Sonnet 429 仅限模型限流
|
2026-01-16 13:03:04 +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 |
|
Wesley Liddick
|
c02c8646a6
|
Merge pull request #304 from IanShaw027/feature/codex-tool-correction
feat(openai): 添加Codex工具调用自动修正功能
|
2026-01-16 08:50:11 +08:00 |
|
Wesley Liddick
|
3ff2ca8d41
|
Merge pull request #303 from IanShaw027/feature/ops-account-health-score
feat(ops): 运维监控功能增强与优化
|
2026-01-16 08:49:52 +08:00 |
|
IanShaw027
|
415840088e
|
fix(lint): 修复剩余的errcheck错误
修复了测试文件中剩余的6处类型断言未检查错误:
- 第115-118行:choices.message.tool_calls 的类型断言链
- 第140和145行:multiple tool calls 测试的类型断言
- 第343和345行:ComplexSSEData 测试的类型断言
**修复模式:**
所有类型断言都改为使用 ok 检查:
```go
// 修复前
choices := payload["choices"].([]any)
// 修复后
choices, ok := payload["choices"].([]any)
if !ok || len(choices) == 0 {
t.Fatal("No choices found in result")
}
```
**测试验证:**
- ✅ TestCorrectToolCallsInSSEData - 所有子测试通过
- ✅ TestComplexSSEData - 通过
- ✅ TestCorrectToolParameters - 通过
- ✅ 所有类型断言都有 ok 检查
- ✅ 添加了数组长度验证
现在所有 errcheck 错误都已修复。
|
2026-01-16 00:14:19 +08:00 |
|
IanShaw027
|
c4f6c89b65
|
fix(lint): 修复golangci-lint检查发现的问题
修复了4个lint问题:
1. errcheck (3处): 在测试中添加类型断言的ok检查
2. govet copylocks (1处): 将mutex从ToolCorrectionStats移到CodexToolCorrector
**详细修改:**
1. **openai_tool_corrector_test.go**
- 添加了类型断言的ok检查,避免panic
- 在解析JSON后检查payload结构的有效性
- 改进错误处理和测试可靠性
2. **openai_tool_corrector.go**
- 将sync.RWMutex从ToolCorrectionStats移到CodexToolCorrector
- 避免在GetStats()返回时复制mutex
- 保持线程安全的同时符合Go最佳实践
**测试验证:**
- 所有单元测试通过 ✅
- go vet 检查通过 ✅
- 代码编译正常 ✅
|
2026-01-16 00:02:22 +08:00 |
|
IanShaw027
|
539b41f421
|
feat(openai): 添加Codex工具调用自动修正功能
实现了完整的Codex工具调用拦截和自动修正系统,解决OpenCode使用Codex模型时的工具调用兼容性问题。
**核心功能:**
1. **工具名称自动映射**
- apply_patch/applyPatch → edit
- update_plan/updatePlan → todowrite
- read_plan/readPlan → todoread
- search_files/searchFiles → grep
- list_files/listFiles → glob
- read_file/readFile → read
- write_file/writeFile → write
- execute_bash/executeBash/exec_bash/execBash → bash
2. **工具参数自动修正**
- bash: 自动移除不支持的 workdir/work_dir 参数
- edit: 自动将 path 参数重命名为 file_path
- 支持 JSON 字符串和对象两种参数格式
3. **流式响应集成**
- 在 SSE 数据流中实时修正工具调用
- 支持多种 JSON 结构(tool_calls, function_call, delta, choices等)
- 不影响响应性能和用户体验
4. **统计和监控**
- 记录每次工具修正的详细信息
- 提供修正统计数据查询
- 便于问题排查和性能优化
**实现文件:**
- `openai_tool_corrector.go`: 工具修正核心逻辑(250行)
- `openai_tool_corrector_test.go`: 完整的单元测试(380+行)
- `openai_gateway_service.go`: 流式响应集成
- `openai_gateway_service_tool_correction_test.go`: 集成测试
**测试覆盖:**
- 工具名称映射测试(18个映射规则)
- 参数修正测试(bash workdir、edit path等)
- SSE数据修正测试(多种JSON结构)
- 统计功能测试
- 所有测试通过 ✅
**解决的问题:**
修复了 OpenCode 使用 sub2api 中转 Codex 时,因工具名称和参数不兼容导致的工具调用失败问题。
Codex 模型有时会忽略指令文件中的工具映射说明,导致调用不存在的工具(如 apply_patch)。
现在通过流式响应拦截,自动将错误的工具调用修正为 OpenCode 兼容的格式。
**参考文档:**
- OpenCode 工具规范: https://opencode.ai/docs/
- Codex Bridge 指令: backend/internal/service/prompts/codex_opencode_bridge.txt
|
2026-01-15 23:52:50 +08:00 |
|
IanShaw027
|
b2ff326ced
|
fix(ops): 调整健康分数权重以修复CI测试
- 将业务健康和基础设施健康的权重从80/20调整为70/30
- 使基础设施故障(DB/Redis)对总分影响更明显
- 修复三个失败的测试用例:
* DB故障: 92→88 (期望70-90)
* Redis故障: 96→94 (期望85-95)
* 业务降级: 82→84.5 (期望84-85)
|
2026-01-15 23:02:15 +08:00 |
|
IanShaw027
|
23aa69f56f
|
refactor(ops): 优化任务心跳和组件刷新机制
后端改动:
- 添加 ops_job_heartbeats.last_result 字段记录任务执行结果
- 优化告警评估器统计信息(规则数/事件数/邮件数)
- 统一各定时任务的心跳记录格式
前端改动:
- 重构 OpsConcurrencyCard 使用父组件统一控制刷新节奏
- 移除独立的 5 秒刷新定时器,改用 refreshToken 机制
- 修复 TypeScript 类型错误
|
2026-01-15 21:31:55 +08:00 |
|
IanShaw027
|
93b5b7474b
|
refactor(ops): 调整健康得分权重
- 业务健康权重从 70% 提升到 80%
- 基础设施健康权重从 30% 降低到 20%
- 更加关注业务指标(SLA、错误率等)对整体健康的影响
|
2026-01-15 19:50:02 +08:00 |
|
yangjianbo
|
f862ddc9ff
|
style: 修复 gofmt 格式化问题
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-15 19:42:18 +08:00 |
|
程序猿MT
|
b59032304c
|
Merge branch 'Wei-Shaw:main' into main
|
2026-01-15 19:34:11 +08:00 |
|
yangjianbo
|
5b37e9aea4
|
fix(OAuth缓存): 修复缓存键冲突、401强制刷新及Redis降级处理
- Gemini 缓存键统一增加 gemini: 前缀,避免与其他平台命名空间冲突
- OAuth 账号 401 错误时设置 expires_at=now 并持久化,强制下次请求刷新 token
- Redis 锁获取失败时降级为无锁刷新,仅在 token 接近过期时执行,并检查 ctx 取消状态
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-15 19:08:07 +08:00 |
|
yangjianbo
|
1820389a05
|
feat(网关): 引入 OpenAI/Claude OAuth token 缓存
新增 OpenAI/Claude TokenProvider 与缓存键生成
扩展 OAuth 缓存失效覆盖更多平台
统一 OAuth 缓存前缀与依赖注入
|
2026-01-15 18:27:06 +08:00 |
|
shaw
|
5f890e85e7
|
Merge PR #296: OAuth token cache invalidation on 401 and refresh
|
2026-01-15 16:31:37 +08:00 |
|
LLLLLLiulei
|
aab44f9fc8
|
feat: add proxy geo location
|
2026-01-15 15:15:20 +08:00 |
|
yangjianbo
|
90bce60b85
|
feat: merge dev
|
2026-01-15 15:14:44 +08:00 |
|
yangjianbo
|
a458e684bc
|
fix(认证): OAuth 401 直接标记错误状态
- OAuth 401 清理缓存并设置错误状态
- 移除 oauth_401_cooldown_minutes 配置及示例
- 更新 401 相关单测
破坏性变更: OAuth 401 不再临时不可调度,需手动恢复
|
2026-01-15 15:06:34 +08:00 |
|
LLLLLLiulei
|
87b4662993
|
Revert "feat: add proxy geo location"
This reverts commit 09c4f82927ddce1c9528c146a26457f53d02b034.
|
2026-01-15 15:01:50 +08:00 |
|