Commit Graph

301 Commits

Author SHA1 Message Date
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
litongtongxue
454f366c50 fix: 修复日均费用计算逻辑
问题描述:
- 之前的日均费用计算是基于固定的30天窗口,而不是账户实际使用的天数
- 这导致新创建的账户显示的日均费用不准确

修复方案:
- 获取账户的创建时间(createdAt字段)
- 计算从账户创建到当前时间的实际天数
- 使用实际天数来计算日均费用(30天总费用 / 实际天数)
- 在前端显示实际使用天数,让用户了解计算基准

修改内容:
- 后端:在 /accounts/:accountId/usage-history 端点中添加实际天数计算逻辑
- 前端:在详情弹窗中显示基于实际使用天数的提示信息

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 11:27:29 +08:00
shaw
2872198259 chore: claude绑定账号响应限流提示 2025-10-04 11:31:21 +08:00
shaw
9148913ca4 feat: 增加Oauth Claude账户usage接口缓存 2025-10-02 18:35:41 +08:00
iaineng
11c214449f feat(api): add Claude OAuth usage endpoint with async loading
Add dedicated API endpoint to fetch Claude account OAuth usage data
asynchronously, improving user experience by eliminating the need for
multiple page refreshes to view session window statistics.

Backend changes:
- Add GET /admin/claude-accounts/usage endpoint for batch fetching
- Implement fetchOAuthUsage() to call Claude API /api/oauth/usage
- Add buildClaudeUsageSnapshot() to construct frontend data structure
- Add updateClaudeUsageSnapshot() to persist data to Redis
- Add _toNumberOrNull() helper for safe type conversion
- Update getAllAccounts() to return claudeUsage from Redis cache

Data structure:
- Store three window types: 5h, 7d, 7d-Opus
- Track utilization percentage and reset timestamps
- Calculate remaining seconds for each window

Performance optimizations:
- Concurrent batch requests using Promise.allSettled
- Graceful error handling per account
- Non-blocking async execution
2025-09-30 22:51:54 +08:00
shaw
aca2b1cccb feat: 账号列表支持批量删除 2025-09-28 21:43:57 +08:00
shaw
b123cc35c1 feat: api-stats页面查询专属账号会话窗口 2025-09-28 14:36:38 +08:00
shaw
5ce385d2bc fix: 修复账号筛选平台是oai显示异常 2025-09-28 11:53:46 +08:00
shaw
e197fbdf80 Merge branch 'pr-485' into dev 2025-09-28 09:45:03 +08:00
shaw
e675c5878e style: 仪表板组件样式优化 2025-09-27 23:07:39 +08:00
shaw
ea28222c71 feat: 支持账号维度的数据统计 2025-09-27 22:55:06 +08:00
yaogdu
d1bbc71796 feat: 🎸 export csv from web and support hourly TTL of key 2025-09-27 14:11:54 +08:00
shaw
0e724c9901 feat: oai账号增加402适配 2025-09-26 17:29:50 +08:00
shaw
f97db927c0 style: 调整standardGeminiRoutes缩进格式 2025-09-26 10:47:07 +08:00
shaw
25d1c3f74e fix: apikey的服务权限问题修复 2025-09-25 22:51:39 +08:00
shaw
c15ef0b6ae feat: 适配codex用量数据 2025-09-25 17:23:52 +08:00
shaw
991dd1436f fix: 修复apikey的服务权限失效问题 2025-09-25 17:23:52 +08:00
shaw
f56d1edce0 feat: openai账号401自动停止调度 2025-09-24 11:35:48 +08:00
shaw
0ba048aced feat: 优化专属账号删除逻辑 2025-09-23 15:48:38 +08:00
shaw
ff73375f0a fix: 优化codex错误抛出 增强客户端限制条件 2025-09-22 11:56:54 +08:00