Montagea API · v1
开发者 API 文档
用 OpenAI 兼容接口调用 Montagea 自建的文本、图片和视频模型。使用开发者密钥认证,可使用账号的付费积分或对应的 Unlimited 权益。免费账号不支持 API。
开始使用
在设置 → 开发者 API 中创建密钥。所有接口的 Base URL 如下。密钥只能放在服务端,不要写进公开的网页或 App。
export MONTAGEA_API_BASE="https://api.montagea.com/api/v1"
export MONTAGEA_API_KEY="mtg_..."每个请求都在 Authorization 头里带上 Bearer 密钥。生成类请求再带上 Idempotency-Key,网络中断后可以安全重试。
价格
下表展示按积分计费的标准价格,与网站使用同一套计费逻辑,由计费系统实时生成。有效 Unlimited 套餐覆盖的个人 API 调用为 0 积分。美元一列按当前积分包单价换算,购买的积分包越大,每个积分越便宜。
| 模型 | 计价单位 | 积分 | 约合美元 |
|---|---|---|---|
| qwen-27b | 每百万输入 token | 480 | $1.20–$2.40 |
| qwen-27b | 每百万输出 token | 2,880 | $7.19–$14.40 |
| qwen-image | 每张 1K | 20 | $0.050–$0.10 |
| qwen-image | 每张 2K | 60 | $0.15–$0.30 |
| z-image | 每张 1K | 20 | $0.050–$0.10 |
| minimax-h3 | 5 秒 720p 视频 | 120 | $0.30–$0.60 |
| minimax-h3 | 10 秒 720p 视频 | 240 | $0.60–$1.20 |
| minimax-h3 | 15 秒 720p 视频 | 360 | $0.90–$1.80 |
- 实际扣的是积分,美元只作参考,积分包价格以定价页为准。
- 文本按实际 token 数计费,每次请求最少扣 1 积分。
- 视频按秒计费,时长可选 4 到 15 秒。失败的请求不扣积分。
- Starter、Pro、Premium 的 API 调用使用订阅积分或充值积分,站内免费额度不适用。Unlimited Images 覆盖 Z-Image 与 Qwen Image(含 2K),Unlimited Videos 覆盖 H3 720p,Studio 覆盖两者:个人 API 密钥调用对应模型不扣积分,无需积分余额,也不占积分预算。其他模型照常按积分计费,渠道密钥仍按渠道合约计费。赠送积分不可用于 API。付费请求先按上限预扣,完成后退回多扣的部分。GET /models 的价格是按积分计费的标准价,文本美元单价是积分的计价基准。密钥预算是累计积分上限,包含预扣部分。
站内任务优先。API 只接受有空闲容量的请求,忙时返回 429 和 Retry-After,不扣积分。已经开始的推理不会被抢占。API 不会启动视频弹性机。同一账号最多一个 API 请求在运行,每个密钥每分钟最多提交 60 次。
模型与限制
文本
模型:qwen-27b。支持 system/developer/user/assistant/tool 消息、文本块数组及用户消息中的 image_url。总上下文为 32,768 token,包含消息、工具定义、Schema 指令、图片和预留输出;完整输入另有 64,000 字符限制(不含图片数据)。最多 10 张 PNG/JPEG/WebP,单张 20 MiB、合计 64 MiB;审核与推理前统一缩放至最长边 1024 像素。非流式最多输出 2,048 token,流式最多 8,192 token。按模型实际用量结算,退回未使用的预留额度。
图片
模型:qwen-image(1K/2K,最多 8 张参考图)和 z-image(1K,仅文生图)。每次请求的张数 n:qwen-image 1K 最多 6 张(带参考图最多 4 张),2K 每次 1 张;z-image 最多 8 张;同时不超过账号的同时出图上限。提示词最多 5,500 字符。比例:1:1、16:9、9:16、4:3、3:4、3:2、2:3。可选 seed:0–2147483647;批量逐张递增,超出后回到 0。批量部分成功时只收取已交付图片的费用。
视频
模型:minimax-h3。支持文生视频、首尾帧或参考媒体;720p,4–15 秒。可选 seed:0–2147483647。比例:16:9、9:16、1:1、4:3、3:4、21:9;auto 需要视觉输入。每 5 秒轮询返回的 ID。视频自带生成声音,参考音频不保证口型同步。不调用外部托管模型,不自动重新提交生成。
参考素材接受不跳转的公开 HTTP(S) URL;图片也接受 PNG/JPEG/WebP 的 base64 data URL。一个请求的全部下载须在 45 秒内完成。单文件不超过 20 MiB,总计不超过 64 MiB。图片须为非动图、不超过 1,600 万像素,校正方向后最长边缩放至 2048 像素内。视频支持 MP4/MOV、最高 4K,会统一转为每秒 24 帧、宽度不超过 1920 像素后逐帧审核,模型使用的就是这份转码后的视频;音频支持 MP3/WAV。单个片段及同类素材的总时长均不超过 15 秒。审核载荷不超过 14 MiB,超过时需压缩片段。素材无效或无法审核时,在扣费前拒绝。
MiniMax 支持 start_frame_url / end_frame_url,或 reference_image_urls(最多 9 张)、reference_video_urls(最多 3 段)、reference_audio_urls(最多 3 段);两类模式互斥,参考文件总计最多 12 个。参考音频须搭配参考图或视频。5 张以上参考图、任意视频或音频的输出上限为 10 秒;轻量输入最长 15 秒。GPU 条件容量可能进一步限制时长,不支持的组合会在扣费前拒绝。首尾帧模式跟随原图比例。
OpenAI 图片参数:response_format=url(默认)或 b64_json。size 支持 auto、256x256、512x512、1024x1024、1536x1024、1024x1536、1792x1024、1024x1792,以及仅 Qwen 支持的 2048x2048。指定尺寸时先按对应模型规格生成,再缩放并居中裁切至精确尺寸;只有 2048x2048 按 2K 计费。与 resolution/aspect_ratio 冲突的参数会被拒绝。同一 Idempotency-Key 可切换 response_format 取回原图,不会重复生成或扣费。
POST /videos 支持 JSON 和 multipart。input_reference 接受 PNG/JPEG/WebP 上传、图片 URL/data URL,或含 image_url 的对象,作为首帧;不支持 file_id。size=1280x720 或 720x1280 会选择横竖方向并交付该精确尺寸的 MP4。不传 size 时仍可使用原生比例。状态为 queued、in_progress、completed、failed,created_at 为 Unix 秒数。GET /videos/{id}/content 使用原 API Key 下载 MP4。暂不支持缩略图、spritesheet、remix 或延长视频;GET /requests/{id} 保留原状态格式。
接口
| GET | /models | 模型与当前价格 |
| GET | /balance | 付费积分余额、不限量模型与密钥预算 |
| POST | /chat/completions | 文本生成(JSON 或 SSE) |
| POST | /images/generations | 同步图片生成(最多 8 张输出) |
| POST | /images/edits | Qwen 图片编辑(JSON 或 multipart) |
| POST | /videos | 提交已获容量的视频任务(202) |
| GET | /videos/{id} | 查询视频状态与结果 |
| GET | /videos/{id}/content | 下载已完成的 MP4(需要鉴权) |
| GET | /requests/{id} | 按请求 ID 恢复查询 |
请求示例
文本
请求
curl "$MONTAGEA_API_BASE/chat/completions" \
-H "Authorization: Bearer $MONTAGEA_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: chat-example-1' \
-d '{"model":"qwen-27b","messages":[{"role":"user","content":"Describe a quiet mountain lake."}],"max_tokens":1024}'响应
{
"id": "req_8c41d2",
"object": "chat.completion",
"created": 1793102400,
"model": "qwen-27b",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "The lake lies perfectly still..." },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 18, "completion_tokens": 96, "total_tokens": 114 },
"montagea_usage": { "credits": 1 }
}图片
请求
curl "$MONTAGEA_API_BASE/images/generations" \
-H "Authorization: Bearer $MONTAGEA_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: image-example-1' \
-d '{"model":"qwen-image","prompt":"A quiet mountain lake at sunrise","resolution":"1K","aspect_ratio":"16:9","n":1}'响应
{
"id": "req_5b07e9",
"created": 1793102400,
"data": [{ "url": "https://.../req_5b07e9.png" }],
"montagea_usage": { "credits": 20 }
}视频
请求
curl "$MONTAGEA_API_BASE/videos" \
-H "Authorization: Bearer $MONTAGEA_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: video-example-1' \
-d '{"model":"minimax-h3","prompt":"A quiet mountain lake at sunrise","seconds":5,"resolution":"720p","aspect_ratio":"16:9"}'
# Poll every 5 seconds with the returned id
curl "$MONTAGEA_API_BASE/videos/req_3f2a9c" \
-H "Authorization: Bearer $MONTAGEA_API_KEY"响应
// POST /videos -> 202
{
"id": "req_3f2a9c",
"model": "minimax-h3",
"object": "video",
"kind": "video",
"status": "in_progress",
"created_at": 1793102400,
"progress": 0,
"seconds": "5",
"size": "1344x768",
"result": null,
"error": null,
"usage": { "credits": 0, "cost_nano_usd": null, "reserved_credits": 120 }
}
// GET /videos/req_3f2a9c once finished
{
"id": "req_3f2a9c",
"status": "completed",
"result": { "url": "https://.../req_3f2a9c.mp4", "seconds": 5 },
"error": null,
"usage": { "credits": 120, "cost_nano_usd": null, "reserved_credits": 0 },
...
}Qwen 图片编辑
POST /images/edits 接受含 reference_image_urls 的 JSON,或 multipart 的 image / image[] 文件,兼容 OpenAI SDK images.edit。qwen-image 的 POST /images/generations 也支持 reference_image_urls。分辨率、比例、seed 和 n 参数沿用图片生成接口。Z-Image 不支持参考图或图片编辑。
curl "$MONTAGEA_API_BASE/images/edits" \
-H "Authorization: Bearer $MONTAGEA_API_KEY" \
-H 'Idempotency-Key: edit-example-2' \
-F 'model=qwen-image' \
-F 'prompt=Change the background to a sunny garden' \
-F '[email protected]' \
-F 'resolution=1K' \
-F 'seed=42'MiniMax 首尾帧与参考媒体
// POST /videos (JSON): first/last frames
{
"model": "minimax-h3", "prompt": "A person turns toward the camera",
"start_frame_url": "https://your-storage.example/start.png",
"end_frame_url": "https://your-storage.example/end.png",
"seconds": 5, "seed": 42
}
// POST /videos (JSON): reference media, without first/last frames
{
"model": "minimax-h3", "prompt": "The person walks through the garden",
"reference_image_urls": ["https://your-storage.example/person.png"],
"reference_video_urls": ["https://your-storage.example/motion.mp4"],
"reference_audio_urls": ["https://your-storage.example/voice.wav"],
"seconds": 5, "seed": 42
}文本返回 choices 和 usage;图片返回 data[].url 或 data[].b64_json。非流式生成结果含 montagea_usage.credits。视频含 object=video、progress、size、seconds,完成后有 result.url;失败原因在 error.code 和 error.message 中。usage 保留已扣/预扣积分。X-Request-ID 和 Inference-Id 标识已受理请求。存储链接可分享;content 下载接口需要该请求所属的 API Key。
用 OpenAI SDK 调用
文本、图片生成/编辑,以及视频创建、查询、轮询和下载均可使用 OpenAI SDK。将 base_url 指向 Montagea,使用 Montagea 模型 ID;其他原生参数放在 extra_body。视频上传使用 input_reference,图片编辑上传使用 image。
from openai import OpenAI
client = OpenAI(base_url="https://api.montagea.com/api/v1", api_key="mtg_...")
reply = client.chat.completions.create(
model="qwen-27b",
messages=[{"role": "user", "content": "Describe a quiet mountain lake."}],
max_tokens=1024,
extra_headers={"Idempotency-Key": "chat-example-2"},
)
print(reply.choices[0].message.content)
image = client.images.generate(
model="qwen-image",
prompt="A quiet mountain lake at sunrise",
n=1,
extra_body={"resolution": "1K", "aspect_ratio": "16:9"},
extra_headers={"Idempotency-Key": "image-example-2"},
)
print(image.data[0].url)
with open("portrait.png", "rb") as reference:
edited = client.images.edit(
model="qwen-image",
image=reference,
prompt="Change the background to a sunny garden",
extra_body={"resolution": "1K", "seed": 42},
extra_headers={"Idempotency-Key": "edit-example-1"},
)
print(edited.data[0].url)
encoded = client.images.generate(
model="qwen-image", prompt="A quiet lake",
size="1536x1024", response_format="b64_json",
extra_headers={"Idempotency-Key": "image-base64-1"},
)
import base64
with open("lake.png", "wb") as output:
output.write(base64.b64decode(encoded.data[0].b64_json))
video = client.videos.create_and_poll(
model="minimax-h3", prompt="A quiet lake at sunrise",
seconds="4", size="1280x720", poll_interval_ms=5000,
extra_headers={"Idempotency-Key": "video-sdk-1"},
)
if video.status == "completed":
client.videos.download_content(video.id).write_to_file("lake.mp4")
else:
print(video.error)函数工具支持 auto、none、required 或指定函数的 tool_choice,以及 parallel_tool_calls。由你的应用执行返回的工具,再用 role=tool 和匹配的 tool_call_id 传回结果。response_format 支持 text、json_object 和 json_schema;结构化输出通过校验后才交付,不会降级为普通文本。每份 Schema 最多 16,000 字符,支持无循环的本地引用,不支持远程/动态引用和正则约束。工具描述、参数、结果及 Schema 内容也会审核。
# Tool calls are returned to your app; Montagea does not execute them.
reply = client.chat.completions.create(
model="qwen-27b",
messages=[{"role": "user", "content": "What is the weather in Paris?"}],
tools=[{"type": "function", "function": {
"name": "get_weather", "strict": True,
"parameters": {
"type": "object", "properties": {"city": {"type": "string"}},
"required": ["city"], "additionalProperties": False,
},
}}],
tool_choice="required",
)
print(reply.choices[0].message.tool_calls)
structured = client.chat.completions.create(
model="qwen-27b",
messages=[{"role": "user", "content": "Return the city Paris."}],
response_format={"type": "json_schema", "json_schema": {
"name": "city", "strict": True,
"schema": {
"type": "object", "properties": {"city": {"type": "string"}},
"required": ["city"], "additionalProperties": False,
},
}},
)
print(structured.choices[0].message.content)
import base64
with open("portrait.png", "rb") as image:
image_url = "data:image/png;base64," + base64.b64encode(image.read()).decode()
vision = client.chat.completions.create(
model="qwen-27b",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Describe this picture."},
{"type": "image_url", "image_url": {"url": image_url}},
]}],
)
print(vision.choices[0].message.content)流式文本
stream=true 读取模型的实时输出。普通文本在生成过程中分段审核后发送,最多进行三次输出审核,每次包含完整对话和已生成的前缀;前两个检查点约为 80 和 1,024 字符,最后一次审核剩余内容。工具参数和 JSON 输出会等完整校验通过后发送。设置 stream_moderation=buffered 可选择整段审核完再发送。保活注释不算首个内容 token,不承诺首 token 低于 5 秒。默认返回末尾 usage,可用 stream_options.include_usage=false 关闭。断开连接不会取消推理;后续审核拒绝或生成中断时,已发送内容无法撤回,已审核部分按记录用量计费,退回其余预留额度。使用同一 Idempotency-Key 重试,或 GET /requests/{id} 恢复记录;部分结果重试不会重新生成,会在 [DONE] 前返回原错误。
stream = client.chat.completions.create(
model="qwen-27b",
messages=[{"role": "user", "content": "Write a short poem about rain."}],
max_tokens=512,
stream=True,
stream_options={"include_usage": True},
extra_headers={"Idempotency-Key": "chat-stream-example-1"},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")错误与重试
错误包含 error.code、error.message 和 error.type,并保留旧版 detail 字段。被拒绝的请求,以及没有交付任何已审核内容的生成失败不扣费。失败的流式请求可能保留已计费的审核通过部分,可通过 /requests/{id} 查看 result.montagea_usage.partial 和 usage。artifact_unavailable 表示已完成、已计费的结果暂时无法读取,请用相同 Idempotency-Key 或视频 ID 重试。model_capability_unavailable 或 tokenizer_unavailable 需要运营方检查模型配置。streaming_price_unavailable 表示渠道报价不足以覆盖分段审核成本,可使用 stream_moderation=buffered 或联系运营方。付费不能绕过审核。
| 400 | content_not_allowed | 提示词或回复含禁止内容,不扣积分。 |
| 401 | invalid_api_key | 密钥缺失、无效或已撤销。 |
| 402 | insufficient_credits · key_budget_exceeded | 付费积分或密钥预算不足。 |
| 403 | paid_account_required · model_not_allowed · account_suspended · channel_only | 账号没有付费记录、模型不在这把密钥的允许范围内、账号已停用,或这把密钥只供 Poe 机器人使用(channel_only)。 |
| 404 | request_not_found | 请求 ID 不存在,或不属于这把密钥。 |
| 409 | idempotency_conflict · request_in_progress · price_changed | 同一个 Idempotency-Key 换了请求内容、原请求还在处理中,或授权后价格发生了变化。 |
| 410 | request_expired | 请求已超过 30 天,内容已删除,无法重放。 |
| 413 | reference_too_large | 参考素材或请求体超过大小上限,不扣费。 |
| 422 | invalid_request · invalid_reference · context_too_large · n_exceeds_limit | 参数无效、对话上下文超限、参考素材无法读取,或一次要的图片数超过账号同时出图上限(n_exceeds_limit)。 |
| 429 | capacity_busy · account_busy · rate_limit | 容量忙、账号已有请求在跑,或超过每分钟限流。按 Retry-After 重试。 |
| 500 | generation_failed · submission_failed | 生成或提交失败,预扣的积分已退回。 |
| 503 | api_unavailable · capacity_unavailable · content_check_unavailable · model_unavailable · artifact_unavailable · tokenizer_unavailable · model_capability_unavailable · streaming_price_unavailable | API、容量、审核服务或结果文件暂时不可用。请稍后使用原请求重试。 |
重试与结果
每次生成发送唯一的 Idempotency-Key。网络中断后用相同 key 和请求内容重试,可取回原操作;相同 key 换内容会返回 409。已失败的操作需要换新 key 才会重新尝试。撤销密钥阻止新调用,已接单任务仍会完成结算。
数据与隐私
- 提示词、回复、参考素材快照和生成文件会在请求创建 30 天后自动删除,仅保留计费记录。我们不会使用 API 数据训练任何模型。
- 提示词、传入的图片/视频/音频以及文字回复会发送至 Google Gemini 进行禁止内容审核。素材不可读或审核不可用时,会在生成前拒绝请求。
- 参考素材快照和生成的图片/视频存储于 Montagea,并在请求创建 30 天后删除。存储 URL 无需登录即可打开,请将其视为可分享链接。