RY.LIVE
DEVELOPER GUIDE

API 接入文档

从第一次请求开始,让灵感连上更多可能。

START HERE / 从这里开始

RY.LIVE 为开发者与团队提供 AI 模型 API 接入、密钥管理与用量查询。使用统一地址,按账户可用模型选择协议;本页说明调用方式、历史验收范围和兼容边界。

页面更新于 2026-10-23(Eliroot Image 2.1 并发与耗时说明;价格数字统一见模型广场) · 示例不含真实密钥 · 以账户授权及当前配置为准

OpenAI 兼容 Base URL

https://ry.live/v1

Anthropic 兼容服务根地址

https://ry.live

服务概览

RY.LIVE 由中山市如云软件开发中心运营,面向需要在应用、脚本与兼容客户端中调用模型的开发者和团队。客服邮箱:1932013@qq.com。经营主体与备案信息见关于本站。

主接入地址为 https://ry.live/v1。先查看模型广场,再通过带密钥的 GET /v1/models 确认账户可见模型。模型名称、授权、端点与能力会随实际配置变化;能列出模型,不代表全部工具、参数或工作流已经兼容。

本文保留对话、Responses、Anthropic Messages、决策、图像和视频接口的示例与历史验收记录。示例仅适用于已开放对应模型和端点的账户,不是当前全站上架清单,也不承诺 GPT、Jev 等示例模型此刻可用。

价格、计费单位、币种与缓存规则请查看模型广场;实际消费还与账户分组及适用折扣有关,以当前配置和使用日志为准。文档不承诺固定价格、固定缓存命中率或响应时效。

01快速开始

  1. 登录控制台,获取有权访问目标模型的 API 密钥。
  2. 在模型广场确认模型名称、端点和实时价格。
  3. 在自己的终端或服务端环境中设置 LLMER_API_KEY,再运行下列示例。

不要把真实密钥写进网页前端、代码仓库、截图或工单。本文不提供在线密钥输入框,也不会在浏览器中调用模型。

BASH / ZSH · 先验证密钥与模型权限
curl --fail-with-body -sS --max-time 30 \
  https://ry.live/v1/models \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}"

返回 data[].id 是该密钥可见的模型名;能列出模型不等于所有推理功能都已通过验证。接着运行对应协议的短请求。

02选择模型与协议

请求中的模型名优先使用兼容情况
eliroot-v4.1-flashChat CompletionsEliroot V4.1 Flash;Anthropic 普通与流式对话已实测,工具调用有限制。
gpt-5.6-luna
gpt-5.6-sol
gpt-5.6-terra
gpt-6-astra
Responses支持 Chat → Responses 兼容转换;并非所有参数或工具都已支持。
jev-latestDecisionsJev决策模型;支持概率判断、分类和评分,不是聊天模型。
minimax-h3-max/text-to-video
minimax-h3-max/image-to-video
VideosMiniMax H3 Max 文生视频与首尾帧视频;提交任务后查询状态,再下载 MP4。
eliroot-image-2.1
eliroot-image-2.1-turbo
Images原版与 Turbo 均支持文生图、参考图编辑,共用单路生成队列;两者价格关系以模型广场为准。
grok-imagine-image
grok-imagine-image-2.0
grok-imagine-image-quality
Images / Tasks同步文生图;成功结果保留在任务日志,可从 ry.live 预览和下载。
grok-imagine-video
grok-imagine-video-1.5
Videos文生视频 / 单参考图生视频;保存任务 ID,轮询状态,完成后下载。
doubao-seedream-5-0-flash
doubao-seedream-5-0-pro
Images / Tasks文生图与参考图生成;同步返回图片,成功后可从 ry.live 取得制品。
doubao-seedance-2-0
doubao-seedance-2-0-fast
doubao-seedance-2-0-mini
doubao-seedance-2-5
Videos文生视频与参考图生视频;分辨率、画幅及参考素材放在 metadata 中。

以上是本文示例与历史验收涉及的模型,不是当前可用模型清单。GPT 的 Responses 流式及 Chat 转换已有样例验收,但不是逐模型、逐参数的完整兼容认证。未确认 eliroot-v4.1-flash 的 Responses 接入或 GPT 的 Anthropic 接入,请勿由协议名称推断支持。

模型的实时价格与账户适用折扣请查看模型广场;下方 Jev 记录仅为标注日期的历史快照,不含当前报价。eliroot-v4.1-flash 与 deepseek-v4.1-flash 是不同的请求名称,不要自行互换或推断它们始终映射到同一服务。请使用本账户 /v1/models 返回的准确名称;历史别名仅在当前目录明确列出时使用。

03Chat Completions 推荐 eliroot-v4.1-flash

POST /v1/chat/completions · 使用 Bearer 鉴权,输入对话放在 messages。

CURL · 普通 JSON 响应
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/chat/completions \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eliroot-v4.1-flash",
    "messages": [{"role": "user", "content": "23+19等于多少?只输出数字。"}],
    "max_tokens": 512,
    "stream": false
  }'

普通响应从 choices[0].message.content 读取文本。开启流式时,将 stream 改为 true 并给 curl 加 -N;逐个处理 SSE 数据块中的 choices[].delta,不要将整段流作为一个 JSON 解析。

对于已开放 GPT 模型且启用 Chat → Responses 兼容策略的账户,请求可由 RY.LIVE 转换至 Responses。优先参考下一节的原生 Responses 示例;特殊参数、工具或客户端工作流需要单独验证。

04Responses 推荐 GPT 系列

以下保留已验收的调用示例,仅适用于当前账户已开放对应模型与 Responses 端点的情况。运行前请核对模型广场与 /v1/models,不要将历史示例视为当前可用性保证。

POST /v1/responses · 使用 Bearer 鉴权,输入放在 input。下面采用已验收的流式请求结构。

CURL · SSE 流式响应
curl --fail-with-body -sS -N --max-time 120 \
  https://ry.live/v1/responses \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-terra",
    "input": [{
      "type": "message",
      "role": "user",
      "content": [{"type": "input_text", "text": "Reply with exactly RESPONSES_OK."}]
    }],
    "max_output_tokens": 128,
    "stream": true
  }'

按事件处理输出:response.output_text.delta 提供文本增量,response.completed 表示正常完成。不要用 Chat 的 choices 解析器读取 Responses。错误、失败事件或中途断开不等于成功完成。

两种协议的参数不能直接互换:Chat 使用 messages,Responses 使用 input。文件、搜索、后台任务、会话持久化等功能需要分别确认支持情况,不能仅凭端点可访问就推断可用。

05Anthropic Messages 有限兼容

POST /v1/messages · 使用 x-api-key 和 anthropic-version: 2023-06-01。这是协议转换,不是 Claude 模型服务。

CURL · eliroot-v4.1-flash 普通对话
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/messages \
  -H "x-api-key: ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eliroot-v4.1-flash",
    "max_tokens": 512,
    "system": "请简洁回答。",
    "messages": [{"role": "user", "content": [{"type": "text", "text": "23+19等于多少?只输出数字。"}]}]
  }'

读取 content 中 type="text" 的文本块。系统提示词使用顶层 system。流式调用加 "stream": true 与 curl -N;已实测收到 message_start、content_block_delta、message_stop 等事件。

兼容范围与已知限制 · 2026-09-21 实测,暂未修复

已验证:普通对话与文本 SSE 可用;测试脚本主动执行工具结果回传后,可以完成工具往返。这不等于标准 Agent 能自动完成工具调用。

已知问题:返回内容包含 tool_use 工具块,但 stop_reason 是 end_turn,而不是 tool_use。补测 Chat 接口同样发现:存在 tool_calls 时,finish_reason 仍为 stop;当前转换逻辑将它映射为 end_turn。

