Commit Graph

482 Commits

Author SHA1 Message Date
fawney19
13487fe4e5 fix: 添加 from __future__ import annotations 修复运行时类型错误
原 PR 将 Optional[X] 改为 X | None 后,如果 X 在 TYPE_CHECKING 块中导入,
会导致运行时 NameError。添加 future annotations 使类型注解延迟求值。

影响文件:
- src/services/auth/service.py
- src/core/api_format/utils.py
- src/core/api_format/detection.py
- 及其他 15 个使用 TYPE_CHECKING 的文件
2026-01-30 12:43:08 +08:00
fawney19
a90f065ab0 fix: 对齐 requires-python 版本声明至 >=3.12
代码已使用 PEP 604 (T | None) 等 3.10+ 语法,
且 Docker 镜像已升级至 Python 3.14,
但 requires-python 仍声明 >=3.9 会导致在 3.9/3.10/3.11 上安装后运行时报错。

- requires-python: ">=3.9" → ">=3.12"
- 移除 classifiers 中 3.9/3.10/3.11 的声明

Co-authored-by: AAEE86 <ppk0227@hotmail.com>
2026-01-30 12:38:29 +08:00
AAEE86
897ea2e7a4 perf: 优化 Provider 预加载和 bcrypt 密码验证性能
- 使用 selectinload 预加载 endpoints 避免 N+1 查询
- 将 bcrypt 密码验证移至线程池执行,避免阻塞事件循环
2026-01-30 10:55:30 +08:00
AAEE86
d0ecdcd8aa feat: 增加签到状态识别关键词"已经签到" 2026-01-30 08:42:36 +08:00
AAEE86
24d24f6829 chore: 升级到 Python 3.14 并现代化代码
- 升级 Docker 基础镜像从 Python 3.12 到 3.14
- 更新 pyproject.toml 支持 Python 3.13/3.14
- 移除 Python 3.8/3.9/3.10/3.11 分类器
- 更新 black 和 mypy 配置目标版本
- 将 get_event_loop() 替换为 get_running_loop() 加上 RuntimeError 处理
- 简化 compute_cost_sync 中的 asyncio.run 使用
- Dict/List/Tuple/Set → dict/list/tuple/set (PEP 585)
- Optional[T] → T | None (PEP 604)
- Union[A, B] → A | B (PEP 604)
- 移除废弃的 typing 导入
- 移除不必要的字符串引号注解
2026-01-30 03:10:21 +08:00
fawney19
3e75bc8964 fix(docker): sync Dockerfile.app.local with Dockerfile.app
- Add /auth to SPA routes
- Add /docs|redoc|openapi.json location block
- Add GUNICORN_WORKERS=4 default env var
2026-01-29 23:26:13 +08:00
fawney19
0b6763745c Merge pull request #128 from AAEE86/master
fix(frontend): 修复端点配置对话框中多个 Select 下拉框同时打开的冲突问题
2026-01-29 23:25:05 +08:00
fawney19
4487c35486 Merge pull request #127 from NyaDoo/master
fix: CLI 模型测试请求添加 x-app: cli 头部
2026-01-29 23:05:25 +08:00
fawney19
61abb47d22 refactor: 重构上游模型获取与展示逻辑
- 后端支持遍历所有活跃 API Key 聚合模型,按 model id 合并 api_formats
- 前端移除按 API 格式分组,改为统一展示并内联显示格式标签
- 改进 401 错误处理,账户异常时清除认证并重定向首页
2026-01-29 22:58:37 +08:00
AAEE86
b0b1bdf158 feat: 添加Gunicorn配置优化并改进Docker构建配置
- 新增 gunicorn_conf.py 配置文件,实现:
  - GC冻结优化以改善Copy-on-Write内存共享
  - Worker RSS内存监控日志
  - 添加 --max-requests 和 --max-requests-jitter 防止内存泄漏

- 改进 Dockerfile 配置:
  - 修复 Nginx 静态文件目录权限问题

