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 |
|
fawney19
|
45a58a4a03
|
fix: 修复模型测试使用记录中 API 格式显示错误
将 check_endpoint 方法中的 api_format 参数从 cls.name 改为 cls.FORMAT_ID,
确保使用记录存储标准枚举值(如 GEMINI)而非内部名称(如 gemini.chat)
|
2026-01-14 21:19:34 +08:00 |
|
fawney19
|
0348b7d915
|
refactor: 废弃 rate_multiplier 字段,改进成本倍率回退逻辑
- 在前后端模型中为 rate_multiplier 添加 @deprecated 标记
- 修复 rate_multipliers 回退逻辑:当 rate_multipliers 存在但未配置当前格式时使用 1.0
- ModelMappingsTab: 删除映射后自动保存,简化空状态提示
- ModelManagement: 添加 refreshModel 事件在映射更新后刷新模型数据
- CacheAwareScheduler: 添加映射匹配调试日志,移除 candidate_models 限制
|
2026-01-14 21:07:28 +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 |
|
fawney19
|
24ece00e93
|
test(aware-scheduler): 添加模型支持检查逻辑的单元测试
测试 _check_model_support_for_global_model 方法的以下场景:
- Provider 没有配置模型时返回 False
- Provider 只有其他模型时返回 False
- Provider 有匹配模型时返回 True
- Provider 模型未激活时返回 False
|
2026-01-14 18:22:22 +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
|
133f3108f0
|
chore(config): 移除冗余的超时配置注释说明
|
2026-01-14 17:31:24 +08:00 |
|
fawney19
|
0ed053b02f
|
fix(model-resolution): 修复模型解析优先级和别名匹配范围
- 调整 ModelCacheService 解析优先级:优先直接匹配 GlobalModel.name,
避免被 provider_model_name 误导到错误的 GlobalModel
- 为 check_model_allowed_with_aliases 新增 candidate_models 参数,
限制别名匹配只能落到 Provider 实际配置的模型名上
- 对 allowed_set 排序以确保别名匹配结果的确定性
- 调整 HTTP_READ_TIMEOUT 默认值从 300s 改为 60s
- 优化 ModelMappingTab 组件布局,将正则表达式提取到 Key 级别展示
- 补充 .env.example 超时配置文档
|
2026-01-14 17:29:04 +08:00 |
|
fawney19
|
97d66a8d0c
|
feat(trace): 在请求链路追踪中记录并展示首字时间(TTFB)
将 first_byte_time_ms 添加到候选记录的 extra_data 中,
并在前端时间线组件中展示该指标。
|
2026-01-14 16:41:58 +08:00 |
|
fawney19
|
ec3c5994d9
|
fix(orchestration): 处理流式响应中的嵌入式错误
- 新增对 EmbeddedErrorException 的处理逻辑
- 客户端错误(如 prompt too long)停止重试并抛出异常
- 服务端错误允许重试或故障转移
- 将 _is_client_error 改为公开方法 is_client_error
|
2026-01-14 15:43:02 +08:00 |
|
fawney19
|
1f6e384d2b
|
fix(ui): 居中对齐时间线轨道内容
|
2026-01-14 15:43:01 +08:00 |
|
fawney19
|
5e4099a588
|
fix(proxy): 新增响应头过滤函数,避免透传不兼容的上游头
添加 filter_proxy_response_headers 函数过滤 content-length、content-encoding、
transfer-encoding 等 hop-by-hop 和 body-dependent 头,防止客户端解码失败。
统一在 chat_handler_base、cli_handler_base、stream_telemetry 和 usage recorder
中使用该函数处理响应头透传。
|
2026-01-14 14:50:33 +08:00 |
|
fawney19
|
68737b9ed6
|
refactor(ui): 重构模型映射功能,简化交互并提取独立组件
- ModelMappingDialog: 简化为单栏选择面板布局,移除拖拽排序和优先级编辑
- ProviderDetailDrawer: 移出别名映射预览,使用独立 ModelMappingTab 组件
- 新增 ModelMappingTab 组件: 统一展示精确映射和正则映射,支持连接测试
|
2026-01-14 14:28:13 +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
|
3b194d3c23
|
fix(ui): 移除未声明的组件 props 和 emits 消除 Vue 警告
- ModelManagement: 移除 ModelDetailDrawer 未使用的 providers、loading-providers props 和 refresh-providers 事件
- ProviderDetailDrawer: 移除 BatchAssignModelsDialog 未声明的 provider-identifier prop
- 删除不再使用的 refreshSelectedModelProviders 函数
|
2026-01-14 00:28:28 +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 |
|
 fawney19andhtmambo
