fengsilin
|
155aa12014
|
perf(docker): BuildKit 缓存加速构建 + fix: 模型列表改用 enabled 接口
Dockerfile 添加 --mount=type=cache 持久化 bun/go 缓存,
前端改代码时跳过后端构建(~10s),后端改代码时跳过前端(~30s)。
模型限流下拉改用 /api/channel/models_enabled 只返回已启用模型。
|
1 день тому |
fengsilin
|
f07f2c25f4
|
feat(rate-limit): 用户模型限流配置改用下拉选择模型
将添加模型限流时的文本输入改为从渠道模型列表中选择,
并自动过滤已配置的模型,提升配置体验和准确性。
|
1 день тому |
fengsilin
|
9ee5f535c8
|
Merge branch 'feat/relay-capture'
Relay 请求抓包日志 + 用户模型 RPM 限流
|
1 день тому |
fengsilin
|
714d8239d1
|
feat: Relay 请求抓包日志 + 用户模型 RPM 限流
两个独立功能:
1. Relay Capture:对开启 capture_relay 的用户记录完整请求/响应到本地文件
- 单 writer goroutine + 128 槽 channel 架构,无 OOM 风险
- 支持流式 SSE 和非流式请求
- 30s 超时保护
2. User-Model RPM Rate Limiting:按 用户+模型 维度的 RPM 限流
- Redis 令牌桶 + 内存滑动窗口双路径,Redis 故障自动降级
- 请求失败时退还令牌/配额(Redis Refund Lua 脚本 + 内存 Refund)
- Redis pipeline 错误处理:失败时清理缓存 key
- 前端用户编辑弹窗新增模型限流配置面板
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 день тому |
fengsilin
|
69ed7d85d7
|
feat(sidebar): 添加监控外部链接菜单项
在管理员菜单区域新增「监控」入口,仅 root 用户可见,
点击后在新窗口打开外部监控面板。支持在侧边栏模块管理中切换显示/隐藏。
同时在 renderWrapper 中添加外部链接的通用支持。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 дні тому |
fengsilin
|
bae5c1faa5
|
feat(pricing): 隐藏模型广场标签和端点类型筛选器
注释掉模型广场侧边栏和筛选弹窗中的 PricingTags 和 PricingEndpointTypes 组件,
添加 EndpointType 常量及相关组件的文档注释。
Co-Authored-By: Claude <noreply@anthropic.com>
|
4 дні тому |
fengsilin
|
e6b4a06557
|
feat(logs): 隐藏使用日志中的分组信息展示
使用注释方式隐藏分组列和分组倍率标签,便于后续恢复:
1. 注释 UsageLogsColumnDefs.jsx 中的分组列定义
2. 注释 useUsageLogsData.jsx 中的 COLUMN_KEYS.GROUP 和默认可见性配置
3. 将计费详情中的"分组倍率"改为"倍率"
后端计费逻辑不变,仍正常应用分组倍率。
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
|
6 дні тому |
fengsilin
|
f9eeb7e47e
|
fix(billing): 修复 Claude 计费明细未应用用户渠道折扣的问题
renderClaudeModelPrice 函数缺少 userChannelRatio 参数声明,导致运行时
ReferenceError;同时价格计算未乘以用户倍率,明细文本也未显示折扣信息。
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
|
6 дні тому |
fengsilin
|
f7ff684d0d
|
feat(pricing): 渠道定价展示用户折扣价格
登录用户查看渠道定价时,按用户分组倍率和渠道个人倍率计算实际折扣价
并在价格列展示划线原价与折扣价,新增 /pricing/user/*model 接口。
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
|
6 дні тому |
fengsilin
|
e1b6aff7e1
|
fix(log): 对普通用户隐藏 Chat ID 和 Upstream ID
后端 GetUserLogs 返回前清空 chat_id/upstream_id(omitempty 不输出),
前端搜索框和展开行详情加 isAdminUser 守卫。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
02e0940555
|
fix(playground): 清空互斥模型默认列表
初始不预填任何模型,由管理员在运营设置页面手动配置。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
2d1a8d2f28
|
fix: 设置 chat_id + 优化日志查询参数构建
- Claude 和 OpenAI Responses 转发中设置 RelayChatID
- 日志查询使用 URLSearchParams 替代手动字符串拼接
- 日志查询日期范围改为可选,不再强制默认今天
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
3e86f523db
|
feat(playground): temperature/top_p 参数互斥设置
部分上游模型不允许同时设置 temperature 和 top_p,新增管理员可配置的
模型前缀列表,匹配的模型在 Playground 中自动互斥切换两个参数。
- 后端新增 PlaygroundSetting 配置 + GET /api/playground/config 公开端点
- 运营设置页面新增 Playground 互斥模型前缀编辑 textarea
- Playground 自动检测模型名匹配,启用一个参数自动禁用另一个
- 默认包含 deepseek-v4-flash/pro、deepseek-reasoner、o1-/o3-/o4-、gpt-5
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
d26ad9e635
|
feat: 渠道-模型级联选择 + 隐藏首页统计卡片
- UserRatioSection 模型输入改为级联下拉,选渠道后自动加载模型列表
- models 信息嵌入 channelOptions 消除冗余 channelMap 状态
- 注释掉首页 HeroSection 统计数据卡片
Co-Authored-By: Claude <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
bb708510fe
|
docs: 用户倍率渠道-模型级联选择器设计文档
Co-Authored-By: Claude <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
b026f6bc04
|
feat: 用户倍率前端展示 + 渠道下拉选择 + 上游调试日志
- UserRatioSection 渠道 ID 输入改为带搜索的下拉选择器
- 使用日志详情、计费过程、展开行均显示用户倍率
- renderLogContent suffix 统一追加,消除 4 处重复
- 提取 dumpUpstreamRequest 辅助函数,debug 日志走 SysLog
Co-Authored-By: Claude <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
9dbf3365fe
|
feat(pricing): 添加用户-模型-渠道倍率功能
为每个用户添加独立于全局定价的倍率乘数,支持按 (userId, model, channel) 三维
精确控制用户级别定价。倍率以乘法叠加在现有 modelRatio × groupRatio 之上。
- 新增 user_channel_ratios 表,写入内存缓存(写穿透模式)
- 新增 /api/user_channel_ratio/ CRUD API(AdminAuth)
- 计费路径集成:compatible_handler、PostClaudeConsumeQuota、
PostWssConsumeQuota、PostAudioConsumeQuota、calculateAudioQuota
- 前端:EditUserModal 内嵌 UserRatioSection 组件
- 修复 Update() 缓存 key 零值 bug(先加载再更新)
- 修复 PreWssConsumeQuota 缺少 UserChannelRatio 导致归零
- 修复 ModelPriceHelperPerCall 缺少默认值 1.0
Co-Authored-By: Claude <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
17a0c2c26a
|
refactor(playground): 隐藏对话页面的分组选择框
Co-Authored-By: Claude <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
b033edec56
|
fix: pending sync records 队列被 quota=0 旧记录阻塞
GetPendingRecordsForSync 添加 quota > 0 过滤条件,避免因上游超时
产生的 quota=0 旧记录(4月29日网络超时遗留)占满批次,阻塞新
的正常的扣费同步到 master 节点。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
8945f8c39e
|
fix: synced 用户剩余额度取 synced_quota + 记录 chat ID
- 前端用户列表:synced 用户显式取 synced_quota 字段作为剩余额度
- 各 OpenAI handler 中记录 relayChatID 用于日志追踪
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
1 тиждень тому |
fengsilin
|
e41f2951f7
|
fix: preserve relay body and capture invalid responses body
|
1 тиждень тому |
fengsilin
|
b2cb7bcf60
|
feat: record chat and upstream ids in usage logs
|
2 тижднів тому |
fengsilin
|
caf457ce9e
|
feat: 错误时记录上游响应体,支持流式
- 提取 TruncateBody 公共函数,截断到 2KB 避免日志过大
- 新增 handleResponsesStreamError 统一 SSE 错误提取逻辑
- 流式/非流式 Responses API 错误路径均捕获 UpstreamBody
- 添加 upstream_body 和 truncate_body 单元测试
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
575f84064e
|
feat: codex API key 模式 + 前端凭证回显修复
- codex adaptor 支持 API key 和 OAuth 两种认证模式
- 提取 setupOAuthHeader 和 shouldUseChatCompletionsViaResponses
- 修复编辑页 codex_credential_mode 切换/回显不同步问题
- ResponsesStreamResponse 添加 Error 字段支持独立错误事件
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
ca91922904
|
docs: add log chat/upstream id design
|
2 тижднів тому |
fengsilin
|
332d5a62f2
|
feat: support codex api key credentials
|
2 тижднів тому |
fengsilin
|
1c0898257c
|
feat: add redemption remarks
|
2 тижднів тому |
fengsilin
|
f18e51e3a9
|
feat: add redemption remark support
|
2 тижднів тому |
fengsilin
|
fae24fdf37
|
test: stabilize channel affinity usage cache tests
|
2 тижднів тому |
fengsilin
|
fc0257f6ca
|
chore: ignore local worktrees
|
2 тижднів тому |
fengsilin
|
d8272e7707
|
feat(channel): 添加渠道"对外名称"(public_name)字段
为 Channel 模型新增 public_name 字段,让管理员可以为每个渠道
设置用户可见的友好名称(如"标准通道"、"高速通道"),替代前端
硬编码的"通道一/二/三"。Playground 通道选择器展示对外名称,
"渠道"统一改为"通道"。新建渠道时对外名称必填,编辑时可选。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
73d10b5799
|
feat: 错误日志记录上游 request-id 和响应体,Playground 渠道路由改为 header 传递
- 错误日志新增 upstream_request_id(从 Anthropic/OpenAI 响应 header 提取)和 upstream_body(截断 2KB)
- 修复 RelayErrorHandler 内部 WithOpenAIError/NewOpenAIError 分支丢失上游字段的 bug
- Playground 渠道和分组改为通过 X-Channel-Id/X-Group header 传递,而非 body 字段
- Distributor 中间件支持从 header 回退读取 channel_id 和 group
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
5b8303ae81
|
fix: 登录后跳转来源页,充值金额校验优化
- LoginForm: 登录成功后跳转回登录前的页面,而非固定 /console
- RechargeCard: 输入金额低于最低值时显示警告提示
- .dockerignore: 排除 .claude、.plans、脚本等非项目文件
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
8bb2883d7e
|
feat(home): 首页定价卡片添加"去体验"按钮,跳转 Playground
- PricingCardView 新增 showTryButton 属性,点击跳转 Playground 并预选模型
- 移除 PricingCardView 中未使用的 props (selectedGroup, currency 等)
- 首页页脚路由重命名: terms→user-agreement, usage-policy→privacy-policy
- i18n: "操练场"更名为"对话"
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
a0ac37b2a9
|
fix: 替换 println 为 SysLog,修复 logger nil context 崩溃
- logger: 增加 ctx nil 检查,避免系统级日志 panic
- relay: 将 DebugEnabled 下的 println 替换为 SysLog
- price: 修复渠道定价在 ChannelMeta 未初始化时的获取失败问题
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
74cc8c0d56
|
feat(playground): 添加渠道选择功能,支持指定渠道体验模型
- 新增 /api/user/model_channels 接口,返回模型可用渠道及默认渠道
- Playground 设置面板添加渠道选择下拉框
- Distribute 中间件支持从请求体读取 channel_id 指定渠道
- 支持 URL 参数 ?model=xxx 直接选择模型
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
a34d44a824
|
fix(user): 修复从节点同步用户余额显示为 0 的问题
同步用户(synced)的实际余额存储在 synced_quota 字段,
但用户列表/详情接口返回的是 quota 字段(值为 0)。
新增 ApplySyncedQuota 方法,在 API 返回前将 synced_quota
赋值给 quota,使前端能正确显示余额。
同时优化 GetUserModels:map 去重替代 O(n) 线性扫描,
禁用模型查询移至 model 层,新增 StringsSubtract 工具函数。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
967309fb56
|
feat: 添加邮箱后缀注册额度规则功能
管理员可在用户管理页面配置「邮箱后缀→初始额度」映射规则,
用户注册时根据邮箱后缀自动匹配并发放对应额度(替代默认额度)。
- 新增 email_quota_rule 数据表 + CRUD API(管理员权限)
- 内存缓存匹配,启动时加载,增删改时刷新
- 注册流程 Insert/InsertWithTx/FinalizeOAuthUserCreation 同步支持
- 前端用户管理页新增 Tab 展示规则管理卡片
- 含 24 个测试(model 16 + controller 8)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2 тижднів тому |
fengsilin
|
83f767b40b
|
Merge branch 'worktree-feat-captcha'
# Conflicts:
# web/src/components/topup/RechargeCard.jsx
|
3 тижднів тому |
fengsilin
|
d24d68a916
|
fix(i18n): 修复令牌和充值页面货币显示不一致问题
- 令牌创建:快捷选项标签根据系统货币设置动态生成,替换硬编码美元
- 充值页面:输入框显示值与预设卡片统一换算为本地货币,内部值仍为原始单位
- 使用 getQuotaPerUnit() 替代魔数 500000
- 消除 RechargeCard 中 getCurrencyConfig() 的 N+1 重复调用
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
fe88bc7758
|
Merge branch 'worktree-feat-captcha'
|
3 тижднів тому |
fengsilin
|
1912dd3b72
|
feat: 添加图片验证码功能,防止脚本批量注册
- 后端:新增 GET /api/captcha 接口,使用 base64Captcha 生成图片验证码
- 后端:发送邮箱验证码时校验图片验证码(CaptchaEnabled 开关控制)
- 前端:注册表单邮箱验证码前增加图片验证码输入,支持点击刷新
- 管理后台:系统设置新增「图片验证码」开关
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
20163dbad5
|
fix(legal): 法律文档页面切换语言时强制重新加载内容
给 DocumentRenderer 添加 key={lang} 属性,确保切换语言时组件
重新挂载并从 API 获取对应语言的内容,而非使用缓存内容。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
56e8d14485
|
fix: 语言切换后 TextArea 内容丢失
添加 useEffect 在 editingLang 变化时同步 form values,
确保重新挂载的 TextArea 能从 React state 中读取正确内容。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
65bd1dabb8
|
fix: 法律文档编辑器切换语言时 TextArea 内容未刷新
给每个 TextArea 添加 key={editingLang} 强制组件在语言切换时重新挂载。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
934b4b10a7
|
feat: 法律文档双语配置(中/英)+ 精简语言支持至中英双语
- LegalSettings 字段拆分为 _zh/_en 双语对
- API 支持 ?lang= 参数返回对应语言内容
- 后台设置页每个文档配语言切换按钮(中文/English)
- 前端页面根据 UI 语言自动请求对应内容
- 移除 fr/ru/ja/vi/zh-TW 语言支持
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
676902ed58
|
Merge branch 'worktree-feat-terms-usage-policy'
# Conflicts:
# web/src/i18n/locales/en.json
# web/src/i18n/locales/fr.json
# web/src/i18n/locales/ja.json
# web/src/i18n/locales/ru.json
# web/src/i18n/locales/vi.json
# web/src/i18n/locales/zh-CN.json
# web/src/i18n/locales/zh-TW.json
|
3 тижднів тому |
fengsilin
|
2757f77011
|
feat(i18n): 补全服务条款和使用政策的多语言翻译
在 zh-CN、en、zh-TW、ja、fr、ru、vi 七个语言文件中添加
服务条款和使用政策的完整翻译 key。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |
fengsilin
|
65c6446a30
|
Merge branch 'worktree-feat-terms-usage-policy'
|
3 тижднів тому |
fengsilin
|
1cc75aa9a2
|
feat: 服务条款和使用政策页面,支持后台 Markdown 配置
复用现有 LegalSettings 模式,新增 TermsOfService 和 UsagePolicy 字段,
添加 /terms 和 /usage-policy 前端页面及 API 端点。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
3 тижднів тому |