1. 15 Jan, 2026 33 commits
    • IanShaw027's avatar
      fix(lint): 修复剩余的errcheck错误 · 41584008
      IanShaw027 authored
      修复了测试文件中剩余的6处类型断言未检查错误:
      - 第115-118行:choices.message.tool_calls 的类型断言链
      - 第140和145行:multiple tool calls 测试的类型断言
      - 第343和345行:ComplexSSEData 测试的类型断言
      
      **修复模式:**
      所有类型断言都改为使用 ok 检查:
      ```go
      // 修复前
      choices := payload["choices"].([]any)
      
      // 修复后
      choices, ok := payload["choices"].([]any)
      if !ok || len(choices) == 0 {
          t.Fatal("No choices found in result")
      }
      ```
      
      **测试验证:**
      -  TestCorrectToolCallsInSSEData - 所有子测试通过
      -  TestComplexSSEData - 通过
      -  TestCorrectToolParameters - 通过
      -  所有类型断言都有 ok 检查
      -  添加了数组长度验证
      
      现在所有 errcheck 错误都已修复。
      41584008
    • IanShaw027's avatar
      fix(lint): 修复golangci-lint检查发现的问题 · c4f6c89b
      IanShaw027 authored
      修复了4个lint问题:
      1. errcheck (3处): 在测试中添加类型断言的ok检查
      2. govet copylocks (1处): 将mutex从ToolCorrectionStats移到CodexToolCorrector
      
      **详细修改:**
      
      1. **openai_tool_corrector_test.go**
         - 添加了类型断言的ok检查,避免panic
         - 在解析JSON后检查payload结构的有效性
         - 改进错误处理和测试可靠性
      
      2. **openai_tool_corrector.go**
         - 将sync.RWMutex从ToolCorrectionStats移到CodexToolCorrector
         - 避免在GetStats()返回时复制mutex
         - 保持线程安全的同时符合Go最佳实践
      
      **测试验证:**
      - 所有单元测试通过 
      - go vet 检查通过 
      - 代码编译正常 
      c4f6c89b
    • IanShaw027's avatar
      feat(openai): 添加Codex工具调用自动修正功能 · 539b41f4
      IanShaw027 authored
      实现了完整的Codex工具调用拦截和自动修正系统,解决OpenCode使用Codex模型时的工具调用兼容性问题。
      
      **核心功能:**
      
      1. **工具名称自动映射**
         - apply_patch/applyPatch → edit
         - update_plan/updatePlan → todowrite
         - read_plan/readPlan → todoread
         - search_files/searchFiles → grep
         - list_files/listFiles → glob
         - read_file/readFile → read
         - write_file/writeFile → write
         - execute_bash/executeBash/exec_bash/execBash → bash
      
      2. **工具参数自动修正**
         - bash: 自动移除不支持的 workdir/work_dir 参数
         - edit: 自动将 path 参数重命名为 file_path
         - 支持 JSON 字符串和对象两种参数格式
      
      3. **流式响应集成**
         - 在 SSE 数据流中实时修正工具调用
         - 支持多种 JSON 结构(tool_calls, function_call, delta, choices等)
         - 不影响响应性能和用户体验
      
      4. **统计和监控**
         - 记录每次工具修正的详细信息
         - 提供修正统计数据查询
         - 便于问题排查和性能优化
      
      **实现文件:**
      - `openai_tool_corrector.go`: 工具修正核心逻辑(250行)
      - `openai_tool_corrector_test.go`: 完整的单元测试(380+行)
      - `openai_gateway_service.go`: 流式响应集成
      - `openai_gateway_service_tool_correction_test.go`: 集成测试
      
      **测试覆盖:**
      - 工具名称映射测试(18个映射规则)
      - 参数修正测试(bash workdir、edit path等)
      - SSE数据修正测试(多种JSON结构)
      - 统计功能测试
      - 所有测试通过 
      
      **解决的问题:**
      修复了 OpenCode 使用 sub2api 中转 Codex 时,因工具名称和参数不兼容导致的工具调用失败问题。
      Codex 模型有时会忽略指令文件中的工具映射说明,导致调用不存在的工具(如 apply_patch)。
      现在通过流式响应拦截,自动将错误的工具调用修正为 OpenCode 兼容的格式。
      
      **参考文档:**
      - OpenCode 工具规范: https://opencode.ai/docs/
      - Codex Bridge 指令: backend/internal/service/prompts/codex_opencode_bridge.txt
      539b41f4
    • Wesley Liddick's avatar
      Merge pull request #300 from mt21625457/main · b36f3db9
      Wesley Liddick authored
      feat(网关): 引入 OpenAI/Claude OAuth token 缓存
      b36f3db9
    • yangjianbo's avatar
      style: 修复 gofmt 格式化问题 · f862ddc9
      yangjianbo authored
      
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      f862ddc9
    • 程序猿MT's avatar
      Merge branch 'Wei-Shaw:main' into main · b5903230
      程序猿MT authored
      b5903230
    • yangjianbo's avatar
      Merge branch 'dev' · 3ba4d535
      yangjianbo authored
      3ba4d535
    • yangjianbo's avatar
      fix(OAuth缓存): 修复缓存键冲突、401强制刷新及Redis降级处理 · 5b37e9ae
      yangjianbo authored
      
      
      - Gemini 缓存键统一增加 gemini: 前缀,避免与其他平台命名空间冲突
      - OAuth 账号 401 错误时设置 expires_at=now 并持久化,强制下次请求刷新 token
      - Redis 锁获取失败时降级为无锁刷新,仅在 token 接近过期时执行,并检查 ctx 取消状态
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      5b37e9ae
    • yangjianbo's avatar
      feat(网关): 引入 OpenAI/Claude OAuth token 缓存 · 1820389a
      yangjianbo authored
      新增 OpenAI/Claude TokenProvider 与缓存键生成
      扩展 OAuth 缓存失效覆盖更多平台
      统一 OAuth 缓存前缀与依赖注入
      1820389a
    • yangjianbo's avatar
      35e3a893
    • shaw's avatar
      5f890e85
    • Wesley Liddick's avatar
      Merge pull request #297 from LLLLLLiulei/feat/ip-management-enhancements · 10bc7f70
      Wesley Liddick authored
      feat: add proxy geo location
      10bc7f70
    • yangjianbo's avatar
      Merge branch 'test' · a65fd9de
      yangjianbo authored
      a65fd9de
    • yangjianbo's avatar
      fix(账号管理): 移除调度切换后的冗余列表刷新 · 1bb4c76d
      yangjianbo authored
      
      
      切换账号调度状态后,updateSchedulableInList 已完成局部更新,
      无需再调用 load() 刷新整个列表。此修改减少不必要的 API 请求,
      避免 UI 闪烁。
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      1bb4c76d
    • LLLLLLiulei's avatar
      feat: add proxy geo location · aab44f9f
      LLLLLLiulei authored
      aab44f9f
    • yangjianbo's avatar
      Merge branch 'test' · 0a848e75
      yangjianbo authored
      0a848e75
    • yangjianbo's avatar
      feat: merge dev · 90bce60b
      yangjianbo authored
      90bce60b
    • 程序猿MT's avatar
      Merge branch 'Wei-Shaw:main' into main · c22d51ee
      程序猿MT authored
      c22d51ee
    • yangjianbo's avatar
      fix(认证): OAuth 401 直接标记错误状态 · a458e684
      yangjianbo authored
      - OAuth 401 清理缓存并设置错误状态
      
      - 移除 oauth_401_cooldown_minutes 配置及示例
      
      - 更新 401 相关单测
      
      破坏性变更: OAuth 401 不再临时不可调度,需手动恢复
      a458e684
    • LLLLLLiulei's avatar
      Revert "feat: add proxy geo location" · 87b46629
      LLLLLLiulei authored
      This reverts commit 09c4f82927ddce1c9528c146a26457f53d02b034.
      87b46629
    • LLLLLLiulei's avatar
      feat: add proxy geo location · 3a100339
      LLLLLLiulei authored
      3a100339
    • Wesley Liddick's avatar
      Merge pull request #284 from longgexx/main · 47eb3c88
      Wesley Liddick authored
      fix(admin): 修复使用记录页面趋势图筛选联动和日期选择问题
      47eb3c88
    • longgexx's avatar
      merge: 合并上游 upstream/main 分支 · 4672a6fa
      longgexx authored
      
      
      解决冲突:
      - usage_log_repo.go: 保留 groupID 和 stream 参数,同时合并上游的
        account_rate_multiplier 逻辑
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      4672a6fa
    • longgexx's avatar
      fix(test): 添加测试辅助函数 truncateToDayUTC 修复编译错误 · 82743704
      longgexx authored
      
      
      在 usage_log_repo_integration_test.go 中添加本地的 truncateToDayUTC
      辅助函数,修复因主代码重命名该函数导致的测试编译错误。
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      82743704
    • Wesley Liddick's avatar
      Merge pull request #289 from IanShaw027/fix/mobile-ui · cc2d064a
      Wesley Liddick authored
      fix(mobile): 优化移动端表格、操作栏和弹窗显示
      cc2d064a
    • Wesley Liddick's avatar
      Merge pull request #285 from IanShaw027/fix/ops-bug · 27214f86
      Wesley Liddick authored
      feat(ops): 增强错误日志管理、告警静默和前端 UI 优化
      27214f86
    • Wesley Liddick's avatar
      Merge pull request #282 from LLLLLLiulei/feat/ip-management-enhancements · 28de614d
      Wesley Liddick authored
      feat: enhance proxy management
      28de614d
    • longgexx's avatar
      fix(dashboard): 修复预聚合表使用UTC时区导致今日统计不准确的问题 · 850183c2
      longgexx authored
      
      
      将 dashboard_aggregation_repo.go 和 usage_log_repo.go 中的时区处理
      从 UTC 改为使用服务器配置时区(默认 Asia/Shanghai),确保"今日"
      统计数据与用户预期一致。
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      850183c2
    • shaw's avatar
    • IanShaw027's avatar
      fix(mobile): 修复 UsersView 更多菜单定位并统一逻辑 · 1d231c6c
      IanShaw027 authored
      **问题描述**:
      - UsersView 的"更多"菜单仍然出现在页面左上角错误位置
      - UsersView 使用 actionButtonRefs Map 获取按钮元素,导致定位失败
      - UsersView 和 AccountsView 的菜单定位逻辑不一致,难以维护
      
      **解决方案**:
      - 修改 openActionMenu 函数签名,添加 MouseEvent 参数
      - 使用 e.currentTarget 直接从事件对象获取触发元素
      - 移除不必要的 actionButtonRefs Map 和 setActionButtonRef 函数
      - 统一菜单宽度为 200px(与 AccountsView 一致)
      - 完全复制 AccountsView 的定位逻辑,确保两者行为一致
      
      **技术要点**:
      - 移动端:菜单居中对齐按钮,优先显示在按钮下方
      - 桌面端:使用鼠标位置定位,添加边界检测
      - 简化代码,移除不必要的防御性检查
      - 两个组件的菜单定位逻辑完全一致,便于维护
      1d231c6c
    • IanShaw027's avatar
      fix(mobile): 优化移动端表格、操作栏和弹窗显示 · 20c71acb
      IanShaw027 authored
      **问题描述**:
      - 表格在移动端显示列过多,需要横向滚动,内容被截断
      - 顶部操作栏按钮拥挤,占用过多空间
      - 弹窗表单在小屏幕上布局不合理
      - "更多"操作菜单定位错误,位置过高或超出屏幕
      - 滚动页面时菜单不会自动关闭,与卡片分离
      
      **解决方案**:
      
      1. **DataTable 组件 - 移动端卡片视图**
         - 在 < 768px 时自动切换到卡片布局
         - 每个表格行渲染为独立卡片,所有字段清晰可见
         - 操作按钮在卡片底部,触摸目标足够大
         - 支持深色模式,包含加载和空状态
         - 自动应用于所有使用 DataTable 的管理页面
      
      2. **UsersView 顶部操作栏优化**
         - 移动端:搜索框全宽 + 次要按钮显示为图标 + 创建按钮突出
         - 桌面端:保持原有布局(图标 + 文字)
         - 使用响应式 Tailwind classes
      
      3. **UserCreateModal 弹窗优化**
         - 余额/并发数字段:移动端单列,桌面端双列
         - 弹窗边距:移动端 8px,桌面端 16px
      
      4. **操作菜单定位修复**
         - UsersView: 移动端菜单居中对齐按钮,智能定位
         - AccountsView: 移动端菜单优先显示在按钮下方
         - 所有情况下确保菜单不超出屏幕边界
         - 添加滚动监听,滚动时自动关闭菜单
      
      **影响范围**:
      - 所有使用 DataTable 的管理页面(8 个页面)自动获得移动端卡片视图
      - 用户管理和账号管理页面的操作菜单定位优化
      - 创建用户弹窗的响应式布局优化
      
      **技术要点**:
      - 使用 Tailwind 响应式断点(md:, sm:)
      - 触摸目标 ≥ 44px
      - 完整支持深色模式
      - 向后兼容,桌面端保持原有布局
      20c71acb
    • yangjianbo's avatar
      Merge branch 'main' into dev · 52ad7c6e
      yangjianbo authored
      52ad7c6e
    • longgexx's avatar
      fix(dashboard): 修复仪表盘今日统计使用UTC时区的问题 · 5aaaffe4
      longgexx authored
      将仪表盘统计中的"今日"时间范围从UTC时区改为服务器配置时区,
      使其与使用记录页面保持一致。
      
      修改内容:
      - GetDashboardStats: 使用 timezone.Now() 和 timezone.Today()
      - GetDashboardStatsWithRange: 同上
      
      影响的统计项:
      - 今日请求 (TodayRequests)
      - 今日 Token (TodayTokens)
      - 今日费用 (TodayCost/TodayActualCost)
      - 今日新用户 (TodayNewUsers)
      - 今日活跃用户 (ActiveUsers)
      5aaaffe4
  2. 14 Jan, 2026 7 commits