e58159fc42
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 全量通过,应用启动测试通过
66 lines
1.7 KiB
Python
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")
|