Nodes/AceChatComfyUI/Ace Chat Completion (Ace Data Cloud)
ComfyUI Node

Ace Chat Completion (Ace Data Cloud)

An LLM in Your Graph, Billed by the Token

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Ace Chat Completion (Ace Data Cloud)
    • assistant_text
    • tool_calls_json
    • usage_json
    • response_id
    • response_model
    ◄model_idgpt-4.1-mini►
    ◄promptExplain this workflow in one sentence.►
    ◄system_prompt►
    ◄messages_json►
    ◄tools_json►
    ◄temperature-1.00►
    ◄max_tokens1024►

    Nothing in this node runs on your machine. Ace Chat Completion POSTs your prompt to Ace Data Cloud's OpenAI-compatible /v1/chat/completions endpoint and hands the assistant's reply back as a plain string. No weights, no VRAM, no download - just an HTTP client with your API key in it and a meter running.

    That puts it in the "LLM as a tool in the graph" camp, not the LLM inside your checkpoint (llm-in-comfyui.md § intro). The usual job is prompt enhancement: you type a rough idea, the model rewrites it into something structured, and that text feeds your encoder. The rest is anything text-shaped - captions, dialogue for a video clip.

    Why an API node and not a local one

    The KB's read on local-vs-API is that local wins for enhancement and captioning - an abliterated 8B is uncensored, offline, and free per call (llm-in-comfyui.md § 3). This pack is the other branch: frontier-chat quality, no second model in VRAM, in exchange for your prompt leaving the machine and every call costing Credits.

    The design choice worth noticing: model_id is free text, not a dropdown, so a stale package enum can't block a newly available ID. Most LLM-in-ComfyUI nodes pin a provider list and go stale quietly.

    How it works

    client.py reads ACEDATACLOUD_API_KEY (or ACEDATACLOUD_API_TOKEN) from the process environment and sends a bearer-authenticated JSON POST. The payload always carries model, messages, max_tokens, and "stream": false - there's no streaming path. temperature is added only when it isn't -1; tools_json adds a tools array plus tool_choice: "auto". One request, one reply, read from choices[0].message.

    The inputs you'll actually set

    • model_id - the exact ID, e.g. the default gpt-4.1-mini. Take it from List Models rather than guessing.
    • prompt - your message; system_prompt is prepended as a system role message when non-empty.
    • messages_json - a full message array that takes precedence over prompt and system_prompt when non-empty. It must be a nonempty JSON array of objects with a supported role (system, developer, user, assistant, tool) and a content field, or the node raises instead of sending.
    • temperature - -1 (the default) omits the parameter entirely; the model's own default usually beats your dial.
    • max_tokens - default 1024, and it's always sent, so a reply cut off mid-sentence is this, not a model quirk. Ceiling is 32768.
    • tools_json - an OpenAI-compatible function-tool array. The node returns the calls and does not execute them, so it only matters if something downstream reads tool_calls_json.

    Five outputs, all STRING: assistant_text (wire it into a text encoder), tool_calls_json, usage_json (tokens, when the provider returns them), response_id, response_model. It also prints the reply on its own panel, so you can run it standalone and read the answer without wiring anything.

    Install

    ComfyUI-Manager first: Custom Nodes → search "Ace Chat", confirm publisher acedatacloud and package Ace Chat by Ace Data Cloud, install, restart. The pack's own tests/e2e-results.json records registry_published: false, so if the search comes up empty, do it by hand:

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

    Its requirements file is one line - requests>=2.31,<3, which ComfyUI already ships - and there are no model files to download. Then set the key in the environment of the actual ComfyUI process and restart:

    export ACEDATACLOUD_API_KEY='paste-your-key-here'
    python main.py
    

    Exporting it in some other terminal does nothing - the number one reason this node "doesn't work" on first try.

    Where people get burned

    It runs on every Queue Prompt. The class is an OUTPUT_NODE with no IS_CHANGED, and output nodes always execute - they're what ComfyUI's engine works backward from (comfyui-node-plumbing.md). So it isn't one call per workflow edit, it's one paid call per queue, including the queue where you only nudged a seed. Settle the model ID first.

    Errors are specific. 401/403 is a bad key or missing model access; 404 is a bad model ID (the list includes IDs from the vendor's other API surfaces, so a real one isn't automatically chat-compatible); 429 is rate limiting. Failed calls still show in the vendor's logs, so check request history before hammering it.

    Chat never retries itself. List Models retries connection failures three times; the completion call doesn't retry, and the read timeout is 120 seconds. A timeout is therefore ambiguous - the request may have completed and been billed.

    Your prompt, and your key, leave the machine. Both go to api.acedata.cloud per the pack's privacy note, which also says nothing is stored in workflows or logs. One thing worth saying without drama: an API node is arbitrary Python holding a credential and calling the network by design - the shape of node already weaponized once here (comfyui-ecosystem.md § The Security Incident). This one is small and readable. Read it before the first run; that habit is the actual defense.

    CategoryAce Data Cloud/Chat

    Inputs (7)

    NameTypeDefaultDescription
    model_idSTRINGgpt-4.1-mini—
    promptSTRINGExplain this workflow in one sentence.—
    system_promptSTRING—
    messages_jsonSTRING—
    tools_jsonSTRING—
    temperatureFLOAT-1.00-1–2—
    max_tokensINT10241–32768—

    Outputs (5)

    NameTypeDescription
    assistant_textSTRING—
    tool_calls_jsonSTRING—
    usage_jsonSTRING—
    response_idSTRING—
    response_modelSTRING—