AQ_OpenAI_acstep15
The same song-metadata schema, but via OpenAI's Responses API (GPT-5 class)
- image
- response_json
- tags
- lyrics
- seed
- bpm
- duration
- timesignature
- language
- keyscale
- coverImage
- title
- tagline
- headline
- yt_description
- yt_tags
- yt_title
- instruction
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.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| openai_api_key | STRING | — | |
| model | COMBO | gpt-5-nano | 9 options: gpt-5.2, gpt-5-nano, gpt-5-mini, gpt-5, gpt-4.1-mini, gpt-4.1, +3 |
| custom_model | STRING | — | |
| prompt | STRING | — | |
| system_message | STRING | You are a helpful assistant. | — |
| temperature | FLOAT | 1.00-1–2 | — |
| top_p | FLOAT | 0.95-1–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| verbosity | COMBO | medium | 4 options: none, low, medium, high |
| reasoning_effort | COMBO | medium | 5 options: none, minimal, low, medium, high |
| imageopt | IMAGE | — |
Outputs (17)
| Name | Type | Description |
|---|---|---|
| response_json | STRING | — |
| tags | STRING | — |
| lyrics | STRING | — |
| seed | INT | — |
| bpm | INT | — |
| duration | FLOAT | — |
| timesignature | COMBO | — |
| language | COMBO | — |
| keyscale | COMBO | — |
| coverImage | STRING | — |
| title | STRING | — |
| tagline | STRING | — |
| headline | STRING | — |
| yt_description | STRING | — |
| yt_tags | STRING | — |
| yt_title | STRING | — |
| instruction | STRING | — |