一句话总结
- 运行
openart model list,然后用以下命令报价openart model cost --model <id> --mode text2image. - 预览单个请求
openart generate image "<prompt>" --model <id> --dry-run. - 使用 bash 循环来调用
openart generate image "$prompt" --model <id> --json --async用于每个 prompt。 - 解析每个 JSON 响应,保存其作业 ID,之后再用以下方式收集结果
openart creation wait <job-id>或用以下命令检查一次openart creation get <job-id>. - 如果需要可重复的批量任务、CI 流水线或基于 shell 的智能体,请选择此工作流——同样的模式也可扩展到
openart generate video用于批量视频生成,而不仅仅是图片。网页界面适合探索性工作,而 OpenArt MCP 适合对话式生成。
在编写任何脚本之前
本教程假设二进制文件已安装并完成认证。如果尚未完成,可用一条命令安装它,并通过浏览器登录。
curl -fsSL https://raw.githubusercontent.com/OpenArt-AI/cli/main/install.sh | sh
openart login
在排队一个会消耗真实积分的批量任务前,请先确认账户、套餐和积分余额。
openart account
有关 Windows 安装步骤、锁定特定版本或完整命令参考,请查看 CLI GitHub 仓库 而不是在这里重复设置步骤。
花钱之前先检查模型适配度和成本
在构建批处理循环之前,先选择一个支持文生图的模型。随着 OpenArt 添加新选项,模型的可用性和功能可能会变化,因此不要依赖凭记忆的名称或隐式默认值。
openart model list
查看可用模型,确认支持文生图,并复制你想使用的模型 ID。将该 ID 存入变量,以减少后续命令中的编辑错误。
如果你需要在将参数(例如宽度、高度或风格字段)添加到批处理之前,确认某个模型究竟接受哪些参数,请查看它的表单。
openart model form "$MODEL_ID" text2image
MODEL_ID="<model-id>"
提交任何任务前,请先查看该模型的单张图片价格。
openart model cost \
--model "$MODEL_ID" \
--mode text2image
这份 model cost 命令只返回报价。它不会生成图像或消耗积分。不带任何标志运行它,可按价格从低到高列出每个模型;也可如上所示将范围限定到某个模型和模式。用报价中的单张图像成本乘以计划生成的图像数量,即可估算批处理成本。如果你的 CSV 为不同行分配了不同模型,请为每个模型请求报价并分别计算各组成本。
使用 --dry-run 预览确切的请求
使用与批处理计划相同的模型和标志,运行一个有代表性的 prompt。
MODEL_ID="your-model-id"
openart generate image \
"A red bicycle leaning against a brick wall at sunset" \
--model "$MODEL_ID" \
--json \
--async \
--dry-run
该命令会打印 OpenArt 将要发送的请求,包括 prompt、模型和生成参数。试运行期间 OpenArt 不会提交作业或消耗积分。
成本报价会估算每张图片的价格。dry run 则会检查请求本身。将打算用于批处理的所有参数添加到此命令中,检查输出,并在读取真实的 prompt 文件之前更正意外的默认值或引号问题。
整理 prompt 列表格式
使用 prompts.txt 当每个作业共享相同的模型和参数时。每行存储一个完整的 prompt。
A watercolor cabin beside a frozen lake
A studio photo of a red ceramic teapot
An isometric library with warm lighting
让每个 prompt 保持在一行内。稍后的 read -r 循环会保留反斜杠,而引号处理 "$prompt" 会将空格和引号作为 prompt 的一部分传入。除非你有意提交空 prompt,否则请跳过空行。
使用 prompts.csv 当不同行需要不同的模型或尺寸时。
prompt,model,width,height
"A cabin beside a lake","model-id-a",1024,1024
"A teapot, red ceramic","model-id-b",768,1024
"A sign reading ""OPEN""","model-id-a",1024,768
包含逗号的 CSV 字段必须使用双引号。要在带引号的字段内表示引号,请用两个引号表示。基于以下方式的 shell 循环 IFS=, 无法正确解析这些情况,因此 CSV 变体应使用支持 CSV 的解析器,例如 Python 的 csv 模块。请保持表头名称稳定,因为后面的脚本会直接读取它们。
用 while-read 循环提交批量任务
将以下脚本保存为 submit.sh。它逐行读取每个 prompt,提交每次生成,并将每个返回的任务 ID 追加到 job-ids.txt.
#!/usr/bin/env bash
set -uo pipefail
MODEL_ID="replace-with-model-id"
PROMPT_FILE="${1:-prompts.txt}"
JOB_FILE="${2:-job-ids.txt}"
printf '' > "$JOB_FILE"
while IFS= read -r prompt || [[ -n "$prompt" ]]; do
[[ -z "$prompt" ]] && continue
if ! response=$(openart generate image "$prompt" \
--model "$MODEL_ID" \
--json \
--async); then
printf 'Submission failed for prompt %s\n' "$prompt" >&2
continue
fi
if ! job_id=$(jq -er '.id' <<&2
continue
fi
printf '%s\n' "$job_id" >> "$JOB_FILE"
printf 'Submitted %s\n' "$job_id" >&2
done &2
替换 replace-with-model-id,让脚本可执行,如有需要可传入不同的 prompt 文件。
chmod +x submit.sh
./submit.sh prompts.txt
该脚本需要 jq 以从每个 JSON 响应中提取 ID。如果你安装的 CLI 在不同字段下返回该标识符,请检查一个响应并相应调整 .id 表达式。
这份 --json 标志可让标准输出保持机器可读。OpenArt 会将进度和分页消息发送到标准错误,因此命令替换只会捕获以下内容的 JSON jq 需要。如果没有 --json,人类可读的输出可能会进入 response 变量,导致 ID 解析失败。
这份 --async 标志会让每条命令在 OpenArt 接受任务后立即返回。若不使用它,循环会等一张图片完成后才提交下一条,甚至可能为每个 prompt 等到默认的五分钟超时。异步提交则让循环先把整批任务排入队列。
每次成功提交都会往其中添加一个标识符 job-ids.txt.
job_abc123
job_def456
job_ghi789
收集循环可以直接使用该文件。失败的提交会在标准错误上产生错误信息,且不会往文件中添加无效条目。
运行 CSV 变体
CSV 循环会将每一行拆分成多个字段,并把该行的模型传给生成命令。
#!/usr/bin/env bash
> job-ids.txt
tail -n +2 prompts.csv |
while IFS=, read -r prompt model
do
model=${model%$'\r'}
[ -z "$prompt" ] && continue
response=$(
openart generate image "$prompt" \
--model "$model" \
--json \
--async
) || continue
printf '%s\n' "$response" |
jq -r '.id' >> job-ids.txt
done
与纯文本循环相比, IFS=, read -r prompt model 拆分每一行,然后 --model "$model" 会替换固定的模型 ID。该 tail 命令会跳过表头行,例如 prompt,model.
Bash 的字段拆分并未实现完整的 CSV 引号规则。如果 prompt 中包含逗号或转义引号,请使用 Python 的 csv 模块或其他支持 CSV 的工具,然后再将字段传入 OpenArt 命令。
全部提交后再收集结果
使用 openart creation wait 当脚本必须等到每个已提交的任务都进入终态后才结束时使用。循环会将每条已完成的创作记录保存为 JSON,并记录任何返回错误的任务。
mkdir -p results
: > failed_job_ids.txt
while IFS= read -r job_id; do
[ -z "$job_id" ] && continue
if openart creation wait "$job_id" --json \
> "results/${job_id}.json"; then
printf 'Completed %s\n' "$job_id"
else
printf '%s\n' "$job_id" >> failed_job_ids.txt
printf 'Failed %s\n' "$job_id" >&2
fi
done < job_ids.txt
每个 JSON 文件都包含最终的创作数据,其中包括返回的资源信息。你的下一个处理步骤可以读取这些文件,并按需下载或移动生成的图片。
使用 openart creation get 当你想进行一次不阻塞的状态检查时使用。手动登记或定时轮询任务只需改动一条命令即可运行同样的循环。
mkdir -p status
while IFS= read -r job_id; do
[ -z "$job_id" ] && continue
openart creation get "$job_id" --json \
> "status/${job_id}.json"
done < job_ids.txt
这份 wait 循环会在每个 ID 上暂停,但这并不会让图片生成变成串行。每个任务都在前一次异步提交后启动,因此循环等待第一个任务时,后续任务仍在继续运行。在 CI 中, wait 提供了清晰的完成节点。若要手动监控, get 让你查看当前状态并立即返回结果。
OpenArt CLI 还能做什么
本教程聚焦于一个工作流程:将一组文本 prompt 转化为一批图像。CLI 的能力远不止于此,在你为其构建单独的工具之前,值得先了解它有哪些功能。
它还能修改你已有的图片。指向电脑上的照片或某个链接,描述你想要的改动,即可获得全新版本,而不必每次都从零生成。在视频方面,它能根据描述生成视频,或让一张静态照片动起来,只要所选模型支持,视频的时长、画幅和分辨率都由你掌控。
除了生成之外,CLI 还能帮你保持条理:在项目和工作区之间切换,只需上传一次参考图,就能在后续多个 prompt 中复用,而无需每次重新上传同一个文件。每个结果都可以保留为可分享的链接,或直接下载到文件夹中;你还可以回顾自己创建的任何内容、查看仍在运行的作业,或等待某个作业完成。
这些都不会改变本教程中的批处理模式。它只是意味着同样的终端优先方法可以延伸到纯文生图作业之外。请参阅 OpenArt 的 CLI 概览 了解以上每项操作背后的命令。
这个批量工作流实际用在哪些场景
几个具体案例说明了团队为什么选择脚本化批处理而非网页应用。
产品目录变体。 某电商团队用一份包含 500 个 SKU 的电子表格,为每个生成一张 产品图片 每一行,将产品描述通过 CSV 变体传入,让每行的模型和尺寸都匹配图片的投放位置(产品网格用正方形,故事广告用竖版)。
内容资源墙。 内容或增长团队需要 50 个 缩略图变体 用于午餐前的 A/B 测试。用一个文本文件的 prompt 列表配合 while-read 循环,就能在你写完这些 prompt 的时间里把全部 50 个都提交上去,而不用在网页应用里点 50 次。
本地化创意套装。 营销团队将同一个基础概念转化为一组 广告创意 跨十几个 prompt 的多个变体,每个变体针对特定市场或渠道采用不同的设置、模型或宽高比,通过 CSV 变体按行改变这些字段。
CI 与智能体流水线。 每当源数据变化时,一个夜间作业会重新生成一组固定的预览图;或者一个已经在运行 shell 命令的智能体,将生成作为更大规模工具调用工作流的一部分提交——这正是背后相同的模式 用 Claude 生成产品广告。两者都需要 --json 输出和非交互式退出码,而不是浏览器会话。
何时选择 CLI 批处理工作流而非网页应用或 MCP
当脚本需要提交可重复的任务、保留任务 ID 并在无需人工干预的情况下收集结果时,请使用 CLI 批处理工作流。它适用于定时 CI 运行、shell 管道、批量 prompt 处理,以及执行终端命令的智能体工具调用。
使用 OpenArt 适用于一次性的创作过程——你想在查看每个结果的同时调整 prompt 和设置。OpenArt MCP 可将对话式生成嵌入 Claude 或 ChatGPT 等智能体中,由对话而非 shell 脚本来控制请求。
If the goal is not just generating images but also routing each result somewhere else automatically, such as posting a finished image to Telegram, Slack, or Discord, that behavior belongs to an agent, not to this batch script. An agent framework that already supports tool calling can call OpenArt MCP to generate the image, then call a separate messaging tool to deliver it. The while-read loop in this tutorial submits jobs and writes results to disk. It does not send anything anywhere, so a delivery step still needs its own script or agent on top of it.
选择与你工作方式相匹配的界面。CLI 的 GitHub 仓库涵盖安装说明和完整命令参考。如果基于对话的生成方式比文件驱动的批量处理更适合你的工作流程,上方的 MCP 概览会有帮助。
常见问题
如果某个作业在批处理中途失败会怎样?
某个任务失败不会取消已提交的任务。除非脚本因错误退出,否则你的收集循环应记录失败的任务 ID 并继续运行。请检查失败的任务 openart creation get <job-id>.
如何在不使用 --async 的情况下设置更长的超时时间?
这份 --timeout <seconds> 选项可延长同步生成命令的等待时间。例如,添加 --timeout 900 以最多等待 15 分钟。请通过以下方式确认支持的取值 openart generate image --help.
我可以将 --async 与 -o 或 --output 一起使用吗?
异步提交会在图片生成之前就返回一个任务 ID,因此 generate 命令无法立即保存完成的图片。请改为在提交时存储任务 ID。使用 openart creation wait <job-id> 随后收集结果并处理其输出。
如何只重跑失败的 prompt?
重新运行需要一份将每个 prompt 映射到其已提交任务 ID 的记录。在收集期间,将失败的 ID 及其 prompt 写入一个单独的文件。在修正任何无效的 prompt 或参数后,再把该文件送回提交循环。
一次性提交数百个任务会触发速率限制吗?
如上所写的循环会以 shell 迭代的最快速度提交,在大批量时可能会超出速率限制。添加一个短暂的 sleep 0.5 在循环内每次提交后执行,或者设置一个计数器,每 20 到 50 个 prompt 暂停几秒,以保持请求速率平稳,避免突发流量。
--dry-run 能和 --async 一起使用吗?
可以。将两者结合使用,可以预览一个本会异步运行的任务的确切请求,而不会实际提交它或消耗积分。测试时在示例命令上保留这两个标志,然后仅去掉 --dry-run 当你转向真正的批处理时。
我怎样才能记录每张图片是由哪个 prompt 生成的?
仅凭任务 ID 无法携带原始 prompt 文本。请在提交时把 prompt 及其任务 ID 写在日志文件的同一行,例如 printf '%s\t%s\n' "$job_id" "$prompt" >> submissions.tsv,这样后续步骤就能将完成的图片匹配回生成它的 prompt。
完成的图片最终存放在哪里?
openart creation wait 和 openart creation get 以 JSON 形式返回任务元数据和资源 URL,而非图片文件本身。请添加一个下载步骤,例如 curl -o "results/${job_id}.png" "$url" ,如果工作流需要磁盘上的文件而非链接,就用该 JSON 中的 URL。
这个批处理工作流也适用于视频生成吗?
可以。CLI 为视频提供了与图片相同的命令: openart generate video "<prompt>" --model kling-3-omni 以同样的方式提交视频作业 openart generate image 提交一个图片任务。替换 generate image 面向 generate video 在提交循环中,并用相同的 --json/--async 标志加上 openart creation wait/openart creation get 应采用收集模式。运行 openart generate video --help 以便在脚本化大批量任务前确认任何视频专属标志(例如时长),因为本教程的示例和测试专门针对图片生成。