Your Name 20898e1ac1
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat(video-agent): add ruxa nine-grid storyboard skill pipeline
2026-03-05 14:48:24 +08:00

82 lines
2.4 KiB
TypeScript

import "server-only";
import { getSystemSetting } from "@/lib/db/queries";
export const VIDEO_STORYBOARD_CONFIG_KEY = "video_storyboard_config";
export type VideoStoryboardConfig = {
enabled: boolean;
providerWhitelist: string[];
minGridConfidence: number;
enableTileUpscale: boolean;
sliceUpscaleMinEdge: number;
dispatchIntervalSec: number;
maxRetry: number;
enableFallback: boolean;
};
export const defaultVideoStoryboardConfig: VideoStoryboardConfig = {
enabled: true,
providerWhitelist: ["ruxa-video"],
minGridConfidence: 0.85,
enableTileUpscale: false,
sliceUpscaleMinEdge: 768,
dispatchIntervalSec: 10,
maxRetry: 3,
enableFallback: true,
};
function toNumber(value: unknown, fallback: number) {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : fallback;
}
export function normalizeVideoStoryboardConfig(
value: unknown
): VideoStoryboardConfig {
const raw =
value && typeof value === "object" && !Array.isArray(value)
? (value as Record<string, unknown>)
: {};
const whitelist = Array.isArray(raw.providerWhitelist)
? raw.providerWhitelist
.map((item) => String(item || "").trim())
.filter(Boolean)
: defaultVideoStoryboardConfig.providerWhitelist;
return {
enabled: raw.enabled !== false,
providerWhitelist:
whitelist.length > 0
? Array.from(new Set(whitelist))
: defaultVideoStoryboardConfig.providerWhitelist,
minGridConfidence: Math.max(
0.5,
Math.min(0.99, toNumber(raw.minGridConfidence, defaultVideoStoryboardConfig.minGridConfidence))
),
enableTileUpscale: raw.enableTileUpscale === true,
sliceUpscaleMinEdge: Math.max(
256,
Math.min(4096, Math.round(toNumber(raw.sliceUpscaleMinEdge, defaultVideoStoryboardConfig.sliceUpscaleMinEdge)))
),
dispatchIntervalSec: Math.max(
1,
Math.min(120, Math.round(toNumber(raw.dispatchIntervalSec, defaultVideoStoryboardConfig.dispatchIntervalSec)))
),
maxRetry: Math.max(
0,
Math.min(5, Math.round(toNumber(raw.maxRetry, defaultVideoStoryboardConfig.maxRetry)))
),
enableFallback: raw.enableFallback !== false,
};
}
export async function getVideoStoryboardConfig(): Promise<VideoStoryboardConfig> {
const setting = await getSystemSetting({ key: VIDEO_STORYBOARD_CONFIG_KEY }).catch(
() => undefined
);
return normalizeVideoStoryboardConfig(setting?.value);
}