使用影响:依赖结束标记驱动工具执行的 Anthropic 客户端或 Agent 可能提前结束。本接口目前仅建议用于已验证的普通对话与文本流式场景,不应视为完整 Anthropic 工具兼容。更改模型名称不会解决此问题;历史兼容性实测不等于新名称下的重新验收。

处理边界:本次仅更新说明,不修改服务。后续若修复,应在响应转换层对完整有效的工具调用纠正结束标记,同时覆盖普通响应与流式收尾;不得把截断、拒绝、断流或不完整参数误标为可执行工具调用。修复并完成回归测试前,保留此限制。

尚未验收图片、扩展思考、缓存控制、流式工具参数、多工具并行或完整 Claude Code / WorkBuddy 工作流。请勿将基础接口测试通过等同于这些功能已兼容。

06Jev决策模型 jev-latest

本节为 Jev 接入的历史示例与验收范围,不表示当前已上架。仅在账户已开放 jev-latest 及 Decisions 端点时使用;以模型广场与账户可用目录为准。

POST /v1/decisions · 使用本站 API Key 的 Bearer 鉴权与 Content-Type: application/json。输入为 state + questions,响应为 answers,适合工单分类、规则判断和评分。

RY.LIVE 对外路径是 /v1/decisions,不支持 /v1/systemone。使用 SDK 时确认请求路径,也不要把 Jev 配成 Chat Completions、Responses 或 Anthropic 聊天模型。Agent 可通过独立 HTTP 工具调用此接口。

请求字段与三种题型

model 填 jev-latest;state 是待评估的字符串、对象或数组;questions 是非空对象。每个问题需有 type 和 instructions,后者同样接受字符串、对象或数组。问题键名仅用于对应返回结果,请把实际判断要求写入 instructions。

typecriteria(本站当前支持范围)读取结果
noul · 是非判断可省略;或以 true、false 为键,字符串描述判断标准。answers.问题名.noul:0–1 的“是”概率,不是布尔值。
choice · 分类必填;1–255 个选项的对象,值为字符串描述或 null。choice 为选项名;probabilities 为分布,另有 confidence。
score · 评分必填;按顺序排列的 2–10 个字符串等级。score 为 0 到等级数减 1 之间的加权值,可为小数;另有 legend、probabilities、confidence。
CURL · 一次请求包含三种题型
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/decisions \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jev-latest",
    "state": "客户反馈被重复扣款,需要今天协助处理。",
    "questions": {
      "billing": {
        "type": "noul",
        "instructions": "这是否属于账单问题?"
      },
      "team": {
        "type": "choice",
        "instructions": "应交由哪个支持团队处理?",
        "criteria": {"billing": "付款、账单与退款", "technical": "软件故障"}
      },
      "urgency": {
        "type": "score",
        "instructions": "评估这条工单的紧急程度。",
        "criteria": ["低", "中", "高"]
      }
    }
  }'

下面仅为响应结构示意,概率、置信度与用量不是固定结果。不要使用聊天接口的 choices 或文本增量解析器。

JSON · 响应结构示意
{
  "model": "jev-1.13.0",
  "answers": {
    "billing": {"type": "noul", "noul": 0.98},
    "team": {
      "type": "choice", "choice": "billing",
      "probabilities": {"billing": 0.98, "technical": 0.02},
      "confidence": 0.86
    },
    "urgency": {
      "type": "score", "score": 1.65,
      "legend": {"0": "低", "1": "中", "2": "高"},
      "probabilities": {"0": 0.05, "1": 0.25, "2": 0.70},
      "confidence": 0.40
    }
  },
  "usage": {"input_tokens": 363, "output_tokens": 62}
}

计费、上下文与兼容边界

  • 历史计费口径(2026-09-21,非当前报价):当时按响应中的 usage.input_tokens 计费,usage.output_tokens 仍记录用量;当前是否开放、价格及实际扣款规则以模型广场和账户配置为准。
  • 上下文限制:整次请求 64k tokens,state 加最长单题 32k tokens。仅文本及文本结构化数据,不支持图片、音频或视频输入。
  • 不支持 SSE;省略 stream。不使用聊天的 messages、max_tokens、max_output_tokens 或 reasoning_effort。输出为固定类型答案,没有通用文本最大输出设置。
  • 历史验收请求名为 jev-latest,当时实测响应模型为 jev-1.13.0;当前可用性与响应版本可能变化。不要据此推断版本号或 preview 可直接作为本站请求名。
  • 本站适配暂不接受嵌套对象/数组形式的 criteria,请使用上表的字符串或 null 形式。结构校验通过不代表判断一定正确;重要决策需人工复核,并用自己的中文业务样本评估准确率。

验收范围:2026-09-21 已通过三种题型、鉴权、消费日志与隔离计费测试;未验收完整 Agent 工作流或生产并发上限。400/422 先检查题型和 criteria,401 检查本站密钥,429 降低并发;502 请提供请求 ID 排查,勿无限重试。

通过 RY.LIVE 调用时,以本页路径、请求格式和兼容范围为准。

ComfyUI 节点与可导入工作流:本地图片直传 MinIO、首尾帧、多参考图和已有结果下载。

H3-Local 与 Agent 媒体接入:本地参考图上传、首尾帧与多参考图、图片视频断点下载。Agent 自动上传至 MinIO,无需外部 OSS。调用契约与工具绑定 · 工具定义 JSON;Python 示例默认授权直传 MinIO。

07MiniMax H3 Max 视频生成 异步 Videos API

使用本站 API Key 的 Authorization: Bearer … 鉴权。文生视频选择 minimax-h3-max/text-to-video;单张图片、首尾两帧或仅尾帧选择 minimax-h3-max/image-to-video。账户可用模型与当前价格请查看模型广场。

  1. POST https://ry.live/v1/videos:提交 JSON 或 multipart 请求,保存响应中的 id。
  2. GET https://ry.live/v1/videos/{id}:每隔 5 秒查询一次,直到 status 为 completed 或 failed。
  3. GET https://ry.live/v1/videos/{id}/content:仅在完成后下载 MP4;使用同一账户的有效本站密钥。
提交成功返回 HTTP 200,表示任务已受理;视频生成仍在后台进行。请先保存任务 ID,再查询进度。POST 超时或断线时不要自动重新提交,以免创建重复任务;查询超时后可用已保存的 ID 继续查询。

全部请求参数

JSON 中整数用数字、布尔值用 true / false;multipart 的文本字段传对应字符串。整数参数也接受十进制整数字符串。下表列出本站接受的全部字段,未列出的字段会被拒绝。

字段类型与默认值取值、用途与限制
model字符串 · 必填上方两个完整模型名之一。
prompt字符串 · 必填1–50,000 字符,不能全为空白。描述画面、运动、镜头及需要的声音或对白。
seconds
duration
整数 · 默认 5视频时长,5–15 秒,含端点。两者为别名;同时填写时数值必须相同。
resolution
size
字符串 · 默认 768P480P、768P、1080P,不区分大小写。两者为别名,同时填写时必须一致。size 只接受分辨率标签,不接受 1280x720 等像素尺寸。
aspect_ratio字符串 · 文生默认 16:9仅文生视频可用:21:9、16:9、4:3、1:1、3:4、9:16。图生视频不得携带此字段,画幅随图片确定。
image_url
input_reference
HTTPS URL;或 multipart 图片文件 · 无默认值仅图生视频可用,作为首帧。两者为别名,不能同时提供,即使内容相同也不行。
end_image_urlHTTPS URL;或 multipart 图片文件 · 无默认值仅图生视频可用,作为尾帧。可与一个首帧字段一起提供,也可单独提供。
seed整数 · 省略时随机0–2,147,483,647。固定 seed 便于对比参数,不保证每次输出逐帧相同。
prompt_expansion_mode字符串 · 默认 balanceddisabled 保留原提示词;balanced 进行快速改写;quality 进行更充分改写,可能额外等待约 30 秒。取值区分大小写。
enable_safety_checker布尔值 · 默认 true是否启用安全检查。JSON 必须传布尔值;multipart 文本仅接受 true 或 false。
target_audio_urlHTTPS URL · 可选指定输出音轨。音频至少 2 秒、最大 15 MB;长于视频时保留开头并裁剪,短于视频时补静音,不改变播放速度。原音频替换输出音轨;高采样率可能重采样。本站仅接受 HTTPS 链接,不接受音频文件上传或 data URI。
sync_mode布尔值 · 固定 false省略或填写 false;不支持同步返回 base64。完成后通过 /content 下载。

