


























@@ -70,6 +70,7 @@ const log = createSubsystemLogger("agents/tools/music-generate");
7070const MAX_INPUT_IMAGES = 10;
7171const SUPPORTED_OUTPUT_FORMATS = new Set<MusicGenerationOutputFormat>(["mp3", "wav"]);
7272const DEFAULT_REFERENCE_FETCH_TIMEOUT_MS = 30_000;
73+const MIN_MUSIC_GENERATION_TIMEOUT_MS = 10_000;
73747475const MusicGenerateToolSchema = Type.Object({
7576action: Type.Optional(
@@ -112,7 +113,8 @@ const MusicGenerateToolSchema = Type.Object({
112113),
113114timeoutMs: Type.Optional(
114115Type.Number({
115-description: "Optional provider request timeout in milliseconds.",
116+description:
117+"Optional provider request timeout in milliseconds. Values below 10000ms are raised to 10000ms.",
116118minimum: 1,
117119}),
118120),
@@ -231,6 +233,42 @@ type MusicGenerateSandboxConfig = {
231233232234type MusicGenerateBackgroundScheduler = (work: () => Promise<void>) => void;
233235236+type MusicGenerationTimeoutNormalization = {
237+requested: number;
238+applied: number;
239+minimum: number;
240+};
241+242+function normalizeMusicGenerationTimeoutMs(timeoutMs: number | undefined): {
243+timeoutMs?: number;
244+normalization?: MusicGenerationTimeoutNormalization;
245+message?: string;
246+} {
247+if (timeoutMs === undefined) {
248+return {};
249+}
250+if (timeoutMs >= MIN_MUSIC_GENERATION_TIMEOUT_MS) {
251+return { timeoutMs };
252+}
253+254+const normalization = {
255+requested: timeoutMs,
256+applied: MIN_MUSIC_GENERATION_TIMEOUT_MS,
257+minimum: MIN_MUSIC_GENERATION_TIMEOUT_MS,
258+};
259+const message = `Timeout normalized: requested ${timeoutMs}ms; used ${MIN_MUSIC_GENERATION_TIMEOUT_MS}ms.`;
260+log.warn("music_generate timeoutMs is below provider minimum; using minimum", {
261+requestedTimeoutMs: timeoutMs,
262+appliedTimeoutMs: MIN_MUSIC_GENERATION_TIMEOUT_MS,
263+minimumTimeoutMs: MIN_MUSIC_GENERATION_TIMEOUT_MS,
264+});
265+return {
266+timeoutMs: MIN_MUSIC_GENERATION_TIMEOUT_MS,
267+ normalization,
268+ message,
269+};
270+}
271+234272function defaultScheduleMusicGenerateBackgroundWork(work: () => Promise<void>) {
235273queueMicrotask(() => {
236274void work().catch((error) => {
@@ -369,6 +407,7 @@ async function executeMusicGenerationJob(params: {
369407loadedReferenceImages: LoadedReferenceImage[];
370408taskHandle?: MusicGenerationTaskHandle | null;
371409timeoutMs?: number;
410+timeoutNormalization?: MusicGenerationTimeoutNormalization;
372411}): Promise<ExecutedMusicGeneration> {
373412if (params.taskHandle) {
374413recordMusicGenerationTaskProgress({
@@ -432,6 +471,11 @@ async function executeMusicGenerationJob(params: {
432471const lines = [
433472`Generated ${savedTracks.length} track${savedTracks.length === 1 ? "" : "s"} with ${result.provider}/${result.model}.`,
434473 ...(warning ? [`Warning: ${warning}`] : []),
474+ ...(params.timeoutNormalization
475+ ? [
476+`Timeout normalized: requested ${params.timeoutNormalization.requested}ms; used ${params.timeoutNormalization.applied}ms.`,
477+]
478+ : []),
435479typeof requestedDurationSeconds === "number" &&
436480typeof appliedDurationSeconds === "number" &&
437481requestedDurationSeconds !== appliedDurationSeconds
@@ -472,6 +516,12 @@ async function executeMusicGenerationJob(params: {
472516 ...(!ignoredOverrideKeys.has("format") && params.format ? { format: params.format } : {}),
473517 ...(params.filename ? { filename: params.filename } : {}),
474518 ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),
519+ ...(params.timeoutNormalization
520+ ? {
521+requestedTimeoutMs: params.timeoutNormalization.requested,
522+timeoutNormalization: params.timeoutNormalization,
523+}
524+ : {}),
475525 ...buildMediaReferenceDetails({
476526entries: params.loadedReferenceImages,
477527singleKey: "image",
@@ -570,7 +620,9 @@ export function createMusicGenerateTool(options?: {
570620});
571621const format = normalizeOutputFormat(readStringParam(args, "format"));
572622const filename = readStringParam(args, "filename");
573-const timeoutMs = readGenerationTimeoutMs(args);
623+const requestedTimeoutMs = readGenerationTimeoutMs(args);
624+const timeout = normalizeMusicGenerationTimeoutMs(requestedTimeoutMs);
625+const timeoutMs = timeout.timeoutMs;
574626const imageInputs = normalizeReferenceImageInputs(args);
575627const selectedProvider = resolveSelectedMusicGenerationProvider({
576628config: effectiveCfg,
@@ -623,6 +675,7 @@ export function createMusicGenerateTool(options?: {
623675 loadedReferenceImages,
624676 taskHandle,
625677 timeoutMs,
678+timeoutNormalization: timeout.normalization,
626679}),
627680});
628681completeMusicGenerationTaskRun({
@@ -668,7 +721,12 @@ export function createMusicGenerateTool(options?: {
668721content: [
669722{
670723type: "text",
671-text: `Background task started for music generation (${taskHandle?.taskId ?? "unknown"}). Do not call music_generate again for this request. Wait for the completion event; I'll post the finished music here when it's ready.`,
724+text: [
725+`Background task started for music generation (${taskHandle?.taskId ?? "unknown"}). Do not call music_generate again for this request. Wait for the completion event; I'll post the finished music here when it's ready.`,
726+timeout.message,
727+]
728+.filter((entry): entry is string => Boolean(entry))
729+.join("\n"),
672730},
673731],
674732details: {
@@ -688,6 +746,13 @@ export function createMusicGenerateTool(options?: {
688746 ...(format ? { format } : {}),
689747 ...(filename ? { filename } : {}),
690748 ...(timeoutMs !== undefined ? { timeoutMs } : {}),
749+ ...(timeout.normalization
750+ ? {
751+requestedTimeoutMs: timeout.normalization.requested,
752+timeoutNormalization: timeout.normalization,
753+warning: timeout.message,
754+}
755+ : {}),
691756},
692757};
693758}
@@ -706,6 +771,7 @@ export function createMusicGenerateTool(options?: {
706771 loadedReferenceImages,
707772 taskHandle,
708773 timeoutMs,
774+timeoutNormalization: timeout.normalization,
709775});
710776completeMusicGenerationTaskRun({
711777handle: taskHandle,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。