Skip to content

Comments

feat: Gemini CLI support & User Management#142

Merged
ding113 merged 105 commits intomainfrom
dev
Nov 20, 2025
Merged

feat: Gemini CLI support & User Management#142
ding113 merged 105 commits intomainfrom
dev

Conversation

@ding113
Copy link
Owner

@ding113 ding113 commented Nov 19, 2025

Release Notes

  • 新增:完整的 Gemini 支持
  • 新增:供应商新增首字节/流式静默/非流式总超时配置
  • 新增:前端可修改不重试的客户端错误规则
  • 新增:独立的用户管理页面
  • 新增:用户新增 5 小时/周/月美元上限和并发 Session 上限字段
  • 新增:为系统内达到限额的请求返回 429 响应
  • 新增:可自定义供应商端点路径
  • 优化:模型重定向体验
  • 优化:若干 i18n 优化

sususu98 and others added 30 commits November 12, 2025 12:16
为每个供应商添加独立的四维超时配置,解决请求超时导致的重试缓慢和流式中途卡住问题。

核心特性:
- 添加 3 个超时配置字段(流式首字节/流式静默期/非流式总时长)
- 实现智能超时策略:区分流式(10秒)和非流式(600秒)请求
- 实现流式静默期监控(watchdog 计时器),解决流式中途卡住问题
- 支持细粒度的超时控制,避免长时间挂起

性能提升:
- 重试时间减少 93%(150 秒 → 30 秒)
- 彻底解决流式静默期卡死问题

数据库变更:
- 添加 providers.first_byte_timeout_streaming_ms(默认 30000ms)
- 添加 providers.streaming_idle_timeout_ms(默认 10000ms)
- 添加 providers.request_timeout_non_streaming_ms(默认 600000ms)

核心实现:
- forwarder.ts: 实现超时控制(AbortController + AbortSignal.any)
- response-handler.ts: 实现流式静默期监控(watchdog 计时器)
- provider-form.tsx: UI 表单支持超时配置
feat(proxy): add configurable timeout settings for providers
… OpenAI Responses

This adds end-to-end API connectivity tests for provider testing page:
- Implement server actions to test Anthropic Messages, OpenAI Chat Completions, and OpenAI Responses
- Introduce ApiTestButton UI component and wire into provider form
- Add API test collapsible UI and translations (zh-CN/en/zh-TW)
- Extend provider-form with API test section and adjust typing for test results
- Ensure non-breaking feature addition with minimal UI/UX impact
重构活跃 Session 展示逻辑,提取可复用组件以提升代码复用性和可维护性:

- 新增 ActiveSessionsList 组件,支持自定义显示数量和样式
- 新增 SessionListItem 组件,统一 Session 列表项展示逻辑
- 简化 ActiveSessionsPanel,使用新组件实现(保持向后兼容)
- 优化 OverviewPanel,移除 recentSessions 数据依赖
- 简化 overview action,移除不必要的 Session 查询
- 修复价格上传对话框翻译 key 引用

技术改进:
- 组件解耦:Session 列表逻辑独立,可在多个页面复用
- 性能优化:减少不必要的数据查询
- 代码复用:统一 Session 展示格式和交互逻辑

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

Co-Authored-By: Claude <noreply@anthropic.com>
- 在 API 测试前校验 providerUrl 是否为有效的 http/https 链接
- 引入 isValidUrl 工具函数进行链接格式验证
- 当未填写 API Key 但存在 providerId 时,自动获取解密后的密钥用于测试
- 重构多个 Anthropic 和 OpenAI 的 API 测试方法,提取公共逻辑到 executeProviderApiTest 函数
- 更新中英文设置页面提示文本,增加 invalidUrl 相关国际化内容
- 修复测试按钮禁用状态逻辑,确保在缺少必要参数时不可点击
将原本内联的供应商 URL 验证代码提取为独立的验证函数
`validateProviderUrlForConnectivity`,提升代码复用性和可维护性。
该函数统一处理协议、内部网络地址和危险端口的安全检查,
并返回结构化的验证结果,便于调用方处理不同类型的错误。
同时优化了 `executeProviderApiTest` 中的 URL 处理逻辑,
确保使用标准化后的 URL 发起请求,并增强错误日志记录。
- Update package manager from pnpm@9.15.0 to bun@1.3.2
- Rewrite Dockerfile to use Bun official image (oven/bun:1.3.2-slim)
- Update all GitHub Actions workflows to use oven-sh/setup-bun@v1
- Update all documentation (CLAUDE.md, AGENTS.md, CONTRIBUTING.md, README)
- Replace pnpm-lock.yaml with bun.lock
- Update .gitignore and .prettierignore for Bun debug logs
- Remove pnpm from CI/CD allowed tools list

