fawney19
|
a12b43ce5c
|
refactor: 清理数据库字段命名歧义
- users 表:重命名 allowed_endpoints 为 allowed_api_formats(修正历史命名错误)
- api_keys 表:删除 allowed_endpoints 字段(未使用的功能)
- providers 表:删除 rate_limit 字段(与 rpm_limit 重复)
- usage 表:重命名 provider 为 provider_name(避免与 provider_id 外键混淆)
同步更新前后端所有相关代码
|
2026-01-07 19:53:32 +08:00 |
|
fawney19
|
6885cf1f6d
|
refactor: 使用 asyncio.wait_for 控制请求整体超时
将 endpoint.timeout 从 httpx 的 read 超时改为 asyncio.wait_for 控制,
更精确地管理"建立连接 + 获取首字节"阶段的整体超时。
主要改动:
- HTTP 超时配置改用全局 config 参数
- endpoint.timeout 作为 asyncio.wait_for 的整体超时
- 增加 asyncio.TimeoutError 处理和连接清理逻辑
- 增加防御性空值检查
|
2026-01-07 18:17:35 +08:00 |
|
fawney19
|
00f6fafcfc
|
feat: 添加 API 文档路由、扩展用户列表字段、修复 CORS 配置
- Dockerfile.app: 添加 /docs、/redoc、/openapi.json 的 nginx 代理规则
- routes.py: 管理员用户列表接口增加 allowed_providers/endpoints/models 字段
- main.py: 修复 CORS_ORIGINS=* 时 credentials 配置冲突问题
|
2026-01-07 17:31:31 +08:00 |
|
fawney19
|
fbe303a3cd
|
fix: 补充 cost.py 中 Provider 未实现模型时的 else 分支处理
|
2026-01-07 16:13:53 +08:00 |
|
fawney19
|
0061fc04b7
|
feat: 添加访问令牌管理功能并升级至 0.2.4
- 新增 Management Token(访问令牌)功能,支持创建、更新、删除和管理
- 前端添加访问令牌管理页面,支持普通用户和管理员
- 后端实现完整的令牌生命周期管理 API
- 添加数据库迁移脚本创建 management_tokens 表
- Nginx 配置添加 gzip 压缩,优化响应传输
- Dialog 组件添加 persistent 属性,防止意外关闭
- 为管理后台 API 添加详细的中文文档注释
- 简化多处类型注解,统一代码风格
|
2026-01-07 14:55:07 +08:00 |
|
fawney19
|
835be3d329
|
refactor: nginx 透传外层代理 IP 头并禁用审计日志页面的审计记录
- Dockerfile.app/local: 使用 map 指令智能处理 X-Real-IP 和 X-Forwarded-For,
有外层代理头则透传,否则使用 remote_addr
- audit.py: 查看审计日志不再产生审计记录,避免刷新页面时产生大量无意义日志
|
2026-01-06 17:23:08 +08:00 |
|
fawney19
|
2395093394
|
refactor: 简化 IP 获取逻辑并将请求体超时配置化
- 移除 TRUSTED_PROXY_COUNT 配置,改为优先使用 X-Real-IP 头
- 添加 REQUEST_BODY_TIMEOUT 环境变量,默认 60 秒
- 统一 get_client_ip 逻辑,优先级:X-Real-IP > X-Forwarded-For > 直连 IP
|
2026-01-06 16:29:03 +08:00 |
|
fawney19
|
00562dd1d4
|
feat: 添加 LDAP 认证支持
- 新增 LDAP 服务和 API 接口
- 添加 LDAP 配置管理页面
- 登录页面支持 LDAP/本地认证切换
- 数据库迁移支持 LDAP 相关字段
|
2026-01-06 14:38:42 +08:00 |
|
fawney19
|
0f78d5cbf3
|
fix: 增强 CLI 处理器的错误信息,包含上游响应详情
|
2026-01-05 19:44:38 +08:00 |
|
fawney19
|
431c6de8d2
|
feat: 用户用量页面支持分页、搜索和密钥信息展示
- 用户用量API增加search参数支持密钥名、模型名搜索
- 用户用量API返回api_key信息(id、name、display)
- 用户页面记录表格增加密钥列显示
- 前端统一管理员和用户页面的分页/搜索逻辑
- 后端LIKE查询增加特殊字符转义防止SQL注入
- 添加escape_like_pattern和safe_truncate_escaped工具函数
|
2026-01-05 19:35:14 +08:00 |
|
fawney19
|
142e15bbcc
|
Merge pull request #69 from AoaoMH/feature/Record-optimization
feat: add usage statistics and records feature with new API routes, f…
|
2026-01-05 19:31:59 +08:00 |
|
fawney19
|
bfa0a26d41
|
feat: 用户导出支持独立余额Key,新增系统版本接口
- 用户导出/导入支持独立余额 Key (standalone_keys)
- API Key 导出增加 expires_at 字段
- 新增 /api/admin/system/version 接口获取版本信息
- 前端系统设置页面显示当前版本
- 移除导入对话框中多余的 bg-muted 背景样式
|
2026-01-05 18:18:45 +08:00 |
|
AoaoMH
|
93ab9b6a5e
|
feat: add usage statistics and records feature with new API routes, frontend types, services, and UI components
|
2026-01-05 17:03:05 +08:00 |
|
fawney19
|
35e29d46bd
|
refactor: 抽取统一计费模块,支持配置驱动的多厂商计费
- 新增 src/services/billing/ 模块,包含计费计算器、模板和使用量映射
- 将 ChatAdapterBase 和 CliAdapterBase 中的计费逻辑重构为调用 billing 模块
- 为每个 adapter 添加 BILLING_TEMPLATE 类属性,指定计费模板
- 支持 Claude/OpenAI/Gemini 三种计费模板,支持阶梯计费和缓存 TTL 定价
- 新增 tests/services/billing/ 单元测试
|
2026-01-05 16:48:59 +08:00 |
|
fawney19
|
465da6f818
|
feat: OpenAI 流式响应解析器支持提取 usage 信息
部分 OpenAI 兼容 API(如豆包)会在最后一个 chunk 中发送 usage 信息,
现在可以正确提取 prompt_tokens 和 completion_tokens。
|
2026-01-05 12:50:05 +08:00 |
|
fawney19
|
e5f12fddd9
|
feat: 流式预读增强与自适应并发算法优化
流式预读增强:
- 新增预读字节上限(64KB),防止无换行响应导致内存增长
- 预读结束后检测非 SSE 格式的错误响应(HTML 页面、纯 JSON 错误)
- 抽取 check_html_response 和 check_prefetched_response_error 到 utils.py
自适应并发算法优化(边界记忆 + 渐进探测):
- 缩容策略:从乘性减少改为边界 -1,一次 429 即可收敛到真实限制附近
- 扩容策略:普通扩容不超过已知边界,探测性扩容可谨慎突破(每次 +1)
- 仅在并发限制 429 时记录边界,避免 RPM/UNKNOWN 类型覆盖
|
2026-01-05 12:17:45 +08:00 |
|
fawney19
|
4fa9a1303a
|
feat: 优化首字时间和 streaming 状态的记录时序
改进 streaming 状态更新机制:
- 统一在首次输出时记录 TTFB 并更新 streaming 状态
- 重构 CliMessageHandlerBase 中的状态更新逻辑,消除重复
- 确保 provider/key 信息在 streaming 状态更新时已可用
前端改进:
- 添加 first_byte_time_ms 字段支持
- 管理员接口支持返回 provider/api_key_name 字段
- 优化活跃请求轮询逻辑,更准确地判断是否需要刷新完整数据
数据库与 API:
- UsageService.get_active_requests_status 添加 include_admin_fields 参数
- 管理员接口调用时启用该参数以获取额外信息
|
2026-01-05 10:31:34 +08:00 |
|
fawney19
|
43f349d415
|
fix: 确保 CLI handler 的 streaming 状态更新时 provider 信息已设置
在 execute_with_fallback 返回后,显式设置 ctx 的 provider 信息,
与 chat_handler_base.py 的行为保持一致,避免 streaming 状态更新
时 provider 为空的问题。
|
2026-01-05 09:36:35 +08:00 |
|
fawney19
|
02069954de
|
fix: streaming 状态更新时传递 first_byte_time_ms
|
2026-01-05 09:29:38 +08:00 |
|
fawney19
|
2e15875fed
|
feat: 端点 API 支持 custom_path 字段
- ProviderEndpointCreate 添加 custom_path 参数
- ProviderEndpointUpdate 添加 custom_path 参数
- ProviderEndpointResponse 返回 custom_path 字段
- 创建端点时传递 custom_path 到数据库模型
|
2026-01-05 09:22:20 +08:00 |
|
fawney19
|
b34cfb676d
|
fix: streaming 状态更新时传递 provider 相关 ID 信息
在 update_usage_status 方法中增加 provider_id、provider_endpoint_id
和 provider_api_key_id 参数,确保流式请求进入 streaming 状态时
能正确记录这些字段。
|
2026-01-05 09:12:03 +08:00 |
|
fawney19
|
3064497636
|
refactor: 改进上游错误消息的提取和传递
- 新增 extract_error_message 工具函数,统一错误消息提取逻辑
- 在 HTTPStatusError 异常上附加 upstream_response 属性,保留原始错误
- 优先使用上游响应内容作为错误消息,而非异常字符串表示
- 移除错误消息的长度限制(500/1000 字符)
- 修复边界条件检查,使用 startswith 匹配 "Unable to read" 前缀
- 简化 result.py 中的条件判断逻辑
|
2026-01-05 03:18:55 +08:00 |
|
fawney19
|
dec681fea0
|
fix: 统一时区处理,确保所有 datetime 带时区信息
- token_bucket.py: get_reset_time 和 Redis 后端使用 timezone.utc
- sliding_window.py: get_reset_time 和 retry_after 计算使用 timezone.utc
- provider_strategy.py: dateutil.parser 解析后确保有时区信息
|
2026-01-05 02:23:24 +08:00 |
|
fawney19
|
523e27ba9a
|
fix: API Key 过期时间使用应用时区而非 UTC
- 后端:parse_expiry_date 使用 APP_TIMEZONE(默认 Asia/Shanghai)
- 前端:移除提示文案中的 "UTC"
|
2026-01-05 02:18:16 +08:00 |
|
fawney19
|
e7db76e581
|
refactor: API Key 过期时间改用日期选择器,rate_limit 支持无限制
- 前端:将过期时间设置从"天数输入"改为"日期选择器",更直观
- 后端:新增 expires_at 字段(ISO 日期格式),兼容旧版 expire_days
- rate_limit 字段现在支持 null 表示无限制,移除默认值 100
- 解析逻辑:过期时间设为当天 UTC 23:59:59.999999
|
2026-01-05 02:16:16 +08:00 |
|
fawney19
|
689339117a
|
refactor: 提取 ModelMultiSelect 组件并支持失效模型检测
- 新增 ModelMultiSelect 组件,支持显示和移除已失效的模型
- 新增 useInvalidModels composable 检测 allowed_models 中的无效引用
- 重构 StandaloneKeyFormDialog 和 UserFormDialog 使用新组件
- 补充 GlobalModel 删除逻辑的设计说明注释
|
2026-01-05 01:20:58 +08:00 |
|
fawney19
|
b202765be4
|
perf: 优化流式响应 TTFB,将数据库状态更新移至 yield 后执行
- StreamUsageTracker: 先 yield 首个 chunk 再更新 streaming 状态
- EnhancedStreamUsageTracker: 同步添加 TTFB 记录和状态更新逻辑
- 确保客户端首字节响应不受数据库操作延迟影响
|
2026-01-05 00:13:23 +08:00 |
|
fawney19
|
3bbf3073df
|
feat: 所有 Provider 失败时透传上游错误信息
- FallbackOrchestrator 在所有候选组合失败后保留最后的错误信息
- 从 httpx.HTTPStatusError 提取上游状态码和响应内容
- ProviderNotAvailableException 携带上游错误信息
- ErrorResponse 在返回错误时透传上游状态码和响应
|
2026-01-04 23:50:15 +08:00 |
|
fawney19
|
f46aaa2182
|
debug: 添加 streaming 状态更新时 provider 为空的调试日志
- base_handler: 更新 streaming 状态时检测并记录 provider 为空的情况
- cli_handler_base: 修复预读数据为空时未更新 streaming 状态的问题
- usage service: 检测状态变为 streaming 但 provider 仍为 pending 的异常
|
2026-01-04 23:16:01 +08:00 |
|
fawney19
|
a2f33a6c35
|
perf: 拆分热力图为独立接口并添加 Redis 缓存
- 新增独立热力图 API 端点 (/api/admin/usage/heatmap, /api/users/me/usage/heatmap)
- 添加 Redis 缓存层 (5分钟 TTL),减少数据库查询
- 用户角色变更时清除热力图缓存
- 前端并行加载统计数据和热力图,添加加载/错误状态显示
- 修复 cache_decorator 缺少 JSON 解析错误处理的问题
- 更新 docker-compose 启动命令提示
|
2026-01-04 22:42:58 +08:00 |
|
fawney19
|
b6bd6357ed
|
perf: 优化 GlobalModel 列表查询的 N+1 问题
|
2026-01-04 20:05:23 +08:00 |
|
fawney19
|
c3a5878b1b
|
feat: 优化用量查询分页和热力图性能
- 用量查询接口添加 limit/offset 分页参数支持
- 热力图统计从实时查询 Usage 表改为读取预计算的 StatsDaily/StatsUserDaily 表
- 修复 avg_response_time_ms 为 0 时被错误跳过的问题
|
2026-01-04 18:02:47 +08:00 |
|
RWDai
|
3e4309eba3
|
Enhance LDAP auth config handling
|
2026-01-04 16:27:02 +08:00 |
|
RWDai
|
414f45aa71
|
Fix LDAP authentication stability
|
2026-01-04 13:09:55 +08:00 |
|
RWDai
|
ebdc76346f
|
revert: 回滚 _version.py 版本号变更
|
2026-01-04 11:25:58 +08:00 |
|
RWDai
|
64bfa955f4
|
feat(ldap): 完善 LDAP 认证功能和安全性
- 添加 LDAP 配置类型定义,移除 any 类型
- 首次配置 LDAP 时强制要求设置绑定密码
- 根据认证类型区分登录标识验证(本地需邮箱,LDAP 允许用户名)
- 添加 LDAP 过滤器转义函数防止注入攻击
- 增加 LDAP 连接超时设置
- 添加账户来源冲突检查,防止 LDAP 覆盖本地账户
- 添加用户名冲突自动重命名机制
|
2026-01-04 11:18:28 +08:00 |
|
RWDai
|
612992fa1f
|
Merge remote-tracking branch 'origin/master' into feature/ldap-authentication
|
2026-01-04 10:48:36 +08:00 |
|
fawney19
|
c02ac56da8
|
chore: 更新 docker-compose 命令为 docker compose
统一使用 Docker Compose V2 的现代写法
|
2026-01-03 01:39:45 +08:00 |
|
RWDai
|
9bfb295238
|
feat: add ldap login
|
2026-01-02 16:17:24 +08:00 |
|
fawney19
|
cddc22d2b3
|
refactor: 重构邮箱验证模块并修复代码审查问题
- 重构: 将 verification 模块重命名为 email,目录结构更清晰
- 新增: 独立的邮件配置管理页面 (EmailSettings.vue)
- 新增: 邮件模板管理功能(支持自定义 HTML 模板和预览)
- 新增: 查询验证状态 API,支持页面刷新后恢复验证流程
- 新增: 注册邮箱后缀白名单/黑名单限制功能
- 修复: 统一密码最小长度为 6 位(前后端一致)
- 修复: SMTP 连接添加 30 秒超时配置,防止 worker 挂起
- 修复: 邮件模板变量添加 HTML 转义,防止 XSS
- 修复: 验证状态清除改为 db.commit 后执行,避免竞态条件
- 优化: RegisterDialog 重写验证码输入组件,提升用户体验
- 优化: Input 组件支持 disableAutofill 属性
|
2026-01-01 02:10:19 +08:00 |
|
fawney19
|
11ded575d5
|
Merge branch 'master' into feature/email-verification
|
2025-12-31 22:00:36 +08:00 |
|
fawney19
|
394cc536a9
|
feat: 添加 API 格式访问限制
扩展访问限制功能,支持 API Key 级别的 API 格式限制(OPENAI、CLAUDE、GEMINI)。
- AccessRestrictions 新增 allowed_api_formats 字段
- 新增 is_api_format_allowed() 方法检查格式权限
- models.py 添加 _filter_formats_by_restrictions() 函数过滤 API 格式
- 在所有模型列表和查询端点应用格式限制检查
- 添加 _build_empty_list_response() 统一空响应构建逻辑
|
2025-12-30 17:50:39 +08:00 |
|
RWDai
|
6bd8cdb9cf
|
feat: 实现邮箱验证注册功能
添加完整的邮箱验证注册系统,包括验证码发送、验证和限流控制:
- 新增邮箱验证服务模块(email_sender, email_template, email_verification)
- 更新认证API支持邮箱验证注册流程
- 添加注册对话框和验证码输入组件
- 完善IP限流器支持邮箱验证场景
- 修复前端类型定义问题,升级esbuild依赖
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2025-12-30 17:15:48 +08:00 |
|
fawney19
|
e20a09f15a
|
feat: 添加模型列表访问限制功能
实现 API Key 和 User 级别的模型访问权限控制,支持按 Provider 和模型名称限制。
- 新增 AccessRestrictions 类处理访问限制合并逻辑(API Key 优先于 User)
- models_service 支持根据限制过滤模型列表
- models.py 在列表查询时构建并应用访问限制
- 优化缓存策略:仅无限制请求使用缓存,有限制的请求旁路缓存
- 修复 logger 配置:enqueue 改为 False 避免 macOS 信号量泄漏
|
2025-12-30 16:57:59 +08:00 |
|
fawney19
|
b89a4af0cf
|
refactor: 统一 HTTP 客户端超时配置
将 HTTPClientPool 中硬编码的超时参数改为使用可配置的环境变量,提高系统的灵活性和可维护性。
- 添加 HTTP_READ_TIMEOUT 环境变量配置(默认 300 秒)
- 统一所有 HTTP 客户端创建逻辑使用配置化超时
- 改进变量命名清晰性(config -> default_config 或 client_config)
|
2025-12-30 15:06:55 +08:00 |
|
fawney19
|
a56854af43
|
feat: 为 GlobalModel 添加关联提供商查询 API
添加新的 API 端点 GET /api/admin/models/global/{global_model_id}/providers,用于获取 GlobalModel 的所有关联提供商(包括非活跃的)。
- 后端:实现 AdminGetGlobalModelProvidersAdapter 适配器
- 前端:使用新 API 替换原有的 ModelCatalog 获取方式
- 数据库:改进初始化时的错误提示和连接异常处理
|
2025-12-30 14:47:35 +08:00 |
|
fawney19
|
96094cfde2
|
fix: 调整仪表盘普通用户月度统计显示,添加月度费用字段
|
2025-12-29 18:28:37 +08:00 |
|
fawney19
|
7e26af5476
|
fix: 修复仪表盘缓存命中率和配额显示逻辑
- 本月缓存命中率改为使用本月数据计算(monthly_input_tokens + cache_read_tokens),而非全时数据
- 修复配额显示:有配额时显示实际金额,无配额时显示为 /bin/zsh 并标记为高警告状态
|
2025-12-29 18:12:33 +08:00 |
|
fawney19
|
c8dfb784bc
|
fix: 修复仪表盘月份统计逻辑,改为自然月而非过去30天
|
2025-12-29 17:55:42 +08:00 |
|
fawney19
|
599b3d4c95
|
feat: 添加 Provider API Key 查看和复制功能
- 后端添加 GET /api/admin/endpoints/keys/{key_id}/reveal 接口
- 前端密钥列表添加眼睛按钮(显示/隐藏完整密钥)和复制按钮
- 关闭抽屉时自动清除已显示的密钥(安全考虑)
Fixes #53
|
2025-12-29 17:14:26 +08:00 |
|