fix: bound live video generation smoke

This commit is contained in:
Peter Steinberger
2026-04-14 14:59:01 +01:00
parent 4015138df9
commit a88c6f0fe7
23 changed files with 749 additions and 229 deletions

View File

@@ -2,9 +2,12 @@ import { isProviderApiKeyConfigured } from "openclaw/plugin-sdk/provider-auth";
import { resolveApiKeyForProvider } from "openclaw/plugin-sdk/provider-auth-runtime";
import {
assertOkOrThrowHttpError,
createProviderOperationDeadline,
fetchWithTimeout,
postJsonRequest,
resolveProviderOperationTimeoutMs,
resolveProviderHttpRequestConfig,
waitProviderOperationPollInterval,
} from "openclaw/plugin-sdk/provider-http";
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
import type {
@@ -73,6 +76,10 @@ async function pollBytePlusTask(params: {
baseUrl: string;
fetchFn: typeof fetch;
}): Promise<BytePlusTaskResponse> {
const deadline = createProviderOperationDeadline({
timeoutMs: params.timeoutMs,
label: `BytePlus video generation task ${params.taskId}`,
});
for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt += 1) {
const response = await fetchWithTimeout(
`${params.baseUrl}/contents/generations/tasks/${params.taskId}`,
@@ -80,7 +87,7 @@ async function pollBytePlusTask(params: {
method: "GET",
headers: params.headers,
},
params.timeoutMs ?? DEFAULT_TIMEOUT_MS,
resolveProviderOperationTimeoutMs({ deadline, defaultTimeoutMs: DEFAULT_TIMEOUT_MS }),
params.fetchFn,
);
await assertOkOrThrowHttpError(response, "BytePlus video status request failed");
@@ -96,7 +103,7 @@ async function pollBytePlusTask(params: {
case "queued":
case "running":
default:
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
await waitProviderOperationPollInterval({ deadline, pollIntervalMs: POLL_INTERVAL_MS });
break;
}
}
@@ -183,6 +190,10 @@ export function buildBytePlusVideoGenerationProvider(): VideoGenerationProvider
}
const fetchFn = fetch;
const deadline = createProviderOperationDeadline({
timeoutMs: req.timeoutMs,
label: "BytePlus video generation",
});
const { baseUrl, allowPrivateNetwork, headers, dispatcherPolicy } =
resolveProviderHttpRequestConfig({
baseUrl: resolveBytePlusVideoBaseUrl(req),
@@ -261,7 +272,10 @@ export function buildBytePlusVideoGenerationProvider(): VideoGenerationProvider
url: `${baseUrl}/contents/generations/tasks`,
headers,
body,
timeoutMs: req.timeoutMs,
timeoutMs: resolveProviderOperationTimeoutMs({
deadline,
defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
}),
fetchFn,
allowPrivateNetwork,
dispatcherPolicy,
@@ -276,7 +290,10 @@ export function buildBytePlusVideoGenerationProvider(): VideoGenerationProvider
const completed = await pollBytePlusTask({
taskId,
headers,
timeoutMs: req.timeoutMs,
timeoutMs: resolveProviderOperationTimeoutMs({
deadline,
defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
}),
baseUrl,
fetchFn,
});
@@ -286,7 +303,10 @@ export function buildBytePlusVideoGenerationProvider(): VideoGenerationProvider
}
const video = await downloadBytePlusVideo({
url: videoUrl,
timeoutMs: req.timeoutMs,
timeoutMs: resolveProviderOperationTimeoutMs({
deadline,
defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
}),
fetchFn,
});
return {