|
8c4c5fa394
|
feat(ui): 增加模型连接性测试功能并优化对话框 ESC 键处理
- 模型测试: 新增测试按钮,支持多 API 格式选择
- ESC 键: 重构为全局栈管理,支持嵌套对话框
- 修复: check_endpoint 使用 FORMAT_ID 替代 name
- 优化: Redis 连接池添加健康检查
Co-authored-by: htmambo <[email protected]>
|
2026-01-13 20:11:09 +08:00 |
|
fawney19
|
6fdb944b1e
|
fix(ui): correct node-line positioning for horizontal scroll
Add proper absolute positioning (right: -64px, top: 50%) to ensure
connection lines correctly span the gap between timeline nodes.
|
2026-01-13 19:17:53 +08:00 |
|
fawney19
|
1a0a3de2fc
|
feat(ui): 优化熔断状态显示和健康度格式
- 健康度格式统一为 0-1 小数格式(前后端同步)
- 添加熔断倒计时显示,支持实时更新
- 新增 useCountdownTimer composable 用于倒计时逻辑
- 添加 Key 健康恢复功能(按 API 格式恢复)
- 优化 UI 布局:简化链路预览标题、调整 Key 信息为两行显示
- 修复错误处理顺序(先刷新数据再显示成功提示)
- 减少模板中函数重复调用
|
2026-01-13 18:42:15 +08:00 |
|
fawney19
|
e536b7bc35
|
fix(ui): 修复提供商展开时左侧节点位置偏移问题
将上半段连线从自适应高度改为固定高度,确保节点圆点始终与卡片头部对齐
|
2026-01-13 16:06:52 +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
|
bde5bf4c76
|
fix(ui): 简化模型定价标签显示
将"输入/输出"改为"入/出"以节省空间
|
2026-01-12 09:10:40 +08:00 |
|
fawney19
|
94abab3260
|
refactor(ui): 重构批量模型管理对话框为单列勾选模式
- BatchAssignModelsDialog: 从左右双栏改为单列勾选,支持统一保存
- KeyAllowedModelsEditDialog: 添加分组折叠功能,优化布局
- Dialog: 调整移动端内边距适配
- ProviderDetailDrawer: 密钥列表改为两行显示
- KeyFormDialog: 缩小对话框尺寸
- ModelsTab: 调整表格列宽
|
2026-01-11 19:33:16 +08:00 |
|
fawney19
|
76ed136228
|
refactor(ui): 简化模型权限编辑对话框交互
- 将模型权限对话框从双栏穿梭框重构为单面板多选模式
- 简化对话框尺寸,优化布局为单列显示避免模型名称截断
- 模型列表移除能力列,新增快捷添加映射按钮
- 支持从模型列表直接跳转到模型映射对话框并预选模型
|
2026-01-11 02:06:48 +08:00 |
|
fawney19
|
8d8b20aa47
|
feat(ui): 优化上游模型查询错误提示
新增 parseUpstreamModelError 函数,将后端返回的原始错误信息
转换为用户友好的中文提示,支持解析 HTTP 状态码和 JSON 错误体
|
2026-01-11 00:41:41 +08:00 |
|
fawney19
|
aec0326d40
|
feat(ui): 密钥管理支持拖拽调整优先级
- 添加拖拽手柄和视觉反馈效果
- 拖拽到组内(2+同优先级)时加入该组
- 拖拽到单独密钥时交换优先级
- 同组内拖拽忽略操作
|
2026-01-11 00:22:21 +08:00 |
|
fawney19
|
7faca5512a
|
feat(ui): 优化密钥添加和仪表盘空状态体验
- KeyFormDialog: 添加模式下保存后不关闭对话框,清除表单以便连续添加
- KeyFormDialog: 按钮文案根据编辑/添加模式动态显示
- Dashboard: 优化统计卡片加载状态和空数据占位显示
|
2026-01-10 19:32:36 +08:00 |
|
fawney19
|
ad84272084
|
fix: 修复普通用户无法访问仪表盘接口的权限问题
将 DashboardAdapter 的 mode 从 ApiMode.ADMIN 改为 ApiMode.USER,
允许普通用户访问 /api/dashboard/stats 和 /api/dashboard/daily-stats 接口。
|
2026-01-10 19:31:19 +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
|
dd2fbf4424
|
style(ui): 调整模型详情抽屉关联提供商表格列宽
|
2026-01-08 13:37:41 +08:00 |
|
fawney19
|
99b12a49c6
|
Merge pull request #78 from fawney19/perf/optimize
perf: 优化 HTTP 客户端连接池复用
|
2026-01-08 13:37:13 +08:00 |
|
fawney19
|
ea35efe440
|
perf: 优化 HTTP 客户端连接池复用
- 新增 get_proxy_client() 方法,相同代理配置复用同一客户端
- 添加 LRU 淘汰策略,代理客户端上限 50 个防止内存泄漏
- 新增 get_default_client_async() 异步线程安全版本
- 使用模块级锁避免类属性初始化竞态条件
- 优化 ConcurrencyManager 使用 Redis MGET 批量获取减少往返
- 添加 get_pool_stats() 连接池统计信息接口
|
2026-01-08 13:34:59 +08:00 |
|
fawney19
|
bf09e740e9
|
fix(ui): 优化提供商详情页的交互体验
- 模型列表删除按钮仅在 hover 时显示红色
- 批量关联模型对话框:只有全局模型时展开,有多个分组时全部折叠
|
2026-01-08 11:25:52 +08:00 |
|
fawney19
|
60c77cec56
|
Merge pull request #77 from AAEE86/ui
style(ui): improve text visibility in dark mode for model badges
|
2026-01-08 10:52:54 +08:00 |
|
fawney19
|
0e4a1dddb5
|
refactor(ui): 优化批量端点创建的 UI 和性能
- 调整布局: API URL 移至顶部, API 格式选择移至下方
- 优化 checkbox 样式: 使用自定义勾选框替代原生样式
- API 格式按列排序: 基础格式和对应 CLI 格式上下对齐
- 请求配置改为 4 列布局, 更紧凑
- 使用 Promise.allSettled 并发创建端点, 提升性能
- 改进错误提示: 失败时直接展示具体错误信息给用户
- 清理未使用的 Select 组件导入和 selectOpen 变量
|
2026-01-08 10:50:25 +08:00 |
|
fawney19
|
1521ce5a96
|
feat: 添加负载均衡调度模式
- 新增 load_balance 调度模式,同优先级内随机轮换
- 前端支持三种调度模式切换:缓存亲和、负载均衡、固定顺序
|
2026-01-08 03:20:04 +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
|
d9e6346911
|
fix: 降低 API Key 最小长度限制至 3 个字符
|
2026-01-08 01:53:16 +08:00 |
|
fawney19
|
238788e0e9
|
fix: 统一端点默认重试次数为 2
同步前端表单、mock 数据和后端导入配置中端点的默认重试次数
|
2026-01-08 01:40:40 +08:00 |
|
fawney19
|
68ff828505
|
feat: 容器启动时自动执行数据库迁移
- 添加 entrypoint.sh 在容器启动前执行 alembic upgrade head
- 更新 Dockerfile.app 和 Dockerfile.app.local 使用新入口脚本
- 移除手动迁移脚本 migrate.sh
- 简化 README 部署说明
|
2026-01-08 01:28:36 +08:00 |
|
fawney19
|
59447fc12b
|
fix: 固定容器内部端口为 8084,避免 PORT 环境变量导致端口冲突
|
2026-01-07 21:51:55 +08:00 |
|
fawney19
|
c8033fb6ab
|
chore: bump version to 0.2.5
|
2026-01-07 20:19:49 +08:00 |
|
fawney19
|
e33d5b952c
|
feat: 所有计费模板支持按次计费,调整端点默认重试次数为 2
- 为 Claude、OpenAI、豆包、Gemini 计费模板添加 request 维度
- 支持通过 price_per_request 配置按次计费(如图片生成模型)
- 将端点 max_retries 默认值从 3 改为 2(请求一次 + 重试一次)
|
2026-01-07 20:15:30 +08:00 |
|
fawney19
|
4345ac2ba2
|
fix: 添加系统配置项默认值,避免前端获取配置时报错
添加以下配置项到 DEFAULT_CONFIGS:
- email_suffix_mode/email_suffix_list (邮箱后缀限制)
- audit_log_retention_days (审计日志保留天数)
- smtp_* (SMTP 邮件服务器配置)
|
2026-01-07 20:01:17 +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
|
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
|
42dc64246c
|
feat: 添加 GUNICORN_WORKERS 环境变量配置
|
2026-01-07 16:38:46 +08:00 |
|
fawney19
|
fbe303a3cd
|
fix: 补充 cost.py 中 Provider 未实现模型时的 else 分支处理
|
2026-01-07 16:13:53 +08:00 |
|
fawney19
|
373845450b
|
refactor: 简化 docker-compose 环境变量配置
使用 env_file 加载 .env 文件,移除冗余的环境变量声明,
仅保留需要组合的变量和容器级别设置
|
2026-01-07 15:19:55 +08:00 |
|
fawney19
|
084bbc0bef
|
refactor: 将 nginx gzip 压缩配置移至 server 块内部
|
2026-01-07 15:10:11 +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
|
f6a6410626
|
feat: 添加 GitHub 仓库链接到页面头部
- 新增 GithubIcon 组件复用 GitHub 图标
- MainLayout 和 Home 页面头部添加 GitHub 链接按钮
- 重构 Home 页面 header 布局结构
|
2026-01-06 18:27:28 +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
|
28209e1c2a
|
Merge pull request #72 from fawney19/test-ldap-pr
feat: 添加 LDAP 认证支持
|
2026-01-06 14:45:31 +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 |
|
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 |
|
fawney19
|
c02ac56da8
|
chore: 更新 docker-compose 命令为 docker compose
统一使用 Docker Compose V2 的现代写法
|
2026-01-03 01:39:45 +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 |
|
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
|
4a35d78c8d
|
fix: 修正 README 中的图片文件扩展名
|
2025-12-30 09:44:45 +08:00 |
|
fawney19
|
26b281271e
|
docs: 更新许可证说明、README 文档和模拟数据;调整模型版本至最新
|
2025-12-30 09:41:03 +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
|
fd3a5a5afe
|
refactor: 将模型测试功能从 ModelsTab 移到 KeyAllowedModelsDialog
|
2025-12-29 17:44:02 +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 |
|
fawney19
|
41719a00e7
|
refactor: 改进分布式任务锁的清理策略
实现两种锁清理模式:
- 单实例模式(默认):启动时使用 Lua 脚本原子性清理旧锁,解决 worker 重启时���锁残留问题
- 多实例模式:使用 NX 选项竞争锁,依赖 TTL 处理异常退出
可通过 SINGLE_INSTANCE_MODE 环境变量控制模式选择。
|
2025-12-28 21:34:43 +08:00 |
|
fawney19
|
b5c0f85dca
|
refactor: 统一剪贴板复制功能到 useClipboard 组合式函数
将各个组件和视图中重复的剪贴板复制逻辑提取到 useClipboard 组合式函数。
增加 showToast 参数支持静默复制,减少代码重复,提高维护性。
|
2025-12-28 20:41:52 +08:00 |
|
fawney19
|
7d6d262ed3
|
feat: 增加用户密码修改时的确认验证
在编辑用户时,如果填写了新密码,需要进行密码确认,确保两次输入一致。
同时更新后端请求模型以支持密码字段。
|
2025-12-28 20:00:25 +08:00 |
|
fawney19
|
e21acd73eb
|
fix: 修复模型映射中重复关联的问题
在批量分配模型和编辑模型映射时,需要检查不仅是主模型名是否已关联,
还要检查其映射名称是否已存在,防止同一个上游模型被重复关联。
|
2025-12-28 19:40:07 +08:00 |
|