Files
meijiaka-zy/python-api/app/scheduler/main.py
T
小鱼开发 e58159fc42 refactor: 第三方平台架构改造(Adapter Protocol + Gateway)
Phase 1: 异常体系统一
- 新增 PlatformError / PlatformErrorType 标准定义
- 改造所有 Provider 异常抛出为 PlatformError
- 注册全局 PlatformError exception handler

Phase 2: Adapter Protocol
- 新增 app/ai/adapters/base.py(PlatformAdapter + SyncCapable + TaskCapable + CallbackCapable)
- 新增 app/ai/adapters/constants.py(Method 常量)
- 新增 PlatformConfigLoader(config/platform-config.yaml)

Phase 3: HTTP Client 统一
- ViduProvider 从 aiohttp 迁移到 httpx(注入方式)
- VolcengineCaptionService 改为注入 http_client
- lifespan 统一管理所有 Client 创建和关闭

Phase 4: Gateway 骨架 + Adapter 实现
- 新增 ViduAdapter / VolcengineArkAdapter / VolcengineCaptionAdapter
- 新增 PlatformGateway(call_sync / submit_task / query_task / handle_webhook)
- 新增 LLMGateway(带 Fallback 降级链)
- lifespan 注册所有 Adapter 和 Gateway

Phase 6: 清理与验证
- 从 Settings 移除 VIDU_BASE_URL / VOLCENGINE_BASE_URL
- Provider 改为从 PlatformConfigLoader 读取 base_url
- 清理 volcengine_caption_service 全局单例
- config_loader 默认路径改为 platform-config.yaml
- Scheduler 注入共享 HTTP client
- vidu.py 回调路由使用 Adapter 验签和解析
- ruff 全量通过,应用启动测试通过
2026-05-04 16:07:16 +08:00

66 lines
1.7 KiB
Python

"""
Async Engine 独立进程入口
=========================
usage: python -m app.scheduler.main
"""
import asyncio
import logging
import sys
from app.scheduler.engine import AsyncEngine
from app.scheduler.handlers.script_handler import ScriptHandler
from app.scheduler.handlers.subtitle_handler import SubtitleHandler
logger = logging.getLogger("scheduler")
def setup_logging() -> None:
log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
logging.basicConfig(
level=logging.INFO,
format=log_format,
handlers=[logging.StreamHandler(sys.stdout)],
)
async def main() -> None:
setup_logging()
# 初始化共享 HTTP Client
import httpx
http_client = httpx.AsyncClient(
timeout=httpx.Timeout(60.0, connect=5.0),
limits=httpx.Limits(max_connections=10, max_keepalive_connections=10),
)
# 初始化字幕服务(注入共享 Client)
from app.services.volcengine_caption_service import VolcengineCaptionService
try:
caption_service = VolcengineCaptionService(client=http_client)
logger.info("字幕服务初始化完成")
except Exception as e:
logger.warning(f"字幕服务初始化失败: {e}")
caption_service = None
engine = AsyncEngine()
engine.register(SubtitleHandler(service=caption_service))
engine.register(ScriptHandler())
try:
await engine.run_forever(interval=10.0, min_interval=2.0)
finally:
if caption_service:
await caption_service.close()
await http_client.aclose()
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("Scheduler stopped by user")