展开本页目录
开始前准备什么
- 准备唯一 row_id、prompt、model 和状态列,先用一行非敏感素材测试。
- 在 n8n 凭证中保存自己的 Key,节点导出与执行日志中不要放入 Authorization 明文。
- 确认当前型号支持 /v1/images/generations、输出格式和参数;本页没有代替你的通道完成付费验证。
- 准备可写的对象存储或文件节点,提前核对路径、权限与重名处理。
- 固定行 ID
- 单行请求
- 转二进制
- 保存原图
- 回写与验收
仅为任务数据,保留唯一 ID 和不同提示词;不是可直接导入的完整 n8n 工作流。
三条人工构造的本地测试数据:图片、HTTP 错误、200 但无图片;其中 1×1 PNG 不是 API 实测。
Node.js 只读取 JSON,检查行 ID、HTTP 状态与 PNG Base64;不访问网络、不保存图片、不发起重试。
这条流程要有六个明确节点
| 节点 | 作用 | 输出检查 |
|---|---|---|
| 任务来源 / Edit Fields | 保留 row_id、prompt、model、待提交状态 | ID 非空且唯一 |
| Loop Over Items | 先串行运行,每次一条任务 | 当前项与原行一致 |
| HTTP Request | POST 已确认的图片生成地址,返回 JSON 与状态码 | 记录状态、请求标识和原行关联 |
| IF / 响应规范化 | 区分错误、Base64 图片与无图响应 | 错误不能进入图片保存节点 |
| Convert to File → 保存节点 | 把 Base64 变为 binary,再保存原文件 | 存储成功,文件可打开 |
| 回写与人工检查 | 按 row_id 更新结果地址与验收状态 | 图片没有错配到另一行 |
- 节点
- 任务来源 / Edit Fields
- 作用
- 保留 row_id、prompt、model、待提交状态
- 输出检查
- ID 非空且唯一
- 节点
- Loop Over Items
- 作用
- 先串行运行,每次一条任务
- 输出检查
- 当前项与原行一致
- 节点
- HTTP Request
- 作用
- POST 已确认的图片生成地址,返回 JSON 与状态码
- 输出检查
- 记录状态、请求标识和原行关联
- 节点
- IF / 响应规范化
- 作用
- 区分错误、Base64 图片与无图响应
- 输出检查
- 错误不能进入图片保存节点
- 节点
- Convert to File → 保存节点
- 作用
- 把 Base64 变为 binary,再保存原文件
- 输出检查
- 存储成功,文件可打开
- 节点
- 回写与人工检查
- 作用
- 按 row_id 更新结果地址与验收状态
- 输出检查
- 图片没有错配到另一行
HTTP Request:先提交一张图片
请求地址为 https://api.apizt.com/v1/images/generations。HTTP Request 选择 POST、JSON Body,并用凭证添加 Bearer 认证。将静态 model 与 prompt 换成当前任务项的字段;HTTP Response Format 选择 JSON,并开启 Include Response Headers and Status。这里是兼容请求示例,型号参数和供应应在自己的分组核对。
让 row_id 留在旁路,与返回数据按 item linkage 或显式 ID 合并。不要用另一个节点的第一个 item 给全部响应补 ID;先用下载的两行不同提示词验证映射。
请求体示例:字段用当前项的 n8n 表达式填写
{
"model": "gpt-image-2",
"prompt": "为蓝色陶瓷杯制作干净的无字商品展示图,单个杯子,浅色背景。",
"n": 1,
"size": "1024x1024",
"quality": "low"
}JSON 成功后,还要把图片落成真实文件
- 确认 HTTP 为 2xx,body.data[0].b64_json 是非空字符串;不要把完整 JSON 文本直接写成 .png。
- Convert to File 选择 Move Base64 String to File,输入字段填写实际响应路径,例如 body.data.0.b64_json;文件名用已核对的 row_id,MIME Type 用确认的真实格式。
- 若通道返回 URL,单独检查地址有效性和允许的存储域,再以 HTTP Request 的 File 响应模式下载;不能把 URL 字符串当成 Base64。
- 保存后重新解码检查实际宽高,HTTP 200、文件扩展名和请求 size 都不能证明图片满足交付要求。
用状态列阻止整批重复收费
关闭生成节点的自动 Retry On Fail。网络超时后的新 POST 可能创建第二次调用;任务重跑时先筛选 ready,保存与回写阶段失败优先复用已有结果。HTTP 错误是否扣费应查自己的账单,不能从状态码推断。
| 状态 | 进入条件 | 下一步 |
|---|---|---|
| ready | 输入、存储路径与预算已核对 | 显式允许提交一张 |
| http_succeeded | 收到图片生成响应 | 解码和保存,不直接标完成 |
| saved | 原文件已写入且可打开 | 按 row_id 人工验收 |
| accepted / rejected | 内容和文件规格已检查 | 记录原因,只有必要时新建修订任务 |
| unknown | 超时或断连,无法确认提交结果 | 查调用记录;不要自动重跑 POST |
| failed | 收到明确错误 | 修正对应字段,再由操作者决定重提 |
- 状态
- ready
- 进入条件
- 输入、存储路径与预算已核对
- 下一步
- 显式允许提交一张
- 状态
- http_succeeded
- 进入条件
- 收到图片生成响应
- 下一步
- 解码和保存,不直接标完成
- 状态
- saved
- 进入条件
- 原文件已写入且可打开
- 下一步
- 按 row_id 人工验收
- 状态
- accepted / rejected
- 进入条件
- 内容和文件规格已检查
- 下一步
- 记录原因,只有必要时新建修订任务
- 状态
- unknown
- 进入条件
- 超时或断连,无法确认提交结果
- 下一步
- 查调用记录;不要自动重跑 POST
- 状态
- failed
- 进入条件
- 收到明确错误
- 下一步
- 修正对应字段,再由操作者决定重提
不用 Key,先验证三条分支
检查器应分别输出 image_ready、failed、needs_review。image_ready 只表示通过有限的结构和 PNG 签名检查,还没有完整解码、存储或内容验收。随后在 n8n 用同样三条人工数据跑 IF 与回写节点,确认没有费用调用、错误行不会覆盖成功行。
只读取本地人工测试数据
node normalize-image-responses.mjs n8n-image-response-fixtures.json怎样确认已经完成
- 至少两条不同 row_id 的响应与原提示词一一对应。
- Base64 变为实际二进制文件,原图可打开且宽高已核对。
- HTTP 错误与 200 无图片响应进入不同分支。
- 重复执行保存阶段不会再次调用生成接口。
- 凭证、原始私密图片与 Key 没有进入公开模板。
常见问题
n8n 的 OpenAI 节点可以直接用吗?
取决于节点版本是否暴露当前型号需要的图片字段及自定义地址。先查节点能力;字段不齐时用 HTTP Request,并按实际响应结构接保存节点。
只生成提示词的工作流能直接改为生图吗?
需要补实际请求、二进制转换、存储和状态回写。已有文案工作流可作上游,但其执行成功不代表图片已生成。