


























@@ -61,6 +61,7 @@ import {
6161textToSpeech,
6262} from "../tts/tts.js";
6363import { generateVideo, listRuntimeVideoGenerationProviders } from "../video-generation/runtime.js";
64+import type { VideoGenerationResolution } from "../video-generation/types.js";
6465import {
6566isWebFetchProviderConfigured,
6667resolveWebFetchDefinition,
@@ -267,7 +268,19 @@ const CAPABILITY_METADATA: CapabilityMetadata[] = [
267268id: "video.generate",
268269description: "Generate video files with configured video providers.",
269270transports: ["local"],
270-flags: ["--prompt", "--model", "--output", "--json"],
271+flags: [
272+"--prompt",
273+"--model",
274+"--size",
275+"--aspect-ratio",
276+"--resolution",
277+"--duration",
278+"--audio",
279+"--watermark",
280+"--timeout-ms",
281+"--output",
282+"--json",
283+],
271284resultShape: "saved video files plus attempts",
272285},
273286{
@@ -822,14 +835,62 @@ async function runAudioTranscribe(params: {
822835} satisfies CapabilityEnvelope;
823836}
824837825-async function runVideoGenerate(params: { prompt: string; model?: string; output?: string }) {
838+function parseOptionalFiniteNumber(
839+raw: string | number | undefined,
840+label: string,
841+): number | undefined {
842+if (raw === undefined || (typeof raw === "string" && raw.trim() === "")) {
843+return undefined;
844+}
845+const value = Number(raw);
846+if (!Number.isFinite(value)) {
847+throw new Error(`${label} must be a finite number`);
848+}
849+return value;
850+}
851+852+function normalizeVideoResolution(raw: string | undefined): VideoGenerationResolution | undefined {
853+const normalized = raw?.trim().toUpperCase();
854+if (!normalized) {
855+return undefined;
856+}
857+if (
858+normalized === "480P" ||
859+normalized === "720P" ||
860+normalized === "768P" ||
861+normalized === "1080P"
862+) {
863+return normalized;
864+}
865+throw new Error("video resolution must be one of 480P, 720P, 768P, or 1080P");
866+}
867+868+async function runVideoGenerate(params: {
869+prompt: string;
870+model?: string;
871+output?: string;
872+size?: string;
873+aspectRatio?: string;
874+resolution?: VideoGenerationResolution;
875+durationSeconds?: number;
876+audio?: boolean;
877+watermark?: boolean;
878+timeoutMs?: number;
879+}) {
826880const cfg = loadConfig();
827881const agentDir = resolveAgentDir(cfg, resolveDefaultAgentId(cfg));
828882const result = await generateVideo({
829883 cfg,
830884 agentDir,
831885prompt: params.prompt,
832886modelOverride: params.model,
887+size: params.size,
888+aspectRatio: params.aspectRatio,
889+resolution: params.resolution,
890+durationSeconds: params.durationSeconds,
891+audio: params.audio,
892+watermark: params.watermark,
893+timeoutMs: params.timeoutMs,
833894});
834895const outputs = await Promise.all(
835896result.videos.map(async (video, index) => {
@@ -1680,6 +1741,13 @@ export function registerCapabilityCli(program: Command) {
16801741.description("Generate video")
16811742.requiredOption("--prompt <text>", "Prompt text")
16821743.option("--model <provider/model>", "Model override")
1744+.option("--size <size>", "Size hint like 1280x720")
1745+.option("--aspect-ratio <ratio>", "Aspect ratio hint like 16:9")
1746+.option("--resolution <value>", "Resolution hint: 480P, 720P, 768P, or 1080P")
1747+.option("--duration <seconds>", "Target duration in seconds")
1748+.option("--audio", "Enable generated audio when supported")
1749+.option("--watermark", "Request provider watermark when supported")
1750+.option("--timeout-ms <ms>", "Provider request timeout in milliseconds")
16831751.option("--output <path>", "Output path")
16841752.option("--json", "Output JSON", false)
16851753.action(async (opts) => {
@@ -1688,6 +1756,13 @@ export function registerCapabilityCli(program: Command) {
16881756prompt: String(opts.prompt),
16891757model: opts.model as string | undefined,
16901758output: opts.output as string | undefined,
1759+size: opts.size as string | undefined,
1760+aspectRatio: opts.aspectRatio as string | undefined,
1761+resolution: normalizeVideoResolution(opts.resolution as string | undefined),
1762+durationSeconds: parseOptionalFiniteNumber(opts.duration, "--duration"),
1763+audio: opts.audio === true ? true : undefined,
1764+watermark: opts.watermark === true ? true : undefined,
1765+timeoutMs: parseOptionalFiniteNumber(opts.timeoutMs, "--timeout-ms"),
16911766});
16921767emitJsonOrText(defaultRuntime, Boolean(opts.json), result, formatEnvelopeForText);
16931768});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。