- 简化 docker-compose 配置:
  - 移除冗余的 PYTHONIOENCODING/LANG/LC_ALL 环境变量
2026-01-29 22:53:42 +08:00
AAEE86
c26598c773 feat(frontend): 调整统一模型表单对话框尺寸
- 将对话框尺寸从 3xl 增大到 4xl
- 将创建模式的内容高度从 500px 增加到 600px
- 为模型选择和配置区域提供更多展示空间
2026-01-29 17:41:12 +08:00
AAEE86
2140c1443a fix(frontend): 修复端点配置对话框中多个 Select 下拉框同时打开的冲突问题 2026-01-29 17:16:30 +08:00
LewisPen
ed2f4c1c34 fix: CLI 模型测试请求添加 x-app: cli 头部
CLI adapter 的 check_endpoint 测试请求缺少 x-app: cli 头部,
导致上游 Aether 节点选择了错误的 adapter 提取 API Key,
返回 401 认证失败。
2026-01-29 14:35:10 +08:00
fawney19
297da59448 refactor(guide): 重构教程页面为管理员视角
- 重新规划教程结构:概览、供应商管理、模型管理、用户与密钥、高级功能、常见问题
- 新增详细的功能解释和配置说明
- 删除旧的 CLI/SDK 用户指南页面
- 修复路由配置,添加 meta.requiresAuth: false
2026-01-29 13:58:06 +08:00
fawney19
ec9aea1f0e refactor(frontend): 优化首页 Header 响应式布局
分离移动端和桌面端的 Header 布局结构,提升不同屏幕尺寸下的显示效果
v0.4.10
2026-01-29 12:11:53 +08:00
fawney19
013c807f0d feat(frontend): 新增配置教程页面并优化暗色模式样式
- 添加 Guide 配置教程页面及路由
- 统一暗色模式配色方案,使用协调的暖色调
- 重新设计功能卡片,区分已完成与开发中状态
- 更新功能卡片描述,反映当前开发重点
2026-01-29 11:41:55 +08:00
fawney19
407fcfff3e refactor(frontend): 代码格式化与移动端响应式优化
- 修正 Vue 组件 defineProps/defineEmits 声明顺序
- 优化首页移动端布局,调整 Logo 位置与透明度
- 为 Aether 标题添加打字机动画效果
- 修复 HTML 属性中引号的实体转义
2026-01-29 11:06:30 +08:00
fawney19
557e64c77f fix: 响应中保留用户请求的原始模型名
- 非流式响应:通过 requested_model 参数传递用户请求的模型名
- 流式响应:StreamState 初始化时使用 ctx.model 而非 ctx.mapped_model
- 流式转换:normalizers 保留初始 model 值,不被上游事件覆盖
- parsed_chunks:格式转换时记录转换后数据,确保与客户端收到的一致
2026-01-29 10:32:36 +08:00
fawney19
2e9c9e80d1 fix: 修复响应解析器中 usage 为 null 时的处理问题
将 response.get("usage", {}) 改为 response.get("usage") or {},
避免 usage 显式为 None 时导致后续属性访问失败。
2026-01-29 09:44:12 +08:00
fawney19
ac73f6fbac chore: 提升请求/响应体记录大小限制至 5MB 2026-01-29 09:33:11 +08:00
fawney19
06a46383a1 perf: 优化同步方法性能,避免事件循环开销
- pipeline.py: 日志格式改为 %-style 懒惰计算
- cost.py: get_model_price/get_tiered_pricing 改用直接数据库查询
- usage/service.py: 批量记录改为并行准备,提取 build_params 减少重复代码
v0.4.9
2026-01-29 02:00:00 +08:00
fawney19
b4bbf4eeb1 feat: 添加 NekoCode 中转站架构支持
- 使用 Cookie 认证(session)
- 支持余额查询和每日配额显示
- 显示订阅状态和有效期
2026-01-28 23:51:06 +08:00
fawney19
6b34a7e3f5 feat: 多项功能优化与问题修复
- 添加高频轮询端点日志抑制,减少 debug 日志噪音
- Gemini 格式转换支持 responseModalities、thinkingConfig 透传和图片生成输出
- OpenAI 格式转换支持流式图片内容块,区分 URL 引用和 base64 内嵌图片
- Provider 余额缓存认证失败时使用短 TTL,避免前端无限加载中
- Usage 服务支持更新 pending/streaming 记录,处理重复 request_id 冲突
- Usage 超时检测增强,避免错误标记已完成请求为超时
2026-01-28 23:07:58 +08:00
fawney19
91986baa57 feat: 添加流式请求客户端断连检测
在等待上游首字节期间检测客户端是否已断开连接,若检测到断连则及时取消请求并清理资源,避免资源浪费。

