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
f862ddc9ff
style: 修复 gofmt 格式化问题
...
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-15 19:42:18 +08:00
yangjianbo
1820389a05
feat(网关): 引入 OpenAI/Claude OAuth token 缓存
...
新增 OpenAI/Claude TokenProvider 与缓存键生成
扩展 OAuth 缓存失效覆盖更多平台
统一 OAuth 缓存前缀与依赖注入
2026-01-15 18:27:06 +08:00
yangjianbo
90bce60b85
feat: merge dev
2026-01-15 15:14:44 +08:00
ianshaw
25b00abca1
fix(网关): 修复账号选择中的调度器快照延迟问题
...
## 问题描述
调度器快照更新存在0.5-1秒的延迟(Outbox轮询间隔),导致在账号被限流或过载后的短时间窗口内,
可能仍会被选中,造成请求失败。
## 根本原因
账号选择逻辑依赖调度器快照(listSchedulableAccounts),但快照更新有延迟:
- Outbox轮询: 每1秒检查一次变更事件
- 全量重建: 每300秒重建一次
- 时间窗口: 账号状态变更后0.5-1秒内,快照可能未更新
## 解决方案
在账号选择循环中添加IsSchedulable()实时检查,作为第二道防线:
1. 第一道防线: 调度器快照过滤(可能有延迟)
2. 第二道防线: IsSchedulable()实时检查(本次修复)
IsSchedulable()会检查:
- RateLimitResetAt: 限流重置时间
- OverloadUntil: 过载持续时间
- TempUnschedulableUntil: 临时不可调度时间
- Status: 账号状态
- Schedulable: 可调度标志
## 修改范围
### OpenAI Gateway Service
- SelectAccountForModelWithExclusions: 添加IsSchedulable()检查
- SelectAccountWithLoadAwareness: 添加IsSchedulable()检查
### Gateway Service (Claude/Gemini/Antigravity)
- 负载感知选择候选账号筛选: 添加IsSchedulable()检查
- selectAccountForModelWithPlatform: 添加IsSchedulable()检查
- selectAccountWithMixedScheduling: 添加IsSchedulable()检查
### 测试用例
- OpenAI: 添加2个测试用例验证限流账号过滤
- Gateway: 添加2个测试用例验证限流和过载账号过滤
### 其他修复
- ops_repo_preagg.go: 修复platform为NULL时的聚合问题
## 测试结果
所有单元测试通过 ✅
2026-01-13 22:49:26 -08:00
Wesley Liddick
0df7385c4e
Merge pull request #226 from xilu0/main
...
feat(gateway): 优化 Antigravity/Gemini 思考块处理 此提交解决了思考块 (thinking blocks) 在转发过程中的兼容性问题
2026-01-13 09:39:43 +08:00
xiluo
524d80ae1c
feat(gateway): 优化 Antigravity/Gemini 思考块处理
...
此提交解决了思考块 (thinking blocks) 在转发过程中的兼容性问题。
主要变更:
1. **思考块优化 (Thinking Blocks)**:
- 在 AntigravityGatewayService 中增加了 sanitizeThinkingBlocks 处理,强制移除思考块中不支持的 cache_control 字段(避免 Anthropic/Vertex AI 报错)
- 实现历史思考块展平 (Flattening):将非最后一条消息中的思考块转换为普通文本块,以绕过上游对历史思考块签名的严格校验
- 增加 cleanCacheControlFromGeminiJSON 作为最后一道防线,确保转换后的 Gemini 请求中不残留非法的 cache_control
2. **GatewayService 缓存控制优化**:
- 更新缓存控制逻辑,跳过 thinking 块(thinking 块不支持 cache_control 字段)
- 增加 removeCacheControlFromThinkingBlocks 函数强制清理
关联 Issue: #225
2026-01-12 13:36:59 +00:00
yangjianbo
2db34139f0
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-12 14:50:53 +08:00
yangjianbo
3141aa5144
feat(scheduler): 引入调度快照缓存与 outbox 回放
...
- 调度热路径优先读 Redis 快照,保留分组排序语义
- outbox 回放 + 全量重建纠偏,失败重试不推进水位
- 自动 Atlas 基线对齐并同步调度配置示例
2026-01-12 14:19:06 +08:00
ianshaw
2a0758bdfe
feat(gateway): 添加流超时处理机制
...
- 添加 StreamTimeoutSettings 配置结构体和系统设置
- 实现 TimeoutCounterCache Redis 计数器用于累计超时次数
- 在 RateLimitService 添加 HandleStreamTimeout 方法
- 在 gateway_service、openai_gateway_service、antigravity_gateway_service 中调用超时处理
- 添加后端 API 端点 GET/PUT /admin/settings/stream-timeout
- 添加前端配置界面到系统设置页面
- 支持配置:启用开关、超时阈值、处理方式、暂停时长、触发阈值、阈值窗口
默认配置:
- 启用:true
- 超时阈值:60秒
- 处理方式:临时不可调度
- 暂停时长:5分钟
- 触发阈值:3次
- 阈值窗口:10分钟
2026-01-11 21:54:52 -08:00
IanShaw027
7ebca553ef
feat(ops): 实现上游错误事件记录与查询功能
...
**新增功能**:
- 新建ops_upstream_error_events表存储上游服务错误详情
- 支持记录上游429/529/5xx错误的详细上下文信息
- 提供按时间范围查询上游错误事件的API
**后端改动**:
1. 模型层(ops_models.go, ops_port.go):
- 新增UpstreamErrorEvent结构体
- 扩展Repository接口支持上游错误事件CRUD
2. 仓储层(ops_repo.go):
- 实现InsertUpstreamErrorEvent写入上游错误
- 实现GetUpstreamErrorEvents按时间范围查询
3. 服务层(ops_service.go, ops_upstream_context.go):
- ops_service: 新增GetUpstreamErrorEvents查询方法
- ops_upstream_context: 封装上游错误上下文构建逻辑
4. Handler层(ops_error_logger.go):
- 新增GetUpstreamErrorsHandler处理上游错误查询请求
5. Gateway层集成:
- antigravity_gateway_service.go: 429/529错误时记录上游事件
- gateway_service.go: OpenAI 429/5xx错误时记录
- gemini_messages_compat_service.go: Gemini 429/5xx错误时记录
- openai_gateway_service.go: OpenAI 429/5xx错误时记录
- ratelimit_service.go: 429限流错误时记录
**数据记录字段**:
- request_id: 关联ops_logs主记录
- platform/model: 上游服务标识
- status_code/error_message: 错误详情
- request_headers/response_body: 调试信息(可选)
- created_at: 错误发生时间
2026-01-11 15:30:27 +08:00
IanShaw027
89a725a433
feat(ops): 添加QPS脉搏线图并优化指标布局
...
- 添加实时QPS/TPS历史数据追踪(最近60个数据点)
- 在平均QPS/TPS上方添加SVG脉搏线图(sparkline)
- 将延迟和TTFT卡片的指标布局从2列改为3列
- 恢复Max指标显示(P95/P90/P50/Avg/Max)
2026-01-11 11:49:34 +08:00
yangjianbo
6a9cc13e3e
fix(网关): 明确粘性命中范围并优化映射构建
...
仅在粘性命中时构建候选账号映射以减少开销
新增用例验证粘性账号缺失时回退负载感知选择
2026-01-10 14:51:16 +08:00
yangjianbo
7a0ca05233
perf(网关): 粘性会话命中复用候选账号
...
使用候选账号映射避免粘性命中时额外的 GetByID 查询
新增单测确保粘性命中不触发 GetByID 且提前返回
2026-01-10 14:39:33 +08:00
yangjianbo
297f08c683
Merge branch 'test' into dev
2026-01-10 09:39:02 +08:00
yangjianbo
72f78f8a56
fix(分组): 强化上下文分组可信校验
...
- 引入 Hydrated 标记限制复用来源
- 无效上下文分组允许被新值覆盖自愈
- 更新相关单测覆盖
2026-01-10 08:40:27 +08:00
yangjianbo
2597fe78ba
fix(分组): 防止降级环并校验上下文分组
...
- 增加降级链路环检测并拦截配置
- 仅复用合法分组上下文并必要时回退查询
- 标注 GetByIDLite 轻量语义并补充测试
2026-01-10 07:56:50 +08:00
yangjianbo
675543240e
perf(网关): 复用分组上下文减少热路径查询
...
新增 GetByIDLite 并在网关与 Gemini 选择流程复用上下文 group,避免 COUNT 触发
更新 API key 中间件注入 group 上下文,减少重复查库
补充 gateway/gemini 中间件与仓库层回归测试
测试: make test
2026-01-09 23:01:42 +08:00
Song Siyu
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
Edric.Li
0a4641c24e
feat(api-key): 添加 IP 白名单/黑名单限制功能 ( #221 )
...
* feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking
- Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
- Add IP address logging to usage logs (admin-only visibility)
- Remove billing_type column from usage logs UI (redundant)
- Use generic "Access denied" error message for security
Backend:
- New ip package with IP/CIDR validation and matching utilities
- Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
- Middleware IP restriction check after API key validation
- Input validation for IP/CIDR patterns on create/update
Frontend:
- API key form with enable toggle for IP restriction
- Shield icon indicator in table for keys with IP restriction
- Removed billing_type filter and column from usage views
* fix: update API contract tests for ip_whitelist/ip_blacklist fields
Add ip_whitelist and ip_blacklist fields to expected JSON responses
in API contract tests to match the new API key schema.
2026-01-09 21:59:32 +08:00
Edric Li
a42105881f
feat(groups): add Claude Code client restriction and session isolation
...
- Add claude_code_only field to restrict groups to Claude Code clients only
- Add fallback_group_id for non-Claude Code requests to use alternate group
- Implement ClaudeCodeValidator for User-Agent detection
- Add group-level session binding isolation (groupID in Redis key)
- Prevent cross-group sticky session pollution
- Update frontend with Claude Code restriction controls
2026-01-08 23:07:00 +08:00
shaw
db6f53e2c9
fix(billing): 修复客户端取消请求时计费丢失问题
...
检测 context.Canceled 作为客户端断开信号,返回已收集的 usage 而非错误
2026-01-08 11:25:17 +08:00
Edric Li
1ada6cf768
feat(usage-log): 增加请求 User-Agent 记录
...
在使用记录中添加 user_agent 字段,用于记录 API 请求的 User-Agent 头信息,
便于分析客户端类型和调试。
变更内容:
- 新增数据库迁移 028_add_usage_logs_user_agent.sql
- 更新 UsageLog 模型和 Ent Schema 添加 user_agent 字段
- 更新 Repository 层的 Create 和 scanUsageLog 方法
- 更新 RecordUsageInput 结构体支持传入 UserAgent
- 更新 Claude/OpenAI/Gemini 三个网关 Handler 传递 UserAgent
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-07 22:49:46 +08:00
shaw
d99a3ef14b
fix(gateway): 修复账号跨分组调度问题
...
问题:账号可能被调度到未分配的分组(如 simon 账号被调度到 claude_default)
根因:
- 强制平台模式下分组查询失败时回退到全平台查询
- listSchedulableAccounts 中分组为空时回退到无分组查询
- 粘性会话只检查平台匹配,未校验账号分组归属
修复:
- 移除强制平台模式的回退逻辑,分组内无账号时返回错误
- 移除 listSchedulableAccounts 的回退逻辑
- 新增 isAccountInGroup 方法用于分组校验
- 在三处粘性会话检查中增加分组归属验证
2026-01-07 10:56:52 +08:00
shaw
6dcd99468b
fix(gateway): 修复 cache_control 块超限问题并优化 Claude Code 检测
...
问题:
- OAuth/SetupToken 账号注入 system prompt 后可能导致 cache_control
块超过 Anthropic API 的 4 个限制
- Claude Code 检测使用精确匹配,无法识别 Agent SDK 等变体
修复:
- 新增 enforceCacheControlLimit 函数,强制执行 4 个块限制
- 优先从 messages 移除,再从 system 尾部移除(保护注入的 prompt)
- 改用前缀匹配检测 Claude Code 系统提示词,支持多种变体:
- 标准版、Agent SDK 版、Explore Agent 版、Compact 版
2026-01-07 10:17:09 +08:00
song
195e227c04
merge: 合并 upstream/main 并保留本地图片计费功能
2026-01-06 10:49:26 +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
yangjianbo
fb313356f7
Merge branch 'main' into test-dev
2026-01-05 14:43:08 +08:00
yangjianbo
048ed061c2
fix(安全): 关闭白名单时保留最小校验与默认白名单
...
实现 allow_insecure_http 并在关闭校验时执行最小格式验证
- 关闭 allowlist 时要求 URL 可解析且 scheme 合规
- 响应头过滤关闭时使用默认白名单策略
- 更新相关文档、示例与测试覆盖
2026-01-05 14:41:08 +08:00
yangjianbo
794a9f969b
feat(安全): 添加安全开关并完善测试流程
...
实现安全开关默认关闭与响应头透传逻辑
- URL 校验与响应头过滤支持开关并覆盖流式路径
- 非流式 Content-Type 透传/默认值按配置生效
- 接入 go test、golangci-lint 与前端 lint/typecheck
- 补充相关测试与配置/文档说明
2026-01-05 13:54:43 +08:00
IanShaw027
06216aad53
fix(backend): 修复 CI 失败问题
...
修复内容:
1. 修复 6 个 golangci-lint 错误
- 3 个 errcheck 错误:在 gateway_request_test.go 中添加类型断言检查
- 3 个 gofmt 格式化问题:修复代码格式
2. 修复 API 契约测试失败
- 在测试中添加缺失的字段:enable_identity_patch 和 identity_patch_prompt
所有测试和 linter 检查现已通过。
2026-01-05 00:56:48 +08:00
IanShaw027
aa6f253374
merge: 合并 upstream/main 并解决冲突
...
解决了以下文件的冲突:
- backend/internal/handler/admin/setting_handler.go
- 采用 upstream 的字段对齐风格和 *Configured 字段名
- 添加 EnableIdentityPatch 和 IdentityPatchPrompt 字段
- backend/internal/handler/gateway_handler.go
- 采用 upstream 的 billingErrorDetails 错误处理方式
- frontend/src/api/admin/settings.ts
- 采用 upstream 的 *_configured 字段名
- 添加 enable_identity_patch 和 identity_patch_prompt 字段
- frontend/src/views/admin/SettingsView.vue
- 合并 turnstile_secret_key_configured 字段
- 保留 enable_identity_patch 和 identity_patch_prompt 字段
2026-01-04 23:17:15 +08:00
IanShaw027
87426e5dda
fix(backend): 改进 thinking/tool block 签名处理和重试策略
...
主要改动:
- request_transformer: thinking block 缺少签名时降级为文本而非丢弃,保留内容并在上层禁用 thinking mode
- antigravity_gateway_service: 新增两阶段降级策略,先处理 thinking blocks,如仍失败且涉及 tool 签名错误则进一步降级 tool blocks
- gateway_request: 新增 FilterSignatureSensitiveBlocksForRetry 函数,支持将 tool_use/tool_result 降级为文本
- gateway_request: 改进 FilterThinkingBlocksForRetry,禁用顶层 thinking 配置以避免结构约束冲突
- gateway_service: 实现保守的两阶段重试逻辑,优先保留内容,仅在必要时降级工具调用
- 新增 antigravity_gateway_service_test.go 测试签名块剥离逻辑
- 更新相关测试用例以验证降级行为
此修复解决了跨平台/账户切换时历史消息签名失效导致的请求失败问题。
2026-01-04 22:32:36 +08:00
yangjianbo
5dd8b8802b
fix(后端): 修复 lint 失败并清理无用代码
...
修正测试中的 APIKey 名称引用
移除不可达返回与未使用函数
统一 gofmt 格式并处理 Close 错误
2026-01-04 22:10:32 +08:00
IanShaw027
7122b3b3b6
fix(backend): 修复 P0/P1 严重安全和稳定性问题
...
P0 严重问题修复:
- 优化重试机制:降至 5 次 + 指数退避 + 10s 上限,防止请求堆积
- 修复 SSE 错误格式:符合 Anthropic API 规范,添加错误类型标准化
P1 重要问题修复:
- 防止 DOS 攻击:使用 io.LimitReader 限制请求体 10MB,流式解析
- 修复计费数据丢失:改为同步计费,使用独立 context 防止中断
技术细节:
- 新增 retryBackoffDelay() 和 sleepWithContext() 支持 context 取消
- 新增 normalizeAnthropicErrorType() 和 sanitizePublicErrorMessage()
- 新增 parseGatewayRequestStream() 实现流式解析
- 新增 recordUsageSync() 确保计费数据持久化
影响:
- 极端场景重试时间从 30s 降至 ≤10s
- 防止高并发 OOM 攻击
- 消除计费数据丢失风险
- 提升客户端兼容性
2026-01-04 21:29:09 +08:00
IanShaw027
d36392b74f
fix(frontend): comprehensive i18n cleanup and Select component hardening
2026-01-04 21:09:14 +08:00
yangjianbo
7dddd06583
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-04 21:06:12 +08:00
yangjianbo
25a0d49af9
chore(合并): 同步主分支变更并解决冲突
...
- 合并 wire/httpclient/http_upstream/proxy_probe 冲突并保留校验逻辑
- 引入 proxyutil 及测试,完善代理配置
- 更新 goreleaser/workflow 与前端细节调整
测试: go test ./...
2026-01-04 20:29:39 +08:00
yangjianbo
7489da49cb
fix(流式): 以上游读取判定超时并调大事件缓冲
...
- 以读取时间戳判定流式间隔超时,避免下游阻塞误判
- antigravity 流式读取使用 MaxLineSize 配置
- 事件通道缓冲提升到 16
测试: go test ./...
2026-01-04 20:19:07 +08:00
yangjianbo
73ffb58518
fix(流式): 提升SSE稳定性并统一超时配置
...
- 扩展SSE行长与间隔超时处理,补充keepalive
- 写入失败与超长行时发送错误事件,修复并发释放
- 同步默认配置与示例配置,更新Caddy超时/压缩规则
- 新增OpenAI流式超时与超长行测试
测试: go test ./...
2026-01-04 19:49:59 +08:00
IanShaw027
a4953785d9
fix(lint): 修复所有 Go 命名规范问题
...
- 全局替换 ApiKey → APIKey(类型、字段、方法、变量)
- 修复所有 initialism 命名(API, SMTP, HTML, URL 等)
- 添加所有缺失的包注释
- 修复导出符号的注释格式
主要修改:
- ApiKey → APIKey(所有出现的地方)
- ApiKeyID → APIKeyID
- ApiKeyIDs → APIKeyIDs
- TestSmtpConnection → TestSMTPConnection
- HtmlURL → HTMLURL
- 添加 20+ 个包注释
- 修复 10+ 个导出符号注释格式
验证结果:
- ✓ golangci-lint: 0 issues
- ✓ 单元测试: 通过
- ✓ 集成测试: 通过
2026-01-04 19:28:20 +08:00
IanShaw027
a8c3dfb0c1
merge: 合并 upstream/main 解决冲突
...
- 接受上游 wire_gen.go 的简化构造函数参数
- 接受上游 account_test_service.go 的优化实现
2026-01-04 17:41:06 +08:00
IanShaw027
a185ad1144
feat(gemini): 完善 Gemini OAuth 配额系统和用量显示
...
主要改动:
- 后端:重构 Gemini 配额服务,支持多层级配额策略(GCP Standard/Free, Google One, AI Studio, Code Assist)
- 后端:优化 OAuth 服务,增强 tier_id 识别和存储逻辑
- 后端:改进用量统计服务,支持不同平台的配额查询
- 后端:优化限流服务,增加临时解除调度状态管理
- 前端:统一四种授权方式的用量显示格式和徽标样式
- 前端:增强账户配额信息展示,支持多种配额类型
- 前端:改进创建和重新授权模态框的用户体验
- 国际化:完善中英文配额相关文案
- 移除 CHANGELOG.md 文件
测试:所有单元测试通过
2026-01-04 15:36:00 +08:00
shaw
d9b1587982
feat(gateway): 实现 Claude Code 系统提示词智能注入
2026-01-04 10:38:13 +08:00
ianshaw
aad4163d22
fix(gateway): 优化 thinking block 重试逻辑
...
- 保留用户的 thinking.type=enabled 设置(不再禁用)
- 只移除历史消息中的 thinking/redacted_thinking blocks
- 处理过滤后空消息:跳过 assistant 消息,user 消息添加占位符
- 增强错误检测:覆盖 signature、Expected thinking、empty content 错误
- 添加重试成功/失败日志便于排查
2026-01-03 18:05:15 -08:00
ianshaw
7eda43c99e
fix(gateway): 完善 thinking block 重试和 cache nil 检查
...
- 使用 FilterThinkingBlocksForRetry 替代 FilterThinkingBlocks
- count_tokens 增加 thinking block 签名错误重试
- cache nil 检查防止空指针
- shouldBill 逻辑修复避免重复扣费
- 移除 debug 日志
2026-01-03 17:10:25 -08:00
ianshaw
519b0b245a
fix(lint): 修复 golangci-lint 检查问题
...
- 格式化代码 (gofmt)
- 修复 rows.Close() 返回值未检查 (errcheck)
- 删除未使用的 usage_clamp.go 文件 (unused)
- 删除临时测试目录
2026-01-03 06:57:08 -08:00
ianshaw
acb718d355
perf(gateway): 优化负载感知调度
...
主要改进:
- 优化负载感知调度的准确性和响应速度
- 将 AccountUsageService 的包级缓存改为依赖注入
- 修复 SSE/JSON 转义和 nil 安全问题
- 恢复 Google One 功能兼容性
2026-01-03 06:32:51 -08:00
yangjianbo
6c86cf7605
Merge branch 'main' into test-dev
2026-01-03 21:38:21 +08:00
yangjianbo
e51a32881b
merge: 合并 test 分支到 test-dev,解决冲突
...
解决的冲突文件:
- wire_gen.go: 合并 ConcurrencyService/CRSSyncService 参数和 userAttributeHandler
- gateway_handler.go: 合并 pkg/errors 和 antigravity 导入
- gateway_service.go: 合并 validateUpstreamBaseURL 和 GetAvailableModels
- config.example.yaml: 合并 billing/turnstile 配置和额外 gateway 选项
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-03 11:36:31 +08:00