fawney19
7f09f191a1
feat: 优化用量状态同步机制和 OpenAI CLI 流式转换
...
- 增加状态回退保护,防止异步响应覆盖已知状态
- 添加轮询并发保护 (pollInFlight),避免重复请求
- 支持 cancelled 状态筛选和显示
- 前端 mergeRecordStatus 保护活跃记录状态
- 后端 streaming 状态同步更新改为使用当前 DB 会话
- OpenAI CLI 流式转换增加工具调用事件支持
- 轮询接口新增 target_model 字段返回
- 修复迁移脚本 inspector 缓存问题,改用 information_schema
2026-02-04 03:17:55 +08:00
fawney19
f3e2f84b38
feat: 统计数据优化 - 支持细粒度时间范围和多维度分析
...
- 新增 StatsHourly/StatsDaily 预聚合表,支持任意时区的精确统计
- 实现 UTC datetime 范围查询策略,边界数据实时聚合
- 新增统计 API:用户/API Key 维度、成本分析、性能百分位、错误分类
- 新增前端页面:成本分析、性能分析、用户统计
- 新增 TimeRangePicker 组件和统计可视化组件
- 优化 Dashboard 和 Usage 页面支持时间范围筛选
Close #135
2026-02-04 02:04:54 +08:00
fawney19
ddf3f5c107
feat: 添加请求体规则功能和 UI 优化
...
- 添加 body_rules 支持(set/drop/rename 操作)
- 后端 apply_body_rules 函数处理请求体修改
- 保护 model/stream 字段不被修改
- 前端 UI 重构:合并请求头/请求体规则为统一区域
- 使用左边框颜色区分规则类型(H=主题色,B=灰色)
Closes #139
Co-authored-by: CC <81609553+hemo94931@users.noreply.github.com >
2026-02-03 18:49:17 +08:00
fawney19
00442c41fa
feat: 视频计费增强与影子计费系统
2026-02-03 18:48:39 +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
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
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
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
bae278a0c1
feat: 添加提供商格式转换优先级保持配置
...
- 新增 Provider.keep_priority_on_conversion 字段,控制格式转换时是否保持优先级
- 新增全局配置 KEEP_PRIORITY_ON_CONVERSION,可全局启用优先级保持
- 调度器根据配置决定是否降级需要格式转换的候选
- 前端 Provider 表单添加"保持优先级"开关
- 调整 HTTP 读写超时默认值为 3600 秒
2026-01-28 15:53:33 +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
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
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
3d88dfd98a
feat: 添加 OAuth 认证支持及相关改进
...
- 新增 OAuth 模块,支持 LinuxDo/GitHub/Google 等第三方登录
- 用户邮箱改为可选字段,支持无邮箱注册
- 新增模块配置验证状态 (config_validated/config_error)
- 系统设置界面改为分块独立保存
- 用户设置新增 OAuth 绑定管理和首次密码设置
- 登录界面支持 OAuth 按钮展示
- 邮箱验证设置移至邮件设置页面
2026-01-19 03:19:17 +08:00
fawney19
d5d74339dd
refactor: 将 global_priority 和 rate_multiplier 改为按 API 格式配置
...
- 新增 global_priority_by_format 字段,支持按 API 格式设置全局优先级
- 移除已废弃的 rate_multiplier 字段,统一使用 rate_multipliers
- 移除已废弃的 timeout 字段(providers 和 provider_endpoints 表)
- 更新调度器以支持按格式的优先级排序
- 同步更新前后端类型定义和 API 接口
- 添加数据库迁移脚本,自动迁移现有数据
2026-01-16 17:53:27 +08:00
fawney19
b1cf348abb
fix: 修复迁移脚本对非对象类型 headers 的处理
...
在 headers -> header_rules 迁移时,添加 jsonb_typeof 类型检查,
避免 jsonb_each_text 在非对象类型数据上报错。
2026-01-16 01:26:45 +08:00
fawney19
8e11f3864a
feat: 添加 API Key 锁定功能和请求头规则系统
...
1. API Key 锁定功能
- 管理员可锁定/解锁用户的 API Key
- 锁定后用户无法使用、修改或删除该 Key
- 前端显示锁定状态并禁用相关操作
2. 请求头规则系统
- 将 endpoint.headers 升级为 header_rules
- 支持 set(设置)、drop(删除)、rename(重命名)操作
- 前端提供可视化规则编辑界面
- 包含数据迁移脚本
Close #37 Close #86 Close #88
2026-01-16 01:18:54 +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
09e0f594ff
refactor: 重构限流系统和健康监控,支持按 API 格式区分
...
- 将 adaptive_concurrency 重命名为 adaptive_rpm,从并发控制改为 RPM 控制
- 健康监控器支持按 API 格式独立管理健康度和熔断器状态
- 新增 model_permissions 模块,支持按格式配置允许的模型
- 重构前端提供商相关表单组件,新增 Collapsible UI 组件
- 新增数据库迁移脚本支持新的数据结构
2026-01-10 18:48:35 +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
0061fc04b7
feat: 添加访问令牌管理功能并升级至 0.2.4
...
- 新增 Management Token(访问令牌)功能,支持创建、更新、删除和管理
- 前端添加访问令牌管理页面,支持普通用户和管理员
- 后端实现完整的令牌生命周期管理 API
- 添加数据库迁移脚本创建 management_tokens 表
- Nginx 配置添加 gzip 压缩,优化响应传输
- Dialog 组件添加 persistent 属性,防止意外关闭
- 为管理后台 API 添加详细的中文文档注释
- 简化多处类型注解,统一代码风格
2026-01-07 14:55:07 +08:00
fawney19
00562dd1d4
feat: 添加 LDAP 认证支持
...
- 新增 LDAP 服务和 API 接口
- 添加 LDAP 配置管理页面
- 登录页面支持 LDAP/本地认证切换
- 数据库迁移支持 LDAP 相关字段
2026-01-06 14:38:42 +08:00
RWDai
3e4309eba3
Enhance LDAP auth config handling
2026-01-04 16:27:02 +08:00
RWDai
9bfb295238
feat: add ldap login
2026-01-02 16:17:24 +08:00
fawney19
03ad16ea8a
fix: 修复迁移脚本在全新安装时报错及改进统计回填逻辑
...
迁移脚本修复:
- 移除 AUTOCOMMIT 模式,改为在同一事务中创建索引
- 分别检查每个索引是否存在,只创建缺失的索引
- 修复全新安装时 AUTOCOMMIT 连接看不到未提交表的问题 (#46 )
统计回填改进:
- 分别检查 StatsDaily 和 StatsDailyModel 的缺失日期
- 只回填实际缺失的数据而非连续区间
- 添加失败统计计数和 rollback 错误日志
2025-12-24 21:50:05 +08:00
fawney19
d73a443484
fix: 修复初次执行 migrate.sh 时 usage 表不存在的问题 ( #43 )
...
- 在 baseline 中直接创建 usage 表复合索引
- 在后续迁移中添加表存在性检查,避免 AUTOCOMMIT 连接看不到事务中的表
2025-12-24 18:10:42 +08:00
fawney19
7185818724
fix: remove index_exists check to avoid transaction conflict in migration
...
- Remove index_exists function that used op.get_bind() within transaction
- Use IF NOT EXISTS / IF EXISTS SQL syntax instead
- Fixes CREATE INDEX CONCURRENTLY error in Docker migration
2025-12-23 00:21:03 +08:00
fawney19
868f3349e5
fix: use AUTOCOMMIT mode for CREATE INDEX CONCURRENTLY in migration
...
PostgreSQL 不允许在事务块内执行 CREATE INDEX CONCURRENTLY,
通过创建独立连接并设置 AUTOCOMMIT 隔离级别来解决此问题。
2025-12-23 00:18:11 +08:00
fawney19
1d5c378343
feat: add TTFB timeout detection and improve stream handling
...
- Add stream first byte timeout (TTFB) detection to trigger failover
when provider responds too slowly (configurable via STREAM_FIRST_BYTE_TIMEOUT)
- Add rate limit fail-open/fail-close strategy configuration
- Improve exception handling in stream prefetch with proper error classification
- Refactor UsageService with shared _prepare_usage_record method
- Add batch deletion for old usage records to avoid long transaction locks
- Update CLI adapters to use proper User-Agent headers for each CLI client
- Add composite indexes migration for usage table query optimization
- Fix streaming status display in frontend to show TTFB during streaming
- Remove sensitive JWT secret logging in auth service
2025-12-22 23:44:42 +08:00
fawney19
4e1aed9976
feat: add daily model statistics aggregation with stats_daily_model table
2025-12-20 02:39:10 +08:00
fawney19
3e50c157be
feat: add HTTP/SOCKS5 proxy support for API endpoints
...
- Add proxy field to ProviderEndpoint database model with migration
- Add ProxyConfig Pydantic model for proxy URL validation
- Extend HTTP client pool with create_client_with_proxy method
- Integrate proxy configuration in chat_handler_base.py and cli_handler_base.py
- Update admin API endpoints to support proxy configuration CRUD
- Add proxy configuration UI in frontend EndpointFormDialog
Fixes #28
2025-12-18 14:46:47 +08:00
fawney19
1dac4cb156
refactor: optimize provider query and stats aggregation logic
2025-12-17 16:41:10 +08:00
fawney19
d696c575e6
refactor(migrations): add idempotency checks to migration scripts
2025-12-16 17:46:38 +08:00
fawney19
33265b4b13
refactor(global-model): migrate model metadata to flexible config structure
...
将模型配置从多个固定字段(description, official_url, icon_url, default_supports_* 等)
统一为灵活的 config JSON 字段,提高扩展性。同时优化前端模型创建表单,支持从 models-dev
列表直接选择模型快速填充。
主要变更:
- 后端:模型表迁移,支持 config JSON 存储模型能力和元信息
- 前端:GlobalModelFormDialog 支持两种创建方式(列表选择/手动填写)
- API 类型更新,对齐新的数据结构
2025-12-16 12:21:21 +08:00
fawney19
9b496abb73
feat(db): add first_byte_time_ms column to usage table
2025-12-16 02:38:43 +08:00
fawney19
c6b9582978
refactor(migration): merge index creation into main aliases migration
2025-12-15 20:47:30 +08:00
fawney19
c6fcc7982d
fix(database): optimize model alias resolution indexes
...
- Fix table name casing (use lowercase 'models' instead of 'Model')
- Convert provider_model_aliases to jsonb for better performance and GIN index support
- Use jsonb_path_ops for more efficient JSONB GIN indexing
- Add dialect check to only apply jsonb conversion on PostgreSQL
- Improve downgrade migration to properly restore json column type
2025-12-15 18:27:25 +08:00
fawney19
aaa6a8f60d
database: add indexes for model alias resolution
...
- Create indexes on provider_model_name and provider_model_aliases
- Optimize model lookup performance for direct match and alias resolution
- Support efficient JSONB queries on provider_model_aliases
2025-12-15 18:13:49 +08:00
fawney19
5319c06f0e
migrate: remove model mappings and add aliases support
2025-12-15 14:29:47 +08:00
fawney19
f784106826
Initial commit
2025-12-10 20:52:44 +08:00