图片、别名与不支持的输入

  • 图生视频至少提供首帧或尾帧之一。提供首帧时输出画布跟随首帧;只提供尾帧时跟随尾帧。文生视频不能携带任何首尾帧字段。
  • 图片可使用可公开读取的 HTTPS URL,或 multipart 上传非空的 PNG、JPEG、WebP 文件,每张不超过 20 MiB。链接应直接返回媒体内容,不需要额外登录或请求头;URL 最长 16,384 字符。
  • 本站不接受 HTTP、base64 data URI、本地路径作为 JSON URL,也不接受链接中的用户名密码、端口或 #fragment。本地文件请使用下方 multipart 示例。
  • 每个 multipart 字段只提供一次,不能对同一字段同时传文本和文件。文件字段仅支持 image_url、input_reference、end_image_url。
  • 不要添加 stream、messages、n、negative_prompt、reference_image_urls、reference_video_urls 或 reference_audio_urls 等字段。本节不提供聊天、SSE、Turbo、参考素材生成、视频编辑、remix、任务列表、取消或删除接口。

通过 RY.LIVE 调用时,以本页路径、输入限制和响应结构为准。

文生视频 · JSON

下面提交 5 秒、768P、16:9 视频。prompt_expansion_mode 设为 disabled,便于按原提示词生成;需要改写时可改为 balanced 或 quality。

CURL · 提交文生视频任务
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "minimax-h3-max/text-to-video",
    "prompt": "一只白猫穿过阳光下的花园,镜头缓慢跟随,树叶轻轻摇动,背景有自然鸟鸣。",
    "seconds": 5,
    "resolution": "768P",
    "aspect_ratio": "16:9",
    "prompt_expansion_mode": "disabled"
  }'

首尾帧视频 · JSON 与本地图片

下面两个 example.com 图片链接仅为占位,运行前必须替换成自己的可读取 HTTPS 图片链接。只需首帧时删除 end_image_url;只需尾帧时删除 image_url。图生请求不要添加 aspect_ratio。

CURL · HTTPS 首尾帧
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "minimax-h3-max/image-to-video",
    "prompt": "人物缓慢转向镜头,从首帧自然过渡到尾帧,保持人物外观与场景一致。",
    "seconds": 5,
    "resolution": "768P",
    "image_url": "https://example.com/replace-with-your-first-frame.png",
    "end_image_url": "https://example.com/replace-with-your-last-frame.png",
    "prompt_expansion_mode": "disabled"
  }'

上传本地图片时,先把当前目录中的 first.png、last.jpg 替换为自己的文件。curl 会生成 multipart 的 Content-Type 和边界,无需手动设置。

CURL · multipart 上传本地首尾帧
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -F 'model=minimax-h3-max/image-to-video' \
  -F 'prompt=人物缓慢转向镜头,从首帧自然过渡到尾帧,保持外观一致。' \
  -F 'seconds=5' \
  -F 'resolution=768P' \
  -F 'prompt_expansion_mode=disabled' \
  -F 'image_url=@first.png;type=image/png' \
  -F 'end_image_url=@last.jpg;type=image/jpeg'

任务响应、查询与下载

提交响应中的 id 是后续查询与下载所需的任务 ID。下方所有 JSON 均为结构示意,task_EXAMPLE、时间戳和结果 URL 都是占位值;请使用自己的实际响应。没有 task_id、request_id 或状态 URL 字段。

JSON · 提交成功,HTTP 200
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "minimax-h3-max/text-to-video",
  "status": "queued",
  "progress": 0,
  "created_at": 1790121600
}

把实际 id 保存到环境变量 VIDEO_ID,例如在终端中设置后运行下面的查询。状态可能为 queued(排队)、in_progress(生成中)、completed(完成)、failed(失败)或 unknown(暂不能确定);progress 为 0–100 的进度提示,不代表剩余时间。只有 completed 才可以下载。

CURL · 查询已有任务
curl --fail-with-body -sS --max-time 30 \
  "https://ry.live/v1/videos/${VIDEO_ID:?请先设置提交响应中的 id}" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}"
JSON · 生成完成,HTTP 200
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "minimax-h3-max/text-to-video",
  "status": "completed",
  "progress": 100,
  "created_at": 1790121600,
  "completed_at": 1790121620,
  "video": {
    "url": "https://example.com/result.mp4",
    "content_type": "video/mp4"
  }
}

created_at、成功时的 completed_at 为 Unix 秒。建议通过本站 /content 下载,成功响应为 Content-Type: video/mp4 的视频字节;同一路径也支持带鉴权的 HEAD,仅返回响应头。不要把本站 Authorization 请求头发送给 video.url 指向的外部地址。下面命令在下载成功后将临时文件保存为当前目录的 h3-video.mp4。

CURL · 完成后下载 MP4
curl --fail-with-body -sS --max-time 120 \
  "https://ry.live/v1/videos/${VIDEO_ID:?请先设置已完成任务的 id}/content" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  --output h3-video.mp4.part && mv h3-video.mp4.part h3-video.mp4

生成失败时,查询仍可能返回 HTTP 200,必须检查 status 和 error,停止轮询并读取错误信息。

JSON · 任务生成失败,HTTP 200
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "minimax-h3-max/text-to-video",
  "status": "failed",
  "progress": 100,
  "created_at": 1790121600,
  "error": {
    "code": "video_generation_failed",
    "message": "Video generation failed"
  }
}

参数错误通常返回 HTTP 400,例如时长超出 5–15 秒。其他错误可能使用顶层 message,因此客户端应兼容 error.message 与 message 两种错误说明。

JSON · 参数校验失败,HTTP 400
{
  "error": {
    "message": "duration must be an integer between 5 and 15 (request id: EXAMPLE)",
    "type": "new_api_error",
    "code": ""
  }
}

查询不存在的任务 ID 返回 HTTP 400(task_not_exist);下载尚未完成的任务返回 HTTP 400。下载不存在或不属于当前账户的任务返回 HTTP 404。请核对保存的 ID 与账户,不要据此重复创建任务。

Python · 提交、保存任务 ID、轮询与下载

只使用 Python 标准库。先设置 LLMER_API_KEY,将示例保存为 h3_video.py 后运行。未设置 VIDEO_ID 时每次运行都会提交新任务;设置后则只继续查询该任务。程序会打印 ID 并写入当前目录的 h3-video-id.txt,每 5 秒查询一次,最多等待 15 分钟;超时退出后设置原 ID 即可恢复查询。

PYTHON · 无需安装第三方包
import json
import os
from pathlib import Path
import shutil
import sys
import time
from urllib.error import HTTPError, URLError
from urllib.parse import quote
from urllib.request import Request, urlopen

BASE_URL = "https://ry.live/v1/videos"
API_KEY = os.environ.get("LLMER_API_KEY", "")
if not API_KEY:
    sys.exit("请先设置 LLMER_API_KEY 环境变量")
HEADERS = {"Authorization": "Bearer " + API_KEY}
WAIT_SECONDS = 900
POLL_SECONDS = 5


