短いAI動画を何度か生成していると、「前回は何を変えたのか」が分からなくなりやすい。プロンプト、参照画像、画角、長さ、モデルを同時に変更すると、結果が改善しても理由を説明できない。
この記事では、生成サービス固有のAPIには依存せず、ブラウザ上で行った試行をローカルのJSONへ記録するための小さなTypeScript設計を考える。目的は生成を自動化することではなく、次の試行で変更する条件を一つに絞ることにある。
記録したい情報
最低限、次の情報を残す。
- 試行IDと作成時刻
- 利用した入力方式(テキストまたは参照画像)
- モデル名と画面比率
- プロンプト
- 表示されていたクレジット見積もり
- 判定(採用、トリム、再試行、中止)
- 次回に変更する項目
クレジット値や対応する長さ・解像度はモデルや時点によって変わるため、固定値としてコードへ埋め込まず、その試行時に画面へ表示された値を記録する。
type InputMode = "text" | "image";
type Decision = "keep" | "trim" | "retry" | "stop";
type Trial = {
id: string;
createdAt: string;
inputMode: InputMode;
model: string;
aspectRatio: string;
durationSec?: number;
resolution?: string;
prompt: string;
referenceImageId?: string;
displayedCreditCost?: number;
decision?: Decision;
note?: string;
nextChange?: keyof Trial;
};
referenceImageId には画像そのものや公開URLではなく、ローカルで管理する識別子を入れる。個人情報や未公開素材をログへ複製しないためである。
変更点が一つかを検査する
比較可能な試行にするには、前回から変わった生成条件を列挙する。判定やメモなど、結果側のフィールドは比較対象から外す。
const conditionKeys = [
"inputMode",
"model",
"aspectRatio",
"durationSec",
"resolution",
"prompt",
"referenceImageId",
] as const satisfies readonly (keyof Trial)[];
function changedConditions(before: Trial, after: Trial): (keyof Trial)[] {
return conditionKeys.filter((key) => before[key] !== after[key]);
}
function validateSingleChange(before: Trial, after: Trial): string[] {
const changed = changedConditions(before, after);
if (changed.length === 0) {
return ["生成条件が変わっていません"];
}
if (changed.length > 1) {
return [`変更点を一つに絞ってください: ${changed.join(", ")}`];
}
if (after.nextChange !== changed[0]) {
return ["nextChange と実際の変更項目が一致しません"];
}
return [];
}
これは因果関係を証明する仕組みではない。生成結果には揺らぎがあるため、同じ条件でも異なる結果になり得る。それでも変更点を一つにすると、「何を意図して比較したか」は後から確認できる。
リトライ回数ではなく予算を先に決める
「もう一回だけ」を繰り返さないため、シーン単位で上限を持たせる。回数だけでなく、画面に表示されたクレジット見積もりの合計も確認する。
type RetryBudget = {
maxTrials: number;
maxDisplayedCredits: number;
};
function canStartNextTrial(
trials: Trial[],
nextDisplayedCost: number,
budget: RetryBudget,
): boolean {
const used = trials.reduce(
(sum, trial) => sum + (trial.displayedCreditCost ?? 0),
0,
);
return (
trials.length < budget.maxTrials &&
used + nextDisplayedCost <= budget.maxDisplayedCredits
);
}
見積もりが取得できない場合に 0 と扱うと判断を誤る可能性がある。実運用では displayedCreditCost が未入力なら生成前に確認を促す方が安全である。
サービスの画面とログを分離する
テキストまたは参照画像から短いクリップを作る場合、モデル別の設定を選べる動画生成ワークスペースのようなブラウザツールを利用しても、試行ログは別のローカルファイルで管理できる。
生成ツール側でプレビューとダウンロードができても、字幕、正確なブランド表記、複数カットの接続、音源条件、SNSへの投稿は別工程である。参照画像を使っても、人物・形状・文字が完全に維持される保証はない。ログには「生成できたか」だけでなく、編集へ渡せる連続区間があるかも記録するとよい。
JSONとして保存する
Node.jsで扱うなら、試行ごとに配列へ追記して保存できる。
import { readFile, writeFile } from "node:fs/promises";
async function appendTrial(path: string, trial: Trial): Promise<void> {
let trials: Trial[] = [];
try {
trials = JSON.parse(await readFile(path, "utf8"));
} catch (error) {
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
}
trials.push(trial);
await writeFile(path, JSON.stringify(trials, null, 2), "utf8");
}
実際の運用では、JSON SchemaやZodで入力値を検証し、秘密情報やローカルの絶対パスを保存しないルールも追加したい。
まとめ
AI動画生成の試行ログでは、項目数を増やすことよりも、比較できる形を保つことが重要になる。
- 試行時に表示された条件とコストを記録する
- 前回から変える条件を一つにする
- 回数とクレジットの上限を生成前に決める
- 採用・トリム・再試行・中止を明示する
- 編集と公開は別工程として確認する
この形なら、生成結果が期待どおりでなかった場合も、次に何を変えるかを具体的に残せる。