Design Agent API
MUAPI Design Agent — API Reference
Design Agent 是一个对话式 AI 系统,可以通过编排 MUAPI 平台上的生成式 AI 模型来生成图片、视频和音频。本文档涵盖 Web 界面使用的全部 API 端点,适合希望以编程方式集成或构建在 Agent 之上的开发者。
Overview(概览)
Base URL: https://api.muapi.ai/api/v1/creative-agent
Auth: x-api-key: {MUAPIAPP_API_KEY}
Format: application/json
Architecture(架构)
Agent 使用提交后轮询模式:
- 向 /sessions/{id}/chat 发送 POST 消息,或通过 /sessions/{id}/run-skill 触发技能。
- 服务器将后台任务加入队列,并立即返回 job_id。
- 后台 Worker(SAQ)执行 Agent 回合,包括规划、调用工具和写入事件。
- 每 1–2 秒轮询一次 GET /jobs/{job_id}/events?since=<cursor>,直到 done: true。
sequenceDiagram
participant "Client"
participant "API"
participant "Worker"
participant "Model (MUAPI)"
"Client"->>"API": POST /sessions/{id}/chat
"API"-->>"Client": { job_id, status: "pending" }
"API"->>"Worker": Enqueue task_run_agent_turn
loop Polling
"Client"->>"API": GET /jobs/{job_id}/events?since=0
"API"-->>"Client": { events: [...], done: false }
end
"Worker"->>"Model (MUAPI)": generate_image / image_to_video / ...
"Model (MUAPI)"-->>"Worker": result URL
"Worker"->>"API": Write tool_result event
"Client"->>"API": GET /jobs/{job_id}/events?since=N
"API"-->>"Client": { events: [tool_result], done: true }
Authentication(身份验证)
所有端点都要求在 header 中提供 API Key:
x-api-key: {MUAPIAPP_API_KEY}
Token 可以是:
- API Key(来自 Muapi Dashboard)
- 用户 JWT(仅 Muapi Web 客户端使用)
[!IMPORTANT] is_test: true 的 API Key 可以在不计费的情况下完整运行 Agent。
Sessions(会话)
Session 是持久化工作区。每个 Session 保存聊天历史、已生成的资产和 Agent 任务列表。
GET /sessions
列出当前已验证用户的全部 Session,按最近更新时间排序。
Response 200 OK
[
{
"id": "sess_abc123",
"name": "My Fashion Shoot",
"credits_spent": 120,
"asset_count": 5,
"created_at": "2026-05-08T07:00:00Z",
"updated_at": "2026-05-08T09:30:00Z"
}
]
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | Session 唯一标识符 |
| name | string | 便于阅读的 Session 名称 |
| credits_spent | number | 本 Session 消耗的总 credits |
| asset_count | number | 生成或上传的资产总数 |
| created_at | ISO 8601 | Session 创建时间 |
| updated_at | ISO 8601 | 最近活动时间 |
POST /sessions
创建新的 Session。
Request Body(可选)
{
"name": "Product Campaign"
}
省略 name 时,会生成类似 session-a1b2c3 的随机名称。
Response 200 OK
{
"id": "sess_xyz789",
"name": "Product Campaign",
"credits_spent": 0,
"asset_count": 0
}
PATCH /sessions/{session_id}
重命名已有 Session。
Path Parameters
| 参数 | 类型 | 说明 |
|---|---|---|
| session_id | string | 要重命名的 Session ID |
Request Body
{
"name": "Summer Collection Ads"
}
Response 200 OK
{
"id": "sess_xyz789",
"name": "Summer Collection Ads"
}
DELETE /sessions/{session_id}
永久删除 Session 以及与其关联的所有资产、消息和任务。
Response 200 OK
{
"status": "deleted"
}
Assets(资产)
Asset 是附加到 Session 的任意媒体文件(图片、视频或音频),可以由用户上传,也可以由 Agent 生成。
GET /sessions/{session_id}/assets
获取 Session 注册的全部资产,按创建时间排序(最早的在前)。
Response 200 OK
[
{
"asset_label": "asset_1",
"kind": "image",
"url": "https://cdn.muapi.ai/sessions/sess_xyz/asset_1.webp",
"source_tool": "upload",
"model": null,
"prompt": null,
"created_at": "2026-05-08T07:05:00Z"
},
{
"asset_label": "asset_2",
"kind": "image",
"url": "https://cdn.muapi.ai/sessions/sess_xyz/asset_2.webp",
"source_tool": "generate_image",
"model": "nano-banana-2",
"prompt": "A cinematic portrait of a woman in a black suit",
"created_at": "2026-05-08T07:12:00Z"
}
]
| 字段 | 类型 | 说明 |
|---|---|---|
| asset_label | string | Agent 可寻址的标签(例如 asset_1),在聊天中用于引用特定资产。 |
| kind | string | image、video 或 audio |
| url | string | 媒体文件的 CDN URL |
| source_tool | string | 资产的创建方式,例如 upload、generate_image、edit_image、image_to_video 等 |
| model | string 或 null | 生成资产所用的模型 |
| prompt | string 或 null | 生成时使用的提示词 |
| created_at | ISO 8601 | 资产注册时间 |
POST /sessions/{session_id}/assets
注册上传到外部的资产,使 Agent 可以在后续回合中通过标签(例如 asset_3)引用它。
[!TIP] 应先使用 GET /api/app/get_file_upload_url 返回的 signed URL 将文件直接上传到 S3,再调用此端点。参见下方的 File Upload 部分。
Request Body
{
"url": "https://cdn.muapi.ai/uploads/my-photo.jpg",
"kind": "image",
"source_tool": "upload",
"prompt": "User selfie for celebrity collage"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | ✅ | 已上传文件的公开 CDN URL |
| kind | string | ✅ | image、video 或 audio |
| source_tool | string | ❌ | 默认为 upload |
| prompt | string | ❌ | 可选的描述或说明 |
Response 200 OK
{
"asset_label": "asset_3",
"kind": "image",
"url": "https://cdn.muapi.ai/uploads/my-photo.jpg",
"source_tool": "upload"
}
[!NOTE] asset_label 会在每个 Session 内以原子方式递增(例如 asset_1、asset_2 等)。在聊天中引用资产时,应始终使用响应返回的标签。
Chat Messages(聊天消息)
GET /sessions/{session_id}/messages
获取 Session 中完整持久化的聊天历史。
Response 200 OK
[
{
"role": "user",
"content": "Generate a 3D action figure of me in a doctor outfit",
"attachments": [
{ "asset_label": "asset_1", "url": "...", "kind": "image" }
],
"timestamp": "2026-05-08T07:10:00Z",
"skill_name": "action-figure-generator"
},
{
"role": "assistant",
"content": "I'll create your action figure right away!",
"events": [
{ "type": "tool_call", "name": "edit_image", "args": { ... } },
{ "type": "tool_result", "name": "edit_image", "result": { ... }, "asset": { ... } }
],
"timestamp": "2026-05-08T07:10:05Z"
}
]
PATCH /sessions/{session_id}/messages
持久化或覆盖 Session 的完整聊天历史。每次回合完成后,前端会自动调用此端点以确保数据持久性。
Request Body
{
"messages": [
{ "role": "user", "content": "...", "timestamp": "..." },
{ "role": "assistant", "content": "...", "events": [...], "timestamp": "..." }
]
}
Response 200 OK
{
"status": "saved",
"count": 4
}
Agent Execution(Agent 执行)
POST /sessions/{session_id}/chat
向 Agent 发送自由格式消息。Agent 会分析意图、规划工具调用并执行(例如生成图片、视频和音频)。这是对话交互的主要入口。
Request Body
{
"message": "Create a selfie of me with Harry Potter on set",
"model": "gpt-5-mini",
"messages_snapshot": [...],
"canvas_state": {
"viewport": { "x": 0, "y": 0, "scale": 1 },
"selected": "asset_2",
"nodes": [
{ "asset_id": "asset_1", "kind": "image", "x": 100, "y": 200, "w": 400, "h": 400 },
{ "asset_id": "asset_2", "kind": "image", "x": 600, "y": 200, "w": 400, "h": 400 }
]
}
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| message | string | ✅ | 用户发送给 Agent 的消息 |
| model | string | ❌ | 使用的规划 LLM。默认为 gpt-5-mini。 |
| messages_snapshot | array | ❌ | 此回合之前的完整聊天历史,用于提供上下文,并以原子方式持久化。 |
| canvas_state | object | ❌ | 用户画布布局快照,用于空间推理,例如“使用左侧的资产”。 |
Response 200 OK
{
"job_id": "job_def456",
"status": "pending"
}
[!IMPORTANT] 此端点会立即返回。Agent 在后台异步运行;请轮询 GET /jobs/{job_id}/events 跟踪进度。
POST /sessions/{session_id}/run-skill
直接调用指定名称的专家技能,跳过 Agent 的意图识别步骤。指定技能的配方会被渲染成结构化提示词并发送给 Agent。
Request Body
{
"skill_name": "fashion-try-on",
"inputs": {
"person_image": "asset_1",
"clothing_image": "asset_2"
},
"model": "gpt-5-mini",
"messages_snapshot": [...]
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| skill_name | string | ✅ | 技能的精确 slug 名称(参见 GET /agent-skills) |
| inputs | object | ❌ | 技能输入变量的键值映射 |
| model | string | ❌ | 规划 LLM,默认为 gpt-5-mini。 |
| messages_snapshot | array | ❌ | 用于持久化的聊天历史快照 |
Response 200 OK
{
"job_id": "job_ghi789",
"status": "pending"
}
GET /agent-skills
列出从 agent/skills/*.skill.md 加载的所有可用专家技能配方。
Response 200 OK
[
{
"name": "fashion-try-on",
"description": "Virtually try on different outfits...",
"inputs": ["person_image", "clothing_image"],
"trigger_keywords": ["fashion try on", "virtual fitting room", ...],
"estimated_credits": 150
},
{
"name": "action-figure-generator",
"description": "Convert a photo of a person into a custom 3D action figure...",
...
}
]
Available Skills(截至 2026 年 5 月)
| 技能名称 | 说明 | 主要模型 |
|---|---|---|
| selfie-with-celebrities | 将自拍与电影演员合成 | nano-banana-2-edit、kling-o1-image-to-video |
| animal-video-generator | 有趣的拟人动物 Vlogger | nano-banana、veo3.1-fast-image-to-video |
| ugc-ads-workflow | Influencer 风格的产品 UGC 广告 | gpt-image-2、seedance-v1.5-pro-i2v-fast |
| cartoon-dance-animation | Pixar 风格的 3D 角色舞蹈 | nano-banana-2-edit、kling-v2.6-std-motion-control |
| character-story-video | 根据图片生成多段故事视频 | nano-banana-2-edit |
| action-figure-generator | 包装中的 3D 收藏级动作人偶 | nano-banana-2-edit |
| fashion-try-on | 虚拟试衣 + 模特视频 | qwen-image-edit-2511、seedance-v1.5-pro-i2v-fast |
| floor-plan-rendering | 2D 平面图 → 3D 建筑渲染 | nano-banana-2、nano-banana-2-edit |
| interior-design-visualizer | 空房间 → 带家具的室内空间 | gpt-image-2、nano-banana-2-edit |
| multi-angle-reshoot | 6 种戏剧化摄像机角度变化 | nano-banana-2-edit |
| couple-grid-creator | 6 格浪漫情侣姿势网格 | qwen-image-edit-plus |
| giant-product-showcase | 人物与建筑大小的产品同框 | nano-banana-2-edit、veo3.1-fast-image-to-video |
| product-showcase-video | 爆炸式食材产品广告 | bytedance-seedream-v5.0-edit、seedance-v1.5-pro-i2v-fast |
| jewelry-product-video | 奢华微距珠宝商业广告 | nano-banana-2-edit、grok-imagine-image-to-video |
| 3d-logo-animation | 2D Logo → 3D 动画展示 | nano-banana-2-edit、veo3.1-fast-image-to-video |
| talking-baby-video | 穿着服装的病毒式会说话婴儿 | nano-banana、grok-imagine-image-to-video |
| keyboard-art-maker | 用键帽拼出自定义消息 | ideogram-v3-t2i |
| product-video-ad-maker | 电影感产品视频广告 | flux-2-pro-edit、wan2.5-image-to-video-fast |
Job Management(任务管理)
Job 代表一次 Agent 回合(一次消息 → 一次响应周期)。
GET /jobs/{job_id}/events
轮询 Agent 在一次任务回合中产生的流式事件。使用基于 cursor 的分页,只接收上次轮询之后的新事件。
Query Parameters
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| since | integer | 0 | 只返回 id > since 的事件。新的轮询从 0 开始。 |
| limit | integer | 200 | 每次调用最多返回的事件数(最大 1000)。 |
Response 200 OK
{
"job_id": "job_def456",
"status": "processing",
"error": null,
"approved": null,
"approval_requested": false,
"cursor": 42,
"events": [
{
"id": 38,
"type": "text",
"payload": { "content": "I'll create your action figure now..." },
"job_id": "job_def456",
"created_at": "2026-05-08T07:10:06Z"
},
{
"id": 39,
"type": "plan_propose",
"payload": {
"title": "Action Figure Generation Plan",
"nodes": [
{ "tool": "edit_image", "model": "nano-banana-2-edit", "credits": 80 }
],
"total_credits": 80
},
"job_id": "job_def456",
"created_at": "2026-05-08T07:10:07Z"
},
{
"id": 42,
"type": "tool_result",
"payload": {
"name": "edit_image",
"result": {
"url": "https://cdn.muapi.ai/...",
"source_asset_id": "asset_1"
},
"asset": {
"asset_label": "asset_2",
"kind": "image",
"url": "https://cdn.muapi.ai/sessions/sess_xyz/asset_2.webp"
}
},
"job_id": "job_def456",
"created_at": "2026-05-08T07:10:45Z"
}
],
"done": true
}
| 字段 | 类型 | 说明 |
|---|---|---|
| status | string | 当前状态:pending、processing、completed、failed |
| approved | boolean 或 null | 已批准时为 true、拒绝时为 false、等待时为 null |
| approval_requested | boolean | Agent 当前等待用户确认时为 true |
| cursor | number | 下一次轮询使用的 cursor |
| events | object[] | 自上次轮询以来的事件列表 |
| error | string | 错误信息(status 为 failed 时提供) |
| done | boolean | 任务完成时为 true |
Event Types Reference(事件类型参考)
| type | 说明 | 主要 Payload 字段 |
|---|---|---|
| text | 流式 Agent 文本(聊天气泡内容) | content: string |
| info | 状态消息(例如“Waiting for approval...”) | content: string、needs_approval: boolean |
| error | 发生错误 | message: string |
| tool_call | Agent 即将调用工具 | name: string、args: object |
| tool_result | 工具调用完成,包含新资产 | name: string、result: object、asset: AssetObject |
| plan_propose | Agent 提出等待批准的生成计划 | title: string、nodes: array、total_credits: number |
| canvas_op | 画布空间操作(移动/排列) | op: string、args: object |
Data Models(数据模型)
AssetObject
表示 Agent 生成或使用的媒体文件。
| 字段 | 类型 | 说明 |
|---|---|---|
| asset_label | string | Session 内的唯一标签(例如 asset_1) |
| kind | string | image、video 或 audio |
| url | string | 公开 CDN URL |
| source_tool | string | 创建资产的工具 |
| model | string 或 null | 使用的 AI 模型 |
| prompt | string 或 null | 使用的提示词 |
| created_at | string | ISO 8601 时间戳 |
GET /sessions/{session_id}/jobs
列出某个 Session 最近的 20 个任务。页面刷新后,可用它检测并恢复正在执行的任务。
Response 200 OK
[
{
"id": "job_def456",
"status": "processing",
"user_message": "Create an action figure of me",
"error": null,
"created_at": "2026-05-08T07:10:00Z",
"completed_at": null
}
]
POST /jobs/{job_id}/approve
批准已提出的计划。Agent 会在执行工具调用前等待批准。轮询 /jobs/{job_id}/events,确认 Agent 已恢复运行。
Response 200 OK
{
"status": "approved"
}
POST /jobs/{job_id}/reject
拒绝已提出的计划。Agent 会停止执行并报告拒绝结果。
Response 200 OK
{
"status": "rejected"
}
POST /jobs/{job_id}/cancel
取消正在执行的任务。Worker 会在工具调用之间检查此标记,并停止派发新的调用。已经在执行中的模型请求仍可能完成。
Response 200 OK
{
"status": "cancelled"
}
File Upload(文件上传)
Design Agent 使用直传 S3 的上传方式,避免将二进制数据经过 API 服务器传输。
Step 1 — Get a Signed Upload URL(获取签名上传 URL)
GET /api/app/get_file_upload_url(Dashboard API,使用独立前缀)
GET /api/app/get_file_upload_url?filename=my-photo.jpg
x-api-key: {MUAPIAPP_API_KEY}
Response
{
"url": "https://s3.amazonaws.com/muapi-uploads/...",
"fields": {
"key": "uploads/user_123/abc/my-photo.jpg",
"AWSAccessKeyId": "...",
"policy": "...",
"signature": "..."
}
}
Step 2 — Upload Directly to S3(直接上传到 S3)
POST <url from above>
Content-Type: multipart/form-data
[all fields from response, then the file itself]
最终 CDN URL 为:https://cdn.muapi.ai/<fields.key>
Step 3 — Register with Session(向 Session 注册)
POST /api/v1/creative-agent/sessions/{session_id}/assets
{
"url": "https://cdn.muapi.ai/uploads/user_123/abc/my-photo.jpg",
"kind": "image",
"source_tool": "upload"
}
响应会返回 asset_label(例如 "asset_3"),之后的消息可以使用它来引用资产。
Complete Workflow Example(完整工作流示例)
下面是使用 JavaScript(fetch)完成端到端流程的示例:
const API = "https://api.muapi.ai/api/v1/creative-agent";
const headers = {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
};
// 1. Create a session
const session = await fetch(`${API}/sessions`, {
method: "POST",
headers,
body: JSON.stringify({ name: "My Campaign" }),
}).then((r) => r.json());
// => { id: "sess_abc", name: "My Campaign", ... }
// 2. (Optional) Upload a reference image
const uploadRes = await fetch(
`/api/app/get_file_upload_url?filename=product.jpg`,
{ headers },
).then((r) => r.json());
// ... upload file to S3 using uploadRes.url and uploadRes.fields ...
const assetRes = await fetch(`${API}/sessions/${session.id}/assets`, {
method: "POST",
headers,
body: JSON.stringify({
url: `https://cdn.muapi.ai/${uploadRes.fields.key}`,
kind: "image",
}),
}).then((r) => r.json());
// => { asset_label: "asset_1", ... }
// 3. Send a message (referencing the uploaded asset)
const job = await fetch(`${API}/sessions/${session.id}/chat`, {
method: "POST",
headers,
body: JSON.stringify({
message: `Create a viral product showcase video using asset_1`,
model: "gpt-5-mini",
}),
}).then((r) => r.json());
// => { job_id: "job_xyz", status: "pending" }
// 4. Poll for events
let cursor = 0;
let done = false;
while (!done) {
await new Promise((r) => setTimeout(r, 1500));
const poll = await fetch(`${API}/jobs/${job.job_id}/events?since=${cursor}`, {
headers,
}).then((r) => r.json());
for (const ev of poll.events) {
if (ev.type === "plan_propose") {
// Approve the plan automatically (or show user for confirmation)
await fetch(`${API}/jobs/${job.job_id}/approve`, {
method: "POST",
headers,
});
}
if (ev.type === "tool_result" && ev.payload.asset) {
console.log("Generated asset:", ev.payload.asset.url);
}
if (ev.type === "text") {
process.stdout.write(ev.payload.content);
}
}
cursor = poll.cursor;
done = poll.done;
}
// 5. Fetch final asset list
const assets = await fetch(`${API}/sessions/${session.id}/assets`, {
headers,
}).then((r) => r.json());
console.log("All session assets:", assets);
Error Handling(错误处理)
所有错误都会返回标准 HTTP 状态码和 JSON body:
{
"detail": "Session not found"
}
| 状态码 | 含义 |
|---|---|
| 400 | Bad request / validation error(请求错误或验证错误) |
| 401 | Missing or invalid auth token(缺少或无效的身份验证 token) |
| 403 | Forbidden(访问其他用户的资源) |
| 404 | 找不到 Session、Job、Asset 或 Skill |
| 422 | 字段值无效,例如不支持的 kind |
| 500 | 内部服务器错误 |
[!WARNING] 如果轮询响应中 done: true 且 status: "failed",请检查 error 字段,其中包含经过清理的模型提供商错误信息。
Rate Limits & Credits(速率限制与 Credits)
- 每次工具调用都会从账户余额消耗 credits。
- plan_propose 事件会在执行前显示 total_credits 估算值。
- 使用 POST /jobs/{job_id}/reject 可以在不花费 credits 的情况下取消计划。
- Sandbox API Key(is_test: true)不会消耗 credits。