def error_message(body):
    if not isinstance(body, dict):
        return str(body)
    error = body.get("error")
    if isinstance(error, dict) and error.get("message"):
        return str(error["message"])
    return str(body.get("message") or error or "未知错误")


def request_json(url, payload=None, timeout=30):
    headers = dict(HEADERS)
    data = None
    if payload is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
    # 仅 payload 不为空时提交 POST;不自动重试任何请求。
    with urlopen(Request(url, data=data, headers=headers), timeout=timeout) as response:
        result = json.load(response)
    if not isinstance(result, dict):
        raise RuntimeError("响应不是 JSON 对象")
    if result.get("error") or (result.get("message") and "status" not in result):
        raise RuntimeError(error_message(result))
    return result


try:
    video_id = os.environ.get("VIDEO_ID", "").strip()
    if not video_id:
        task = request_json(BASE_URL, {
            "model": "minimax-h3-max/text-to-video",
            "prompt": "白猫穿过阳光下的花园,镜头缓慢跟随,背景有鸟鸣。",
            "seconds": 5,
            "resolution": "768P",
            "aspect_ratio": "16:9",
            "prompt_expansion_mode": "disabled",
        }, timeout=120)
        video_id = task.get("id")
        if not isinstance(video_id, str) or not video_id:
            raise RuntimeError("提交响应没有任务 id;请检查记录,勿自动重新提交")

    print("任务 ID:", video_id, flush=True)
    Path("h3-video-id.txt").write_text(video_id + "\n", encoding="utf-8")
    task_url = BASE_URL + "/" + quote(video_id, safe="")
    deadline = time.monotonic() + WAIT_SECONDS
    while True:
        remaining = deadline - time.monotonic()
        if remaining <= 0:
            raise TimeoutError("等待已达上限;设置 VIDEO_ID 为上述 ID 后可继续查询")
        task = request_json(task_url, timeout=min(30, remaining))
        status = task.get("status")
        print("状态:", status, "进度:", task.get("progress"), flush=True)
        if status == "completed":
            break
        if status == "failed":
            raise RuntimeError(error_message(task))
        if status not in {"queued", "in_progress", "unknown"}:
            raise RuntimeError("无法识别任务状态,请保留 ID 后联系支持")
        remaining = deadline - time.monotonic()
        if remaining > 0:
            time.sleep(min(POLL_SECONDS, remaining))

    # 只向本站 content 端点发送鉴权,不请求 task["video"]["url"]。
    temporary = Path("h3-video.mp4.part")
    with urlopen(Request(task_url + "/content", headers=HEADERS), timeout=120) as response:
        if response.headers.get_content_type() != "video/mp4":
            raise RuntimeError("下载响应不是 MP4;请保留任务 ID 后检查")
        with temporary.open("wb") as output:
            shutil.copyfileobj(response, output)
    temporary.replace("h3-video.mp4")
    print("已保存 h3-video.mp4")
except HTTPError as exc:
    raw = exc.read().decode("utf-8", errors="replace")
    try:
        message = error_message(json.loads(raw))
    except ValueError:
        message = raw[:500] or exc.reason
    sys.exit(f"HTTP {exc.code}: {message};不会自动重新提交")
except (URLError, OSError, ValueError, RuntimeError) as exc:
    sys.exit(f"请求已停止:{exc}。保留已打印的 ID;POST 结果不明时不要自动重发。")

恢复查询时,将 h3-video-id.txt 中的值设为 VIDEO_ID 后再次运行。等待上限只控制本次查询,不会取消后台任务。修改为图生视频时,将请求模型改为 minimax-h3-max/image-to-video,删除 aspect_ratio,并加入自己的 HTTPS 首帧或尾帧 URL。

08Eliroot Image 2.1 图像生成与编辑 Images API

原版与 Turbo(2026-10-22 起由单节点提供服务)。eliroot-image-2.1 与 eliroot-image-2.1-turbo 均支持文生图与 1–4 张参考图编辑,输出上限为 1K 像素预算;两个模型的文生图、图生图共用单路生成(同一时间只运行 1 个任务,最多 3 个排队),生成超时为 600 秒。请使用具备该模型权限的普通 API Key 调用。遇到繁忙、维护或结果不明的请求时,先核对状态与用量,勿循环重试。

使用本站普通 API Key,通过 Authorization: Bearer <API_KEY> 鉴权。不要使用管理令牌;密钥仅放在自己的终端或服务端环境变量中。下列示例使用 https://ry.live。实时价格和账户权限以模型广场及账户配置为准。

场景端点请求与返回
文生图POST /v1/images/generationsapplication/json;同步返回图片 Base64。
图生图 / 参考图编辑POST /v1/images/editsmultipart/form-data;上传静态图片文件,同步返回图片 Base64。

提交接口仍同步返回 b64_json,可由客户端解码保存 PNG;后台同时建立持久任务记录,成功图片也可在控制台任务日志中预览和下载。不使用 messages,不返回视频式任务 ID,不支持 SSE、图片 URL 输入、独立 mask 或 response_format=url。

参数与资源限制

参数 / 限制当前约束
model原版使用 eliroot-image-2.1;Turbo 使用 eliroot-image-2.1-turbo。两个模型均支持文生图和图生图。
prompt必填非空文本,最多 16,000 字符。编辑时明确哪些内容改变、哪些内容保留;多参考时按“图 1、图 2”指代上传顺序。
size默认或 auto 都是 1024x1024,不会自动沿用输入图尺寸。自定义格式为 宽x高;宽高各为 256–2752 范围内的 32 倍数,并且宽 × 高不得超过 1024 × 1024 = 1,048,576 像素。文生图和图生图均不接受 2K 输出。
n只能为 1,表示输出图片数量,不是参考图数量。多参考输入仍只输出 1 张。
response_format仅 b64_json;不支持 url。
quality可用 auto、high、standard;每个模型的三个选项均使用相同参数:原版 40 步、Turbo 8 步,guidance 均为 1;选项本身不改变速度或质量档位。
seed可选整数,范围 0–4294967295(含边界),默认 42。相同 seed 不保证跨版本、跨环境或改动参考图后逐像素复现。
参考图字段与数量支持 1–4 张参考图。单图可使用一次 image 或一项 image[];2–4 图必须重复提交 image[],按提交顺序理解“图 1、图 2……”。不可混用两种字段,也不可重复提交 image。
图片格式与大小只上传静态 PNG、JPEG 或 WebP;每图最多 10 MiB,整个 multipart 请求最多 32 MiB(含表单字段和边界开销)。参考图解码后每图最多 16 × 1024 × 1024 = 16,777,216 像素,累计最多 32 × 1024 × 1024 = 33,554,432 像素;输入图上限不等于输出分辨率上限。
JSON 请求体文生图完整请求体最多 64 KiB;字符上限与字节上限必须同时满足。客户端把中文转为 \uXXXX 时可能增加请求体大小。
并发与等待原版与 Turbo 的两种接口共用 1 个运行/预留名额和最多 3 个等待名额,按提交顺序处理;队列满额返回 503 queue_full。1024×1024 单张参考耗时(不含排队):原版约 170 秒,Turbo 约 45–55 秒。服务端最多排队 600 秒,开始推理后另有 600 秒生成时限。经 https://ry.live 访问时,单次请求最长等待约 600 秒,超过后返回 524,但任务可能仍在运行并照常计费;请到任务日志核对并下载,不要重复提交。等待超时任务失败并退款,排队不保证最终成功。
尺寸需要同时满足边长和总像素约束,例如 1024x1024、768x1280 均在像素预算内;2048x2048 不在范围内。不要仅看单边最大值判断尺寸是否允许。
选择 Turbo:下面所有文生图、图生图示例都可将 model 替换为 eliroot-image-2.1-turbo,其它字段不变。Turbo 与原版使用同一套接口和字段,两者价格关系、分组折扣与实时价格以模型广场为准。

