fawney19
5a81be0756
fix(routing): 有效 Keys 计数考虑模型白名单权限
...
路由预览中计算有效 Keys 数量时,除了检查 is_active 状态外,
还需检查 Key 的白名单是否允许当前模型(包括模型映射匹配)。
2026-01-15 09:21:30 +08:00
fawney19
5d34426428
feat(models): 路由预览显示 Key 白名单的模型映射匹配
...
- 后端返回 GlobalModel 的 model_mappings 正则模式
- 前端用映射模式匹配 Key 白名单,显示匹配的模型名
2026-01-15 02:36:00 +08:00
fawney19
19209181dc
feat(models): 添加全局 Key 白名单数据支持模型映射实时匹配
...
- 新增 GlobalKeyWhitelistItem 类型定义
- 路由预览 API 返回 all_keys_whitelist 字段,包含所有活跃 Provider 的 Key 白名单
- 前端 ModelMappingsTab 改用全局白名单数据进行实时匹配
2026-01-15 00:35:28 +08:00
fawney19
154ec94c58
fix: 关闭 auto_fetch_models 时保留锁定的模型
2026-01-14 21:31:05 +08:00
fawney19
8909e6741a
Merge PR #92 : feat(keys): trigger immediate model fetch when auto_fetch_models is enabled
2026-01-14 21:30:29 +08:00
AAEE86
c61c3147ba
feat(keys): clear allowed_models when auto_fetch_models is disabled
...
Add logic to automatically set allowed_models to null when auto_fetch_models is turned off for a key. Also include auto_fetch_models and locked_models fields in config export/import, and trigger model fetching for keys with auto_fetch_models enabled during import.
2026-01-14 20:05:52 +08:00
fawney19
bec9c3a989
refactor: 将模型别名(alias)统一重命名为模型映射(mapping)
...
- 重命名 API: alias-mapping-preview -> mapping-preview
- 重命名类型: AliasMatchedModel -> MappingMatchedModel 等
- 重命名字段: model_aliases -> model_mappings, alias_matched_model -> mapping_matched_model
- 重命名前端组件: ModelAliasesTab -> ModelMappingsTab
- 重命名验证函数: validate_model_aliases -> validate_model_mappings
- 同步更新相关测试用例
- 补充 ModelService 中新增/批量创建模型时的缓存失效逻辑
2026-01-14 19:35:41 +08:00
AAEE86
1becf39269
feat(keys): trigger immediate model fetch when auto_fetch_models is enabled
2026-01-14 18:18:31 +08:00
fawney19
b272109055
refactor(model-permissions): 简化 allowed_models 为纯列表格式
...
移除按 API 格式区分的字典模式(Dict[str, List[str]]),统一使用简单列表格式。
- 删除 normalize_allowed_models 的 api_format 参数
- 删除 check_model_allowed 的 api_format 参数
- 简化 merge_allowed_models 为直接列表交集
- 移除前端的字典模式兼容代码和警告 UI
- 删除 is_format_mode、convert_to_format_mode 等辅助函数
2026-01-14 17:57:21 +08:00
fawney19
a8813cfb89
feat(keys): 新增密钥自动获取模型功能
...
- 添加 auto_fetch_models 字段支持定时从上游 API 获取可用模型
- 添加 locked_models 字段支持锁定模型,刷新时不会被删除
- 新增 ModelFetchScheduler 调度器定期执行模型获取任务
- 前端 KeyFormDialog 添加自动获取模型开关
- 前端 KeyAllowedModelsEditDialog 支持模型锁定操作
- ProviderDetailDrawer 显示密钥同步状态
- 数据库迁移添加新字段
2026-01-14 13:12:19 +08:00
fawney19
5374add5d8
feat(update): 增强更新检查功能,展示发布日志和发布时间
...
- 后端从 GitHub Tags API 改为 Releases API,获取更丰富的发布信息
- 新增 release_notes 和 published_at 字段
- 前端更新对话框展示发布时间和 Markdown 格式的更新日志
- 使用 DOMPurify 对 Markdown 渲染结果进行 XSS 防护
- 简化 GlobalModel 缓存失效逻辑,合并同步/异步调用
2026-01-13 20:29:16 +08:00
fawney19
1a0a3de2fc
feat(ui): 优化熔断状态显示和健康度格式
...
- 健康度格式统一为 0-1 小数格式(前后端同步)
- 添加熔断倒计时显示,支持实时更新
- 新增 useCountdownTimer composable 用于倒计时逻辑
- 添加 Key 健康恢复功能(按 API 格式恢复)
- 优化 UI 布局:简化链路预览标题、调整 Key 信息为两行显示
- 修复错误处理顺序(先刷新数据再显示成功提示)
- 减少模板中函数重复调用
2026-01-13 18:42:15 +08:00
fawney19
85decd7487
feat: 实现 GlobalModel 别名匹配系统
...
主要更改:
- GlobalModel 支持 model_aliases 配置,允许使用正则表达式定义别名规则
- Provider Key 的 allowed_models 现在可以通过别名规则匹配 GlobalModel
- 新增 ModelAliasesTab 组件用于管理模型别名配置
- Provider 详情页新增别名映射预览功能,展示 Key 白名单与 GlobalModel 别名的匹配关系
- 路由预览 API 返回 Key 的 allowed_models 信息
安全特性:
- 使用 regex 库的原生超时保护(100ms)防止 ReDoS 攻击
- 别名规则数量限制(50 条/模型)和长度限制(200 字符)
- 别名映射预览 API 添加超时保护和结果截断
其他改进:
- GlobalModel 更新/删除时使用行级锁防止并发竞态
- 缓存失效逻辑优化,支持异步清理和正则缓存清空
- 路由 Tab 布局重构,使用 flexbox 替代绝对定位
2026-01-13 16:04:15 +08:00
fawney19
9fea71a70c
feat(ui): 新增模型请求链路预览功能
...
- 添加后端 API 获取 GlobalModel 的请求链路信息 (/api/admin/models/global/{id}/routing)
- 新增 RoutingTab 组件展示模型的请求链路树状结构
- 支持全局 Key 优先和提供商优先两种模式的可视化
- 重构批量模型管理对话框为单列勾选模式
- 修复 errorParser.ts 字符串拼接格式问题
- 若干 Vue 模板格式优化
2026-01-12 23:28:37 +08:00
fawney19
09e0f594ff
refactor: 重构限流系统和健康监控,支持按 API 格式区分
...
- 将 adaptive_concurrency 重命名为 adaptive_rpm,从并发控制改为 RPM 控制
- 健康监控器支持按 API 格式独立管理健康度和熔断器状态
- 新增 model_permissions 模块,支持按格式配置允许的模型
- 重构前端提供商相关表单组件,新增 Collapsible UI 组件
- 新增数据库迁移脚本支持新的数据结构
2026-01-10 18:48:35 +08:00
fawney19
f2e62dd197
feat: 添加版本更新检查功能
...
- 后端新增 /api/admin/system/check-update 接口,从 GitHub Tags 获取最新版本
- 前端新增 UpdateDialog 组件,管理员登录后自动检查更新并弹窗提示
- 同一会话内只检查一次,点击"稍后提醒"后 24 小时内不再提示
- CI 和 deploy.sh 自动生成 _version.py 版本文件
2026-01-08 03:01:54 +08:00
fawney19
d378630b38
perf: 添加多层缓存优化减少数据库查询
...
- 新增 ProviderCacheService 缓存 Provider 和 ProviderAPIKey 数据
- SystemConfigService 添加进程内缓存(TTL 60秒)
- API Key last_used_at 更新添加节流策略(60秒间隔)
- HTTP 连接池配置改为可配置,支持根据 Worker 数量自动计算
- 前端优先级管理改用 health_score 显示健康度
2026-01-08 02:34:59 +08:00
fawney19
238788e0e9
fix: 统一端点默认重试次数为 2
...
同步前端表单、mock 数据和后端导入配置中端点的默认重试次数
2026-01-08 01:40:40 +08:00
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
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
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
00562dd1d4
feat: 添加 LDAP 认证支持
...
- 新增 LDAP 服务和 API 接口
- 添加 LDAP 配置管理页面
- 登录页面支持 LDAP/本地认证切换
- 数据库迁移支持 LDAP 相关字段
2026-01-06 14:38:42 +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
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
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
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
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
RWDai
3e4309eba3
Enhance LDAP auth config handling
2026-01-04 16:27:02 +08:00
RWDai
64bfa955f4
feat(ldap): 完善 LDAP 认证功能和安全性
...
- 添加 LDAP 配置类型定义,移除 any 类型
- 首次配置 LDAP 时强制要求设置绑定密码
- 根据认证类型区分登录标识验证(本地需邮箱,LDAP 允许用户名)
- 添加 LDAP 过滤器转义函数防止注入攻击
- 增加 LDAP 连接超时设置
- 添加账户来源冲突检查,防止 LDAP 覆盖本地账户
- 添加用户名冲突自动重命名机制
2026-01-04 11:18:28 +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
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
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
599b3d4c95
feat: 添加 Provider API Key 查看和复制功能
...
- 后端添加 GET /api/admin/endpoints/keys/{key_id}/reveal 接口
- 前端密钥列表添加眼睛按钮(显示/隐藏完整密钥)和复制按钮
- 关闭抽屉时自动清除已显示的密钥(安全考虑)
Fixes #53
2025-12-29 17:14:26 +08:00
hoping
26b4a37323
feat: 引入统一的端点检查器以重构适配器并改进错误处理和用量统计。
2025-12-25 00:02:56 +08:00
fawney19
d44cfaddf6
fix: rename variable to avoid shadowing in model mapping cache stats
...
循环内部变量 provider_model_mappings 与外部列表同名,导致外部列表被覆盖为 None 引发 AttributeError
2025-12-23 00:38:37 +08:00
fawney19
65225710a8
refactor: use ConcurrencyDefaults for CACHE_RESERVATION_RATIO constant
2025-12-23 00:34:18 +08:00
fawney19
d7384e69d9
fix: improve code quality and add type safety for Key updates
...
- Replace f-string logging with lazy formatting in keys.py (lines 256, 265)
- Add EndpointAPIKeyUpdate type interface for frontend type safety
- Use typed EndpointAPIKeyUpdate instead of any in KeyFormDialog.vue
2025-12-23 00:11:10 +08:00
fawney19
4e1aed9976
feat: add daily model statistics aggregation with stats_daily_model table
2025-12-20 02:39:10 +08:00
fawney19
e2e7996a54
feat: implement upstream model import and batch model assignment with UI components
2025-12-20 02:01:17 +08:00
fawney19
df9f9a9f4f
feat: add internal model list query interface with configurable User-Agent headers
2025-12-19 23:40:42 +08:00
hoping
8c12174521
个性化处理
...
1. 为所有抽屉和对话框添加 ESC 键关闭功能;
2. 为`使用记录`表格添加自动刷新开关;
3. 为后端 API 请求增加 User-Agent 头部;
4. 修改启动命令支持从.env中读取数据库和Redis配置。
2025-12-19 17:31:15 +08:00
fawney19
c69a0a8506
refactor: remove stream smoothing config from system settings and improve base image caching
...
- Remove stream_smoothing configuration from SystemConfigService (moved to handler default)
- Remove stream smoothing UI controls from admin settings page
- Add AdminClearSingleAffinityAdapter for targeted cache invalidation
- Add clearSingleAffinity API endpoint to clear specific affinity cache entries
- Include global_model_id in affinity list response for UI deletion support
- Improve CI/CD workflow with hash-based base image change detection
- Add hash label to base image for reliable cache invalidation detection
- Use remote image inspection to determine if base image rebuild is needed
- Include Dockerfile.base in hash calculation for proper dependency tracking
2025-12-19 13:09:56 +08:00