- 新增 ClientDisconnectedException 和 wait_for_with_disconnect_detection 工具函数
- ChatHandlerBase 和 CliMessageHandlerBase 均支持 http_request 参数用于断连检测
- 流式传输期间使用后台任务主动检测断连状态
- 断连时设置状态码 499 并记录日志
2026-01-28 17:10:21 +08:00
fawney19
bae278a0c1 feat: 添加提供商格式转换优先级保持配置
- 新增 Provider.keep_priority_on_conversion 字段,控制格式转换时是否保持优先级
- 新增全局配置 KEEP_PRIORITY_ON_CONVERSION,可全局启用优先级保持
- 调度器根据配置决定是否降级需要格式转换的候选
- 前端 Provider 表单添加"保持优先级"开关
- 调整 HTTP 读写超时默认值为 3600 秒
2026-01-28 15:53:33 +08:00
fawney19
5e81a0b581 refactor: 移除 ModelsTab 单个删除按钮,简化表格样式
Close #119
2026-01-28 13:17:50 +08:00
fawney19
e7fda0eadd fix: 统一格式兼容性检查,透传格式也需开关启用
- 同族格式(如 CLAUDE/CLAUDE_CLI)现在也需要全局开关和端点开关启用才能透传
- 格式转换关闭时,Models API 只返回客户端格式本身
- 添加测试用例验证透传格式受开关限制
v0.4.8
2026-01-28 13:08:14 +08:00
fawney19
95fc848e59 feat: 配置导出/导入支持 LDAP 和 OAuth Provider
- 新增配置格式 v2.1,支持导出/导入 LDAP 配置和 OAuth Providers
- 导出时解密敏感字段(bind_password, client_secret, provider_ops credentials)
- 导入时加密敏感字段后存储
- 前端支持预览和显示 LDAP/OAuth 导入结果
2026-01-28 12:56:37 +08:00
fawney19
4cd196f665 fix: 隐藏普通用户的模型映射信息
对普通用户隐藏使用记录中的 target_model 字段,只有管理员可见。
避免向普通用户暴露内部模型映射策略。
2026-01-28 12:41:29 +08:00
fawney19
40e54097b0 feat: 添加 Zeabur 部署文档,Models API 支持 CLI 格式
- 新增 Zeabur 平台部署指南文档
- Models API 格式列表增加对应的 CLI 格式支持
v0.4.7
2026-01-28 12:06:48 +08:00
fawney19
bd843bca61 feat: 使用量轮询接口添加 API 格式转换字段
- 前端:添加 api_format、endpoint_api_format、has_format_conversion 类型定义
- 前端:轮询时同步更新格式转换相关字段
- 后端:查询时返回格式转换字段,包含历史数据兼容逻辑
- 后端:优化 import 位置提升性能
2026-01-28 11:24:37 +08:00
fawney19
5c80be92c9 refactor: 使用 data_format_id 重构格式兼容性判断逻辑
- 在 ApiFormatDefinition 中新增 data_format_id 字段标识数据格式
- 新增 can_passthrough() 函数判断格式间是否可透传
- 重构 compatibility.py 使用 data_format_id 替代 get_base_format()
- 使用量记录支持从 endpoint 回填格式信息(兼容历史数据)
- 前端优化格式转换显示逻辑,区分跨格式转换和同族格式差异
- 首页 header 响应式布局优化
2026-01-28 11:07:23 +08:00
fawney19
c1d7b13e7a feat: 使用量记录添加格式转换字段
- cli_handler_base 添加 needs_conversion 变量跟踪格式转换状态
- 用户使用量查询响应新增 endpoint_api_format 和 has_format_conversion 字段
2026-01-28 10:01:19 +08:00
fawney19
865be3a6bf feat: 添加异步使用量记录队列系统
- 新增 QueueTelemetryWriter 支持通过内存队列异步记录使用量
- 新增 UsageQueueConsumer 消费者,支持批量处理和流式消费
- 重构 StreamTelemetryRecorder 支持队列写入模式
- UsageService 新增 record_usage_batch 批量记录方法
- 新增 USAGE_QUEUE_ENABLED 和 USAGE_QUEUE_INCLUDE_BODIES 配置项
- 状态值新增 cancelled 类型支持
2026-01-28 09:54:18 +08:00
fawney19
b97e029c82 refactor: 重构 CleanupScheduler 为 MaintenanceScheduler,新增 Provider 自动签到任务
- 将 cleanup_scheduler.py 重命名为 maintenance_scheduler.py
- CleanupScheduler 重命名为 MaintenanceScheduler,保留向后兼容别名
- 新增 Provider 自动签到定时任务(每天凌晨 1:05 执行)
- 前端新增定时任务配置区域,支持开关 Provider 自动签到
- 新增 enable_provider_checkin 系统配置项

