Skip to content

[Grok/dsh 56] 视频生成与媒体任务状态 #188

Description

@Blackman99

Parent

#132

Ticket: 56

Status: ready-for-agent

User Stories: 56, 62(见父规格)

What to build

用户通过参考支持的图片/参考帧等输入生成视频,检查状态、取消并打开完成文件。

Acceptance criteria

  • 清单内视频输入、时间/分辨率等参数按所配置服务能力验证,不把不支持值默默忽略。
  • 远端异步任务与本地显示有可靠对应,超时、取消、不确定最终结果和恢复后查询明确区分。
  • 结果文件可打开,路径与会话关联正确;权限与费用提示沿用统一机制。
  • 使用受控服务覆盖全部状态,并完成至少一条获批准的真实替代服务验证。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 26, 2026

    @Blackman99
    OwnerAuthor

    已集成到 rewrite/grok-dsh-20260920:95070ba(视频生成与媒体任务状态,基于 022a417,无需 rebase)。阻塞项 #175、#187 均已关闭。

    实现(对照验收标准)

    • 时长、分辨率、输入按服务能力校验,不支持时不静默忽略:[models] video_gen 指向带 base_url 且标记 supports_video_generation 的 [model.<id>];protocol = "xai"(默认,参考实现异步接口:POST /videos/generations → 轮询 GET /videos/{id} → 下载 video.url)或 "sdcpp"(本地 stable-diffusion.cpp sd-server 原生任务接口:/sdcpp/v1/capabilities、/sdcpp/v1/vid_gen、/sdcpp/v1/jobs/{id}、/sdcpp/v1/jobs/{id}/cancel)。能力显式配置:video_durations、video_resolutions、video_tools,sdcpp 另有 video_fps、video_output_format(webm/webp/avi)、video_strength;这些限制写进工具 schema 与描述。不支持的时长、分辨率或输入(如 sdcpp 不接受的参考图)在发出任何请求前带原因失败(例:duration 7s is not supported by the video service …)。未配置时工具不注册;官方主机被拒绝;聊天模型不会被当作视频服务。
    • 远端异步任务映射到本地显示;超时、取消、结果不确定、恢复后查询可区分:每个任务在发出开始请求前写入 <会话>/video-jobs/<name>.json,状态为 submitting/queued/generating/downloading/completed/failed/expired/refused/cancelled/timed_out/unknown/lost。运行行实时显示 video: job <id> queued on <主机> (position N) / generating / downloading 与已用时间。超时说明远端可能仍会完成;Ctrl+C 对 sdcpp 发出取消并记录服务的回答(confirmed / refused / already_finished / not_supported),xai 没有取消请求时明确说明;运行器被杀掉的任务显示为 interrupted。/videos status [N](会话外 codsh --rust video status)向服务查询没人跟进的任务,完成则保存(标注 recovered);/videos cancel N 取消;--resume 后提示列出结果未定的任务。
    • 结果文件可打开,路径和会话链接正确;权限与费用提示走统一机制:成品先校验(mp4/webm/avi/动态 webp),原子写入 <会话>/videos/<n>.<ext>,不覆盖已有文件;失败、过期、拒绝、损坏或外部主机下载(xai 只从 base_url 主机或 video_download_hosts 下载)、超时、Ctrl+C 均不落盘。/videos 列出任务与文件,/videos open [N] 用 CODSH_VIDEO_OPENER(否则 open/xdg-open)打开。模型的 image_to_video / reference_to_video 由 dsh 执行(rust-acp-video.mjs),每次都走 dsh 审批,卡片为 Allow Animate image (<时长>, <分辨率>) "<提示词>" via <主机>?(或 Reference video (...)),注明发送几张图片、codsh 不知道该服务价格;Read deny 规则拒绝参考图路径。/imagine-video <描述> 逐字发送参考指令并携带附图,恢复后按输入原样显示。GROK_VIDEO_GEN=0 关闭,tools.media_gen.max_parallel_video_gen_calls 限并发。
    • 假服务覆盖所有状态,并至少验证一个真实替代:见下。
    • 文档:README / README.zh 视频章节(含配置示例)、CONTEXT 术语 “Video service”、CONTRIBUTING 测试说明、长帮助、changeset、rust/upstream/MODIFICATIONS(对照 grok-build video_gen/mod.rs、media_gen/limits.rs、imagine_video.rs 编写,/imagine-video 指令与用法逐字,工具描述去品牌化,无 tier upsell / ZDR/S3 / 模型覆盖)。

    检查(本机 Linux x86_64,keyless mock 模型,隔离临时 HOME,真实 dsh @deepseek-ai/dsh@0.1.5-rc.2)

    • python3 scripts/rust-video-gen-pty-test.py(新增,已加入 test:rust:pty,packed 安装产物 + 回环 xAI 异步形态与 sdcpp 形态两个假服务):通过。覆盖卡片 n 拒绝 / y 允许、实时任务行、保存 videos/1.mp4、/imagine-video + Ctrl+V 图片、不支持的时长不发请求、failed/expired/402/非视频/外部主机五种失败不落盘(外部 URL 不访问)、超时后 /videos status 恢复为 videos/3.mp4、Ctrl+C(xai 无取消请求)、/videos 与 open、resume 提示;sdcpp:能力检查、queued→generating→completed 保存 videos/1.webm、协议不支持的输入被拒、排队任务 Ctrl+C 取消且服务确认;关闭时 RUST_ACP_VIDEO_TOOLS (none);官方主机被 inspect 拒绝。9 个任务记录状态:completed×3、failed×3、expired、refused、cancelled。rust-image-gen-pty-test.py 仍通过。
    • scripts/rust-video-gen.spec.mjs 18/18;pnpm test 107 文件 / 2638 passed / 15 skipped;pnpm run typecheck 通过。
    • cargo test --locked --workspace --no-fail-fast:codsh-rust 758 passed / 4 失败(2 个 filesystem_sandbox、privacy、voice,与基线相同的 Linux 已知失败),其他 crate 1043 passed;新增 17 个单测(video_gen 15、config 1、命令解析 1)。cargo fmt --check 干净;严格 Clippy -D warnings 仅基线已有的 filesystem_sandbox.rs:743(tail_marker)与 :1372(needless_return)2 项,-A dead_code -A clippy::needless_return 下 0 警告。
    • pnpm run build、pnpm run build:rust 成功(native linux-x64 SHA-256 162edc79a6729a32fb930a9b824895aa1bb71a518629604513c68fd22a87a8b7);check:rust-package(linux-x64)与 rust-install-test.py 通过。
    • legacy e2e(pnpm 10.34.5)全套 19 文件 / 177 passed / 1 skipped。

    真实服务链(本机 localhost,无密钥,无费用)

    stable-diffusion.cpp sd-server(commit 2f88688,SD 1.5 q8_0 + AnimateDiff mm_sd15_v3,CPU,--steps 10 --sampling-method euler --scheduler karras),protocol = "sdcpp"、video_resolutions = ["256p"]、video_fps = 4;源图为 #187 真实生成的 256x256 PNG:

    • video generate --duration 2:Video saved to videos/1.webm (webm, 280.7 KB), 8 frames @ 4 fps,远端任务 job_6ab79842_00000000,209.0 s;ffprobe:vp8、256x256、4 fps、8 帧。
    • 生成中 Ctrl+C(SIGINT):the service refused to cancel remote job job_6ab79953_00000001 (HTTP 409: job is currently generating and cannot be interrupted yet); it may still finish. Nothing was saved.,退出码 130,未落盘。
    • 排队中 kill -9 运行器:/videos 显示 interrupted: codsh stopped following it while it ran;之后 video status 3 → finished on 127.0.0.1:18188; saved videos/2.webm (recovered after the tool call ended),video status 2(取消被拒的任务,由用户显式查询)→ 保存 videos/3.webm。
    • 实际 UI(packed 安装产物 + mock 模型 + 真实 sd-server):卡片 Allow Animate image (1s, default resolution) "a lighthouse at night, waves, rain" via 127.0.0.1:18188? y=allow once n=reject / Starts one video job on 127.0.0.1:18188 with the prompt and 1 image. codsh does not know its price; any charge is set by that service. Each video request asks again. → y → video: job job_6ab79ab8_00000003 generating on 127.0.0.1:18188 · … elapsed → Video saved to videos/1.webm (webm, 148.6 KB), 4 frames @ 4 fps(104.7 s,ffprobe 4 帧 256x256),/videos 显示 completed → videos/1.webm。
    • 说明:256p/10 步的 CPU 画面质量很低,仅用于验证协议与状态链路。

    未验证 / 未覆盖

    • 真实 xAI 形态或任何付费视频服务(按规格不购买、不调用官方端点;xai 协议仅用回环假服务验证);reference_to_video 只在假服务上验证(sdcpp 不支持参考图,按设计拒绝)。
    • 声音参考、关键帧只在 xai 请求体单测与 dsh spec(参数与引用解析)中验证,未经 PTY 或真实服务。
    • macOS 上的 PTY 运行与 open 打开器;Windows 未运行。Linux 下真实播放器未打开(测试用记录脚本)。
    • 编辑器 ACP(codsh --rust agent stdio)不提供视频工具。

    未改动

    main、npm 发布、默认切换均未改动。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions