Nodes/AQnodes for ComfyUI/AQ_OpenAI_acstep15
ComfyUI Node

AQ_OpenAI_acstep15

The same song-metadata schema, but via OpenAI's Responses API (GPT-5 class)

By 2frames·Created about a year ago·Updated 6 months ago· 1
AQ_OpenAI_acstep15
  • image
  • response_json
  • tags
  • lyrics
  • seed
  • bpm
  • duration
  • timesignature
  • language
  • keyscale
  • coverImage
  • title
  • tagline
  • headline
  • yt_description
  • yt_tags
  • yt_title
  • instruction
openai_api_key
modelgpt-5-nano
custom_model
prompt
system_messageYou are a helpful assistant.
temperature1.00
top_p0.95
seed0
verbositymedium
reasoning_effortmedium

AQ_Gemini_acstep15's OpenAI twin: the same fixed music-metadata schema - tags, lyrics, bpm, duration, keyscale, cover art, YouTube text - but it calls OpenAI's Responses API and defaults to gpt-5-nano. If you're already paying for OpenAI, or you want the reasoning-model class doing the song metadata, this is the one.

What it produces

Identical role in the ACE-Step pipeline: a song idea in, a structured JSON out, ready to feed ACE-Step's audio text encoder (for the music), AQ_CoverPrompt (for the cover), and an upload node (for YouTube). The field descriptions here are the most elaborate in the whole pack - the tags field alone is a mini-guide to writing ACE-Step style prompts (genre, instruments, vocal style, mood, era, tempo), and the lyrics schema documents ACE-Step's structure tags ([verse], [chorus], [inst]) and language codes. The node is literally teaching the model how to talk to the next node.

How it works

It posts to OpenAI's /v1/responses endpoint with a strict JSON-schema response_format - the schema is the contract the API must obey, so you get valid JSON back (or an error, not garbage). The system message goes in the developer role. Two controls are GPT-5-era specific: verbosity (none/low/medium/high) maps to the text's verbosity, and reasoning_effort (none/minimal/low/medium/high) maps to the reasoning effort. Set both to none and gpt-5-nano gets snappier and cheaper; crank reasoning when you want better metadata. Negative temperature/top_p are omitted from the request entirely, and the seed you pass in is echoed back out so you can reproduce a song's metadata exactly.

Inputs

openai_api_key, model (gpt-5.2, gpt-5-nano default, gpt-5-mini, gpt-5, gpt-4.1-mini, gpt-4.1, gpt-4o-mini, gpt-4o, or custom), custom_model, prompt, system_message, temperature, top_p, seed, verbosity, reasoning_effort, and an optional image (sent as a base64 input image).

Outputs

The full 17-slot acestep set: response_json, tags, lyrics, seed, bpm, duration, timesignature, language, keyscale, coverImage, title, tagline, headline, yt_description, yt_tags, yt_title, instruction.

Install

Part of AQnodes:

cd ComfyUI/custom_nodes
git clone https://github.com/2frames/ComfyUI-AQnodes
cd ComfyUI-AQnodes
pip install -r requirements.txt

or search "AQnodes" in ComfyUI Manager and restart.

Gotchas

No key → it silently returns default values with empty strings, so check the console. And this node is Responses API only - local or OpenAI-compatible servers won't work with it; that's what AQ_openai_compatible (same pack) is for. The schema is strict (additionalProperties: false), so a model that refuses to follow it just errors out and the node re-raises - if you're getting failures, check the console for the API error body.

CategoryAquasite/LLM

Inputs (11)

NameTypeDefaultDescription
openai_api_keySTRING
modelCOMBOgpt-5-nano9 options: gpt-5.2, gpt-5-nano, gpt-5-mini, gpt-5, gpt-4.1-mini, gpt-4.1, +3
custom_modelSTRING
promptSTRING
system_messageSTRINGYou are a helpful assistant.
temperatureFLOAT1.00-1–2
top_pFLOAT0.95-1–1
seedINT00–18446744073709550000
verbosityCOMBOmedium4 options: none, low, medium, high
reasoning_effortCOMBOmedium5 options: none, minimal, low, medium, high
imageoptIMAGE

Outputs (17)

NameTypeDescription
response_jsonSTRING
tagsSTRING
lyricsSTRING
seedINT
bpmINT
durationFLOAT
timesignatureCOMBO
languageCOMBO
keyscaleCOMBO
coverImageSTRING
titleSTRING
taglineSTRING
headlineSTRING
yt_descriptionSTRING
yt_tagsSTRING
yt_titleSTRING
instructionSTRING