Close #112
v0.4.6
2026-01-28 02:04:45 +08:00
fawney19
91a30adfc4 feat: 用户模型目录支持格式转换
为 /api/users/me/available-models 端点添加格式转换支持,
确保显示所有可通过任意客户端格式访问的模型。

- 新增 _get_all_available_provider_ids 方法
- 检查 OPENAI/CLAUDE/GEMINI 三种格式的兼容性
- 优化 DB 查询从 6 次减少到 2 次
- 与 /v1/models API 逻辑保持一致
2026-01-28 01:45:19 +08:00
fawney19
af0daa91ad refactor: 将格式转换全局开关迁移到环境变量配置
- 新增 FORMAT_CONVERSION_ENABLED 环境变量(默认开启)
- 移除数据库中的 format_conversion_enabled 系统配置
- 移除前端系统设置页面的格式转换开关 UI
- 统一同族格式转换(OPENAI/OPENAI_CLI)逻辑,也需检查全局开关和端点配置
- 流生成器使用 ctx.needs_conversion 替代 _needs_format_conversion 方法调用
- 更新测试用例适配新逻辑
- 清理 .env.example 中过时的超时和连接池配置注释
2026-01-28 01:22:39 +08:00
fawney19
1e0255d0ed feat: 优化批量余额查询和用户模型权限检查
- 添加批量余额查询并发限制,避免数据库连接池耗尽
- 支持余额加载 pending 状态和前端自动重试机制
- 添加用户可用模型 API,统一使用 AccessRestrictions
- 修复用户表单编辑时数组引用共享导致的数据覆盖问题
- 添加数据库连接池配置说明到 .env.example
2026-01-28 01:01:05 +08:00
fawney19
8e0695e9d9 Merge branch 'NyaDoo/master' 2026-01-28 00:10:00 +08:00
fawney19
0bd3fe32e2 fix: 移除 RegisterDialog 中重复的用户名验证检查 2026-01-28 00:09:56 +08:00
fawney19
c732a03263 feat: 添加格式转换追踪、模型过滤规则和 Provider 超时配置
1. Usage 格式转换追踪
   - 新增 endpoint_api_format 和 has_format_conversion 字段
   - 在用量记录中显示格式转换信息(请求格式 → 端点格式)
   - 兼容历史数据的回填逻辑

2. Provider API Key 模型过滤规则
   - 新增 model_include_patterns 和 model_exclude_patterns 字段
   - 支持 * 和 ? 通配符,不区分大小写
   - 自动获取模型时应用过滤规则

