Nodes/FishAudioComfyUI/Fish Audio Retrieve Tasks (Ace Data Cloud)
ComfyUI Node

Fish Audio Retrieve Tasks (Ace Data Cloud)

Check twenty jobs at once without paying for one of them

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Fish Audio Retrieve Tasks (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄ids_json►

    The batch version of the lookup

    Single-task retrieval is fine for one line of narration. It's the wrong tool the moment you're doing this at volume - you submit a dozen TTS jobs in one queue run, and you do not want twelve retrieval nodes wired into twelve Load Audio nodes, each holding the queue open for up to four minutes.

    This node takes a list of task IDs and returns their combined state in one call. Like the single-task lookup it's read-only, so polling with it can't open a new paid job. If you batched submissions and then lost the thread of which ones actually landed, this is where you sort it out.

    How it works

    The pack's copy of Fish Audio's published contract fixes the action for this tool to retrieve_batch, so there's nothing to select - the node always asks the batch question. It sends your IDs to the task endpoint with action: retrieve_batch, then normalises the list response into one status line and one merged URL list.

    The merge is the useful part. If several tasks are done, media_urls_json contains the URLs from all of them, in the order the service returned them, with duplicates collapsed. status is computed across the whole set: succeeded when everything finished, pending when anything is still running, and partial when some succeeded and some failed. A failed task inside a batch raises with the same message single retrieval would give you - "Task failed. Use its task or trace ID to inspect the service request." - so a mixed batch surfaces the failure rather than quietly dropping it.

    Retries here match the read-only rules elsewhere in the pack: up to three attempts with a short backoff, a 10-second connect timeout, a 60-second read timeout, no redirects followed. So a flaky poll retries itself; a genuinely dead endpoint surfaces an error.

    Inputs and outputs

    Only two inputs, and the required one is the list:

    • ids_json - a JSON array of strings, e.g. ["tsk_abc123", "tsk_def456"]. It's validated before anything is sent: malformed JSON gives "ids_json must contain a JSON array of task IDs.", and an empty array gives "ids_json must be a nonempty JSON array of task IDs." There's no partial credit - one empty list is a hard stop, not a request for everything.
    • parameters_json - the pack-wide escape hatch, {} by default. A non-empty widget always overrides the matching key if you put the same field in both places.

    Outputs are the familiar six: status, task_id, media_urls_json, first_media_url, result_json and trace_id. For a batch, treat task_id as bookkeeping rather than a single job's receipt - the IDs you care about are the ones you supplied, and result_json holds the per-item detail the node saw. first_media_url is the first URL out of the merged list, handy for a quick audition but not a reliable per-item mapping; if you need to know which clip is which, read result_json and pair items up by ID.

    Where it fits

    The workflow it enables is the sane way to do speech at volume: queue a run of generation nodes (or call the API, or run them one after another), collect the task_id values the pack prints in each node's output, then paste them into one ids_json on this node in a later run. Raise nothing, wait nothing, and don't hold the queue open.

    Because these are lookups, you can also use this node as your "did I already pay for this?" check. That's the practical difference between this pack and a purely local TTS pipeline: on a local model, the cost of a mistake is time, and here it's credits. Knowing which jobs are already done is what stops you from re-running them.

    One limitation worth stating plainly: there's no wait_seconds on this node, unlike the single-task version. It's a snapshot. If it comes back pending, press Queue again in a minute - you're only re-asking, and that's free.

    Install

    ComfyUI Manager → search Fish Audio → confirm publisher acedatacloud and package Fish Audio by Ace Data Cloud (registry ID fish-audio) → install → restart. Or from a shell:

    cd ComfyUI/custom_nodes
    git clone https://github.com/AceDataCloud/FishAudioComfyUI
    cd FishAudioComfyUI && python -m pip install -r requirements.txt
    

    The pack installs requests and jsonschema and nothing else - no model files, no GPU time. Set ACEDATACLOUD_API_KEY (or ACEDATACLOUD_API_TOKEN) in the environment ComfyUI is started from and restart the process. Adding it to a workflow field doesn't work; the pack reads the process environment only, and if it's missing you get "Set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart."

    Gotchas

    • IDs are opaque strings. Don't trim, don't case-fix, don't guess. A task ID you mistyped returns as a missing item, not as an error naming the bad entry.
    • Watch what a partial batch does downstream. If you wire the merged media_urls_json into something that assumes a fixed count, a partial result will silently change the arithmetic on you. Check status before consuming the list.
    • IDs from a previous session may be gone. Retention is the service's call. If a batch that worked yesterday returns nothing useful today, that's the API, not the node.
    CategoryAce Data Cloud/Fish Audio

    Inputs (2)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    ids_jsonSTRING—

    Outputs (6)

    NameTypeDescription
    statusSTRING—
    task_idSTRING—
    media_urls_jsonSTRING—
    first_media_urlSTRING—
    result_jsonSTRING—
    trace_idSTRING—