ai-chatbot/lib/canvas/image-task-config.ts
Your Name 2108d06715
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: support cross-provider image failover and workflow model settings
2026-04-27 20:10:48 +08:00

56 lines
1.5 KiB
TypeScript

export const CANVAS_IMAGE_TASK_QUEUE_CONFIG_KEY = "canvas_image_task_queue_config";
export const DEFAULT_CANVAS_IMAGE_TASK_CONCURRENCY = 1;
export const MAX_CANVAS_IMAGE_TASK_CONCURRENCY = 100;
export interface CanvasImageTaskQueueConfig {
concurrency: number;
}
function clampConcurrency(value: number) {
return Math.min(
MAX_CANVAS_IMAGE_TASK_CONCURRENCY,
Math.max(DEFAULT_CANVAS_IMAGE_TASK_CONCURRENCY, Math.floor(value))
);
}
function parseConcurrencyCandidate(value: unknown): number | null {
if (typeof value === "number" && Number.isFinite(value)) {
return clampConcurrency(value);
}
if (typeof value === "string" && value.trim()) {
const parsed = Number.parseInt(value.trim(), 10);
if (Number.isFinite(parsed)) {
return clampConcurrency(parsed);
}
}
return null;
}
export function normalizeCanvasImageTaskQueueConfig(
value: unknown,
options?: { envConcurrency?: unknown }
): CanvasImageTaskQueueConfig {
const raw = value && typeof value === "object" && !Array.isArray(value)
? (value as Record<string, unknown>)
: {};
const candidates = [
raw.concurrency,
raw.maxConcurrency,
raw.maxConcurrent,
typeof value === "number" || typeof value === "string" ? value : undefined,
options?.envConcurrency,
];
for (const candidate of candidates) {
const parsed = parseConcurrencyCandidate(candidate);
if (parsed !== null) {
return { concurrency: parsed };
}
}
return { concurrency: DEFAULT_CANVAS_IMAGE_TASK_CONCURRENCY };
}