Yukuiii
861ad11647
fix: 添加对gpt-5.1模型的提示词判断
2025-11-15 18:08:39 +08:00
shaw
d0f23dac46
fix: 临时剔除tools的input_examples参数引发的bug
2025-11-15 14:41:05 +08:00
zstring
fdded1b8c3
临时修复新版本客户端context_management字段兼容性问题
2025-11-15 11:12:41 +08:00
曾庆雷
47d7a394c9
仅对个人账户调用 tokeninfo/userinfo 接口
...
- 添加 projectId 非空判断,减少对企业账户的影响
- 优化错误日志级别为 warn
2025-11-14 11:17:14 +08:00
曾庆雷
7a6c287a7e
修复标准Gemini API流式响应的缓冲区和解析问题
...
- 新增通用SSE解析器(src/utils/sseParser.js)
- 添加streamBuffer处理TCP数据包分割
- 统一两种API方式的SSE解析逻辑
- 记录解析失败和usage缺失的详细日志
2025-11-14 11:17:14 +08:00
曾庆雷
e130405809
添加tools和toolConfig传递支持
2025-11-14 11:17:14 +08:00
曾庆雷
008c7a2b03
移除thought字段过滤逻辑
2025-11-14 11:17:14 +08:00
曾庆雷
df796a005a
修复handleSimpleEndpoint返回Promise导致的路由错误
2025-11-14 11:17:14 +08:00
曾庆雷
91ad0658a9
实现listExperiments端点和通用转发机制
...
- 添加forwardToCodeAssist通用转发函数支持简单端点
- 添加handleSimpleEndpoint通用路由处理函数
- 注册listExperiments路由(v1internal和v1beta)
- 解决gemini-cli启动时404 Not Found错误
2025-11-12 14:32:45 +08:00
shaw
3525fe5697
fix: 修复codex 客户端问题
2025-11-06 20:24:32 +08:00
sususu
9b15e08624
fix: 请求/v1/messages/count_tokens 的CanceledError 不再被记录为ERROR 日志
2025-11-05 09:47:37 +08:00
sususu98
1458d609ca
feat: 为 Claude Console 账户添加并发控制机制
...
实现了完整的 Claude Console 账户并发任务数控制功能,防止单账户过载,提升服务稳定性。
**核心功能**
- 🔒 **原子性并发控制**: 基于 Redis Sorted Set 实现的抢占式并发槽位管理,防止竞态条件
- 🔄 **自动租约刷新**: 流式请求每 5 分钟自动刷新租约,防止长连接租约过期
- 🚨 **智能降级处理**: 并发满额时自动清理粘性会话并重试其他账户(最多 1 次)
- 🎯 **专用错误码**: 引入 `CONSOLE_ACCOUNT_CONCURRENCY_FULL` 错误码,区分并发限制和其他错误
- 📊 **批量性能优化**: 调度器使用 Promise.all 并行查询账户并发数,减少 Redis 往返
**后端实现**
1. **Redis 并发控制方法** (src/models/redis.js)
- `incrConsoleAccountConcurrency()`: 增加并发计数(带租约)
- `decrConsoleAccountConcurrency()`: 释放并发槽位
- `refreshConsoleAccountConcurrencyLease()`: 刷新租约(流式请求)
- `getConsoleAccountConcurrency()`: 查询当前并发数
2. **账户服务增强** (src/services/claudeConsoleAccountService.js)
- 添加 `maxConcurrentTasks` 字段(默认 0 表示无限制)
- 获取账户时自动查询实时并发数 (`activeTaskCount`)
- 支持更新并发限制配置
3. **转发服务并发保护** (src/services/claudeConsoleRelayService.js)
- 请求前原子性抢占槽位,超限则立即回滚并抛出专用错误
- 流式请求启动定时器每 5 分钟刷新租约
- `finally` 块确保槽位释放(即使发生异常)
- 为每个请求分配唯一 `requestId` 用于并发追踪
4. **统一调度器优化** (src/services/unifiedClaudeScheduler.js)
- 获取可用账户时批量查询并发数(Promise.all 并行)
- 预检查并发限制,避免选择已满的账户
- 检查分组成员时也验证并发状态
- 所有账户并发满额时抛出专用错误码
5. **API 路由降级处理** (src/routes/api.js)
- 捕获 `CONSOLE_ACCOUNT_CONCURRENCY_FULL` 错误
- 自动清理粘性会话映射并重试(最多 1 次)
- 重试失败返回 503 错误和友好提示
- count_tokens 端点也支持并发满额重试
6. **管理端点验证** (src/routes/admin.js)
- 创建/更新账户时验证 `maxConcurrentTasks` 为非负整数
- 支持前端传入并发限制配置
**前端实现**
1. **表单字段** (web/admin-spa/src/components/accounts/AccountForm.vue)
- 添加"最大并发任务数"输入框(创建和编辑模式)
- 支持占位符提示"0 表示不限制"
- 表单数据自动映射到后端 API
2. **实时监控** (web/admin-spa/src/views/AccountsView.vue)
- 账户列表显示并发状态进度条和百分比
- 颜色编码:绿色(<80%)、黄色(80%-100%)、红色(100%)
- 显示"X / Y"格式的并发数(如"2 / 5")
- 未配置限制时显示"并发无限制"徽章
2025-10-21 13:43:57 +08:00
shaw
abef8a4e31
feat: claude账号新增保存claude的uuid
2025-10-19 17:15:31 +08:00
shaw
1ed0ca31ec
fix: 修复因代理ip不可用导致axios的proxy回退到环境变量代理问题
2025-10-18 11:00:43 +08:00
shaw
484689e479
Merge branch 'dev' of github.com:Wei-Shaw/claude-relay-service into dev
2025-10-17 16:32:11 +08:00
shaw
5cff6fdd6d
Merge branch 'new' into dev
2025-10-17 16:26:37 +08:00
shaw
9ed4a344be
fix: 修复gemini转发问题
2025-10-17 16:11:12 +08:00
sususu
b0917b75a4
feat: 新增Claude Console账户临时封禁处理和错误消息清理
...
- 新增 CLAUDE_CONSOLE_BLOCKED_HANDLING_MINUTES 配置项,自动处理账户临时禁用的 400 错误(如 "organization has been disabled"、"too many active sessions" 等)。
- 添加 errorSanitizer 工具模块,自动清理上游错误响应中的供应商特定信息(URL、供应商名称等),避免泄露中转服务商信息。
- 统一调度器现在会主动检查并恢复已过期的封禁账户,确保账户在临时封禁时长结束后可以立即重新使用。
2025-10-17 15:27:47 +08:00
AAEE86
8f58fe6264
feat: 账号使用趋势增加对Droid账户的支持
2025-10-16 23:01:06 +08:00
shaw
2f0839c7da
feat: 合并 PR #578 并接入统一定价服务
2025-10-16 14:12:25 +08:00
shaw
d606cb2e38
fix: 优化模型价格文件更新策略
2025-10-16 10:46:45 +08:00
shaw
472fb535cf
Merge branch 'bottotl/main' into dev
2025-10-15 19:27:13 +08:00
shaw
77124aa501
fix: droid去掉count_tokens端点
2025-10-15 15:50:04 +08:00
jft0m
b886012f97
Merge branch 'Wei-Shaw:main' into main
2025-10-14 22:39:30 +08:00
jft0m
344599f318
refactor: extract intelligent routing to unified.js
...
- Created new src/routes/unified.js (225 lines)
- detectBackendFromModel(): Detects backend from model name
- routeToBackend(): Routes to Claude/OpenAI/Gemini with permission checks
- POST /v1/chat/completions: OpenAI-compatible endpoint with intelligent routing
- POST /v1/completions: Legacy completions endpoint with intelligent routing
- Updated src/routes/api.js (reduced from 1185 to 968 lines)
- Removed ~217 lines of routing logic
- Kept Claude-specific endpoints (/api/v1/messages)
- Maintained all other Claude API functionality
- Updated src/app.js
- Added unifiedRoutes registration at /api prefix
Benefits:
- Single responsibility: api.js focuses on Claude API routes
- Better organization: routing logic isolated in unified.js
- Easier maintenance: changes to routing won't affect Claude code
- File size reduction: api.js reduced by 18%
Tested:
- ✅ Claude model routing via /v1/chat/completions
- ✅ OpenAI model routing (correct backend detection)
- ✅ Gemini model routing (correct backend detection)
- ✅ Legacy /v1/completions endpoint
- ✅ All tests pass, no regressions
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 14:30:23 +00:00
jft0m
e540ec3a52
feat: add intelligent backend routing and model service
...
- Add modelService for centralized model management
- Support dynamic model list from config file (data/supported_models.json)
- Include 2025 latest models: GPT-4.1, o3, o4-mini, Gemini 2.5, etc.
- File watcher for hot-reload configuration changes
- Improve model detection logic in api.js
- Priority: modelService lookup → prefix matching fallback
- Smart backend routing based on model provider
- Add intelligent routing endpoints
- /v1/chat/completions: unified OpenAI-compatible endpoint
- /v1/completions: legacy format support
- Auto-route to Claude/OpenAI/Gemini based on requested model
- Add Xcode system prompt support in openaiToClaude
- Detect and preserve Xcode-specific system messages
- Export handler functions for reuse
- openaiClaudeRoutes: export handleChatCompletion
- openaiRoutes: export handleResponses
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 14:12:44 +00:00
shaw
62aea5a4a8
fix: 修复tokenExpiresAt混淆问题
2025-10-14 19:19:33 +08:00
mrlitong
aaa2bda407
fix: 修复账户过期时间字段映射问题
...
## 问题描述
移除 formatSubscriptionExpiry 函数后,API返回的 expiresAt 字段变成了OAuth token过期时间(通常1小时)
而不是订阅过期时间,导致前端显示错误的过期时间,并可能将短期token过期时间错误保存为订阅过期时间。
## 修复方案
1. 添加 formatAccountExpiry 函数,正确映射字段:
- expiresAt: 映射为 subscriptionExpiresAt(订阅过期时间)供前端使用
- tokenExpiresAt: 保留OAuth token过期时间供内部使用
2. 在所有账户端点应用格式化:
- 所有账户类型的GET端点(Claude, Claude Console, CCR, Bedrock, Gemini, OpenAI等)
- 所有账户类型的POST创建端点
- 错误处理分支也正确格式化
## 影响范围
- 修复了9种账户类型的所有相关端点
- 共应用了28处格式化调用
- 确保前端获取正确的订阅过期时间,而非token过期时间
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 09:26:56 +00:00
mrlitong
1f61478fbc
refactor: 优化账户过期检查逻辑和代码一致性
...
## 主要改进
### 1. 添加缺失的过期检查方法
- 在 `claudeConsoleAccountService` 中添加 `isSubscriptionExpired()` 方法
- 在 `ccrAccountService` 中添加 `isSubscriptionExpired()` 方法
- 与其他 7 个账户服务保持一致的实现方式
### 2. 统一过期检查逻辑
- 重构 `unifiedClaudeScheduler` 中的 5 处手动日期检查代码
- 统一调用服务层的 `isSubscriptionExpired()` 方法
- 消除重复代码,提升可维护性
### 3. 统一字段映射顺序
- 调整 Claude 账户更新端点的 `mapExpiryField()` 调用时机
- 与其他账户类型保持一致的处理顺序
- 提升代码可读性和一致性
## 技术细节
**修改文件**:
- `src/services/claudeConsoleAccountService.js`: 添加 `isSubscriptionExpired()`
- `src/services/ccrAccountService.js`: 添加 `isSubscriptionExpired()`
- `src/services/unifiedClaudeScheduler.js`: 5 处调用统一为服务方法
- `src/routes/admin.js`: 统一字段映射顺序
**改进效果**:
- ✅ 代码一致性提升:所有账户服务统一实现
- ✅ 可维护性提升:过期逻辑集中管理
- ✅ 减少重复代码:消除 4 处重复实现
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 08:35:13 +00:00
mrlitong
cd5df4f76b
Merge remote-tracking branch 'upstream/main' into feature/account-subscription-expiry-check
2025-10-14 08:04:12 +00:00
mrlitong
cbc3a83f11
refactor: 统一账户过期时间字段映射和检查逻辑
...
主要改进:
1. 创建 mapExpiryField() 工具函数统一处理前后端字段映射(expiresAt -> subscriptionExpiresAt)
2. 统一 subscriptionExpiresAt 初始值为 null(替代空字符串)
3. 规范过期检查方法名为 isSubscriptionExpired(),返回 true 表示已过期
4. 优化过期检查条件判断,只检查 null 而非空字符串
5. 补充 OpenAI-Responses 和调度器中缺失的过期检查逻辑
6. 添加代码评审文档记录未修复问题
影响范围:
- 所有 9 种账户服务的过期字段处理
- admin.js 中所有账户更新路由
- 统一调度器的过期账户过滤逻辑
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 08:04:05 +00:00
Wesley Liddick
4b3ffa4136
Merge pull request #561 from AAEE86/new
...
feat: 添加Droid账户API Key管理功能
2025-10-14 14:34:07 +08:00
shaw
d6a9beff2f
feat: 适配新版本gemini
2025-10-14 11:24:27 +08:00
litongtongxue
1e7465e533
feat: 为所有账户服务添加订阅过期检查功能
...
完成账户订阅到期时间功能的核心调度逻辑实现。
## 实现范围
✅ 已添加订阅过期检查的服务(5个):
- Gemini 服务:添加 isSubscriptionExpired() 函数及调度过滤
- OpenAI 服务:添加 isSubscriptionExpired() 函数及调度过滤
- Droid 服务:添加 _isSubscriptionExpired() 方法及调度过滤
- Bedrock 服务:添加 _isSubscriptionExpired() 方法及调度过滤
- Azure OpenAI 服务:添加 isSubscriptionExpired() 函数及调度过滤
## 核心功能
- 账户调度时自动检查 subscriptionExpiresAt 字段
- 过期账户将不再被系统调度使用
- 未设置过期时间的账户视为永不过期(向后兼容)
- 使用 <= 比较判断过期(精确到过期时刻)
- 跳过过期账户时记录 debug 日志便于排查
## 技术实现
- 统一的实现模式:过期检查函数 + 账户选择逻辑集成
- 不影响现有功能,完全向后兼容
- 业务字段 subscriptionExpiresAt 与技术字段 expiresAt(OAuth token过期)独立管理
## 相关文档
参考 account_expire_bugfix.md 了解问题背景和实现细节
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-14 02:42:03 +00:00
AAEE86
1f9afc788b
feat: 添加Droid账户API Key管理功能
...
(cherry picked from commit 0cf3ca6c7eafcf28a2da7e8bfd6814b4883bb752)
2025-10-13 18:24:49 +08:00
shaw
508d9aad1b
fix: 继续修复PR-541引发的系列bug
2025-10-13 08:41:24 +08:00
shaw
a67c34bee1
fix: 修复claude SSE捕获usage问题
2025-10-12 23:05:48 +08:00
shaw
6f6c274877
fix: 继续修复PR-541遗留的系列bug
2025-10-12 22:13:38 +08:00
shaw
40b7c68694
fix: 修复账号过期时间的一系列bug
2025-10-12 18:35:05 +08:00
litongtongxue
c8c337099e
Merge upstream/main into feature/account-expiry-management
...
解决与 upstream/main 的代码冲突:
- 保留账户到期时间 (expiresAt) 功能
- 采用 buildProxyPayload() 函数重构代理配置
- 同步最新的 Droid 平台功能和修复
主要改动:
- AccountForm.vue: 整合到期时间字段和新的 proxy 处理方式
- 合并 upstream 的 Droid 多 API Key 支持等新特性
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-12 00:55:25 +08:00
shaw
6f2307721b
fix: 修复droid账号调度接口404问题
2025-10-11 11:34:13 +08:00
shaw
c56bebdbe5
fix: 修复droid分组调度保存无效的问题
2025-10-11 11:07:05 +08:00
litongtongxue
a82dcebd7b
feat: 添加账户订阅到期时间管理功能
...
## 新增功能
- 支持为 Claude 账户设置订阅到期时间
- 前端提供到期时间选择器(快捷选项 + 自定义日期)
- 账户列表显示到期状态(已过期/即将过期/永不过期)
- 新增独立的到期时间编辑弹窗组件
## 技术变更
- 后端新增 subscriptionExpiresAt 字段存储
- 前端使用 expiresAt 字段进行交互
- 支持创建、编辑、显示完整流程
## 包含文件
- src/routes/admin.js: POST/PUT 端点支持 expiresAt 字段
- src/services/claudeAccountService.js: 存储和返回到期时间
- web/admin-spa/src/components/accounts/AccountForm.vue: 表单添加到期时间选择
- web/admin-spa/src/views/AccountsView.vue: 列表显示和编辑功能
- web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue: 新增编辑弹窗
- account_expire_feature.md: 代码评审报告和优化建议
## 注意事项
⚠️ 本次提交包含初步实现,详细的优化建议请查看 account_expire_feature.md
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-10-11 01:05:21 +08:00
shaw
c9ad287587
docs: 更新droid教程部分
2025-10-10 21:06:02 +08:00
shaw
6b02dbf040
fix: 优化droid转发错误传递
2025-10-10 20:05:13 +08:00
shaw
66fe3cf74a
fix: 优化count_tokens接口不受并发跟客户端限制
2025-10-10 17:16:10 +08:00
shaw
1811290c0b
feat: 优化droid类型账号oauth流程
2025-10-10 15:36:50 +08:00
shaw
42db271848
feat: droid平台账户数据统计及调度能力
2025-10-10 15:13:45 +08:00
shaw
2fc84a6aca
feat: 新增Droid cli支持
2025-10-09 23:05:09 +08:00
shaw
eb304c7e70
feat: openai转发增加apikey速率限制
2025-10-08 08:36:43 +08:00