3. Provider 超时配置
   - 新增 stream_first_byte_timeout 和 request_timeout 字段
   - 支持每个 Provider 单独配置超时时间
   - 优先使用 Provider 配置,否则回退到全局配置

Close #122, Close #123

Co-Authored-By: AAEE86 <33052466+AAEE86@users.noreply.github.com>
2026-01-28 00:06:49 +08:00
fawney19
3c0bf5fdae fix: 修复同族 API 格式转换判断逻辑
- OPENAI 和 OPENAI_CLI 使用不同协议(Chat Completions vs Responses API),需要转换
- CLAUDE/CLAUDE_CLI、GEMINI/GEMINI_CLI 格式相同仅认证不同,可透传
- 添加 max_completion_tokens 参数支持(OpenAI 新参数名)
- 移除登录表单冗余的 keyup.enter 事件处理
2026-01-27 21:59:12 +08:00
NyaDoo
0c8c774642 Merge branch 'fawney19:master' into master 2026-01-27 14:03:06 +08:00
fawney19
6f340b7b91 fix: 修复跨格式转换时 usage 提取不准确的问题
- CLI Handler: 跨格式转换时使用 Provider 格式的解析器提取原始 usage
- CLI Handler: 新增从转换后事件中提取 usage 的补充方法
- Chat Handler: 移除不必要的格式自动检测转换代码(跨格式转换由 CLI Handler 统一处理)
- OpenAI Normalizer: 流式请求自动添加 stream_options 以获取 usage 统计
2026-01-27 12:39:36 +08:00
LewisPen
9fefa94134 feat: 用户名验证支持点号,统一错误消息,完善前端验证
- 后端正则改为 ^[a-zA-Z0-9_.\-]+$ 支持点号
- 统一错误消息使用"连字符"
- 前端 UserFormDialog 和 RegisterDialog 添加实时验证
- 输入框显示格式提示和错误信息
2026-01-27 12:17:19 +08:00
NyaDoo
e24534668a Merge branch 'fawney19:master' into master 2026-01-27 11:26:09 +08:00
fawney19
add477fece refactor: 重构格式转换系统为 Hub-and-Spoke Normalizer 架构
- 移除旧的 converters 模块,改用基于 Internal 中间表示的 Normalizer 模式
- 新增 internal.py 定义统一的内部数据结构(InternalRequest/Response/Error)
- 新增 normalizer.py 定义 FormatNormalizer 基类接口
- 实现 OpenAI/Claude/Gemini 及其 CLI 格式的 Normalizer
- 新增 stream_events.py 和 stream_state.py 支持流式转换
- 重构 registry.py 使用 Normalizer 进行格式转换
- 更新 handlers 适配新的转换架构
- 前端移除 CLI 格式转换按钮的限制
- 添加 golden data 测试确保转换正确性
2026-01-27 02:17:18 +08:00
fawney19
6cf251b19a test: 添加 Gemini 流式解析和格式转换相关测试
- 添加 Gemini JSON-array 兜底解析测试
- 添加 Gemini stream_parser 单元测试
- 添加 provider transport URL 构建测试
v0.4.5
2026-01-23 23:36:08 +08:00
fawney19
76ed7e9fcb feat: 增强 Gemini 流式响应兼容性,支持 JSON-array 格式解析
- 添加 Gemini JSON-array/chunks 格式的解析支持(兼容非 SSE 返回)
- 在上游请求中添加 alt=sse 参数,优先使用 SSE 格式
- 为 OpenAI 客户端统一补齐 [DONE] 流结束标记
- 更新 Gemini finishReason 判断逻辑,采用更宽松的结束判定
2026-01-23 23:34:38 +08:00
fawney19
c3be83bf94 fix: 将 UsageRecord.provider 字段改为可选类型
配合 PR #121 后端移除普通用户 API 中的 provider 字段
2026-01-23 18:59:21 +08:00