文生图:JSON 请求

以下命令不会自动重试。成功时响应文件包含较长的 Base64,而不是可直接打开的 PNG;解码方法见后面的 Python 示例。发生 HTTP 错误时,--fail-with-body 会保留错误正文并返回非零退出码。

CURL · 文生图
curl --fail-with-body -sS --max-time 1320 \
  https://ry.live/v1/images/generations \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eliroot-image-2.1",
    "prompt": "一只蓝色陶瓷杯,白色背景,柔和自然光,产品摄影。",
    "size": "1024x1024",
    "n": 1,
    "quality": "auto",
    "response_format": "b64_json",
    "seed": 42
  }' \
  -o image-response.json

图生图:上传本地图片

将 reference.png 替换成自己的文件路径。让 curl 自动生成 multipart 的 Content-Type 与 boundary;不要手动添加 Content-Type: application/json。--form-string 将文本作为普通字段发送,避免提示词中的 @ 被当成文件路径。

CURL · 单参考图编辑
curl --fail-with-body -sS --max-time 1320 \
  https://ry.live/v1/images/edits \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  --form-string 'model=eliroot-image-2.1' \
  --form-string 'prompt=将图中的红色陶瓷杯改为蓝色,保留杯上的黄色星形、杯柄、构图和白色背景。' \
  --form-string 'size=1024x1024' \
  --form-string 'n=1' \
  --form-string 'response_format=b64_json' \
  --form-string 'seed=42' \
  -F 'image=@reference.png;type=image/png' \
  -o image-response.json
双参考图按下面的顺序上传:图 1 是第一个 image[],图 2 是第二个。使用 3 或 4 张时,继续按顺序重复 image[],并在提示词中说明图 3、图 4 的用途。参考数量不是 n,输出仍为 1 张。不要混合使用 image 和 image[],也不要重复使用 image。
CURL · 双参考图编辑
curl --fail-with-body -sS --max-time 1320 \
  https://ry.live/v1/images/edits \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  --form-string 'model=eliroot-image-2.1' \
  --form-string 'prompt=把图1中带黄色星星的红色陶瓷杯放在图2的蓝色盘子上,保留两件物体的颜色和形状,白色背景。' \
  --form-string 'size=1024x1024' \
  --form-string 'n=1' \
  --form-string 'response_format=b64_json' \
  -F 'image[]=@reference-1.png;type=image/png' \
  -F 'image[]=@reference-2.png;type=image/png' \
  -o image-response.json

成功响应与保存图片

以下为结构示意,Base64 内容经过省略,不能直接解码。仅 HTTP 200 不足以证明拿到图片;还需确认 data[0].b64_json 存在、可解码且内容是 PNG。

JSON · 成功响应结构示意
{
  "created": 1791547200,
  "data": [
    {"b64_json": "iVBORw0KGgo...省略的PNG内容..."}
  ]
}

Python 示例依赖 requests,请在自己的 Python 环境安装。默认执行文生图;编辑时把 REFERENCES 改为一个本地 PNG 路径,并改写提示词。这个简化示例只读取 PNG 参考文件,请勿直接传入 JPEG / WebP 后只改文件扩展名;这两种格式可使用上面的 curl 上传方式,并填写对应文件名及 image/jpeg / image/webp 类型。多参考编辑时,按参考顺序在 REFERENCES 中填写 1–4 个 PNG 路径,并用“图 1、图 2……”说明各图用途。密钥从 LLMER_API_KEY 读取,不写在代码里;发生网络异常、超时或 HTTP 错误时停止,不自动重发可能已计费的请求。

PYTHON / REQUESTS · 生成或编辑并保存 PNG
import base64
from contextlib import ExitStack
import os
from pathlib import Path
import sys

import requests

BASE_URL = "https://ry.live/v1"
REFERENCES = []  # 文生图;本示例仅用 PNG 参考图,如 ["reference.png"]
OUTPUT = Path("eliroot-image.png")
key = os.environ.get("LLMER_API_KEY", "").strip()
if not key:
    sys.exit("请先设置 LLMER_API_KEY 环境变量")
if OUTPUT.exists():
    sys.exit("输出文件已存在;请改名,避免覆盖")

fields = {
    "model": "eliroot-image-2.1",
    "prompt": "一只蓝色陶瓷杯,白色背景,柔和自然光,产品摄影。",
    "size": "1024x1024",
    "n": 1,
    "quality": "auto",
    "response_format": "b64_json",
    "seed": 42,
}
headers = {"Authorization": "Bearer " + key}
try:
    # 单次 POST;不配置重试,不跟随跳转携带密钥。
    with ExitStack() as stack:
        if REFERENCES:
            files = []
            for index, filename in enumerate(REFERENCES, 1):
                handle = stack.enter_context(open(filename, "rb"))
                files.append(("image[]", (f"reference-{index}.png", handle, "image/png")))
            response = requests.post(
                BASE_URL + "/images/edits", headers=headers,
                data=fields, files=files, timeout=(15, 1320), allow_redirects=False,
            )
        else:
            response = requests.post(
                BASE_URL + "/images/generations", headers=headers,
                json=fields, timeout=(15, 1320), allow_redirects=False,
            )
    if response.status_code != 200:
        request_id = response.headers.get("X-Request-ID", "未提供")[:120]
        sys.exit(f"HTTP {response.status_code},请求 ID: {request_id};停止,不自动重试")
    result = response.json()
    items = result.get("data")
    if not isinstance(items, list) or len(items) != 1:
        raise ValueError("响应不是一张图片")
    encoded = items[0].get("b64_json")
    if not isinstance(encoded, str) or not encoded:
        raise ValueError("响应没有 b64_json")
    raw = base64.b64decode(encoded, validate=True)
    if not raw.startswith(b"\x89PNG\r\n\x1a\n"):
        raise ValueError("解码结果不是 PNG")
    with OUTPUT.open("xb") as output:
        output.write(raw)
    print(f"已保存 {OUTPUT},{len(raw)} 字节")
except (requests.RequestException, OSError, ValueError, TypeError, AttributeError) as exc:
    sys.exit(f"请求或保存失败({type(exc).__name__});结果不明时先核对用量,不自动重试")

这里的 timeout=(15, 1320) 分别控制连接和读取等待,不是服务完成承诺,也不是取消后台生成的指令。收到超时后先核对任务日志和账户用量,再决定是否手动重发。

任务日志与再次下载

登录控制台,进入任务日志,找到本模型的成功任务,点击“制品”预览图片,再点击“下载”保存 PNG。消费日志记录扣费,任务日志记录进度和结果。重复下载已有图片不重新推理、不再次收费。上线前的历史同步图片没有可靠的账户归属记录,不会自动补入任务日志。

程序化下载时,先从自己的任务日志取得任务 ID,再用普通 API Key 查询 GET /v1/tasks/{task_id}/artifacts,读取返回的 content_url;也可携带自己的 Bearer 请求 GET /v1/tasks/{task_id}/artifacts/image/content。只有成功任务可下载,不能访问其他账户的任务。

带 access 参数的下载链接本身就是访问凭证,持有链接者可获取图片,请勿公开或写入共享日志。连接超时、关闭页面或下载失败不等于生成失败;先核对任务状态,成功任务应再次下载,而不是重新提交生成。未承诺永久保存期限,请及时把图片下载到自己的设备。

本模型错误排查

下面的状态和错误码描述模型服务的拒绝原因;经过本站网关时可能被包装成不同 HTTP 状态或 error 结构,例如上游超时在外层表现为 500。请同时保留实际 HTTP 状态、脱敏错误码、时间和 Request ID,不要只按单个状态码判断。