Changes verified:
- ✅ bun run typecheck: passed
- ✅ bun run lint: passed (only pre-existing warnings)
- ✅ bun run build: successful
- ✅ Docker build: successful (437MB image)
- ✅ Docker runtime: verified
为 provider API 测试功能添加了新的类型定义 ProviderApiResponse,
用于更精确地描述 API 响应结构。同时更新了 executeProviderApiTest
函数中 extract 方法的参数类型,从 any 改为新定义的
ProviderApiResponse 类型,以提升类型安全性。
- 在统计图表、排行榜、使用日志等组件中补全了 useCallback 的依赖项,
  包括翻译函数 `t` 和相关状态更新函数,以避免潜在的闭包问题。
- 移除了未使用的 imports 和参数,优化代码结构。
- 统一了 Collapsible 组件中 onOpenChange 的写法,提升一致性。
- Fix 'Cannot find module undici' error in Docker production environment
- undici is required at runtime for proxy functionality (ProxyAgent)
- Next.js standalone output only includes dependencies, not devDependencies
- 调整 API 测试按钮组件逻辑,支持根据供应商类型自动匹配 API 格式和默认模型
- 增加允许模型选择下拉框,提升用户选择体验
- 更新中英文设置项文案,统一术语为“供应商类型”和“模型测试”
- 支持从白名单模型中选择或手动输入测试模型
- 默认情况下同步路由配置中的供应商类型与模型选项
- Add regex pattern for cache_control block limit errors
- Update error count from 6 to 7 types
- Add documentation and example for new error type
- Prevents unnecessary retries for client configuration errors
- Add 'extra inputs are not permitted' pattern to parameter validation errors
- Update ErrorCategory comment to include extra parameters
- Prevents retry on client schema validation errors
…otection

Changes:
- Add File API polyfill for Node.js environment compatibility
- Add safe-regex dependency to detect and prevent ReDoS vulnerabilities
- Create error_rules database table with dynamic rule management
- Implement ErrorRuleDetector with performance-optimized detection (contains → exact → regex)
- Add EventEmitter for automatic cache refresh on rule updates
- Refactor error detection from hardcoded regex array to database-driven system
- Support three match types: regex, contains, exact
- Add priority and category-based rule organization

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

Co-Authored-By: Claude <noreply@anthropic.com>
ding113 and others added 22 commits November 19, 2025 13:55
- Fixed Invalid URL error caused by missing path segments
- Changed from 'baseUrl:action' to 'baseUrl/models/{model}:action'
- Both gemini and gemini-cli now use consistent URL format
- Resolves: https://api-dmit.cubence.com:generateContenthttps://api-dmit.cubence.com/models/gemini-3-pro-preview:generateContent
…usage extraction

Core fixes:
1. Support Gemini message format (contents field) in getMessagesLength() and getMessages()
   - Added support for direct contents[] array
   - Added support for wrapped request.contents[] format

2. Enhanced GeminiAdapter request transformation
   - Support multiple content formats (string, array, object)
   - Added extractTextContent() helper for flexible parsing
   - Support system message arrays
   - Improved image handling (base64 + URL)
   - Added Gemini CLI systemInstruction role support

3. Improved usage extraction in response-handler
   - Handle response wrapping ({response: {...}})
   - Support both usageMetadata and usage fields
   - Extract from both JSON and SSE formats
   - Added comprehensive source tracking in logs

4. Enhanced response transformation
   - Handle missing text in parts (empty string fallback)
   - Support both direct and wrapped response formats

