fawney19
00442c41fa
feat: 视频计费增强与影子计费系统
2026-02-03 18:48:39 +08:00
fawney19
ed68aebfb0
refactor: 统一任务框架 Phase 3 - 用 TaskService/FailoverEngine 替代 FallbackOrchestrator
...
核心重构:
- 移除 FallbackOrchestrator,用 TaskService + FailoverEngine 替代
- TaskService 作为统一入口,支持 SYNC/ASYNC 两种任务模式
- FailoverEngine 实现候选遍历、重试、故障转移逻辑
- 新增 AttemptFunc/AttemptResult 协议,统一尝试结果表示
功能改进:
- 流式响应首字节探测(30s 超时,空流触发故障转移)
- 流式取消归因优化(区分客户端断连 vs 服务端中断)
- 新增 OpenAI Sora 视频取消路由 POST /v1/videos/{task_id}/cancel
- OpenAI 流式请求自动添加 stream_options.include_usage
代码规范:
- 修复 loguru 日志格式(%s → {})
- 新增 FORMAT_CONVERSION_ENABLED 环境变量说明
测试覆盖:
- test_failover_engine.py: FailoverEngine 单元测试
- test_task_service_async_execute.py: TaskService ASYNC 模式测试
- test_video_cancel_e2e.py: 视频取消端到端测试
2026-02-02 21:16:28 +08:00
fawney19
ebe1a8d3e3
fix: 修复测试文件兼容性问题
...
- 重命名 golden 测试数据文件,将 `:` 替换为 `_` 以兼容 Windows 文件系统
- 修复 test_compatibility.py 中的参数名 global_conversion_enabled -> effective_conversion_enabled
2026-02-02 10:37:28 +08:00
fawney19
26493ff0ab
refactor: 移除迁移脚本中自动创建 video endpoint 的逻辑
...
- 不再从 openai:chat/gemini:chat 自动复制创建 video endpoint
- 不再自动补齐 api_formats 中的 video 变体
- 不再复制 rate_multipliers/global_priority_by_format 到 video
2026-02-02 09:16:57 +08:00
fawney19
63bae5a31c
fix: 修复迁移脚本中 Inspector 缓存导致的 DuplicateColumn 错误
...
在 table_exists、column_exists、index_exists、unique_constraint_exists
函数中添加 inspector.clear_cache() 调用,确保每次检查时从数据库获取
最新的 schema 信息,避免因缓存过期导致重复添加已存在的列/表/索引。
2026-02-02 03:20:10 +08:00
fawney19
9e31efe26c
refactor: 重构异步任务系统和计费服务架构
...
- 重构任务系统:新增 lifecycle (TaskStatus/BillingStatus)、context、application 模块
- 将 video tasks 泛化为 async tasks,支持更通用的异步任务管理
- 新增 Gemini Files 管理模块和管理界面
- 重构 billing 服务:拆分 schema.py 和 service.py
- 新增 candidate 服务模块用于请求候选管理
- 数据库迁移:添加 billing_status、request_id、gemini_file_mappings 表和索引
- 移除废弃的 video_telemetry、task orchestrator 等模块
2026-02-02 03:16:52 +08:00
fawney19
feb7484fda
fix: 迁移脚本创建 video endpoint 时补充 created_at/updated_at 字段
...
修复 create_video_endpoints() 函数 INSERT 语句缺少时间戳字段导致的
NOT NULL 约束错误。
2026-02-01 17:36:48 +08:00
fawney19
4ac8e63c94
feat: 添加视频生成功能增强和多维度计费系统适配
...
- 视频生成: 增强 video_handler,重构 task_poller,新增 telemetry
- 计费系统: 适配新的 signature 格式,支持 video 任务类型回退
- 数据库迁移: 添加 api_family/endpoint_kind 字段和 video_formats
2026-02-01 17:28:27 +08:00
fawney19
7b66505634
refactor: 全局适配 ApiFamily/EndpointKind 结构化标识体系
...
将新的 (ApiFamily, EndpointKind) / `family:kind` 签名体系应用到整个代码库:
- API Handlers: 所有 adapter/handler 使用新的签名格式
- Services: provider, model, usage, cache, auth 等服务层适配
- Database: ProviderEndpoint 新增 api_family/endpoint_kind 字段
- Frontend: Provider 管理、Usage 表格等组件适配
- Tests: 更新所有相关测试用例
2026-02-01 17:28:00 +08:00
fawney19
c246ccfc91
refactor(api_format): 重构为结构化的 (ApiFamily, EndpointKind) 标识体系
...
将扁平的 APIFormat 枚举 (CLAUDE, OPENAI, GEMINI, *_CLI) 重构为二维结构:
- ApiFamily: 协议族 (openai, claude, gemini)
- EndpointKind: 端点变体 (chat, cli, video, image)
新增 EndpointSignature 数据类和 `family:kind` 签名键工具函数,
统一 JSON dict/metrics/logs 中的字符串标识格式。
2026-02-01 17:25:28 +08:00
fawney19
2101a957ce
fix: 优化 Redis 连接超时的错误日志输出
...
将 Redis 超时和连接错误改为 WARNING 级别的简短日志,
避免系统休眠恢复时打印大量堆栈信息。
2026-01-31 20:10:42 +08:00
fawney19
97b15afe7c
feat: 添加多维度计费系统和视频任务管理功能
...
计费系统:
- 新增 BillingRule 和 DimensionCollector 数据模型
- 实现 FormulaEngine 安全表达式求值引擎 (AST 白名单)
- 支持 dimension/matrix/tiered/constant 多种维度映射
- BillingRuleService 支持 Provider Model -> GlobalModel 规则回退
- CLI task_type 在计费域自动映射为 chat
视频任务增强:
- 添加 request_metadata 字段记录候选 key 和计费规则快照
- 后台轮询支持并发控制 (Semaphore + 独立 session)
- 任务终态自动写入 Usage 记录并计算成本
- 新增视频任务管理 API 和前端界面
其他改进:
- UsageService 新增 record_usage_with_custom_cost 方法
- StandardizedUsage 支持 dimensions 字段 (兼容 extra)
- 配置新增 BILLING_REQUIRE_RULE 和 BILLING_STRICT_MODE
2026-01-31 19:11:25 +08:00
fawney19
dc4bb25cc2
feat: 添加 Vertex AI Claude 模型支持和动态格式识别
...
- 新增 get_vertex_ai_effective_format 函数,根据模型名自动判断 API 格式
- 支持通过 auth_config.model_format_mapping 自定义模型格式映射
- 修改 Vertex AI URL 构建逻辑,Claude 模型使用 anthropic publisher 和 rawPredict
- 修复 auth_config 可能是未加密 dict 的兼容性问题
2026-01-31 00:30:07 +08:00
fawney19
772cb90f64
feat: 添加视频生成 API 支持和认证抽象层重构
...
- 新增 Video Generation API 路由和处理器(支持 Gemini Veo 和 OpenAI Sora 兼容格式)
- 新增 AuthHandler 策略模式,统一 API key 提取逻辑(Bearer/ApiKey/GoogApiKey/OAuth2/QueryKey)
- 新增 RequestContext 三维度检测(数据格式/端点类型/认证方式)
- 新增 EndpointType 和 AuthMethod 枚举
- Gemini/OpenAI normalizer 添加视频格式转换(InternalVideoRequest/Task/PollResult)
- 新增视频任务轮询服务和数据库迁移(video_tasks 表)
- 代码格式化:修复 black 行宽限制,调整 import 排序,target-version 降级至 py313
2026-01-30 22:41:42 +08:00
fawney19
16fb06ff4c
perf: 使用 BuildKit 缓存加速 Docker 构建
...
- 添加 # syntax=docker/dockerfile:1 启用 BuildKit 新语法
- apt-get 使用 --mount=type=cache 缓存包下载
- pip install 使用 --mount=type=cache 缓存依赖
- npm ci 使用 --mount=type=cache 缓存模块
- 添加 --no-install-recommends 减少安装包体积
缓存命中后构建时间从 ~40s 降至 ~1.5s
2026-01-30 15:03:58 +08:00
fawney19
5603c72f40
fix: 修复 mypy 类型检查错误并升级到 Python 3.14
...
主要变更:
- 修复 1483 个 mypy 类型检查错误
- 添加缺失的类型注解 (Any, Callable, Session 等)
- 修复隐式 Optional 类型 (param: Type = None -> param: Type | None = None)
- 修复 __new__ 单例模式返回类型
- 添加 type: ignore 注释处理第三方库类型问题
- 更新 pyproject.toml 依赖到 Python 3.14 兼容版本
- 更新 mypy/black 配置为 Python 3.14
2026-01-30 14:30:57 +08:00
fawney19
7066166757
style: 统一使用 PEP 604/585 现代类型语法
...
- Optional[X] → X | None
- Dict[X, Y] → dict[X, Y]
- List[X] → list[X]
- Tuple[X, Y] → tuple[X, Y]
- Set[X] → set[X]
涉及 10 个文件,共约 50 处改动。
2026-01-30 13:06:34 +08:00
fawney19
041a61f89c
fix: 补充合并后遗漏的 from __future__ import annotations
...
合并 fix/python314-upgrade 后,部分文件仍使用 Optional/Dict 等旧式类型
但未添加 future annotations 导入,导致运行时 NameError。
2026-01-30 13:01:50 +08:00
fawney19
cd1b103223
Merge branch 'fix/python314-upgrade'
...
# Conflicts:
# src/api/handlers/base/base_handler.py
# src/api/handlers/base/request_builder.py
# src/models/endpoint_models.py
# src/services/orchestration/candidate_resolver.py
# src/services/orchestration/fallback_orchestrator.py
2026-01-30 12:59:52 +08:00
fawney19
f8ca3773be
fix: 恢复被误删的 database_extensions 导入
...
原 PR 误删了 database.py 末尾的导入语句,导致 ApiKeyProviderMapping
和 ProviderUsageTracking 模型不再被加载到 SQLAlchemy 注册表中。
2026-01-30 12:48:46 +08:00
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 and AAEE86
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
fawney19
c33cd07ea9
feat: add Gemini Files API proxy with key capability support
...
- Add gemini_files_api capability for key-level Files API support
- Implement Gemini Files API proxy endpoints (upload/list/get/delete)
- Add file-to-key mapping cache for correct key routing
- Support preferred_key_ids to prioritize keys that uploaded files
- Enhance logging for file mapping diagnostics
2026-01-30 11:37:34 +08:00
fawney19
32b293ef3e
feat: add Vertex AI authentication support for provider API keys
...
- Add auth_type field to ProviderAPIKey model (api_key or vertex_ai)
- Implement Vertex AI OAuth token generation with service account
- Update transport layer to handle Vertex AI authentication
- Add Vertex AI endpoint URL generation in request builder
- Update frontend KeyFormDialog to support auth_type selection
- Add migration for auth_type column in provider_api_keys table
2026-01-30 02:43:50 +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
fawney19
297da59448
refactor(guide): 重构教程页面为管理员视角
...
- 重新规划教程结构:概览、供应商管理、模型管理、用户与密钥、高级功能、常见问题
- 新增详细的功能解释和配置说明
- 删除旧的 CLI/SDK 用户指南页面
- 修复路由配置,添加 meta.requiresAuth: false
2026-01-29 13:58:06 +08:00
fawney19
ec9aea1f0e
refactor(frontend): 优化首页 Header 响应式布局
...
分离移动端和桌面端的 Header 布局结构,提升不同屏幕尺寸下的显示效果
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 减少重复代码
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 只返回客户端格式本身
- 添加测试用例验证透传格式受开关限制
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 格式支持
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
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 and AAEE86
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
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
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 构建测试
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
fawney19
2256ad1233
feat: 完善跨格式转换支持,添加 Gemini 双向转换器
...
- 实现 Claude/OpenAI -> Gemini 的请求和流式响应转换
- 实现 Gemini -> Claude/OpenAI 的请求转换
- 新增 ClaudeStreamConversionState 和 OpenAIStreamConversionState 状态类
- 添加 model_in_body 和 stream_in_body 元数据字段区分格式特性
- 格式转换后自动设置目标格式所需的 model/stream 字段
- 修复流式转换中 delta/choices 等字段的空值防护
2026-01-23 18:50:38 +08:00
fawney19
f45fd06fb0
fix: 修复 Redis SCAN cursor 类型问题并优化缓存清除日志
...
- CacheService.delete_pattern 中 cursor 可能为 int 或 str,统一转为 int 比较
- 模型缓存清除时区分有/无缓存的日志级别(info/debug)
2026-01-23 16:23:17 +08:00
fawney19
6f597a5f54
fix: 修复模型权限正则匹配逻辑及相关缓存清除
...
- 修复 model_mappings 正则匹配不再受 candidate_models 限制
- Provider 启用/禁用/删除时清除 GlobalModel 解析缓存
- 优先级管理对话框中启用的 Provider 排在禁用的前面
- 修复请求时间线 skipped 状态颜色适配主题
2026-01-23 16:10:53 +08:00
fawney19
3963e424f8
Merge branch 'NyaDoo/master'
2026-01-23 14:44:47 +08:00
fawney19
86b9bc3036
feat: 模型列表 API 支持格式转换兼容性过滤
...
- 新增 get_compatible_provider_formats 函数,基于端点 format_acceptance_config 过滤兼容的 Provider
- 模型列表查询根据客户端格式和全局转换开关返回可用模型
- 缓存 key 增加 client_format 维度,避免不同格式的缓存混用
- GlobalModel 解析支持 provider_model_mappings 和 model_mappings 匹配
- 修复格式兼容性检查中 config 类型校验缺失问题
2026-01-23 14:33:42 +08:00
fawney19
08a3148ab3
refactor: 简化模型权限检查,移除 resolved_model_name 参数
...
- 从 check_model_allowed 和 check_model_allowed_with_mappings 移除 resolved_model_name 参数
- 优化匹配逻辑:先精确匹配 model_name,再检查 candidate_models 交集,最后进行映射匹配
- 更新 CacheAwareScheduler 中的相关调用,传入 provider_model_names 作为 candidate_models
- 同步更新测试用例
2026-01-23 00:57:47 +08:00
fawney19
7ef0488419
refactor: 完善拖拽排序逻辑并新增格式转换开关
...
- 修复 PriorityManagementDialog 中 provider 和 key 的拖拽排序逻辑
- 修复 ProviderDetailDrawer 中 key 的拖拽排序逻辑
- 被拖动项单独成组,其他同组项保持在一起
- 在系统设置中新增"启用格式自动转换"配置项
2026-01-23 00:07:07 +08:00
fawney19
1da70d0518
refactor: 统一测试请求构建逻辑,支持多格式测试
...
- 重构 adapter 基类的 build_request_body 方法,使用 converter_registry 自动处理格式转换
- 后端 test_model 接口增加 endpoint_id 和 api_format 参数支持
- 前端模型映射测试支持根据 Key 和端点配置动态显示可用格式下拉菜单
2026-01-22 23:25:51 +08:00
fawney19
6c7b40764f
refactor: 重构优先级拖拽排序逻辑,支持整组移动与归一化
...
- 将拖拽逻辑从简单的两项交换改为整组移动并重新归一化优先级值
- 修复对话框内容区域高度限制(min-h 改为 max-h)
- 优化 API 调用,只更新实际发生变化的 key
2026-01-22 20:54:19 +08:00
fawney19
69335ad974
refactor: 使用 DropdownMenu 组件重构模型测试按钮
...
- 新增 DropdownMenu 组件系列(DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem)
- 重构 ModelsTab 中的格式选择菜单,替换原有的手动实现
- 移除 handleClickOutside 等手动管理菜单状态的代码
2026-01-22 20:01:55 +08:00
fawney19
ee5ba42b79
feat: 增强 Gemini 认证支持与 URL 敏感信息脱敏
...
- 新增 extract_client_api_key_with_query 支持从 URL query 参数提取 API Key
- Gemini 格式遵循 Google SDK 行为:query 参数优先于 header
- 添加 redact_url_for_log 函数对日志中的敏感 URL 参数脱敏
- 上游请求始终使用 header 认证,清除 Gemini query 中的 key 参数
- 放宽 API Key 最小长度限制至 3 字符
- 完善认证方式相关代码注释
2026-01-22 19:11:38 +08:00
fawney19
1d27284575
Merge pull request #118 from AAEE86/fix2
...
fix: 链路预览只显示白名单匹配的 Endpoint 和 Key
2026-01-22 14:54:52 +08:00
fawney19
af1828dd32
feat: 新增 Thinking 整流器处理跨 Provider 签名错误 ( #115 )
...
当 Provider A 生成的 thinking 块被发送到 Provider B 时,签名验证会失败。
本次更新实现了自动整流机制,在遇到签名错误时自动清洗 thinking 块后重试。
主要更改:
- 新增 ThinkingRectifier 整流器,移除 thinking 块和 signature 字段
- 新增 ThinkingSignatureException 异常类型
- ErrorClassifier 新增 Thinking 错误模式检测
- FallbackOrchestrator 支持整流后在当前候选重试
- Handler 层传递 request_body_ref 容器支持请求体动态修改
- Usage API 新增 has_rectified 字段标识整流过的请求
- 新增 THINKING_RECTIFIER_ENABLED 配置项控制功能开关
其他改进:
- CacheAwareScheduler 支持 exact/convertible 候选分组排序
- StreamProcessor 预读阶段新增格式转换试验
- ProviderAPIKey.api_formats 改为可空(None 表示支持所有格式)
- Dockerfile 修复 entrypoint.sh 换行符问题
Closes #115
Co-Authored-By: FredericMN <FredericMN@users.noreply.github.com >
2026-01-22 14:23:33 +08:00
fawney19
cc5db20c58
feat: 实现跨 API 格式自动转换功能
...
- 新增端点级 format_acceptance_config 配置,控制是否接受跨格式请求
- 重构 EndpointFormDialog 为卡片式布局,支持内联编辑和格式转换开关
- StreamProcessor 实现流式响应的跨格式转换,支持 OpenAI/Claude/Gemini 互转
- CacheAwareScheduler 按端点格式筛选候选,同格式优先于跨格式
- 健康度/熔断按 Provider 端点格式分桶,而非客户端请求格式
- 新增 format_conversion_total 和 format_conversion_duration_seconds 指标
- 新增全局配置 format_conversion_enabled 控制总开关
- Input 组件新增 size="sm" 尺寸选项
2026-01-22 01:48:56 +08:00
fawney19
99388bfa33
refactor: 重构 API 格式相关代码到统一的 api_format 模块
...
- 新增 src/core/api_format/ 模块,整合所有 API 格式相关功能
- enums.py: APIFormat 枚举定义
- metadata.py: API 格式元数据注册
- headers.py: 请求头处理逻辑
- detection.py: API 格式检测
- conversion/: 格式转换器(Claude/OpenAI/Gemini 互转)
- 删除分散在各处的旧实现
- src/core/api_format_metadata.py
- src/core/headers.py
- src/api/handlers/*/converter.py
- src/api/handlers/base/format_converter_registry.py
- 更新所有引用路径,使用新的统一模块
- 新增 cli_handler_base 中的格式转换支持
2026-01-21 18:07:10 +08:00
fawney19 and AAEE86
856077a46c
feat(ui): 重构端点健康状态为进度条可视化
...
- 将端点标签改为网格布局的进度条样式
- 显示 API 格式缩写和健康分数百分比
- 优化端点提示区分禁用、无可用密钥和未配置密钥状态
- 优化优先级管理对话框布局以显示更多内容
- 后端添加 total_keys 字段支持密钥状态区分
Closes #113
Co-authored-by: AAEE86 <ppk0227@hotmail.com >
2026-01-21 01:10:35 +08:00
fawney19
4eeba69381
feat: 新增 cancelled 状态区分客户端主动断开连接
...
- 新增 cancelled 请求状态,与系统失败 (failed) 区分
- 客户端主动断开连接 (HTTP 499) 不计入失败率统计
- 前后端同步更新状态枚举、UI 样式和统计逻辑
2026-01-20 15:40:16 +08:00
fawney19
ffca11bc18
fix: 优化模型获取错误状态处理逻辑
...
只有在所有端点都失败时才记录错误,部分端点失败不影响整体状态
2026-01-20 11:11:21 +08:00
fawney19
8e7582d8b9
feat: 新增签到 Cookie 失效警告功能
...
- 签到认证失败时返回 cookie_expired 标记而非静默跳过
- 前端显示"签到 Cookie 已失效"警告提示
- 支持 auth_expired 状态,余额数据仍可正常显示
- 认证失败(auth_failed)时清除余额缓存以便重试
2026-01-20 02:44:22 +08:00
fawney19
c8b256ded1
refactor: 优化仪表盘权限和 UI 样式
...
- 普通用户仪表盘隐藏提供商统计相关信息
- 为普通用户新增每日使用趋势折线图
- 登录对话框 UI 样式优化(Logo 放大、圆角统一)
- 输入框组件样式微调
- 将项目名称从 "API Gateway" 改为 "AI Gateway"
2026-01-20 01:58:55 +08:00
fawney19
dd7cd68b51
fix: 修复 NewApiBalanceAction 中 Cookie 检测方式
...
将 Cookie 检测从 httpx client headers 检查改为 service 层注入的
_has_cookie 配置标志,解决 Cookie 在实际请求中存在但检测失败的问题
2026-01-20 01:36:45 +08:00
fawney19
24ef24558c
refactor: 优化端点管理表单和上游模型获取逻辑
...
- 端点表单布局优化,支持 provider website 作为默认 Base URL
- 模型路由始终显示 provider_model_name
- 无端点时显示添加按钮
- 上游模型获取只针对基础 API 格式,跳过 CLI 格式
2026-01-20 01:32:47 +08:00
fawney19
edf8c663f1
refactor: 重构供应商操作基类为抽象类并支持 New API Cookie 认证
...
主要更改:
- 重构 BalanceAction/CheckinAction 为抽象基类,子类实现具体查询逻辑
- 重构 ProviderArchitecture 认证相关方法为抽象方法
- New API 支持 Cookie 认证(与 api_key+user_id 二选一)
- 添加 NewApiBalanceAction,支持查询余额前自动签到
- 修复 session cookie gob 编码解析逻辑
- 前端认证表单支持 inline 布局、字段联动和 onFieldChange 回调
2026-01-20 00:55:52 +08:00
fawney19
c24f3d47f7
Merge branch 'feat/dashboard-provider-cost-stats'
2026-01-19 20:47:38 +08:00
fawney19
1874214927
fix: 供应商统计排除 unknown 及表格列宽响应式优化
...
- 从 Dashboard 供应商成本统计中排除 unknown 提供商
- 优化供应商管理表格列宽为百分比宽度配合最小宽度
Closes #110
Co-authored-by: RWDai <27391645+RWDai@users.noreply.github.com >
2026-01-19 20:47:00 +08:00
fawney19 and RWDai
c29d57622f
feat: 添加 Dashboard 供应商成本统计功能
...
- 新增 stats_daily_provider 表存储每日供应商统计数据
- 实现供应商维度的数据聚合服务
- Dashboard API 返回 provider_summary 供应商汇总数据
- 前端新增 DoughnutChart 环形图组件
- Dashboard 新增供应商成本分布可视化卡片
- 移除重复的请求次数/费用趋势折线图
Closes #110
Co-authored-by: RWDai <27391645+RWDai@users.noreply.github.com >
2026-01-19 20:23:55 +08:00
fawney19
c66ecd7517
fix: 使用 sortApiFormats 对上游模型 API 格式进行排序
2026-01-19 19:43:13 +08:00
fawney19
427f173b38
feat: OAuth 绑定安全增强及限流配置优化
...
- 新增一次性绑定令牌机制,避免在 URL 中暴露 access_token
- 绑定流程改为新标签页打开,完成后自动刷新状态
- 放宽认证相关接口的 IP 限流配置
- 登录添加 429 限流错误的友好提示
- OAuth 绑定列表添加 Provider 图标显示
Close #106
2026-01-19 19:34:31 +08:00
fawney19 and AAEE86
b53e3f14d6
feat: 将 CreateUserRequest 邮箱字段改为可选
...
Closes #107
Co-authored-by: AAEE86 <ppk0227@hotmail.com >
2026-01-19 18:38:02 +08:00
fawney19
ffdc9a9585
feat: 为 Provider 认证添加代理配置支持
...
- 前端新增可折叠的代理配置字段组(URL/用户名/密码)
- 更新 anyrouter/cubence/new-api/yescode 模板支持代理
- 后端 provider_ops 服务验证和数据获取时支持代理
- 移除 Dockerfile 中的 ca-certificates(回退之前改动)
2026-01-19 18:30:52 +08:00
fawney19
b6a9969aee
fix: 添加 ca-certificates 解决 Docker 容器内 SSL 证书验证失败
...
python:3.12-slim 镜像缺少系统级 CA 证书,导致 httpx 请求外部
HTTPS 服务时出现 CERTIFICATE_VERIFY_FAILED 错误。
2026-01-19 18:02:04 +08:00
fawney19
0265849ed3
feat: 统一 SSL 证书配置并支持用户创建时设置访问权限
...
- 新增 ssl_utils.py 模块,统一使用 certifi 证书
- 将所有 httpx 客户端的 verify 参数改为使用 get_ssl_context()
- 管理员创建用户时支持设置 allowed_providers/api_formats/models
- 修复 provider_ops 敏感字段列表缺失 session_cookie
2026-01-19 17:56:02 +08:00
fawney19
6bc9cdc69d
feat: 新增 Anyrouter/Cubence/YesCode 架构及余额监控增强
...
- 新增三个 provider 架构:Anyrouter、Cubence、YesCode
- 前端新增对应的认证配置模板
- 余额监控增强:支持窗口限额显示(进度条+倒计时)、签到状态、错误信息展示
- 架构基类新增 prepare_verify_config 异步预处理方法
- API 返回 ops_architecture_id 字段用于前端展示
2026-01-19 17:18:03 +08:00
fawney19
3d88dfd98a
feat: 添加 OAuth 认证支持及相关改进
...
- 新增 OAuth 模块,支持 LinuxDo/GitHub/Google 等第三方登录
- 用户邮箱改为可选字段,支持无邮箱注册
- 新增模块配置验证状态 (config_validated/config_error)
- 系统设置界面改为分块独立保存
- 用户设置新增 OAuth 绑定管理和首次密码设置
- 登录界面支持 OAuth 按钮展示
- 邮箱验证设置移至邮件设置页面
2026-01-19 03:19:17 +08:00
fawney19
e2e14fd09c
feat: ProviderOpsConfig 支持独立存储 base_url
...
将 base_url 作为 ProviderOpsConfig 的独立字段存储,
获取时优先读取配置中的值,否则回退到 endpoint/provider。
2026-01-18 13:20:14 +08:00
fawney19
aa57f78561
feat: 验证 API 成功后预填充余额缓存
...
验证认证成功时,复用返回的 quota 信息缓存余额,
避免后续重复查询余额接口。
2026-01-18 13:00:11 +08:00
fawney19
0f7ba38655
fix: 新增 API 验证增加响应完整性检查
...
- 站点地址字段在无官方地址时改为必填
- 验证成功时检查用户信息和余额是否完整返回
2026-01-18 11:40:59 +08:00
fawney19
1e71d355fc
fix: 自动同步模式下禁用上游模型手动选择
...
- 添加"自动同步"标签提示
- 禁用全选/取消按钮
- 禁用模型项点击交互
- 调整视觉样式降低模型项不透明度
2026-01-18 01:56:16 +08:00