若干更新迭代
This commit is contained in:
1 parent
deb9cc5bcf
commit
4ac786aafb
64 files changed
+3251
-291
No files matched your search
@@ -5,13 +5,13 @@ import {
|
||||
recordUsageForJob,
|
||||
updateGenerationJob
|
||||
} from "@/lib/server/data-store";
|
||||
import { chargeGenerationJob, quoteGenerationCharge, settleMinimaxGenerationCharge, settleSeedanceGenerationCharge } from "@/lib/server/billing-service";
|
||||
import { chargeGenerationJob, quoteGenerationCharge, settleBailianWan3GenerationCharge, settleMinimaxGenerationCharge, settleSeedanceGenerationCharge } from "@/lib/server/billing-service";
|
||||
import { DEFAULT_OWNER_ID } from "@/lib/server/runtime";
|
||||
import { importRemoteAssetAsAsset } from "@/lib/server/storage";
|
||||
import { createSeedanceTask, getSeedanceConfig, querySeedanceTask, type SeedanceSettings } from "@/lib/seedance/client";
|
||||
import type { BillingJobCharge, GenerationJob, UsageContext } from "@/lib/types";
|
||||
import { VIDEO_DURATION_DEFAULT, clampVideoDuration, isSupportedSeedanceModel, normalizeSeedanceModel, normalizeVideoDuration, normalizeVideoRatio, normalizeVideoResolution } from "@/lib/video-settings";
|
||||
import { bailianResultUrls, bailianStatus, bailianTaskId, buildBailianVideoPayload, getBailianConfig, queryBailianTask, submitBailianTask } from "@/lib/bailian/client";
|
||||
import { bailianOutputVideoSeconds, bailianResultUrls, bailianStatus, bailianTaskId, buildBailianVideoPayload, getBailianConfig, queryBailianTask, submitBailianTask } from "@/lib/bailian/client";
|
||||
import { buildMinimaxH3Payload, createMinimaxH3Task, getMinimaxConfig, MINIMAX_H3_MODEL, queryMinimaxH3Task } from "@/lib/minimax/client";
|
||||
|
||||
export type VideoCreationEngine = "seedance" | "bailian" | "minimax";
|
||||
@@ -121,7 +121,14 @@ function prepareVideoGeneration(input: SubmitVideoJobInput, origin: string): Pre
|
||||
if (engine === "seedance" && input.model !== undefined && !isSupportedSeedanceModel(input.model)) {
|
||||
throw new Error("不支持的 Seedance 视频模型。");
|
||||
}
|
||||
const model = normalizeSeedanceModel(input.model, config.model);
|
||||
if (engine === "minimax" && input.model !== undefined && input.model !== MINIMAX_H3_MODEL) {
|
||||
throw new Error("MiniMax 仅支持 H3 视频模型。");
|
||||
}
|
||||
const bailianModel = input.model || getBailianConfig().videoModel;
|
||||
if (engine === "bailian" && !["wan2.7-i2v-2026-04-25", "wan3.0-video", getBailianConfig().videoModel].includes(bailianModel)) {
|
||||
throw new Error("不支持的百炼视频模型。");
|
||||
}
|
||||
const model = engine === "seedance" ? normalizeSeedanceModel(input.model, config.model) : engine === "bailian" ? bailianModel : MINIMAX_H3_MODEL;
|
||||
const assembled = assemblePrompt({
|
||||
...input,
|
||||
mode: "video",
|
||||
@@ -130,9 +137,9 @@ function prepareVideoGeneration(input: SubmitVideoJobInput, origin: string): Pre
|
||||
const finalPrompt = input.prompt?.trim() || assembled.prompt;
|
||||
const settings: SeedanceSettings = { ...(input.settings || {}) };
|
||||
if (engine === "bailian") {
|
||||
settings.duration = normalizeVideoDuration(settings.duration) ?? 10;
|
||||
settings.duration = settings.duration === undefined ? 10 : Number(settings.duration);
|
||||
settings.resolution = String(settings.resolution || "720P").toUpperCase();
|
||||
buildBailianVideoPayload({ prompt: finalPrompt, materials: assembled.materials, origin, settings });
|
||||
buildBailianVideoPayload({ prompt: finalPrompt, materials: assembled.materials, origin, settings, model });
|
||||
} else if (engine === "minimax") {
|
||||
const payload = buildMinimaxH3Payload({ prompt: finalPrompt, materials: assembled.materials, settings, origin });
|
||||
settings.duration = payload.duration;
|
||||
@@ -152,7 +159,7 @@ function prepareVideoGeneration(input: SubmitVideoJobInput, origin: string): Pre
|
||||
assembled,
|
||||
settings,
|
||||
engine,
|
||||
...(engine === "seedance" ? { model } : {})
|
||||
model
|
||||
};
|
||||
return {
|
||||
ownerId,
|
||||
@@ -163,7 +170,7 @@ function prepareVideoGeneration(input: SubmitVideoJobInput, origin: string): Pre
|
||||
settings,
|
||||
missingProviderCredentials,
|
||||
provider: engine,
|
||||
reqKey: engine === "bailian" ? getBailianConfig().videoModel : engine === "minimax" ? MINIMAX_H3_MODEL : model,
|
||||
reqKey: model,
|
||||
requestPayload
|
||||
};
|
||||
}
|
||||
@@ -193,7 +200,7 @@ async function dispatchVideoJob(job: GenerationJob, origin: string): Promise<Gen
|
||||
? assembled.materials as PromptMaterial[]
|
||||
: input.materials || [];
|
||||
if (job.provider === "bailian") {
|
||||
const response = await submitBailianTask("video", buildBailianVideoPayload({ prompt: job.prompt || "", settings: asRecord(settings), materials, origin }));
|
||||
const response = await submitBailianTask("video", buildBailianVideoPayload({ prompt: job.prompt || "", settings: asRecord(settings), materials, origin, model: job.reqKey }));
|
||||
const providerTaskId = bailianTaskId(response);
|
||||
if (!providerTaskId) throw new Error("视频任务响应缺少 task_id。");
|
||||
return updateGenerationJob(job.id, { status: "running", providerTaskId, responsePayload: response });
|
||||
@@ -231,7 +238,7 @@ export async function syncVideoJob(jobId: string, origin: string): Promise<Gener
|
||||
if (status !== "succeeded" || !resultUrl) {
|
||||
return updateGenerationJob(job.id, { status, responsePayload: response, error: status === "failed" ? { message: response.message || "百炼视频任务失败。", retryable: false } : undefined });
|
||||
}
|
||||
return completeRemoteVideo(job, origin, resultUrl, response);
|
||||
return completeRemoteVideo(job, origin, resultUrl, response, undefined, undefined, bailianOutputVideoSeconds(response));
|
||||
}
|
||||
if (job.provider === "minimax") {
|
||||
const result = await queryMinimaxH3Task(job.providerTaskId);
|
||||
@@ -270,13 +277,16 @@ async function completeRemoteVideo(
|
||||
resultUrl: string,
|
||||
responsePayload: Record<string, unknown>,
|
||||
completionTokens?: number,
|
||||
minimaxUsage?: { outputSeconds: number; inputSeconds: number; inputImageCount: number }
|
||||
minimaxUsage?: { outputSeconds: number; inputSeconds: number; inputImageCount?: number },
|
||||
bailianOutputSeconds?: number
|
||||
) {
|
||||
const settledJob = job.provider === "seedance"
|
||||
? await settleSeedanceGenerationCharge(job, completionTokens) || job
|
||||
: job.provider === "minimax"
|
||||
? await settleMinimaxGenerationCharge(job, minimaxUsage) || job
|
||||
: job;
|
||||
: job.provider === "bailian"
|
||||
? await settleBailianWan3GenerationCharge(job, bailianOutputSeconds) || job
|
||||
: job;
|
||||
const asset = await importRemoteAssetAsAsset({
|
||||
ownerId: settledJob.ownerId,
|
||||
url: resultUrl,
|
||||
|
||||
Reference in new issue
Block a user