现象 / 模型服务错误处理方式
503 generation_disabled模型生成因停用或维护暂时关闭;等待恢复通知,不连续重试。网关也可能先拒绝不可用模型。
503 queue_full运行/预留与等待名额已满,本次未接收新任务。不要连续重试,稍后人工确认后再提交。
401 / 403 / 模型不可用检查普通 API Key 的有效性、模型权限及服务开放状态;不要改用管理令牌绕过。
400 invalid_size / too_many_images / invalid_image检查输出总像素、32 倍数、参考数量和真实文件内容;同时确保 n=1、b64_json。URL、mask、聊天及流式参数不属于本接口。
400 mixed_image_fields / duplicate_field不要混合提交 image 与 image[];单数 image 只能出现一次,多参考请重复使用 image[]。其他普通表单字段也不能重复。
413 request_too_large / invalid_image_size / image_dimensions_too_large压缩文件或降低输入像素;同时遵守单图 10 MiB、multipart 请求 32 MiB、JSON 请求 64 KiB 及上表的单图 / 累计输入像素限制。
415 json_required / multipart_required文生图发送 JSON,图生图发送带文件的 multipart;不要手动破坏 multipart boundary。
504 queue_timeout / generation_timeout分别表示排队超过 600 秒、推理超过 600 秒;任务失败后退还预扣额度。先确认最终任务状态和用量,不自动重发。
524(经 ry.live 等待超过约 600 秒)连接被前置网络断开,不代表生成失败;任务可能仍在运行并照常计费。进入任务日志核对状态,成功后直接下载,不重复生成。
502 image_artifact_unavailable / 网络中断图片可能已生成并正常计费,但同步响应或下载失败。进入任务日志核对;成功任务直接再次下载,不重复生成。

09Grok 生图 Images / Tasks

使用 RY.LIVE 的普通 API Key,而不是 xAI 官网密钥。先通过 GET /v1/models 确认权限;价格见模型广场。下列两种生图方式二选一,每次提交都会创建新的生成请求。

模型resolutionquality
grok-imagine-image1k(默认)、2k省略或 auto
grok-imagine-image-2.01k(默认)、1.5k、2kauto(按 low 处理)、low、medium
grok-imagine-image-quality1k(默认)、1.5k、2k省略或 auto

prompt 必填;n 为 1–10 的整数,默认 1。aspect_ratio 默认 auto,可选 1:1、16:9、9:16、4:3、3:4、3:2、2:3、2:1、1:2、19.5:9、9:19.5、20:9、9:20、21:9、5:2。以上为本站当前接入范围;不支持 Grok 图片编辑、聊天参数或 SSE。

方式 A · 保持标准生图接口

CURL · 同步生成图片
curl --fail-with-body -sS --max-time 300 \
  https://ry.live/v1/images/generations \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-imagine-image",
    "prompt": "一只蓝色陶瓷杯,白色背景,柔和自然光,产品摄影。",
    "n": 1,
    "resolution": "1k",
    "aspect_ratio": "1:1",
    "response_format": "url"
  }' -o grok-image-response.json

等待生成后返回 created 和 data[].url;将 response_format 改为 b64_json 时,优先读取 data[].b64_json 并解码图片。Base64 转换失败时可能只返回 URL,客户端应检查字段并使用 URL 或本站制品下载,不要直接判定生成失败。文件类型以实际内容为准,不要一律当作 PNG。返回结构不变,没有 task_id;成功的新请求同时保留任务与制品,可登录 ry.live → 任务日志预览、下载或取得任务 ID。

请使用 resolution 和 aspect_ratio,不要发送 size、style、stream、negative_prompt 等未支持字段;Grok 的 /v1/images/edits 尚未启用。

返回的图片 URL 可能是上游临时链接,不保证长期有效,也不要向该链接发送本站 API Key。需要从 ry.live 下载时,按下方制品流程操作。普通生图接口不提供边生成边推送的实时进度;超时或断线先核对任务日志,不要自动重发。

方式 B · 程序需要保存任务 ID

使用通用任务入口,参数直接放在 JSON 顶层,不嵌套 input。这仍可能等待上游同步生成,不是立即返回 ID 的后台生图接口;不要与方式 A 对同一张图重复提交。此入口不做标准图片接口的 Base64 转换,请省略 response_format,随后通过制品接口下载。

CURL · 生成并保存任务收据
curl --fail-with-body -sS --max-time 300 \
  https://ry.live/v1/tasks/xai-imagine \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-imagine-image",
    "prompt": "一只蓝色陶瓷杯,白色背景,柔和自然光,产品摄影。",
    "n": 1,
    "resolution": "1k",
    "aspect_ratio": "1:1"
  }' -o grok-image-task.json

成功收据包含顶层 id、task_id(同一任务 ID)、model、created_at 和 status。当前收据中的 status="queued" 不能作为最终生成状态,即使图片已完成也需按 GET /v1/tasks/{task_id} 查询。保存实际的 task_id 后,继续下方进度与制品下载。

10Grok 生视频 异步 Videos API

支持 grok-imagine-video 和 grok-imagine-video-1.5。同一模型通过有无参考图选择文生视频或图生视频;不要添加 MiniMax 的首尾帧、步数或多参考图参数。

字段本站当前支持范围
model / prompt必填模型名和非空提示词。
seconds / duration1–15 的整数秒,默认 5;两者同时填写必须相同。
resolution默认 480p。两个模型均支持 480p、720p;grok-imagine-video-1.5 另支持 1080p。
aspect_ratio可选 1:1、16:9、9:16、4:3、3:4、3:2、2:3。文生视频默认 16:9;图生视频省略时保留输入图比例。
input_reference可选单张参考图。JSON 填可读取的 HTTPS 图片 URL 或图片 data URI;multipart 上传 PNG、JPEG、WebP,每张最多 20 MiB。JSON 也可用 image: {"url": "…"},但不能与 input_reference 同时提供。
generate_audio可选布尔值 true / false;不填写时由上游默认行为决定。

文生视频 · 提交一次,保存 ID

视频参数不使用 size、n 或 stream,也不通过聊天接口调用。

CURL · JSON 提交视频
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-imagine-video",
    "prompt": "海边日出,浪花轻拍沙滩,镜头缓慢向前移动。",
    "seconds": 5,
    "resolution": "480p",
    "aspect_ratio": "16:9"
  }' -o grok-video-task.json

成功返回 id、object="video"、model、status、progress 和 created_at;保存 本站返回的 id,不要使用上游 request_id 或错误报告的 Request ID 代替。提交成功只代表受理,不代表视频完成。

图生视频 · 上传一张本地图片

将 reference.png 换成自己的文件路径。下面是另一种提交方式,会创建新视频;curl 自动生成 multipart 边界,不要手动设置 Content-Type。

CURL · multipart 图生视频
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  --form-string 'model=grok-imagine-video' \
  --form-string 'prompt=保持主体外观,镜头缓慢靠近,背景自然运动。' \
  --form-string 'seconds=5' \
  --form-string 'resolution=480p' \
  -F 'input_reference=@reference.png;type=image/png' \
  -o grok-video-task.json

查询视频进度

将提交响应的 id 设置为 VIDEO_ID。建议每隔 5 秒查询,客户端可设置 15 分钟等待上限;到时只停止查询,不代表取消后台任务。保留原 ID 后可继续查询。

CURL · 查询已有视频,不创建新任务
curl --fail-with-body -sS --max-time 30 \
  "https://ry.live/v1/videos/${VIDEO_ID:?请先设置提交响应中的 id}" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}"

顶层 status 为 queued、in_progress、completed 或 failed;unknown 表示暂不能确定。progress 是数字。当前 Grok 的处理中状态通常映射为 50%,不是精确生成百分比或剩余时间。只在 completed 后下载;failed 时停止轮询,并用 GET /v1/tasks/{id} 的 fail_reason 或任务日志查看失败原因,不能假定 Videos 响应含 error。HTTP 200 本身不等于成功。

