RY.LIVE 为开发者与团队提供 AI 模型 API 接入、密钥管理与用量查询。使用统一地址,按账户可用模型选择协议;本页说明调用方式、历史验收范围和兼容边界。
OpenAI 兼容 Base URL
https://ry.live/v1Anthropic 兼容服务根地址
https://ry.live服务概览
RY.LIVE 由中山市如云软件开发中心运营,面向需要在应用、脚本与兼容客户端中调用模型的开发者和团队。客服邮箱:1932013@qq.com。经营主体与备案信息见关于本站。
主接入地址为 https://ry.live/v1。先查看模型广场,再通过带密钥的 GET /v1/models 确认账户可见模型。模型名称、授权、端点与能力会随实际配置变化;能列出模型,不代表全部工具、参数或工作流已经兼容。
本文保留对话、Responses、Anthropic Messages、决策、图像和视频接口的示例与历史验收记录。示例仅适用于已开放对应模型和端点的账户,不是当前全站上架清单,也不承诺 GPT、Jev 等示例模型此刻可用。
价格、计费单位、币种与缓存规则请查看模型广场;实际消费还与账户分组及适用折扣有关,以当前配置和使用日志为准。文档不承诺固定价格、固定缓存命中率或响应时效。
01快速开始
不要把真实密钥写进网页前端、代码仓库、截图或工单。本文不提供在线密钥输入框,也不会在浏览器中调用模型。
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-flash | Chat Completions | Eliroot V4.1 Flash;Anthropic 普通与流式对话已实测,工具调用有限制。 |
gpt-5.6-lunagpt-5.6-solgpt-5.6-terragpt-6-astra | Responses | 支持 Chat → Responses 兼容转换;并非所有参数或工具都已支持。 |
jev-latest | Decisions | Jev决策模型;支持概率判断、分类和评分,不是聊天模型。 |
minimax-h3-max/text-to-videominimax-h3-max/image-to-video | Videos | MiniMax H3 Max 文生视频与首尾帧视频;提交任务后查询状态,再下载 MP4。 |
eliroot-image-2.1eliroot-image-2.1-turbo | Images | 原版与 Turbo 均支持文生图、参考图编辑,共用单路生成队列;两者价格关系以模型广场为准。 |
grok-imagine-imagegrok-imagine-image-2.0grok-imagine-image-quality | Images / Tasks | 同步文生图;成功结果保留在任务日志,可从 ry.live 预览和下载。 |
grok-imagine-videogrok-imagine-video-1.5 | Videos | 文生视频 / 单参考图生视频;保存任务 ID,轮询状态,完成后下载。 |
doubao-seedream-5-0-flashdoubao-seedream-5-0-pro | Images / Tasks | 文生图与参考图生成;同步返回图片,成功后可从 ry.live 取得制品。 |
doubao-seedance-2-0doubao-seedance-2-0-fastdoubao-seedance-2-0-minidoubao-seedance-2-5 | Videos | 文生视频与参考图生视频;分辨率、画幅及参考素材放在 metadata 中。 |
模型的实时价格与账户适用折扣请查看模型广场;下方 Jev 记录仅为标注日期的历史快照,不含当前报价。eliroot-v4.1-flash 与 deepseek-v4.1-flash 是不同的请求名称,不要自行互换或推断它们始终映射到同一服务。请使用本账户 /v1/models 返回的准确名称;历史别名仅在当前目录明确列出时使用。
03Chat Completions 推荐 eliroot-v4.1-flash
POST /v1/chat/completions · 使用 Bearer 鉴权,输入对话放在 messages。
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 --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。错误、失败事件或中途断开不等于成功完成。
messages,Responses 使用 input。文件、搜索、后台任务、会话持久化等功能需要分别确认支持情况,不能仅凭端点可访问就推断可用。05Anthropic Messages 有限兼容
POST /v1/messages · 使用 x-api-key 和 anthropic-version: 2023-06-01。这是协议转换,不是 Claude 模型服务。
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 等事件。
已验证:普通对话与文本 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,适合工单分类、规则判断和评分。
/v1/decisions,不支持 /v1/systemone。使用 SDK 时确认请求路径,也不要把 Jev 配成 Chat Completions、Responses 或 Anthropic 聊天模型。Agent 可通过独立 HTTP 工具调用此接口。请求字段与三种题型
model 填 jev-latest;state 是待评估的字符串、对象或数组;questions 是非空对象。每个问题需有 type 和 instructions,后者同样接受字符串、对象或数组。问题键名仅用于对应返回结果,请把实际判断要求写入 instructions。
| type | criteria(本站当前支持范围) | 读取结果 |
|---|---|---|
noul · 是非判断 | 可省略;或以 true、false 为键,字符串描述判断标准。 | answers.问题名.noul:0–1 的“是”概率,不是布尔值。 |
choice · 分类 | 必填;1–255 个选项的对象,值为字符串描述或 null。 | choice 为选项名;probabilities 为分布,另有 confidence。 |
score · 评分 | 必填;按顺序排列的 2–10 个字符串等级。 | score 为 0 到等级数减 1 之间的加权值,可为小数;另有 legend、probabilities、confidence。 |
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 或文本增量解析器。
{
"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形式。结构校验通过不代表判断一定正确;重要决策需人工复核,并用自己的中文业务样本评估准确率。
ComfyUI 节点与可导入工作流:本地图片直传 MinIO、首尾帧、多参考图和已有结果下载。
07MiniMax H3 Max 视频生成 异步 Videos API
使用本站 API Key 的 Authorization: Bearer … 鉴权。文生视频选择 minimax-h3-max/text-to-video;单张图片、首尾两帧或仅尾帧选择 minimax-h3-max/image-to-video。账户可用模型与当前价格请查看模型广场。
POST https://ry.live/v1/videos:提交 JSON 或 multipart 请求,保存响应中的id。GET https://ry.live/v1/videos/{id}:每隔 5 秒查询一次,直到status为completed或failed。GET https://ry.live/v1/videos/{id}/content:仅在完成后下载 MP4;使用同一账户的有效本站密钥。
全部请求参数
JSON 中整数用数字、布尔值用 true / false;multipart 的文本字段传对应字符串。整数参数也接受十进制整数字符串。下表列出本站接受的全部字段,未列出的字段会被拒绝。
| 字段 | 类型与默认值 | 取值、用途与限制 |
|---|---|---|
model | 字符串 · 必填 | 上方两个完整模型名之一。 |
prompt | 字符串 · 必填 | 1–50,000 字符,不能全为空白。描述画面、运动、镜头及需要的声音或对白。 |
secondsduration | 整数 · 默认 5 | 视频时长,5–15 秒,含端点。两者为别名;同时填写时数值必须相同。 |
resolutionsize | 字符串 · 默认 768P | 480P、768P、1080P,不区分大小写。两者为别名,同时填写时必须一致。size 只接受分辨率标签,不接受 1280x720 等像素尺寸。 |
aspect_ratio | 字符串 · 文生默认 16:9 | 仅文生视频可用:21:9、16:9、4:3、1:1、3:4、9:16。图生视频不得携带此字段,画幅随图片确定。 |
image_urlinput_reference | HTTPS URL;或 multipart 图片文件 · 无默认值 | 仅图生视频可用,作为首帧。两者为别名,不能同时提供,即使内容相同也不行。 |
end_image_url | HTTPS URL;或 multipart 图片文件 · 无默认值 | 仅图生视频可用,作为尾帧。可与一个首帧字段一起提供,也可单独提供。 |
seed | 整数 · 省略时随机 | 0–2,147,483,647。固定 seed 便于对比参数,不保证每次输出逐帧相同。 |
prompt_expansion_mode | 字符串 · 默认 balanced | disabled 保留原提示词;balanced 进行快速改写;quality 进行更充分改写,可能额外等待约 30 秒。取值区分大小写。 |
enable_safety_checker | 布尔值 · 默认 true | 是否启用安全检查。JSON 必须传布尔值;multipart 文本仅接受 true 或 false。 |
target_audio_url | HTTPS 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、任务列表、取消或删除接口。
文生视频 · JSON
下面提交 5 秒、768P、16:9 视频。prompt_expansion_mode 设为 disabled,便于按原提示词生成;需要改写时可改为 balanced 或 quality。
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 --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 --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 字段。
{
"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 --fail-with-body -sS --max-time 30 \
"https://ry.live/v1/videos/${VIDEO_ID:?请先设置提交响应中的 id}" \
-H "Authorization: Bearer ${LLMER_API_KEY:?请先设置 LLMER_API_KEY}"{
"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 --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,停止轮询并读取错误信息。
{
"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 两种错误说明。
{
"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 即可恢复查询。
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
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/generations | application/json;同步返回图片 Base64。 |
| 图生图 / 参考图编辑 | POST /v1/images/edits | multipart/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 不在范围内。不要仅看单边最大值判断尺寸是否允许。model 替换为 eliroot-image-2.1-turbo,其它字段不变。Turbo 与原版使用同一套接口和字段,两者价格关系、分组折扣与实时价格以模型广场为准。文生图:JSON 请求
以下命令不会自动重试。成功时响应文件包含较长的 Base64,而不是可直接打开的 PNG;解码方法见后面的 Python 示例。发生 HTTP 错误时,--fail-with-body 会保留错误正文并返回非零退出码。
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 --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.jsonimage[],图 2 是第二个。使用 3 或 4 张时,继续按顺序重复 image[],并在提示词中说明图 3、图 4 的用途。参考数量不是 n,输出仍为 1 张。不要混合使用 image 和 image[],也不要重复使用 image。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。
{
"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 错误时停止,不自动重发可能已计费的请求。
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 确认权限;价格见模型广场。下列两种生图方式二选一,每次提交都会创建新的生成请求。
| 模型 | resolution | quality |
|---|---|---|
grok-imagine-image | 1k(默认)、2k | 省略或 auto |
grok-imagine-image-2.0 | 1k(默认)、1.5k、2k | auto(按 low 处理)、low、medium |
grok-imagine-image-quality | 1k(默认)、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 --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 尚未启用。
方式 B · 程序需要保存任务 ID
使用通用任务入口,参数直接放在 JSON 顶层,不嵌套 input。这仍可能等待上游同步生成,不是立即返回 ID 的后台生图接口;不要与方式 A 对同一张图重复提交。此入口不做标准图片接口的 Base64 转换,请省略 response_format,随后通过制品接口下载。
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 / duration | 1–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 --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 --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 --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 获取进度与制品
在网页中预览和下载
- 登录发起调用的账户,打开 任务日志,按模型和调用时间找到任务。
- 查看任务状态与进度;成功后点击“制品”,预览图片或视频,再点击“下载”。
- 消费金额在使用日志核对;任务状态、生成结果在任务日志查看。查询状态和再次下载已有制品不会重新生成或再次收取模型生成费。
普通 /v1/images/generations 的成功新请求也会保留制品,原有 URL / Base64 返回不变。历史上未保留结果的任务不会自动补回;请及时下载自己的文件,不把本站制品记录视为永久备份。
程序方式 · 先确认任务完成
将通用任务接口的 task_id、视频接口的 id,或网页任务日志中的任务 ID,设置为 TASK_ID。以下命令只访问已有任务;使用任务所属账户的有效普通 API Key,不能查询他人的任务。
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 --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 只是申请已有制品下载链接,不会创建生成任务。
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。
(
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"
)url / content_url 都应保密。content_url 也可直接取制品,但属于另一种访问凭证,不能假定它与 download-url 一样只有 15 分钟有效期。不要把完整链接写入公开日志、聊天截图或前端源码;需要长期留存时下载文件本身。下载失败只重试下载或重新申请链接,不重新提交生图、生视频。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 --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_format | n 只能为 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 --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_audio | true 生成声音,false 生成无声视频;四款模型均支持声音,默认开启。 |
metadata.content | 可选参考素材列表;单张首帧的写法见下例。更复杂的首尾帧、多素材组合先核对对应模型的官方限制。 |
resolution、ratio、generate_audio 不会生效;顶层 image / input_reference 也不能作为参考图。当前不支持通过 multipart 直接上传视频参考文件,请使用 JSON 里的可读取图片链接。图生视频时,将上例的 metadata 对象换为下方内容,并替换图片占位链接;prompt 描述希望出现的运动。下方是请求的一部分,不是独立提交命令。
{
"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 只等待制品保存并重试下载链接,不重新生成。超时或断线先核对原任务,勿自动重发创建请求。
13客户端怎么填
下表是对应协议的填写方式,不是当前模型开放清单;请先确认账户具备对应模型和端点权限。
| 客户端类型 | 地址 | 模型与注意事项 |
|---|---|---|
| OpenAI 兼容客户端 / SDK | https://ry.live/v1 | Chat 推荐 eliroot-v4.1-flash;GPT 优先选择 Responses 模式。 |
| Anthropic SDK / 兼容客户端 | https://ry.live | eliroot-v4.1-flash;由客户端追加 /v1/messages,工具限制见上文。 |
| Jev / 自定义 HTTP 工具 | https://ry.live/v1/decisions | jev-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/generationshttps://ry.live/v1/images/edits | JSON 文生图 / multipart 图生图;已开放,需具备模型权限的普通 API Key;同步返回 b64_json,不是 Chat。 |
| Grok Imagine / 自定义 HTTP 工具 | https://ry.live/v1/images/generationshttps://ry.live/v1/videos | 生图同步返回;视频保存 ID 后查询。两者均可在本站任务日志获取制品;程序下载见统一流程。 |
| 火山方舟 / 自定义 HTTP 工具 | https://ry.live/v1/images/generationshttps://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、密码或客户敏感内容;请求超时或输出中断后先核对使用与任务日志,避免重复提交已产生用量的请求。