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 等模块
This commit is contained in:
fawney19
2026-02-02 03:16:52 +08:00
parent feb7484fda
commit 9e31efe26c
75 changed files with 7511 additions and 2068 deletions

View File

@@ -7,6 +7,7 @@
from src.core.modules.base import ModuleDefinition
# 导入所有模块定义
from src.modules.gemini_files import gemini_files_module
from src.modules.ldap import ldap_module
from src.modules.oauth import oauth_module
@@ -14,6 +15,7 @@ from src.modules.oauth import oauth_module
ALL_MODULES: list[ModuleDefinition] = [
ldap_module,
oauth_module,
gemini_files_module,
]
__all__ = ["ALL_MODULES"]

View File

@@ -0,0 +1,96 @@
"""
Gemini Files 文件管理模块
提供 Gemini Files API 文件上传和管理功能:
- 文件上传到 Google Gemini Files API
- 文件映射管理file_id → key_id
- 文件列表查看和删除
"""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from src.core.modules.base import (
ModuleCategory,
ModuleDefinition,
ModuleHealth,
ModuleMetadata,
)
if TYPE_CHECKING:
from sqlalchemy.orm import Session
def _get_router() -> Any:
"""延迟导入路由"""
from src.api.admin.gemini_files import router
return router
async def _health_check() -> ModuleHealth:
"""健康检查"""
# 检查是否有可用的 gemini_files 能力的 Key
from src.database import create_session
from src.models.database import ProviderAPIKey
db = create_session()
try:
# 查找有 gemini_files 能力的 Key
keys = db.query(ProviderAPIKey).filter(ProviderAPIKey.is_active.is_(True)).all()
has_capable_key = any(
key.capabilities and key.capabilities.get("gemini_files", False) for key in keys
)
if has_capable_key:
return ModuleHealth.HEALTHY
return ModuleHealth.DEGRADED
except Exception:
return ModuleHealth.UNKNOWN
finally:
db.close()
def _validate_config(db: Session) -> tuple[bool, str]:
"""
验证 Gemini Files 模块配置
检查项:
1. 至少有一个有 gemini_files 能力的 Provider Key
"""
from src.models.database import ProviderAPIKey
# 查找有 gemini_files 能力的 Key
keys = db.query(ProviderAPIKey).filter(ProviderAPIKey.is_active.is_(True)).all()
capable_keys = [
key for key in keys if key.capabilities and key.capabilities.get("gemini_files", False)
]
if not capable_keys:
return (
False,
"至少启用一个具有「Gemini 文件 API」能力的 Key",
)
return True, ""
gemini_files_module = ModuleDefinition(
metadata=ModuleMetadata(
name="gemini_files",
display_name="文件缓存",
description="管理 Gemini Files API 上传的文件,支持文件上传、查看和删除",
category=ModuleCategory.INTEGRATION,
env_key="GEMINI_FILES_AVAILABLE",
default_available=True,
required_packages=[],
api_prefix="/api/admin/gemini-files",
admin_route="/admin/gemini-files",
admin_menu_icon="FileUp",
admin_menu_group="system",
admin_menu_order=60,
),
router_factory=_get_router,
health_check=_health_check,
validate_config=_validate_config,
)