fix: MediaKit 视频理解轮询限时至30s,修复 nginx 504 超时
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
AI Code Review / AI Code Review (pull_request) Successful in 1m40s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m38s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 22s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 28s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 35s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m51s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m44s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m15s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 6m54s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 41s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 47s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1058h24m21s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1058h24m23s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 1058h24m22s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1058h24m22s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 1058h31m18s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1058h31m18s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1058h31m38s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1058h31m40s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1058h31m42s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1058h31m42s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1058h57m38s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1059h4m32s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1059h4m53s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1059h4m56s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1058h57m37s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1059h4m52s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
AI Code Review / AI Code Review (pull_request) Successful in 1m40s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m38s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 22s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 28s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 35s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m51s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m44s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m15s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 6m54s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 41s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 47s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1058h24m21s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1058h24m23s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 1058h24m22s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1058h24m22s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 1058h31m18s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1058h31m18s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1058h31m38s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1058h31m40s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1058h31m42s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1058h31m42s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1058h57m38s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1059h4m32s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1059h4m53s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1059h4m56s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1058h57m37s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1059h4m52s
- analyze_videos() 轮询参数从默认(3s*60=180s)改为(2s*15=30s) - 预留30s给 LLM 调用,总耗时控制在 nginx 60s 限制内 - 超时自动降级到无分析模式,不影响主流程 - 修复 URL→asset_id 映射改用并行列表,消除重复 URL 覆盖风险
This commit is contained in:
@@ -48,9 +48,9 @@ def _build_asset_analyses(
|
||||
asset_repo = SQLAlchemyAssetRepository(db)
|
||||
storage_svc = get_shared_storage_service()
|
||||
|
||||
# 查找素材并获取下载 URL
|
||||
# 查找素材并获取下载 URL(使用并行列表保持索引对应,避免 URL 重复导致映射覆盖)
|
||||
video_urls: list[str] = []
|
||||
url_to_asset_id: dict[str, str] = {}
|
||||
valid_asset_ids: list[str] = []
|
||||
|
||||
for aid in asset_ids[:10]: # MediaKit 单次最多 10 个视频
|
||||
asset = asset_repo.get(aid)
|
||||
@@ -64,7 +64,7 @@ def _build_asset_analyses(
|
||||
url = storage_svc.get_download_url(asset.storage_key)
|
||||
if url:
|
||||
video_urls.append(url)
|
||||
url_to_asset_id[url] = aid
|
||||
valid_asset_ids.append(aid)
|
||||
except Exception as e:
|
||||
logger.warning("获取素材URL失败: asset_id=%s error=%s", aid, str(e))
|
||||
|
||||
@@ -79,23 +79,26 @@ def _build_asset_analyses(
|
||||
"控制在100字以内。"
|
||||
)
|
||||
|
||||
# 限制轮询参数以适配 API 网关超时(nginx 60s)
|
||||
# 视频理解最多 30s(poll_interval=2s * max_poll_attempts=15)
|
||||
# 剩余 30s 留给 LLM 调用
|
||||
contents = client.analyze_videos(
|
||||
video_urls=video_urls,
|
||||
prompt=prompt,
|
||||
level="Economy",
|
||||
poll_interval=2.0,
|
||||
max_poll_attempts=15,
|
||||
)
|
||||
|
||||
if not contents:
|
||||
logger.warning("MediaKit 视频理解未返回结果")
|
||||
return {}
|
||||
|
||||
# 将结果映射回 asset_id
|
||||
# 将结果映射回 asset_id(通过索引对应)
|
||||
analyses: dict[str, str] = {}
|
||||
for i, content in enumerate(contents):
|
||||
if i < len(video_urls) and content:
|
||||
asset_id = url_to_asset_id.get(video_urls[i])
|
||||
if asset_id:
|
||||
analyses[asset_id] = content
|
||||
if i < len(valid_asset_ids) and content:
|
||||
analyses[valid_asset_ids[i]] = content
|
||||
|
||||
logger.info(
|
||||
"MediaKit 视频理解完成: total=%d analyzed=%d",
|
||||
|
||||
Reference in New Issue
Block a user