diff --git a/apps/api/src/opendirector_api/creation.py b/apps/api/src/opendirector_api/creation.py index c1de28496..9e17aa54c 100644 --- a/apps/api/src/opendirector_api/creation.py +++ b/apps/api/src/opendirector_api/creation.py @@ -1,4 +1,5 @@ """Authoritative project endpoints for the canvas creation workflow.""" +from typing import Literal from uuid import UUID from pathlib import Path from base64 import b64encode @@ -185,13 +186,33 @@ async def query(project_id: UUID, value: CreationQuery): result = await canvas.query(value) if value.type == 'asset.preview' and 'preview' in result: result['preview'].pop('path') - result['preview']['url'] = f'/api/creation/projects/{project_id}/assets/{value.objectId}/preview' + base_url = f'/api/creation/projects/{project_id}/assets/{value.objectId}/preview' + if value.videoScope == 'contact_sheet': + result['preview']['url'] = ( + f'{base_url}?video_scope=contact_sheet&columns={value.columns}&rows={value.rows}' + ) + else: + result['preview']['url'] = base_url return result @router.get('/projects/{project_id}/assets/{asset_id}/preview') - async def asset_preview(project_id: UUID, asset_id: UUID): + async def asset_preview( + project_id: UUID, + asset_id: UUID, + video_scope: Literal['first_frame', 'contact_sheet'] = Query(default='first_frame'), + columns: int = Query(default=4, ge=1, le=8), + rows: int = Query(default=3, ge=1, le=8), + ): target = projects.local.state_dir / 'previews' / str(project_id) - result = await run_in_threadpool(assets.preview, project_id, asset_id, target) + result = await run_in_threadpool( + assets.preview, + project_id, + asset_id, + target, + video_scope=video_scope, + columns=columns, + rows=rows, + ) if 'preview' not in result: return result return FileResponse(result['preview']['path'], media_type=result['preview']['mimeType']) diff --git a/docs/guides/cli.md b/docs/guides/cli.md index cc85732e2..a7f6f732b 100644 --- a/docs/guides/cli.md +++ b/docs/guides/cli.md @@ -42,6 +42,46 @@ CLI 输出 JSON。修改回执附带对应的 assetId、itemId、specId 及其 Agent 的 Shell 通过 PATH 使用同一个 `opendirector`。宿主提供受令牌保护的本轮连接、工程范围、编辑会话和执行目录,文件登记限制在本轮执行目录。每次调用产生业务活动及回执,供聊天与轨迹页展示。 +## H3 专业分镜提示词编排、连续性审计、多帧质检与单镜头局部修订 + +`opendirector video` 支持首帧(`--first-frame`)、尾帧(`--last-frame`)、首尾帧插值(同时传 `--first-frame` 与 `--last-frame`)、多模态参考(`--reference-item`)与续写模式(`--continue-from`),并提供 H3 分镜计划校验、结构化提示词编译/标签校验、工程级跨镜头连续性审计(`storyboard.audit`)、视频多帧拼图预览与客观测量质检(`measuredFacts`),以及不破坏相邻轨道与字幕的时间线单镜头局部替换: + +```bash +# 校验多镜头景别与运镜多样性(防止同质化)及 4—15 秒时长约束 +opendirector video lint-shot-plan --file ./shot-plan.json + +# 编译并校验符合 MiniMax-H3 规范的 T2VA / I2VA / FL2VA / L2VA / Ref2VA 英文提示词 +opendirector video compile-h3-prompt --file ./shot-01-spec.json + +# 创建首尾帧(FL2VA)或续写视频节点,并结合工程实际参考顺序校验 /