



























@@ -2,6 +2,7 @@ import fs from "node:fs/promises";
22import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
33import { canResolveEnvSecretRefInReadOnlyPath } from "openclaw/plugin-sdk/extension-shared";
44import { extensionForMime } from "openclaw/plugin-sdk/media-mime";
5+import { resolvePositiveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
56import {
67isProviderApiKeyConfigured,
78type AuthProfileStore,
@@ -418,14 +419,15 @@ async function waitForLocalHistory(params: {
418419dispatcherPolicy?: ComfyDispatcherPolicy;
419420}): Promise<ComfyHistoryEntry> {
420421const deadline = Date.now() + params.timeoutMs;
421-while (Date.now() <= deadline) {
422+for (;;) {
423+const requestTimeoutMs = resolveComfyRemainingMs(deadline, params.timeoutMs);
422424const history = await readJsonResponse<unknown>({
423425url: `${params.baseUrl}/history/${params.promptId}`,
424426init: {
425427method: "GET",
426428headers: params.headers,
427429},
428-timeoutMs: params.timeoutMs,
430+timeoutMs: requestTimeoutMs,
429431policy: params.policy,
430432dispatcherPolicy: params.dispatcherPolicy,
431433auditContext: "comfy-history",
@@ -437,10 +439,9 @@ async function waitForLocalHistory(params: {
437439return entry;
438440}
439441440-await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
442+const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
443+await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
441444}
442-443-throw new Error(`Comfy workflow did not finish within ${Math.ceil(params.timeoutMs / 1000)}s`);
444445}
445446446447async function waitForCloudCompletion(params: {
@@ -453,14 +454,15 @@ async function waitForCloudCompletion(params: {
453454dispatcherPolicy?: ComfyDispatcherPolicy;
454455}): Promise<void> {
455456const deadline = Date.now() + params.timeoutMs;
456-while (Date.now() <= deadline) {
457+for (;;) {
458+const requestTimeoutMs = resolveComfyRemainingMs(deadline, params.timeoutMs);
457459const status = await readJsonResponse<ComfyStatusResponse>({
458460url: `${params.baseUrl}/api/job/${params.promptId}/status`,
459461init: {
460462method: "GET",
461463headers: params.headers,
462464},
463-timeoutMs: params.timeoutMs,
465+timeoutMs: requestTimeoutMs,
464466policy: params.policy,
465467dispatcherPolicy: params.dispatcherPolicy,
466468auditContext: "comfy-status",
@@ -476,10 +478,22 @@ async function waitForCloudCompletion(params: {
476478);
477479}
478480479-await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
481+const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
482+await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
480483}
484+}
481485482-throw new Error(`Comfy workflow did not finish within ${Math.ceil(params.timeoutMs / 1000)}s`);
486+function resolveComfyRemainingMs(
487+deadline: number,
488+timeoutMs: number,
489+defaultTimeoutMs = timeoutMs,
490+) {
491+const defaultMs = resolvePositiveTimerTimeoutMs(defaultTimeoutMs, 1);
492+const remainingMs = deadline - Date.now();
493+if (remainingMs <= 0) {
494+throw new Error(`Comfy workflow did not finish within ${Math.ceil(timeoutMs / 1000)}s`);
495+}
496+return Math.max(1, Math.min(defaultMs, remainingMs));
483497}
484498485499function collectOutputFiles(params: {
@@ -662,10 +676,14 @@ export async function runComfyWorkflow(params: {
662676const inputImageInputName =
663677normalizeOptionalString(capabilityConfig.inputImageInputName) ?? DEFAULT_INPUT_IMAGE_INPUT_NAME;
664678const outputNodeId = normalizeOptionalString(capabilityConfig.outputNodeId);
665-const pollIntervalMs =
666-readConfigInteger(capabilityConfig, "pollIntervalMs") ?? DEFAULT_POLL_INTERVAL_MS;
667-const timeoutMs =
668-readConfigInteger(capabilityConfig, "timeoutMs") ?? params.timeoutMs ?? DEFAULT_TIMEOUT_MS;
679+const pollIntervalMs = resolvePositiveTimerTimeoutMs(
680+readConfigInteger(capabilityConfig, "pollIntervalMs"),
681+DEFAULT_POLL_INTERVAL_MS,
682+);
683+const timeoutMs = resolvePositiveTimerTimeoutMs(
684+readConfigInteger(capabilityConfig, "timeoutMs") ?? params.timeoutMs,
685+DEFAULT_TIMEOUT_MS,
686+);
669687const providerModel = normalizeOptionalString(params.model) || DEFAULT_COMFY_MODEL;
670688671689setWorkflowInput({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。