
如何通过 EvoLink 使用 Midjourney V8.1 API:代码示例、轮询与 Callback

如果你想从代码里调用 Midjourney V8.1,真正的问题不只是“调用哪个接口”,而是:
我如何先测试 Midjourney V8.1,再提交图像任务、追踪完成状态、控制成本,并且保留后续切换其他图像模型的能力?
POST https://api.evolink.ai/v1/images/generations 提交 model: "mj-v8.1" 的任务,之后用 GET https://api.evolink.ai/v1/tasks/{task_id} 轮询状态,或者在生产环境里配置 callback_url 接收完成通知。快速答案
通过 EvoLink 调用 Midjourney V8.1 时,核心请求如下:
curl --request POST \
--url https://api.evolink.ai/v1/images/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "mj-v8.1",
"prompt": "a premium product photo of a matte black espresso machine on a marble counter --ar 16:9 --s 250",
"quality": "standard",
"model_params": {
"speed": "fast"
},
"callback_url": "https://your-domain.com/webhooks/evolink-image-task"
}'id,再查询:curl --request GET \
--url https://api.evolink.ai/v1/tasks/<task_id> \
--header 'Authorization: Bearer YOUR_API_KEY'completed 后,读取 results 数组并及时保存图片 URL。Midjourney V8.1 在 fast 模式下每次生成最多返回 4 张图;draft 模式会返回最多 24 张轻量级 0.5K 草图。内容审核可能过滤部分输出,EvoLink 这里按请求计费,不按返回图片数量计费。这篇指南解决什么问题
这不是一篇泛泛的 Midjourney prompt 教程,而是一篇面向 EvoLink 用户的生产接入指南。
| 用户任务 | 本文回答什么 | EvoLink 的额外价值 |
|---|---|---|
| 先试用 V8.1 | 如何用 Playground 先验证 prompt | 写代码前先在浏览器中测试 |
| 提交任务 | 用哪个 endpoint、model name 和 payload | 一把 EvoLink API Key,一个图像生成接口 |
| 追踪完成 | task_id、轮询和状态流怎么处理 | 图像/视频路由统一异步任务模式 |
| 上生产 | 怎么使用 callback_url、重试和结果保存 | callback、状态查询和任务可见性 |
| 控制成本 | speed 与 quality 如何影响计费 | 产品页透明展示按次价格 |
| 选择模型 | V8.1 何时优于 GPT Image 2、Nano Banana Pro 或 V7 | 不重写集成即可做模型路由 |
开始之前
你需要准备四件事:
- 一个 EvoLink 账户。
- 一个 EvoLink API Key。
- 一个能安全保存 API Key 的后端环境。
- 一个结果存储方案,因为生成图片链接可能有时效限制。
task_id,最后只把安全的任务状态返回给前端。第 1 步:先在 EvoLink Playground 测试
- prompt 风格是否能得到你想要的视觉方向;
- 是否需要图生图、Style Reference 或 Omni Reference;
- 当前任务更适合
draft、fast、standard还是hd。
这也是 EvoLink 产品价值所在:开发者不是只要一个 endpoint,而是要一条可落地的图像工作流。先在 Playground 中跑通,可以减少后续工程调试成本,也能让你的 API 示例更接近真实业务场景。
第 2 步:获取 EvoLink API Key
EvoLink API 使用 Bearer Token:
Authorization: Bearer YOUR_API_KEY生产环境中,推荐的调用链是:
用户在你的产品中发起生成
-> 你的后端 API route
-> EvoLink 图像生成接口
-> 保存 task_id
-> 轮询或接收 callback
-> 保存结果到你自己的存储
-> 在产品中展示最终图片这样可以保护 API Key,也能让你的产品更好地控制任务状态、失败重试和用户权限。
第 3 步:选择 Midjourney V8.1 路由
新建图像生成任务使用:
POST https://api.evolink.ai/v1/images/generations模型名称使用:
{
"model": "mj-v8.1"
}prompt 开头,然后跟上文本描述和支持的 prompt 参数。第 4 步:发送文生图请求
适合商品图、商业视觉、概念图、情绪板、社媒图和通用创意生成。
curl --request POST \
--url https://api.evolink.ai/v1/images/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "mj-v8.1",
"prompt": "a cinematic product photo of a titanium travel mug on wet black stone, soft studio reflection, premium outdoor brand style --ar 16:9 --s 250 --chaos 8",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}'任务创建响应示例:
{
"created": 1757156493,
"id": "task-unified-1757156493-xkd8mv2r",
"model": "mj-v8.1",
"object": "image.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": true,
"estimated_time": 120
},
"type": "image",
"usage": {
"billing_rule": "per_call",
"credits_reserved": 6.0,
"user_group": "default"
}
}id。它就是后续轮询、callback 对账和错误排查时要用的 task_id。第 5 步:添加图生图或参考图
Midjourney V8.1 使用 Midjourney 风格的 prompt 语法处理参考图。图生图时,把图片 URL 放在 prompt 最前面。支持的输入格式包括 PNG、GIF、WebP、JPG 和 JPEG。单张图片 URL 但不带文本描述是无效请求;可以使用一张图片加文本、多张图片,或多张图片加文本。
curl --request POST \
--url https://api.evolink.ai/v1/images/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "mj-v8.1",
"prompt": "https://your-cdn.example.com/reference-sofa.jpg a luxury living room campaign image, keep the sofa shape and fabric feel, warm morning light --ar 4:3 --iw 1.2 --s 200",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}'当你希望结果跟随某个已有产品、场景、角色或视觉方向时,就适合使用这个模式。
第 6 步:使用 Style Reference 和 Omni Reference
如果你要保持品牌视觉风格,用 Style Reference;如果你要锚定主体或物体,用 Omni Reference。
{
"model": "mj-v8.1",
"prompt": "a premium skincare bottle on a clean studio set, soft shadows, commercial beauty lighting --ar 1:1 --sref https://your-cdn.example.com/brand-style.jpg --sw 180 --oref https://your-cdn.example.com/product-object.jpg --ow 250",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}| 参考图类型 | 语法 | 适合场景 | 说明 |
|---|---|---|---|
| Image Prompt | URL prompt text --iw N | 让输入图影响生成方向 | URL 放在文本 prompt 前面 |
| Style Reference | --sref URL --sw N | 转移视觉风格 | 需要文本 prompt |
| Omni Reference | --oref URL --ow N | 锚定主体或物体 | 需要文本 prompt;Object Reference 生成可能更久 |
第 7 步:轮询任务直到完成
如果你在做原型、内部工具或后台 worker,轮询是最直接的方式。
curl --request GET \
--url https://api.evolink.ai/v1/tasks/task-unified-1757156493-xkd8mv2r \
--header 'Authorization: Bearer YOUR_API_KEY'id、model、progress、status、task_info、type 等字段。完成后会出现 results。{
"created": 1756817821,
"id": "task-unified-1756817821-4x3rx6ny",
"model": "mj-v8.1",
"object": "image.generation.task",
"progress": 100,
"results": [
"https://cdn.evolink.ai/images/generated-image-abc123.jpg"
],
"status": "completed",
"task_info": {
"can_cancel": false
},
"type": "image"
}推荐轮询策略:
| 阶段 | 建议间隔 | 处理方式 |
|---|---|---|
| 前 20 秒 | 每 3-5 秒一次 | 展示 queued 或 processing 状态 |
| 长任务 | 每 5-10 秒一次 | 避免过于频繁请求 |
| completed | 停止轮询 | 保存结果 URL 到自己的存储 |
| failed | 停止轮询 | 记录 payload、task ID 和错误状态 |
| 前端超时 | 停止用户等待 | 后台 worker 可继续查询 |
第 8 步:生产环境使用 callback_url
callback_url:{
"model": "mj-v8.1",
"prompt": "a clean hero image for a travel booking app, modern airport lounge, premium editorial photo style --ar 16:9",
"quality": "standard",
"model_params": {
"speed": "fast"
},
"callback_url": "https://your-domain.com/webhooks/evolink-image-task"
}callback_url 是任务完成后的 HTTPS 回调地址,覆盖完成、失败或取消事件;超时时间为 10 秒,最多重试 3 次。URL 必须使用 HTTPS,长度不能超过 2048 个字符,且不能指向 127.0.0.1、10.x.x.x、172.16-31.x.x 或 192.168.x.x 等私有 IP 段。你的 webhook handler 应该做到:
- 快速返回 2xx;
- 验证
task_id确实存在于你的数据库; - 标记终态前,再调用一次
GET /v1/tasks/{task_id}做确认; - 按 task ID 和终态去重,避免重复 callback 造成重复写入;
- 在 30 天图片链接有效期内,把最终图片 URL 保存到自己的存储。
用户可见的应用、批量生成和高流量任务更适合 callback;内部工具和本地测试可以继续使用轮询。
EvoLink 上常用的 Midjourney V8.1 请求参数
精确字段以 API Reference 为准。下表用于理解常见接入字段:
| 字段 | 是否必填 | 示例 | 控制什么 |
|---|---|---|---|
model | 是 | mj-v8.1 | 选择 Midjourney V8.1 |
prompt | 是 | a product photo... --ar 16:9 --s 250 | 图像描述和支持的 MJ 风格参数 |
quality | 否 | standard, hd | 输出质量档和价格倍率 |
model_params.speed | 否 | draft, fast | 队列优先级和价格倍率 |
callback_url | 否 | https://your-domain.com/webhooks/evolink-image-task | 生产环境完成回调 |
--ar、--s、--chaos、--exp、--raw、--seed、--iw、--sref、--sw、--oref、--ow。model_params.speed 控制速度,用顶层 quality 字段控制输出质量。不要直接假设这些参数可用
不要从旧 Midjourney 版本或第三方示例里复制参数表,必须以 EvoLink 当前 API Reference 为准。
| 不要假设 | 原因 |
|---|---|
--v 8.1 | 路由已经锁定 V8.1 |
prompt 里的 --fast、--turbo、--draft | speed 由 model_params.speed 控制 |
--hd | quality 由顶层 quality 字段控制 |
--q | 后端支持未确认前,本 V8.1 路由不暴露 |
--no | 后端支持未确认前,本 V8.1 路由不暴露 |
--cref | 主体/物体参考使用 Omni Reference,即 --oref |
这也是 EvoLink 产品页的价值:开发者看到的是当前路由行为,而不是过时的社区参数列表。
价格与成本规划
| 选择 | 成本影响 | 产品建议 |
|---|---|---|
fast | 基础速度档 | 大多数生产请求默认选择 |
draft | 当前路由同基础价格 | 适合探索,不要当成半价档 |
standard | 基础质量档 | 预览图和多数产品内结果默认选择 |
hd | 1.5x 质量倍率 | 用于最终营销图、hero 图和高价值场景 |
| Fast 4 张,Draft 24 张草图 | 按请求计费 | 评估有效成本时看实际通过审核的结果数 |
hd 隐藏在一个模糊的“最佳质量”开关后面,除非你的计费模型能承担对应成本。同时注意,quality: "hd" 与 model_params.speed: "draft" 互斥。按场景的 Payload 示例
商品摄影
{
"model": "mj-v8.1",
"prompt": "a premium product photo of a ceramic desk lamp on a walnut table, soft window light, editorial interior design style --ar 4:3 --s 180",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}最终营销 Hero 图
{
"model": "mj-v8.1",
"prompt": "a luxury resort terrace overlooking a futuristic skyline at golden hour, cinematic commercial photography, elegant travel campaign mood --ar 16:9 --s 300 --chaos 6",
"quality": "hd",
"model_params": {
"speed": "fast"
},
"callback_url": "https://your-domain.com/webhooks/evolink-image-task"
}图生图商品变体
{
"model": "mj-v8.1",
"prompt": "https://your-cdn.example.com/reference-chair.jpg a modern ecommerce lifestyle photo, keep the chair silhouette, add a bright Scandinavian apartment setting --ar 3:2 --iw 1.4 --s 150",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}品牌风格参考
{
"model": "mj-v8.1",
"prompt": "a set of premium coffee packaging on a clean studio background --ar 1:1 --sref https://your-cdn.example.com/brand-moodboard.jpg --sw 220 --s 200",
"quality": "standard",
"model_params": {
"speed": "fast"
}
}JavaScript 示例:提交并轮询
这段代码应该运行在你的后端,而不是浏览器里。
const API_KEY = process.env.EVOLINK_API_KEY;
const BASE_URL = "https://api.evolink.ai/v1";
async function createMidjourneyTask() {
const response = await fetch(`${BASE_URL}/images/generations`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "mj-v8.1",
prompt: "a premium product photo of a smart speaker on a stone plinth --ar 16:9 --s 250",
quality: "standard",
model_params: {
speed: "fast"
}
})
});
if (!response.ok) {
throw new Error(`EvoLink task create failed: ${response.status}`);
}
return response.json();
}
async function getTask(taskId) {
const response = await fetch(`${BASE_URL}/tasks/${taskId}`, {
headers: {
Authorization: `Bearer ${API_KEY}`
}
});
if (!response.ok) {
throw new Error(`EvoLink task query failed: ${response.status}`);
}
return response.json();
}
async function waitForTask(taskId) {
for (let attempt = 0; attempt < 60; attempt += 1) {
const task = await getTask(taskId);
if (task.status === "completed") return task;
if (task.status === "failed") throw new Error(`Task failed: ${task.id}`);
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error(`Task timeout: ${taskId}`);
}Python 示例:提交并轮询
import os
import time
import requests
API_KEY = os.environ["EVOLINK_API_KEY"]
BASE_URL = "https://api.evolink.ai/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
payload = {
"model": "mj-v8.1",
"prompt": "a premium product photo of a minimalist wristwatch on dark slate --ar 16:9 --s 220",
"quality": "standard",
"model_params": {
"speed": "fast",
},
}
create_response = requests.post(
f"{BASE_URL}/images/generations",
headers=headers,
json=payload,
timeout=30,
)
create_response.raise_for_status()
task = create_response.json()
task_id = task["id"]
for _ in range(60):
status_response = requests.get(
f"{BASE_URL}/tasks/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30,
)
status_response.raise_for_status()
current = status_response.json()
if current["status"] == "completed":
print(current.get("results", []))
break
if current["status"] == "failed":
raise RuntimeError(f"Task failed: {task_id}")
time.sleep(5)
else:
raise TimeoutError(f"Task timeout: {task_id}")生产上线 Checklist
| 模块 | 生产环境要求 |
|---|---|
| API Key | 只在服务端保存 EVOLINK_API_KEY |
| 请求日志 | 记录 model、prompt hash、model_params.speed、quality、user ID 和 task_id |
| 用户体验 | 展示 pending、processing、completed、failed 状态 |
| 轮询 | 前几次可以快一点,后续退避,避免高频轮询 |
| Callback | 快速返回 2xx,异步处理回调事件 |
| 结果存储 | 在链接过期前复制图片到自己的存储 |
| 成本控制 | 对 hd 做产品权限或计费控制 |
| Fallback | 保留第二个图像模型路由作为替代 |
| 风控 | 限流、清洗 prompt、监控失败任务 |
| 文档 | 让开发者回到 API Reference 查看精确字段 |
Midjourney V8.1 与其他 EvoLink 图像模型怎么选
EvoLink 的价值不只是“有一个模型”。更重要的是,你可以在同一个鉴权、计费和异步任务模式下比较和切换多个图像模型。
| 模型 | 什么时候选 | 什么时候不适合作默认 |
|---|---|---|
| Midjourney V8.1 | 需要 Midjourney 风格视觉方向、商品图、Style Reference、Omni Reference,以及 Fast 四图生成 | 主要需求是文字渲染或严格版式复现 |
| Midjourney V7 | 已有 V7 prompt,或需要保留旧版 Midjourney 系列路由 | 新项目想使用 V8.1 的生成默认能力 |
| Nano Banana Pro | 想在 EvoLink 上为商品 mockup 或偏编辑的工作流测试图像替代路线 | 明确需要 MJ prompt 语法和四图创意批量 |
| GPT Image 2 | 想在 EvoLink 上为偏指令跟随的图像工作流测试替代路线 | 明确需要 Midjourney 风格视觉输出和 MJ 参数控制 |
对生产团队来说,这才是关键:先用 Midjourney V8.1 起步,同时保留 GPT Image 2 或 Nano Banana Pro 作为替代,根据真实用户结果做路由,而不是被单一供应商绑定。
常见错误
错误 1:把博客当成 API Reference
本文解释工作流。精确字段、参数范围和当前路由行为,以模型页 API Reference 为准。
错误 2:把 speed 写进 prompt
model_params.speed。不要依赖 prompt 里的 --fast、--turbo 或 --draft。错误 3:假设每次请求一定返回 4 张可用图
results。错误 4:等待一个超长 HTTP 请求
task_id,再轮询或接收 callback。错误 5:不保存生成结果
生成图片链接有效期为 30 天。任务完成后应复制到你自己的存储。
FAQ
如何通过 EvoLink 使用 Midjourney V8.1 API?
mj-v8.1 模型名。保存返回的 task ID,再轮询任务状态或使用 callback URL。EvoLink 上 Midjourney V8.1 的模型名是什么?
mj-v8.1。Variation、Remix、Canvas Edit、Retexture、Remove Background、Advanced Edit 等操作在 Midjourney V8.1 API 页面 中有各自的模型名。Midjourney V8.1 图像生成调用哪个接口?
创建任务使用 EvoLink 图像生成接口,查询状态使用 EvoLink 任务状态接口。具体路径和代码示例见本文前面的 curl、JavaScript 和 Python 示例。
Midjourney V8.1 支持图生图吗?
prompt 开头,再接文本描述和支持的 prompt 参数。Midjourney V8.1 支持轮询吗?
id 的异步任务对象。使用 task ID 查询任务状态,直到 completed 或 failed。Midjourney V8.1 支持 callback URL 吗?
支持。V8.1 API Reference 记录了 HTTPS callback 地址,用于完成、失败或取消事件。生产环境建议用 callback,并保留轮询作为最终校验。
一次 Midjourney V8.1 请求返回几张图?
results 为准。计费按请求,不按返回图片数。应该用 standard 还是 hd?
standard。最终营销图、hero 图或高价值付费工作流,可以用 hd,但要考虑 1.5x 质量倍率。不要把 quality: "hd" 和 model_params.speed: "draft" 组合使用。应该用 fast 还是 draft?
fast。draft 适合快速探索构图并返回轻量草图,但不要把它当成半价档。什么时候应该改用 GPT Image 2 或 Nano Banana Pro?
如果你的工作流更依赖精确指令跟随、OpenAI 体系或更强上下文理解,可以选 GPT Image 2。如果更看重图像编辑、商品 mockup 或 Gemini 图像工作流,可以选 Nano Banana Pro。
参考资料
- EvoLink Midjourney V8.1 API 页面
- EvoLink Midjourney V8.1 图像生成文档
- EvoLink Midjourney V8.1 价格区块
- EvoLink 模型目录
- Midjourney 公开文档