Resolves: Gemini request body and response body parsing issues
Fixes: Message count statistics and token usage calculation
调整 providerSupportsModel 函数中非 Claude 模型的检查顺序,优先检查显式声明
(allowedModels/modelRedirects),再检查 provider_type。这允许 Claude 类型的
供应商通过显式声明支持非 Claude 模型(如 gemini-*),实现CCR代理。
…-column grid

- Limit dialog height to 70vh with scrollable content area
- Convert Key quota dialog to 2x2 grid layout (4 cost limits)
- Convert User quota dialog to 1x2 grid layout (2 fields)
- Reduce vertical spacing and use compact styling (h-9, text-xs)
- Add fixed header/footer with border separator
- Increase dialog width to 600px for dual-column layout
feat(user-form): 更新用户限制并增强错误处理
- 修复 ContentPart 接口的 source 对象缺少 url 属性导致的类型错误
- 修复 GeminiRequest 的 systemInstruction 缺少可选 role 字段的类型错误
- 删除所有语言文件中未使用的 settings.errorRules.section.description 翻译
- 通过 TypeScript 类型检查和 Docker 镜像构建测试
**新功能**:
1. 端点优先的客户端格式检测
   - 新增 detectFormatByEndpoint() 函数,通过 API 路径精确识别格式
   - 支持 Claude/Codex/OpenAI/Gemini/Gemini CLI 端点检测
   - 提高格式识别准确性,避免 Gemini 透传问题

