juenjunli
549c95eb80
feat: 为 AWS Bedrock 账户添加 Bearer Token 认证支持
...
- 新增 credentialType 字段支持 access_key 和 bearer_token 两种认证方式
- 实现 Bedrock 账户的 testAccountConnection 方法,支持 SSE 流式测试
- 前端账户表单增加认证类型选择器,自动切换输入字段
- 前端测试模态框根据账户类型自动选择测试模型(Bearer Token 使用 Sonnet 4.5,Access Key 使用 Haiku)
- 改进测试接口错误处理,避免响应流重复关闭
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-10 14:13:36 +08:00
Wesley Liddick
3f98267738
Merge branch 'main' into antigravity
2025-12-26 00:56:27 -05:00
52227
9960f237b8
feat: 实现 Antigravity OAuth 账户支持与路径分流
2025-12-25 14:33:24 +08:00
shaw
8ec8a59b07
feat: claude账号新增支持拦截预热请求
2025-12-21 22:28:22 +08:00
shaw
638d2ff189
feat: 支持claude单账户开启串行队列
2025-12-19 22:29:57 +08:00
shaw
7698f5ce11
chore: 增加opus4.5快捷映射按钮
2025-12-15 09:44:36 +08:00
thejoven
304c8dda4e
Update AccountForm.vue
...
新版 gemini-cli 的 Access Token 位置和文件名已变更
2025-12-12 00:43:11 +08:00
John Doe
201d95c84e
[fix] Droid: dynamic x-api-provider and custom User-Agent support
...
- Dynamic x-api-provider selection for OpenAI endpoint based on model
- Models with '-max' suffix use 'openai' provider
- Other models use 'azure_openai' provider
- Fixes gpt-5.1-codex-max model compatibility issue
- Update default User-Agent to factory-cli/0.32.1
- Add custom User-Agent field for Droid accounts
- Backend: userAgent field in createAccount and updateAccount
- Frontend: User-Agent input in account creation/edit UI
- Supports all Droid auth modes: OAuth, Manual, API Key
This resolves the issue where gpt-5.1-codex-max failed with 'Azure OpenAI only supports...' error due to incorrect provider header.
2025-12-07 21:08:48 +03:00
SunSeekerX
8aca1f9dd1
feat(account): 新增账户自动防护禁用开关
...
支持 disableAutoProtection 配置项,启用后上游 401/400/429/529 错误不再自动禁用账户
2025-12-04 20:47:12 +08:00
shaw
81e89d2dc4
feat: 支持sessionKey完成oauth授权
2025-12-02 20:43:47 +08:00
shaw
dfee7be944
fix: 调整gemini-api BaseApi后缀以适配更多端点
2025-11-29 21:30:28 +08:00
shaw
d89344ad87
fix: 修复Gemini-api账户分组调度设置不生效的问题
2025-11-29 14:11:58 +08:00
shaw
25f455ac1c
fix: 适配claude新的usage接口
2025-11-25 10:54:21 +08:00
shaw
bae39d5468
feat: 支持Gemini-Api接入
2025-11-23 22:00:13 +08:00
sususu98
3abd0b0f36
fix: 编辑Console账户表单前先读取maxConcurrentTasks并显示,防止每次编辑Console账户并发限制都被重置
2025-10-27 16:35:27 +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
liangjie.wanglj
b9d2e855f3
claude console类型中增加claude-haiku-4-5-20251001、GLM、Kimi、Qwen模型支持;增加计费消息通知;Claude console 及 ccr模型匹配大小写不敏感
2025-10-16 09:53:42 +08:00
shaw
92712277db
feat: droid的apikey页面增加一键复制全部
2025-10-14 20:44:14 +08:00
AAEE86
8dd07919f4
fix: 修复 API Key 管理界面按钮的点击事件逻辑
2025-10-14 10:34:38 +08:00
AAEE86
582348d615
fix: 修正删除API Key时更新数据的字段名称
2025-10-14 10:09:47 +08:00
AAEE86
1f9afc788b
feat: 添加Droid账户API Key管理功能
...
(cherry picked from commit 0cf3ca6c7eafcf28a2da7e8bfd6814b4883bb752)
2025-10-13 18:24:49 +08:00
shaw
a3dacbccd0
refactor: 编辑账户时隐藏过期时间表单,使用独立编辑弹窗
...
## 问题分析
编辑账户时显示过期时间表单存在以下问题:
1. **相对时间 vs 绝对时间冲突**:
- 下拉框提供相对时间选项(30天、90天等)
- 实际存储的是绝对时间(如 2025-02-15)
- 过了1天后,无法准确对应原来的"30天"选项
2. **用户体验混乱**:
- 设置了30天过期,编辑时下拉框显示"永不过期"
- 无法准确回显用户当初的选择
- 容易误导用户
3. **功能重复**:
- 已有独立的AccountExpiryEditModal弹窗专门编辑过期时间
- 该弹窗使用绝对时间显示,更清晰准确
## 解决方案
仅在编辑模式下隐藏过期时间表单:
- 创建账户时:保留过期时间表单(相对时间设置合理)
- 编辑账户时:隐藏过期时间表单,引导用户使用独立的编辑弹窗
## 实现细节
在两处过期时间表单添加 v-if="!isEdit" 条件:
- 第645行:OAuth添加方式的表单
- 第2116行:手动添加方式的表单
## 用户流程改进
- 创建账户:可以快速选择相对过期时间(30天、90天等)
- 编辑账户:在列表中点击"编辑到期时间"按钮 → 使用独立弹窗编辑
- 弹窗优势:显示当前绝对过期时间、支持快捷延期、实时预览新时间
文件: web/admin-spa/src/components/accounts/AccountForm.vue:645,2116
2025-10-12 14:04:16 +08:00
shaw
62e457932e
fix: 修复账户编辑时过期时间不回显的问题
...
## 问题描述
在账户编辑页面,虽然过期时间已保存并在列表中正确显示,但点击编辑时:
- expireDuration 和 customExpireDate 字段为空
- 导致过期时间选择器显示为空白状态
## 根本原因
AccountForm.vue 的 form 初始化时:
- expiresAt 正确读取了 props.account?.expiresAt
- 但 expireDuration 和 customExpireDate 都初始化为空字符串
- 缺少从 expiresAt 反向初始化这两个字段的逻辑
## 修复方案
修改 form 初始化逻辑(第 3443-3457 行):
- expireDuration: 如果存在 expiresAt,设置为 'custom'
- customExpireDate: 如果存在 expiresAt,转换为 datetime-local 格式 (YYYY-MM-DDTHH:mm)
- expiresAt: 保持原有逻辑不变
## 技术细节
使用 IIFE (立即执行函数) 在 reactive 对象初始化时计算初始值:
```javascript
expireDuration: (() => {
if (props.account?.expiresAt) return 'custom'
return ''
})()
```
## 测试验证
- ✅ 编辑已设置过期时间的账户,过期时间正确回显
- ✅ 编辑未设置过期时间的账户,显示为永不过期
- ✅ AccountExpiryEditModal 组件已有正确的初始化逻辑,无需修改
文件: web/admin-spa/src/components/accounts/AccountForm.vue:3443-3457
2025-10-12 13:56:26 +08:00
shaw
a84f344df6
Merge PR #541 : 添加账户订阅到期时间管理功能 + 修复核心过期检查逻辑
...
## 原PR功能
- ✅ 后端添加subscriptionExpiresAt字段支持
- ✅ 前端提供到期时间设置界面(快捷选项 + 自定义日期)
- ✅ 账户列表显示到期状态(已过期🔴 /即将过期🟠 /永不过期⚪ )
- ✅ 新增AccountExpiryEditModal.vue编辑弹窗组件
- ✅ 支持创建和更新账户时设置到期时间
- ✅ 完整支持暗黑模式
## 🔧 关键修复(本次提交)
原PR缺少核心过期检查逻辑,过期账户仍会被调度使用。本次合并时添加了:
1. **新增isAccountNotExpired()方法**:
- 检查账户subscriptionExpiresAt字段
- 未设置过期时间视为永不过期
- 添加debug日志记录过期账户
2. **在selectAvailableAccount()中添加过期检查**:
- 过滤逻辑中集成this.isAccountNotExpired(account)
- 确保过期账户不被选择
3. **在selectAccountForApiKey()中添加过期检查**:
- 绑定账户检查中添加过期验证
- 共享池过滤中添加过期验证
## 🗑️ 清理工作
- 移除了不应提交的account_expire_feature.md评审文档(756行)
## 技术细节
- API层使用expiresAt,存储层使用subscriptionExpiresAt
- 存储格式:ISO 8601 (UTC)
- 空值表示:null表示永不过期
- 时区处理:后端UTC,前端自动转换本地时区
作者: mrlitong (原PR) + Claude Code (修复)
PR: https://github.com/Wei-Shaw/claude-relay-service/pull/541
2025-10-12 13:42:57 +08:00
shaw
8e415f8ff8
Merge PR #545 : 常用模型增加deepseek-chat;修复修改时默认选择白名单
...
- Claude Console类型账户默认白名单模型增加deepseek-chat模型
- 修复白名单模式下的初始化逻辑:
* 白名单模式:正确设置allowedModels用于显示勾选的模型
* 同时保留modelMappings以便用户切换到映射模式时有初始数据
* 映射模式:只设置modelMappings,不填充allowedModels
- 增加代码注释,清晰说明不同模式的数据设置逻辑
作者: looksgood
PR: https://github.com/Wei-Shaw/claude-relay-service/pull/545
2025-10-12 13:34:10 +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
0b2610842a
feat: droid apikey异常自动移除
2025-10-11 22:39:41 +08:00
shaw
53dee11a10
feat: droid的apikey模式适配多种更新方式
2025-10-11 22:15:38 +08:00
liangjie.wanglj
c81ec34ad8
常用模型增加deepseek-chat;修复修改时默认选择白名单
2025-10-11 18:53:41 +08:00
shaw
6c2ef2eef3
fix: 修复droid账号更新丢失apikey的问题
2025-10-11 11:23:24 +08:00
shaw
19fa518e65
fix: 修复droid追加和代理代理IP提交异常的问题
2025-10-11 10:50:26 +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
b28631e737
Merge branch 'pr-523' into merge-pr523
2025-10-10 16:34:29 +08:00
shaw
fad9e52c98
feat: Droid平台支持多apikey添加
2025-10-10 16:09:15 +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
sususu98
786a62e2e3
feat(账户表单): 添加模型限制模式切换功能
...
支持在白名单模式和映射模式之间切换,白名单模式允许通过复选框选择支持的模型,映射模式保留原有的模型映射功能
暂时没有限制专属绑定场景
2025-10-08 17:41:28 +08:00
shaw
d44582dc31
feat: 适配claude新opus周限规则
2025-10-04 10:49:40 +08:00
shaw
9c4dc714f8
Revert "Merge pull request #424 from Wangnov/feat/i18n"
...
This reverts commit 1d915d8327 , reversing
changes made to 009f7c84f6 .
2025-09-12 09:21:53 +08:00
Wangnov
99d72516ae
feat: 完成 AccountForm.vue 组件的国际化文本替换
...
- 将多个文本替换为 i18n 语言包中的键,以提升多语言支持和一致性。
- 更新了模型支持描述、用户代理描述、凭证文件描述等文本内容。
- 通过引入 i18n 键,增强了用户界面的可读性和可维护性。
2025-09-12 00:04:11 +08:00
Wangnov
e36bacfd6b
feat: 完成多个组件的国际化支持与文本替换
...
- 更新 AccountForm.vue 中的占位符文本为 i18n 语言包中的键
- 修改 ConfirmModal.vue 中的确认和取消按钮文本为 i18n 语言包中的键
- 更新 CustomDropdown.vue 中的占位符文本为 i18n 语言包中的键
- 修改 app.js 中的应用标题为英文版本
- 更新 router/index.js 中的日志输出为英文
- 在 accounts.js 和 apiKeys.js 中的错误处理信息中引入 i18n 键以提升多语言一致性
- 更新 dashboard.js 中的系统状态和错误日志为 i18n 键
- 在 DashboardView.vue 中的多个文本替换为 i18n 语言包中的键
2025-09-12 00:04:11 +08:00
Wangnov
97b94eeff9
feat: 完成web/admin-spa/src/components/apikeys的国际化并修复语法错误和警告
2025-09-12 00:03:05 +08:00
Wangnov
2b40552eab
feat: 完成AccountForm组件国际化的最终验证和修复
...
- 修复遗漏的API URL和API Key标签国际化
- 修复title属性的国际化(复制链接提示)
- 修复Claude Max/Pro订阅类型显示的国际化
- 修复剩余placeholder属性的国际化
- 完成系统性的多维度验证检查:
* ✅ 模板中的硬编码文本
* ✅ JavaScript中的字符串常量
* ✅ 特殊属性(title, placeholder等)
* ✅ 翻译键在三语言文件中的存在性
* ✅ 动态内容和条件渲染
现在AccountForm组件已真正实现完整的三语言国际化支持
2025-09-12 00:03:03 +08:00
Wangnov
30acf4a374
feat: 修复AccountForm组件中所有遗漏的国际化内容
...
- 添加60+个新的翻译键到三语言文件
- 国际化所有placeholder属性
- 国际化按钮文本和标签
- 国际化错误消息和验证提示
- 国际化OAuth步骤描述文本
- 国际化Claude功能描述和配置说明
- 确保三种语言完整覆盖所有UI文本
2025-09-12 00:03:03 +08:00
Wangnov
be7416386f
feat: 完成AccountForm组件剩余模块国际化
2025-09-12 00:03:02 +08:00
Wangnov
1beed324d9
feat: 完成AccountForm组件剩余模块国际化
...
- 国际化剩余JavaScript错误消息和验证文本
- 完成AWS Bedrock配置字段和帮助文本国际化
- 完成Azure OpenAI特定字段和描述国际化
- 国际化了150+个翻译键,覆盖三种语言(zh-cn, zh-tw, en)
- 将所有硬编码中文字符串替换为响应式翻译
- 国际化了Toast消息、确认对话框、表单验证等用户交互元素
- 确保了编辑模式和创建模式的完整国际化支持
AccountForm组件国际化工作已基本完成,支持完整的三语言切换体验。
2025-09-12 00:03:02 +08:00
Wangnov
2e09896d0b
feat: 继续完成AccountForm组件国际化的核心模块
...
- 完成手动Token输入部分国际化,支持Claude/Gemini/OpenAI三个平台
- 完成编辑模式所有特定功能的国际化:账户信息、类型、分组管理
- 完成Claude高级功能国际化:订阅类型、自动停止调度、统一User-Agent、客户端标识
- 完成Gemini Project ID配置的国际化支持
- 新增150+翻译键,涵盖三种语言(简中/繁中/英文)
- 保持响应式特性和暗黑模式兼容性
技术改进:
- 采用结构化翻译键命名策略 (accountForm.module.item)
- 解决重复字符串精确匹配问题
- 使用上下文信息区分相似文本的不同用法
- 优化用户交互文本:占位符、提示、按钮等
进度:AccountForm组件(3730行)已完成约70%的国际化工作
2025-09-12 00:03:02 +08:00
Wangnov
e80c49c1ce
feat: 开始 AccountForm 组件国际化
...
- 扩展语言文件,添加200+条 AccountForm 相关翻译键
- 支持简体中文、繁体中文、英文三种语言
- 添加 useI18n 组合式 API 支持
- 国际化模态框标题、步骤指示器、平台选择等关键UI元素
- 国际化账户类型、分组管理等核心功能
- 国际化 JavaScript 中的Toast消息和确认对话框
- 为多平台(Claude、Gemini、OpenAI、Azure OpenAI、Bedrock、Claude Console)提供完整翻译支持
这是一个大型组件(3730行)的渐进式国际化工作,后续将继续完善其余部分。
2025-09-12 00:03:02 +08:00
shaw
02989a7588
fix: 修复CCR账户表单验证和平台分组逻辑
...
- 修复CCR账户创建时的表单字段验证
- 统一CCR与Claude Console的处理逻辑
- 修复账户删除前的API Key绑定检查
- 修复Claude Console账户绑定的API Key计数
- 优化平台分组判断逻辑
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-11 11:54:27 +08:00