完成后可带 Bearer 请求 GET /v1/videos/{id}/content 下载 MP4;推荐使用下节的统一制品接口获取 ry.live 下载链接,图片、视频使用同一套流程。

11在 ry.live 获取进度与制品

在网页中预览和下载

  1. 登录发起调用的账户,打开 任务日志,按模型和调用时间找到任务。
  2. 查看任务状态与进度;成功后点击“制品”,预览图片或视频,再点击“下载”。
  3. 消费金额在使用日志核对;任务状态、生成结果在任务日志查看。查询状态和再次下载已有制品不会重新生成或再次收取模型生成费。

普通 /v1/images/generations 的成功新请求也会保留制品,原有 URL / Base64 返回不变。历史上未保留结果的任务不会自动补回;请及时下载自己的文件,不把本站制品记录视为永久备份。

程序方式 · 先确认任务完成

将通用任务接口的 task_id、视频接口的 id,或网页任务日志中的任务 ID,设置为 TASK_ID。以下命令只访问已有任务;使用任务所属账户的有效普通 API Key,不能查询他人的任务。

CURL · 通用任务状态
curl --fail-with-body -sS --max-time 30 \
  "https://ry.live/v1/tasks/${TASK_ID:?请先设置本站任务 ID}" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}"

此接口字段在顶层,读取 status、progress、fail_reason,没有 data.status 包装。status="SUCCESS" 才进入下载;FAILURE 时读取 fail_reason 并停止;其他未完成状态间隔 5 秒再查,设置有限等待上限。这里的状态是大写,progress 是 "50%" 这样的字符串,不要套用 Videos 接口的小写状态与数字进度解析器。

步骤 1 · 列出制品

CURL · 获取图片 / 视频制品列表
curl --fail-with-body -sS --max-time 30 \
  "https://ry.live/v1/tasks/${TASK_ID:?请先设置本站任务 ID}/artifacts" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -o grok-artifacts.json

读取顶层 artifacts[],每项包含 key、type、content_url,还可能包含 mime_type。Grok 图片通常为 image-1、image-2 等,视频为 video;以实际返回的 key 为准,多张图片逐项下载。

步骤 2 · 获取 ry.live 短期下载链接

下面示例依赖 jq,选取列表第一项;也可手动将对应 key 设置为 ARTIFACT_KEY。请求的 POST 只是申请已有制品下载链接,不会创建生成任务。

CURL + JQ · 申请下载链接并查看 HTTP 状态
ARTIFACT_KEY=$(jq -er '.artifacts[0].key' grok-artifacts.json) &&
curl --fail-with-body -sS --max-time 30 -X POST \
  "https://ry.live/v1/tasks/${TASK_ID:?请先设置本站任务 ID}/artifacts/${ARTIFACT_KEY}/download-url?disposition=attachment" \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" -d '{}' \
  -D grok-download-headers.txt -o grok-download.json -w 'HTTP %{http_code}\n'
  • HTTP 200 且 artifact_status="ready":读取 url、expires_at、mime_type、size_bytes。下载链接当前有效期为 15 分钟,过期后重新申请,不要重新生成。
  • HTTP 202 且 artifact_status="publishing":生成已完成,制品仍在保存;按 Retry-After(当前为 3 秒)等待后重试本步骤,建议最多等待 2 分钟,仍未就绪则保留 ID 稍后再查。202 的正文是 JSON,不是图片或视频。
  • 401 / 403 / 404 / 503:检查密钥、账户、任务与制品 key,或稍后再尝试下载;不要因下载失败自动提交新生成请求。

步骤 3 · 下载文件,不携带 API Key

仅在上一步为 200、ready 后执行。将 grok-result.bin 按 mime_type 改为 .jpeg、.png 或 .mp4 等;选择未使用的文件名。示例仅接受本站 HTTPS 下载链接,不打印签名 URL,也不向下载地址附加 Authorization。

BASH / ZSH + JQ · 下载已保存的制品
(
  set -eu
  DOWNLOAD_URL=$(jq -er 'select(.artifact_status == "ready") | .url' grok-download.json)
  case "$DOWNLOAD_URL" in
    https://ry.live/*) ;;
    *) printf '%s\n' '下载地址不是本站 HTTPS 地址,已停止' >&2; exit 1 ;;
  esac
  OUTPUT=grok-result.bin
  test ! -e "$OUTPUT"
  test ! -e "$OUTPUT.part"
  curl --fail-with-body -sS --max-time 300 "$DOWNLOAD_URL" --output "$OUTPUT.part"
  mv -n "$OUTPUT.part" "$OUTPUT"
)
API Key 与带签名的 url / content_url 都应保密。content_url 也可直接取制品,但属于另一种访问凭证,不能假定它与 download-url 一样只有 15 分钟有效期。不要把完整链接写入公开日志、聊天截图或前端源码;需要长期留存时下载文件本身。下载失败只重试下载或重新申请链接,不重新提交生图、生视频。

文档按 2026-10-15 的本站接入实现核对,并用已有 Grok 图片任务验证了查询、制品列表和下载链接。未为本次文档更新新建付费图片或视频,也不将接口参数核对视为所有视频参数组合的生成验收。

12火山方舟图片与视频 Seedream / Seedance

做图片选 Seedream,做视频选 Seedance。使用本站普通 API Key 与 https://ry.live,不需要填写火山方舟的密钥。运行前用 GET /v1/models 确认权限,实时价格见模型广场。

模型怎么选输出范围
doubao-seedream-5-0-flash快速试稿、日常图片素材。图片;1K / 1.5K / 2K。
doubao-seedream-5-0-pro画质优先,更重视细节的图片。图片;1K / 1.5K / 2K。
doubao-seedance-2-0画质优先,需要较高分辨率的短片。4–15 秒;480p / 720p / 1080p / 4k。
doubao-seedance-2-0-fast快速试镜头,兼顾速度与成本。4–15 秒;480p / 720p。
doubao-seedance-2-0-mini轻量试稿,先确认画面与创意。4–15 秒;480p / 720p。
doubao-seedance-2-5需要更长的视频片段。4–30 秒;480p / 720p / 1080p。

图片 · 一次生成一张

POST /v1/images/generations 同步返回图片。下面使用 Flash;需要 Pro 时只改 model。命令只提交一次,不自动重试。

CURL · Seedream 文生图
curl --fail-with-body -sS --max-time 300 \
  https://ry.live/v1/images/generations \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedream-5-0-flash",
    "prompt": "一只蓝色陶瓷杯,白色背景,柔和自然光,产品摄影。",
    "size": "2K",
    "n": 1,
    "response_format": "url"
  }' -o seedream-image-response.json
参数怎么填
model / prompt必填完整模型名与图片描述。
size建议先用 2K;也支持 1K、1.5K。自定义宽高需符合官方像素与比例限制。
n / response_formatn 只能为 1;建议 response_format="url",从 data[0].url 读取图片地址。
image可选参考图:填可读取的 HTTPS 图片 URL,或按顺序组成 URL 数组,最多 10 张;也接受图片 data URI。提示词中说明每张图的用途。

参考图生成沿用同一接口,例如在请求 JSON 中加入 "image": ["https://example.com/replace-with-your-reference.png"],并将占位链接换成自己的真实图片。不要照搬聊天的 messages,也不要加入 stream、mask 或组图参数 sequential_image_generation。

成功响应为 created 与 data[],不返回任务 ID。登录任务日志可取得任务 ID、预览和下载成功制品;不要向上游图片 URL 发送本站 API Key。

程序必须取得任务 ID 时,可改用 POST /v1/tasks/doubao:同样把图片参数放在 JSON 顶层,省略 n 和 response_format,保存返回的 task_id(与 id 相同),再查 GET /v1/tasks/{task_id}。此方式仍等待图片生成,收据的 queued 不是最终状态;与普通图片接口二选一,不要重复提交。

