Fish Audio Retrieve Task (Ace Data Cloud)
The free node that saves you from paying twice
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
Why a lookup node matters
Every paid node in this pack is asynchronous. You press Queue, the node returns pending with a task_id almost instantly, and the actual audio shows up on the server a few seconds later. So the question "did my generation finish?" has to be answered somewhere, and this is the node that answers it.
It matters because of one detail in how the pack talks to the API: read-only requests are retried, paid submissions are not. Task lookups are read-only. A lookup can't open a new job or charge you again, so the safe way to handle a slow or ambiguous run is always to go ask about the task you already have - never to re-run the generation node and hope. If a connection dropped mid-submit and you have no idea whether the job landed, this node is how you find out.
How it works
You give it a task_id and it calls the service's task endpoint with action: retrieve, then normalises whatever comes back into the same six-string output shape the generation and retrieval nodes use. No generation happens; this is a GET-shaped query in every sense that matters.
wait_seconds is the interesting part. It takes an integer from 0 to 240, and instead of being ignored it drives an internal poll loop: the node asks, and if the result is still pending it sleeps (at most five seconds at a stretch) and asks again until the task leaves pending or the deadline passes. Set it to 0 and you get a single snapshot - one query, answer immediately, perfect for "what happened to last night's run?" Set it to 30 or 60 and you can finish a normal speech job inside one execution of the graph, which is what makes a single-pass workflow possible.
Requests to the task endpoint use the same guardrails as everything else: a 10-second connect timeout, 60-second read timeout, no redirects, and up to three attempts on a network hiccup. Everything is HTTPS with your bearer token from ACEDATACLOUD_API_KEY.
Inputs and outputs
Three inputs, and only one of them is required:
task_id- the ID from an earlier submission. If it's blank, the node refuses with a clear "A task ID or supported trace ID is required." rather than silently submitting something.wait_seconds- 0–240 as above. Default 0.parameters_json- always present on pack nodes,{}unless you need an API field the widgets don't expose.
The outputs are status, task_id, media_urls_json, first_media_url, result_json and trace_id. Read status first, because it tells you which of two worlds you're in:
pending- still working.media_urls_jsonis[]andfirst_media_urlis empty. Try again with a biggerwait_seconds.succeeded- done, andfirst_media_urlnow holds a playable CDN link. Wire it into Fish Audio Load Audio to get a realAUDIOobject.partial- some constituents finished and some failed. You'll see this mostly from batch lookups rather than single ones.failed- the node raises, with the message "Task failed. Use its task or trace ID to inspect the service request." The graph will show statusfailedand the job details live in the service's request history.
trace_id is worth keeping for the same reason: it's the other handle on a specific request when something needs explaining.
The pattern to build
The workflow that works: one Generate Audio node, then this node downstream, wait_seconds around 60 for a sentence or two, first_media_url into Load Audio, audio into SaveAudio or a talking-head node. If it comes back pending anyway, press Queue again - you're only re-asking about a task, which costs nothing. Query the same task ID until status reads succeeded; the README says it plainly and it's the right habit.
The pattern that doesn't work: queueing the generation node over and over. Each of those submissions is a fresh paid job.
Install
Manager → search Fish Audio → publisher acedatacloud, package Fish Audio by Ace Data Cloud (registry ID fish-audio) → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/FishAudioComfyUI
cd FishAudioComfyUI && python -m pip install -r requirements.txt
Then make sure ACEDATACLOUD_API_KEY (or ACEDATACLOUD_API_TOKEN) is exported in the environment ComfyUI was started from and restart the server - the pack reads it from the process environment, not from the workflow, so a key added to a workflow JSON does nothing. Without it you get "Set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart."
Honest caveats
- A long
wait_secondsblocks the queue. 240 seconds is a long time to hold a slot for one line of speech, and there's no cancel button inside a running node. For batches, submit first, collect IDs, then poll in a separate pass. - Not every ID is yours forever. Task history and retention are the service's business, not the pack's. If a lookup says there's no task ID and no completed result, that's "No task ID or completed result was returned." - try the
trace_id, and check the request history before spending credits on a re-run. - This node needs the same key as the paid ones. It's free to call, but it isn't anonymous.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| task_id | STRING | — | |
| wait_seconds | INT | 00–240 | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| media_urls_json | STRING | — |
| first_media_url | STRING | — |
| result_json | STRING | — |
| trace_id | STRING | — |