From 2dd7adea03933170d7258bc967829c4bd90bdf9d Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Mon, 9 Nov 2026 05:45:10 +0000 Subject: [PATCH 1/2] feat(music): songs up to 3 minutes; show written lyrics in c0mpute.com/chat; v0.2.84 - MAX_SECONDS 120 -> 180 (a brief asking for '150-second' or '2-3 minutes' was clamped to 2 min), worker JOB_TIMEOUT 15 -> 25 min, result cap 48 MiB. - Bid gate min_free_ram_gb 12 -> 10: a bf16 song peaked at 8.5 GB RSS. - c0mpute.com/chat passes Infernet's written caption/lyrics through the poll and shows the lyrics while the song renders; client wait 45 min. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 32 +++++++++---------- Cargo.toml | 2 +- apps/tui/package.json | 2 +- apps/web/package.json | 2 +- apps/web/src/app/api/v1/music/[id]/route.ts | 10 +++++- apps/web/src/app/chat/chat-app.tsx | 16 ++++++++-- .../web/src/app/releases/latest.json/route.ts | 2 +- apps/web/src/lib/chat/music.ts | 2 +- node/crates/c0mpute-core/src/config.rs | 4 +-- node/crates/c0mpute-core/src/music.rs | 14 ++++---- package.json | 2 +- packages/shared/package.json | 2 +- plugins/ad-generator-agent/module.toml | 2 +- plugins/ads-manager/module.toml | 2 +- plugins/coinpay/module.toml | 2 +- plugins/crawl/module.toml | 2 +- plugins/ctv-ads/module.toml | 2 +- plugins/diffusion/module.toml | 2 +- plugins/embed/module.toml | 2 +- plugins/gameserver/module.toml | 2 +- plugins/hosting/module.toml | 2 +- plugins/infernet/module.toml | 2 +- plugins/live-stream/module.toml | 2 +- plugins/music/module.toml | 6 ++-- plugins/ocr/module.toml | 2 +- plugins/podcast-ads/module.toml | 2 +- plugins/podcasting/module.toml | 2 +- plugins/podcasts/module.toml | 2 +- plugins/render/module.toml | 2 +- plugins/secure-chat/module.toml | 2 +- plugins/storage/module.toml | 2 +- plugins/train/module.toml | 2 +- plugins/transcode/module.toml | 2 +- plugins/tts/module.toml | 2 +- plugins/video/module.toml | 2 +- plugins/webhook/module.toml | 2 +- plugins/whisper/module.toml | 2 +- plugins/workflow-step/module.toml | 2 +- 38 files changed, 83 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe4e6c77..363a7a54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -478,7 +478,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "c0mpute-api" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "c0mpute-proto", @@ -493,7 +493,7 @@ dependencies = [ [[package]] name = "c0mpute-bench" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "blake3", @@ -504,7 +504,7 @@ dependencies = [ [[package]] name = "c0mpute-cli" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "axum", @@ -534,7 +534,7 @@ dependencies = [ [[package]] name = "c0mpute-core" -version = "0.2.83" +version = "0.2.84" dependencies = [ "aes-gcm", "anyhow", @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "c0mpute-doctor" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "serde", @@ -592,7 +592,7 @@ dependencies = [ [[package]] name = "c0mpute-envelope" -version = "0.2.83" +version = "0.2.84" dependencies = [ "blake3", "bs58", @@ -605,7 +605,7 @@ dependencies = [ [[package]] name = "c0mpute-gateway" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "axum", @@ -627,7 +627,7 @@ dependencies = [ [[package]] name = "c0mpute-market" -version = "0.2.83" +version = "0.2.84" dependencies = [ "c0mpute-envelope", "serde", @@ -637,7 +637,7 @@ dependencies = [ [[package]] name = "c0mpute-net" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "async-trait", @@ -654,7 +654,7 @@ dependencies = [ [[package]] name = "c0mpute-placement" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "async-trait", @@ -675,7 +675,7 @@ dependencies = [ [[package]] name = "c0mpute-proto" -version = "0.2.83" +version = "0.2.84" dependencies = [ "blake3", "hex", @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "c0mpute-secure-chat" -version = "0.2.83" +version = "0.2.84" dependencies = [ "aes-gcm", "anyhow", @@ -710,7 +710,7 @@ dependencies = [ [[package]] name = "c0mpute-store" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "blake3", @@ -728,7 +728,7 @@ dependencies = [ [[package]] name = "c0mpute-transcode" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "c0mpute-proto", @@ -741,7 +741,7 @@ dependencies = [ [[package]] name = "c0mpute-update" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "hex", @@ -755,7 +755,7 @@ dependencies = [ [[package]] name = "c0mpute-verify" -version = "0.2.83" +version = "0.2.84" dependencies = [ "anyhow", "blake3", diff --git a/Cargo.toml b/Cargo.toml index 4e74235c..4e5b2421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.2.83" +version = "0.2.84" edition = "2024" license = "MIT" repository = "https://github.com/profullstack/c0mpute" diff --git a/apps/tui/package.json b/apps/tui/package.json index 34150b7a..ec6664a9 100644 --- a/apps/tui/package.json +++ b/apps/tui/package.json @@ -1,6 +1,6 @@ { "name": "@c0mpute/tui", - "version": "0.2.83", + "version": "0.2.84", "private": true, "type": "module", "bin": { diff --git a/apps/web/package.json b/apps/web/package.json index 6d200fae..26394bdf 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "c0mpute", - "version": "0.2.83", + "version": "0.2.84", "private": true, "type": "module", "scripts": { diff --git a/apps/web/src/app/api/v1/music/[id]/route.ts b/apps/web/src/app/api/v1/music/[id]/route.ts index 913d927a..4ed5d5f1 100644 --- a/apps/web/src/app/api/v1/music/[id]/route.ts +++ b/apps/web/src/app/api/v1/music/[id]/route.ts @@ -29,6 +29,14 @@ export async function GET(req: Request, { params }: { params: Promise<{ id: stri return json({ error: { message: "the c0mpute network is restarting; try again in a minute", code: 503 } }, 503); } const body = (await upstream.json().catch(() => ({}))) as Record; - if (upstream.status === 202) return json({ id, status: "pending", seconds: body.seconds ?? null }, 202, { "cache-control": "no-store" }); + if (upstream.status === 202) { + // Infernet writes lyrics from a brief first; pass what it wrote along. + const pick = (k: string) => (typeof body[k] === "string" || typeof body[k] === "number" ? body[k] : undefined); + return json( + { id, status: "pending", seconds: body.seconds ?? null, stage: pick("stage"), caption: pick("caption"), lyrics: pick("lyrics"), duration: pick("duration") }, + 202, + { "cache-control": "no-store" }, + ); + } return json({ error: { message: typeof body.error === "string" ? body.error : "song failed", code: upstream.status } }, upstream.status); } diff --git a/apps/web/src/app/chat/chat-app.tsx b/apps/web/src/app/chat/chat-app.tsx index cd66792c..88009b8b 100644 --- a/apps/web/src/app/chat/chat-app.tsx +++ b/apps/web/src/app/chat/chat-app.tsx @@ -267,7 +267,9 @@ export function ChatApp({ error }: { error: string | null }) { }); const start = await res.json().catch(() => ({})); if (res.status !== 202 || !start.poll) throw new Error(start.error?.message ?? `HTTP ${res.status}`); - const deadline = Date.now() + 20 * 60_000; + // Infernet may write lyrics from the brief first; keep what it wrote. + let written: { caption: string; lyrics: string } | null = null; + const deadline = Date.now() + 45 * 60_000; let done: Response | null = null; while (!done) { if (Date.now() > deadline) throw new Error("song timed out"); @@ -275,7 +277,15 @@ export function ChatApp({ error }: { error: string | null }) { if (ctrl.signal.aborted) throw new DOMException("aborted", "AbortError"); const poll = await fetch(start.poll, { cache: "no-store", signal: ctrl.signal }); if (poll.status === 202) { - setLast({ content: `// composing with ACE-Step 1.5 on a c0mpute worker… ${Math.round((Date.now() - started) / 1000)}s` }); + const p = await poll.json().catch(() => ({})); + const secs = Math.round((Date.now() - started) / 1000); + if (typeof p.caption === "string") written = { caption: p.caption, lyrics: typeof p.lyrics === "string" ? p.lyrics : "" }; + setLast({ + content: + p.stage === "writing" + ? `// writing lyrics and a style from your brief… ${secs}s` + : `// composing with ACE-Step 1.5 on a c0mpute worker… ${secs}s${written?.lyrics ? `\n\n${written.lyrics}` : ""}`, + }); continue; } if (!poll.ok) { @@ -287,7 +297,7 @@ export function ChatApp({ error }: { error: string | null }) { const blob = await done.blob(); const url = URL.createObjectURL(blob); setLast({ - content: `[music: ${music.prompt}${music.lyrics ? " (with lyrics)" : ", instrumental"}] (${Math.round((Date.now() - started) / 1000)}s on a c0mpute worker)`, + content: `[music: ${(written?.caption ?? music.prompt).slice(0, 300)}${written?.lyrics || music.lyrics ? " (with lyrics)" : ", instrumental"}] (${Math.round((Date.now() - started) / 1000)}s on a c0mpute worker)${written?.lyrics ? `\n\n${written.lyrics}` : ""}`, audio: url, audioType: blob.type || "audio/mpeg", }); diff --git a/apps/web/src/app/releases/latest.json/route.ts b/apps/web/src/app/releases/latest.json/route.ts index a31d1ad4..7fd61665 100644 --- a/apps/web/src/app/releases/latest.json/route.ts +++ b/apps/web/src/app/releases/latest.json/route.ts @@ -28,7 +28,7 @@ export const dynamic = "force-dynamic"; * this in sync with the workspace version in `Cargo.toml` on each release so a * freshly built CLI reports "already latest" rather than a phantom upgrade. */ -const FALLBACK_VERSION = "0.2.83"; +const FALLBACK_VERSION = "0.2.84"; const FALLBACK_MIN_REQUIRED = "0.0.1"; type Channel = "stable" | "beta" | "nightly"; diff --git a/apps/web/src/lib/chat/music.ts b/apps/web/src/lib/chat/music.ts index 2db3be86..dcfe64d8 100644 --- a/apps/web/src/lib/chat/music.ts +++ b/apps/web/src/lib/chat/music.ts @@ -22,7 +22,7 @@ export function parseMusicCommand(text: string): MusicCommand | null { export const MAX_TEXT_CHARS = 100_000; export const MIN_SECONDS = 10; -export const MAX_SECONDS = 120; +export const MAX_SECONDS = 180; /** Validate a POST body; returns the body to forward or an error string. */ export function parseMusicRequest( diff --git a/node/crates/c0mpute-core/src/config.rs b/node/crates/c0mpute-core/src/config.rs index 26c5bc88..6b9519ec 100644 --- a/node/crates/c0mpute-core/src/config.rs +++ b/node/crates/c0mpute-core/src/config.rs @@ -377,8 +377,8 @@ fn default_music_min_ram_gb() -> u64 { 24 } fn default_music_min_free_ram_gb() -> u64 { - // A bf16 DiT-only job peaks around 9 GB; keep some to spare. - 12 + // A bf16 DiT-only song peaked at 8.5 GB RSS (measured 2026-11-09). + 10 } fn default_music_min_free_disk_gb() -> u64 { 30 diff --git a/node/crates/c0mpute-core/src/music.rs b/node/crates/c0mpute-core/src/music.rs index 60cb9884..5f2f884d 100644 --- a/node/crates/c0mpute-core/src/music.rs +++ b/node/crates/c0mpute-core/src/music.rs @@ -43,8 +43,8 @@ pub const MODEL_ID: &str = "ace-step-1.5"; pub const MODEL_TAG: &str = "c0mpute:music:model:ace-step-1.5"; /// Largest song a worker returns or a buyer accepts. A 2-minute 128 kb/s MP3 -/// is ~2 MB; the FLAC fallback for the same song is up to ~20 MB. -pub const MAX_RESULT_BYTES: usize = 32 * 1024 * 1024; +/// is ~2 MB; the FLAC fallback for a 3-minute song is up to ~30 MB. +pub const MAX_RESULT_BYTES: usize = 48 * 1024 * 1024; /// What a buyer may send. Longer than the model reads on purpose: callers /// paste whole briefs and songs, and `clip_for_model` trims them. pub const MAX_PROMPT_CHARS: usize = 100_000; @@ -55,10 +55,12 @@ pub const MAX_LYRICS_CHARS: usize = 100_000; pub const MODEL_PROMPT_CHARS: usize = 1_000; pub const MODEL_LYRICS_CHARS: usize = 4_000; pub const MIN_SECONDS: u32 = 10; -pub const MAX_SECONDS: u32 = 120; +pub const MAX_SECONDS: u32 = 180; pub const DEFAULT_SECONDS: u32 = 30; -/// Worker-side limit for one song, model load included. -pub const JOB_TIMEOUT: Duration = Duration::from_secs(15 * 60); +/// Worker-side limit for one song, model load included. A 30 s song takes +/// ~130 s on 16 CPU threads and time grows with length, so a 3-minute song +/// on a busy box needs well over 10 minutes. +pub const JOB_TIMEOUT: Duration = Duration::from_secs(25 * 60); const INSTALL_RETRY_BACKOFF_SECS: u64 = 6 * 60 * 60; const WORKER: &str = include_str!("music_worker.py"); @@ -657,7 +659,7 @@ async fn run_job( let path = generate(&spec, &job_dir).await?; let bytes = tokio::fs::read(&path).await?; if audio_content_type(&bytes).is_none() || bytes.len() > MAX_RESULT_BYTES { - bail!("ACE-Step output is not MP3/FLAC audio under the 32 MiB result limit"); + bail!("ACE-Step output is not MP3/FLAC audio under the 48 MiB result limit"); } // Over 1 MiB goes back as pieces: one chunk fetch caps out near 5 MiB. crate::pieces::publish_result_bytes(net, store, &bytes).await diff --git a/package.json b/package.json index b56aaf50..27f5ab00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "c0mpute-monorepo", - "version": "0.2.83", + "version": "0.2.84", "private": true, "workspaces": [ "apps/*", diff --git a/packages/shared/package.json b/packages/shared/package.json index c9829be9..ff998df7 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@c0mpute/shared", - "version": "0.2.83", + "version": "0.2.84", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/plugins/ad-generator-agent/module.toml b/plugins/ad-generator-agent/module.toml index 4a240e31..54b71660 100644 --- a/plugins/ad-generator-agent/module.toml +++ b/plugins/ad-generator-agent/module.toml @@ -21,7 +21,7 @@ [module] id = "ad-generator-agent" name = "Ad Generator Agent — every ad type from one URL" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "available" diff --git a/plugins/ads-manager/module.toml b/plugins/ads-manager/module.toml index 2a12b996..ad8c2a1c 100644 --- a/plugins/ads-manager/module.toml +++ b/plugins/ads-manager/module.toml @@ -38,7 +38,7 @@ [module] id = "ads-manager" name = "Ads Manager — shared ad operations layer" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "partial" diff --git a/plugins/coinpay/module.toml b/plugins/coinpay/module.toml index 37aef8c1..8ff70d14 100644 --- a/plugins/coinpay/module.toml +++ b/plugins/coinpay/module.toml @@ -7,7 +7,7 @@ [module] id = "coinpay" name = "CoinPay — DID, payments, escrow, reputation" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "available" diff --git a/plugins/crawl/module.toml b/plugins/crawl/module.toml index 3c76dc35..75114027 100644 --- a/plugins/crawl/module.toml +++ b/plugins/crawl/module.toml @@ -8,7 +8,7 @@ [module] id = "crawl" name = "Crawl — distributed web fetching" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "data" status = "available" diff --git a/plugins/ctv-ads/module.toml b/plugins/ctv-ads/module.toml index 5baf73ff..213584be 100644 --- a/plugins/ctv-ads/module.toml +++ b/plugins/ctv-ads/module.toml @@ -28,7 +28,7 @@ [module] id = "ctv-ads" name = "CTV Ads — VAST and VMAP from every gateway" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "partial" diff --git a/plugins/diffusion/module.toml b/plugins/diffusion/module.toml index 310acd78..d62bbdbf 100644 --- a/plugins/diffusion/module.toml +++ b/plugins/diffusion/module.toml @@ -11,7 +11,7 @@ [module] id = "diffusion" name = "Diffusion — image generation" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/embed/module.toml b/plugins/embed/module.toml index 294a0155..bd5fbeb4 100644 --- a/plugins/embed/module.toml +++ b/plugins/embed/module.toml @@ -19,7 +19,7 @@ [module] id = "embed" name = "Embeddings — vector generation" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/gameserver/module.toml b/plugins/gameserver/module.toml index 373d919f..d222e1da 100644 --- a/plugins/gameserver/module.toml +++ b/plugins/gameserver/module.toml @@ -55,7 +55,7 @@ [module] id = "gameserver" name = "Game server — Minecraft / Factorio / Valheim" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "infrastructure" status = "available" diff --git a/plugins/hosting/module.toml b/plugins/hosting/module.toml index 14a9b1cf..d477d89c 100644 --- a/plugins/hosting/module.toml +++ b/plugins/hosting/module.toml @@ -30,7 +30,7 @@ [module] id = "hosting" name = "Hosting — p2p static sites" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "data" status = "available" diff --git a/plugins/infernet/module.toml b/plugins/infernet/module.toml index d69ac61f..ed19829f 100644 --- a/plugins/infernet/module.toml +++ b/plugins/infernet/module.toml @@ -22,7 +22,7 @@ [module] id = "infernet" name = "Infernet Protocol — AI inference" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/live-stream/module.toml b/plugins/live-stream/module.toml index af73b5a1..52b019e8 100644 --- a/plugins/live-stream/module.toml +++ b/plugins/live-stream/module.toml @@ -34,7 +34,7 @@ [module] id = "live-stream" name = "Live Stream — p2p HLS live streaming" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "media" status = "available" diff --git a/plugins/music/module.toml b/plugins/music/module.toml index f357e85c..0de0e3ee 100644 --- a/plugins/music/module.toml +++ b/plugins/music/module.toml @@ -8,14 +8,14 @@ # CPU PyTorch, ACE-Step from a pinned commit, and the turbo DiT + text encoder # + VAE from Hugging Face pinned to a repo revision (~6 GB; the 5 Hz LM is # skipped). Jobs run DiT-only, bf16 on CPU (~7-9 GB RAM) or on a GPU torch -# can see. MP3 out where ffmpeg exists, else FLAC. Bids only while >=12 GiB +# can see. MP3 out where ffmpeg exists, else FLAC. Bids only while >=10 GiB # RAM is free. Buyers call the speech gateway's POST /v1/music. # Opt out: C0MPUTE_MUSIC_AUTO=0 or [music] auto_install = false. [module] id = "music" name = "Music — song generation (ACE-Step 1.5)" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" @@ -46,7 +46,7 @@ repo = "ACE-Step/Ace-Step1.5" default = true params = "2B DiT (turbo) + 0.6B text encoder" precision = "bf16 (CPU) / bf16-fp16 (GPU)" -resolution = "10-120 s songs (default 30 s), 48 kHz stereo" +resolution = "10-180 s songs (default 30 s), 48 kHz stereo" workloads = ["music.txt2music"] license = "MIT" backend = "acestep (PyTorch)" diff --git a/plugins/ocr/module.toml b/plugins/ocr/module.toml index db86d5a9..f51d9244 100644 --- a/plugins/ocr/module.toml +++ b/plugins/ocr/module.toml @@ -19,7 +19,7 @@ [module] id = "ocr" name = "OCR — document text extraction" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/podcast-ads/module.toml b/plugins/podcast-ads/module.toml index 21a80f99..5a093c7b 100644 --- a/plugins/podcast-ads/module.toml +++ b/plugins/podcast-ads/module.toml @@ -31,7 +31,7 @@ [module] id = "podcast-ads" name = "Podcast Ads — dynamic ad insertion" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "partial" diff --git a/plugins/podcasting/module.toml b/plugins/podcasting/module.toml index 0fa8b9f3..530f5243 100644 --- a/plugins/podcasting/module.toml +++ b/plugins/podcasting/module.toml @@ -24,7 +24,7 @@ [module] id = "podcasting" name = "Podcasting — p2p podcast publishing" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "media" status = "available" diff --git a/plugins/podcasts/module.toml b/plugins/podcasts/module.toml index 90cacf83..ce4ed5ce 100644 --- a/plugins/podcasts/module.toml +++ b/plugins/podcasts/module.toml @@ -24,7 +24,7 @@ [module] id = "podcasts" name = "Podcasts — p2p podcast listener" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "media" status = "available" diff --git a/plugins/render/module.toml b/plugins/render/module.toml index 65ba4027..e953f87f 100644 --- a/plugins/render/module.toml +++ b/plugins/render/module.toml @@ -33,7 +33,7 @@ [module] id = "render" name = "Render — Blender 3D rendering" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "media" status = "available" diff --git a/plugins/secure-chat/module.toml b/plugins/secure-chat/module.toml index 199fe819..efbae4f9 100644 --- a/plugins/secure-chat/module.toml +++ b/plugins/secure-chat/module.toml @@ -21,7 +21,7 @@ [module] id = "secure-chat" name = "Secure Chat — E2E encrypted p2p messaging" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "applications" status = "available" diff --git a/plugins/storage/module.toml b/plugins/storage/module.toml index 67fd8b16..3b0591cd 100644 --- a/plugins/storage/module.toml +++ b/plugins/storage/module.toml @@ -20,7 +20,7 @@ [module] id = "storage" name = "Storage — Reed-Solomon shard service" -version = "0.2.83" +version = "0.2.84" kind = "service" category = "data" status = "available" diff --git a/plugins/train/module.toml b/plugins/train/module.toml index 48b46d9d..e2a14754 100644 --- a/plugins/train/module.toml +++ b/plugins/train/module.toml @@ -41,7 +41,7 @@ [module] id = "train" name = "Fine-tune — LoRA training" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/transcode/module.toml b/plugins/transcode/module.toml index 27c3eddb..9ea03792 100644 --- a/plugins/transcode/module.toml +++ b/plugins/transcode/module.toml @@ -7,7 +7,7 @@ [module] id = "transcode" name = "FFmpeg Transcoding" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "media" status = "available" diff --git a/plugins/tts/module.toml b/plugins/tts/module.toml index 2daf453b..730d34a2 100644 --- a/plugins/tts/module.toml +++ b/plugins/tts/module.toml @@ -15,7 +15,7 @@ [module] id = "tts" name = "TTS — text-to-speech" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/video/module.toml b/plugins/video/module.toml index 32ed25e8..8b194296 100644 --- a/plugins/video/module.toml +++ b/plugins/video/module.toml @@ -50,7 +50,7 @@ [module] id = "video" name = "Video — generation (Wan 2.2, LTX-2.3 with audio)" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/webhook/module.toml b/plugins/webhook/module.toml index 74bbe996..b62b5fee 100644 --- a/plugins/webhook/module.toml +++ b/plugins/webhook/module.toml @@ -7,7 +7,7 @@ [module] id = "webhook" name = "Webhooks — paid, end-to-end encrypted delivery" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "infrastructure" status = "available" diff --git a/plugins/whisper/module.toml b/plugins/whisper/module.toml index 945583c4..192c7a8f 100644 --- a/plugins/whisper/module.toml +++ b/plugins/whisper/module.toml @@ -7,7 +7,7 @@ [module] id = "whisper" name = "Whisper — speech-to-text" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "ai" status = "available" diff --git a/plugins/workflow-step/module.toml b/plugins/workflow-step/module.toml index 70c0cbfa..07f541a9 100644 --- a/plugins/workflow-step/module.toml +++ b/plugins/workflow-step/module.toml @@ -14,7 +14,7 @@ [module] id = "workflow-step" name = "Workflow step — webhook workflow steps (meshhook)" -version = "0.2.83" +version = "0.2.84" kind = "workload" category = "infrastructure" status = "available" From cf8bc50e48c39ca92991cd38f8bc180611386410 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Mon, 9 Nov 2026 05:46:29 +0000 Subject: [PATCH 2/2] fix(music): lift ACE-Step's own 600 s generation timeout ACE-Step aborts generation after ACESTEP_GENERATION_TIMEOUT (600 s by default). On vienna's 8-thread job budget a 2-minute song passed that and died ('Music generation timed out after 600 seconds'). Set it from our JOB_TIMEOUT minus a 3-minute margin for load and decode. Co-Authored-By: Claude Opus 5.5 --- node/crates/c0mpute-core/src/music.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/node/crates/c0mpute-core/src/music.rs b/node/crates/c0mpute-core/src/music.rs index 5f2f884d..135a62bb 100644 --- a/node/crates/c0mpute-core/src/music.rs +++ b/node/crates/c0mpute-core/src/music.rs @@ -510,6 +510,13 @@ pub async fn generate(spec: &Txt2MusicSpec, job_dir: &Path) -> Result { .current_dir(job_dir) .env("HF_HOME", music_root().join("hf-home")) .env("ACESTEP_TMPDIR", job_dir) + // ACE-Step aborts its own diffusion loop after 600 s, which an 8-thread + // CPU budget passes on a 2-minute song (vienna, 2026-11-09). Our job + // timeout is the real limit; leave a margin for model load and decode. + .env( + "ACESTEP_GENERATION_TIMEOUT", + JOB_TIMEOUT.saturating_sub(Duration::from_secs(3 * 60)).as_secs().to_string(), + ) .env("TMPDIR", job_dir) .stdin(std::process::Stdio::null()) .stdout(std::process::Stdio::piped())