视频 · 提交后查询进度

POST /v1/videos 接收 JSON。把时长放在顶层 seconds;分辨率、画幅和声音等设置放在 metadata。

CURL · Seedance 文生视频
curl --fail-with-body -sS --max-time 120 \
  https://ry.live/v1/videos \
  -H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedance-2-0",
    "prompt": "海边日出,浪花轻拍沙滩,镜头缓慢向前移动。",
    "seconds": 5,
    "metadata": {
      "resolution": "720p",
      "ratio": "16:9",
      "generate_audio": true
    }
  }' -o seedance-video-task.json
参数怎么填
seconds整数秒,范围见模型表。建议明确填写;不要同时再传别名 duration。
metadata.resolution分辨率,范围见模型表;例如 720p。
metadata.ratio画幅比例,例如横屏 16:9、竖屏 9:16 或方形 1:1。
metadata.generate_audiotrue 生成声音,false 生成无声视频;四款模型均支持声音,默认开启。
metadata.content可选参考素材列表;单张首帧的写法见下例。更复杂的首尾帧、多素材组合先核对对应模型的官方限制。
不要直接套用 Grok 的字段。火山视频的顶层 resolution、ratio、generate_audio 不会生效;顶层 image / input_reference 也不能作为参考图。当前不支持通过 multipart 直接上传视频参考文件,请使用 JSON 里的可读取图片链接。

图生视频时,将上例的 metadata 对象换为下方内容,并替换图片占位链接;prompt 描述希望出现的运动。下方是请求的一部分,不是独立提交命令。

JSON · 单张首帧的 metadata
{
  "resolution": "720p",
  "ratio": "16:9",
  "generate_audio": true,
  "content": [{
    "type": "image_url",
    "image_url": {"url": "https://example.com/replace-with-your-first-frame.png"},
    "role": "first_frame"
  }]
}

提交成功后保存本站返回的 id,每隔 5 秒查询 GET /v1/videos/{id}:queued 表示排队,in_progress 表示处理中,completed 才可下载,failed 应停止查询。进度通常是 10% / 50% / 100% 的阶段提示,不是精确完成百分比或剩余时间;失败原因可用 GET /v1/tasks/{id} 的 fail_reason 查看。

获取结果:图片和视频都沿用第 11 节:ry.live 进度与制品下载。网页进入任务日志;程序先列出制品,再申请本站下载链接。遇到 202 publishing 只等待制品保存并重试下载链接,不重新生成。超时或断线先核对原任务,勿自动重发创建请求。

验收范围:2026-10-15 已完成 Seedream Flash 图片生成与 ry.live 制品下载验证;其他模型及视频参数按当前接入实现和官方资料核对,不表示所有组合均已完成生成实测。

更多能力与素材限制:Seedream 5.0 官方说明 · Seedance 2.0 官方说明 · Seedance 2.5 官方说明。通过 RY.LIVE 调用时,地址、字段层级与制品流程以本节为准。

13客户端怎么填

下表是对应协议的填写方式,不是当前模型开放清单;请先确认账户具备对应模型和端点权限。

客户端类型地址模型与注意事项
OpenAI 兼容客户端 / SDKhttps://ry.live/v1Chat 推荐 eliroot-v4.1-flash;GPT 优先选择 Responses 模式。
Anthropic SDK / 兼容客户端https://ry.liveeliroot-v4.1-flash;由客户端追加 /v1/messages,工具限制见上文。
Jev / 自定义 HTTP 工具https://ry.live/v1/decisionsjev-latest;POST JSON,Bearer 鉴权,读取 answers,不选择聊天协议。
MiniMax H3 Max / 自定义 HTTP 工具https://ry.live/v1/videos选择 文生视频或图生视频模型;Bearer 鉴权,提交后查询 id,完成后下载 /content。
Eliroot Image 2.1 / 自定义 HTTP 工具https://ry.live/v1/images/generations
https://ry.live/v1/images/edits
JSON 文生图 / multipart 图生图;已开放,需具备模型权限的普通 API Key;同步返回 b64_json,不是 Chat。
Grok Imagine / 自定义 HTTP 工具https://ry.live/v1/images/generations
https://ry.live/v1/videos
生图同步返回;视频保存 ID 后查询。两者均可在本站任务日志获取制品;程序下载见统一流程。
火山方舟 / 自定义 HTTP 工具https://ry.live/v1/images/generations
https://ry.live/v1/videos
Seedream 图片 / Seedance 视频;视频设置放在 metadata,参考图采用 JSON 链接,完成后从本站任务日志或制品接口下载。
要求“完整请求 URL”的工具域名 + 对应完整端点例如 https://ry.live/v1/chat/completions。

API Key 一栏填写本站密钥。客户端字段名及自动拼接行为不同,保存后检查实际请求路径,尤其避免 /chat/completions 缺少 /v1 或出现 /v1/v1/…。

14排查与使用建议

现象先检查
401 / 鉴权失败密钥是否正确、有效;请求头是否符合所选协议。
无模型权限 / 无可用渠道密钥模型限制、账户分组与模型授权;先查看 /v1/models。
200 但返回 HTML很可能请求到了网页。检查路径与 Content-Type;200 本身不代表推理成功。
400 / 参数不支持先用本文最小示例,确认协议、输入格式、token 上限,再逐项加入参数。
429 / 繁忙降低客户端并发,采用有上限的退避重试;不要无限重试或瞬间提交大量请求。
502 / 连接超时 / 流中断记录时间和请求 ID,供支持人员排查服务响应与网络问题。已开始输出的请求可能已产生用量,盲目重试可能重复计费。

示例的 120 秒是客户端等待上限,不是响应时效承诺。长上下文或繁忙请求可能更慢。敏感数据先脱敏,AI 输出的重要结论需核实。

需要帮助?

联系邮箱:1932013@qq.com
请提供模型名、调用域名与路径、发生时间(含时区)、HTTP 状态、Request ID 和脱敏错误;不要发送完整 API Key。

本站接口速查

15常见问题

客户端的 API 地址应该怎么填?

OpenAI 兼容客户端通常填写 https://ry.live/v1;要求完整请求 URL 时,再追加对应端点,例如 /chat/completions。Anthropic 兼容客户端通常填写根地址 https://ry.live,由客户端追加 /v1/messages。不要重复拼接 /v1,并确认目标模型支持所选协议。

文档出现的模型都能直接调用吗?

不一定。文档包含历史示例,实际可用模型取决于账户授权、密钥限制与当前配置。先看模型广场,再使用本站密钥查询 GET /v1/models;以返回的准确模型名调用。接口存在或模型列出,也不代表所有参数、工具和客户端工作流都已通过验收。

模型价格和实际扣费以哪里为准?

模型广场提供当前价格、计费单位与币种,实际消费还取决于账户分组、适用折扣和请求用量。请结合使用日志核对;本文不维护价格表,也不应将所有模型视为采用同一种计费方式。

重复提示词一定能按缓存价计费吗?

不一定。缓存加速和缓存计费是两件事:只有上游实际返回可识别的缓存命中用量,且该模型配置了对应缓存价格时,才能按缓存规则核算。重复输入或模型服务内部启用缓存,不保证本次账单包含缓存优惠;请核对使用日志中的缓存用量和当时的定价规则。不同服务的缓存通常不共享,不承诺固定命中率。

遇到调用错误,应该提供什么?

请将模型名、接口路径、发生时间及其时区、Request ID、HTTP 状态和脱敏错误发送至 1932013@qq.com。不要发送完整 API Key、密码或客户敏感内容;请求超时或输出中断后先核对使用与任务日志,避免重复提交已产生用量的请求。