2. 智能 URL 拼接(修复 Issue #139)
   - 重写 buildProxyUrl() 函数,智能检测重复路径
   - 避免 base_url 已包含完整路径时的重复拼接
   - 移除 forwarder.ts 中强制 /v1/responses 路径重写

3. URL 预览组件
   - 新增 url-preview.tsx 实时预览组件
   - 展示所有 API 端点拼接结果
   - 检测并高亮重复路径
   - 支持一键复制完整 URL
   - 集成到供应商表单

**国际化**:
- 完成 5 种语言翻译(zh-CN, zh-TW, en, ja, ru)

**修复**:
- 修复 GeminiUsageMetadata 类型定义缺少 cachedContentTokenCount 字段
- 修复 gemini/adapter.ts 构建错误

**测试**:
- ✅ TypeScript 类型检查通过
- ✅ 生产构建测试通过
**改进**:
1. 根据供应商类型只显示相关端点预览
   - Claude/Claude Auth: Messages + Count Tokens
   - Codex: Responses
   - OpenAI Compatible: Chat Completions + Models
   - Gemini: Generate/Stream Content
   - Gemini CLI: Generate/Stream Content

2. 精简 UI 体验
   - 移除冗余的描述文案
   - 移除不必要的提示信息
   - 保持简洁清晰的界面

**国际化**:
- 更新 5 种语言翻译,删除冗余翻译键
- 过滤元数据字段 (sample_spec),避免导入非模型数据
- 添加 mode 字段验证,确保只处理有效的模型价格数据
- 优化同步结果 Toast 提示:失败消息优先显示且更明显
- 显示失败的模型名称(最多5个)以便快速定位问题
- 新增 Dockerfile.dev 文件用于构建开发环境

- 使用 BuildKit 加速依赖安装和 Next.js 构建
feat: 添加开发环境 Dockerfile.dev
- 移除 user_created 翻译中未使用的 {name} 参数占位符
- 添加 create_failed, update_failed, delete_failed 翻译到所有 5 种语言
- 修复因参数不匹配导致翻译无法显示的问题
- 弹框添加固定高度(85vh)和可滚动内容区域
- 表单布局改为 flex 布局,标题和按钮固定
- RPM/每日额度改为双列布局
- 限额输入框(5h/周/月/并发)改为双列布局
- 移除限额字段的 description 以节省空间
主要变更:
1. 修复翻译键路径错误(logs.modelRedirect.redirected → modelRedirect.redirected)
2. 在 ProviderChainItem 中添加 modelRedirect 结构化字段
3. ModelRedirector 执行重定向时自动更新决策链
4. 决策链时间线中展示模型重定向详情(请求模型、实际转发、计费依据)
5. 完成 5 种语言的 i18n 翻译(zh-CN, en, zh-TW, ja, ru)

技术细节:
- 类型定义:src/types/message.ts - modelRedirect 可选字段
- 记录逻辑:src/app/v1/_lib/proxy/model-redirector.ts
- UI 展示:src/lib/utils/provider-chain-formatter.ts
- 组件修复:model-display-with-redirect.tsx

影响范围:使用记录列表和详情对话框的模型重定向展示

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

Co-Authored-By: Claude <noreply@anthropic.com>
@ding113
Copy link
Owner Author

ding113 commented Nov 20, 2025

@claude plz review it

@claude
Copy link
Contributor

claude bot commented Nov 20, 2025

🔍 Code Review Summary

我已经审查了这个大型 PR(220 文件,+20,150/-14,107 行)。这是一个重要的功能更新,主要包含以下特性:

✅ 主要功能亮点

1. Gemini 完整支持

  • 新增 src/app/v1/_lib/gemini/ 模块,包含 adapter.tsauth.tsprotocol.tstypes.ts
  • 支持两种 Gemini 端点类型:
    • gemini: 官方 API (generativelanguage.googleapis.com)
    • gemini-cli: CLI 内部端点 (cloudcode-pa.googleapis.com)
  • OAuth2 Token 刷新逻辑和 API Key 自动检测
  • 请求/响应转换器支持 OpenAI 兼容格式

2. 用户管理增强

  • 新增用户级别配额字段:limit_5h_usdlimit_weekly_usdlimit_monthly_usdlimit_concurrent_sessions
  • 独立的用户管理页面
  • 完整的 Zod 验证 schema

3. 供应商超时配置

  • first_byte_timeout_streaming_ms: 流式请求首字节超时
  • streaming_idle_timeout_ms: 流式静默期超时
  • request_timeout_non_streaming_ms: 非流式总超时

4. 错误规则系统

  • 新增 error_rules 表,支持数据库驱动的动态错误规则
  • 正则/完全匹配模式
  • 前端可配置客户端错误白名单

✅ 代码质量亮点

  • 类型安全: 完整的 TypeScript 类型定义和 Zod 验证
  • 错误处理: ProxyError 支持结构化错误消息和智能截断
  • 国际化: 多语言支持(zh-CN、en、ja、ru、zh-TW)
  • 测试覆盖: 单元测试验证 7 种默认错误规则
  • 权限控制: 用户操作有完整的 session 权限检查

⚠️ 改进建议

1. Gemini Auth Token 持久化
src/app/v1/_lib/gemini/auth.ts:55-57 中有注释提到刷新后的 token 没有写回数据库:

// Note: We are not persisting the new token back to DB here.
// This means we might refresh more often than needed if the DB is not updated.

建议考虑实现 token 持久化以减少不必要的刷新请求。

2. 数据库迁移
三个迁移文件(0018-0020)看起来是按功能合理拆分的,确保在生产环境执行前测试迁移回滚。

3. 大型 PR 拆分建议
这个 PR 包含多个独立功能(Gemini 支持、用户管理、超时配置、错误规则),未来可以考虑拆分成更小的 PR 以便于审查和回滚。

🔐 安全性检查

  • ✅ 用户 actions 有正确的 session 权限检查
  • ✅ Zod 验证防止非法输入
  • ✅ 敏感数据(API Key)在日志中有脱敏处理
  • ✅ 限流和熔断器保护

📊 测试建议

  1. 测试 Gemini 端点的请求/响应转换
  2. 验证用户配额限流在各时段的重置行为
  3. 测试超时配置对流式/非流式请求的影响
  4. 确认错误规则的正则匹配不会造成 ReDoS

总体评价: 这是一个功能完善、代码质量高的 PR。架构设计合理,支持 Gemini 的实现遵循了项目现有的适配器模式。建议合并前进行充分的集成测试。

🤖 Generated with Claude Code

@ding113 ding113 merged commit 70240f6 into main Nov 20, 2025
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

4 participants