新把任何智能体接入 UberLLM:一个密钥,所有模型,价格不高于官方价。
UberLLM

图像、视频、音乐和语音

您用于文本的 API key 也能用于生成图像、视频、音乐和语音,并将录音转换为文本,所有这些都从同一个余额中扣除。在 模型表格 (或 ?type=image, ?type=music, ?type=audio) 中选择一个模型;每个模型的页面都会显示其价格、类型和可用的请求示例。

您想要 路由 来源图片放入
从提示生成新图像 POST /v1/images/generations (无)
编辑图片 POST /v1/images/edits image (或 image_url, input_images, images)
从提示生成视频 POST /v1/video/generations (无)
从图片开始的视频 POST /v1/video/generations image_url (第一帧);end_image_url 用于最后一帧
从参考图片生成视频 POST /v1/video/generations input_images 和 "role": "reference"
关于图片的文本回答 POST /v1/chat/completions messages[].content 中的 image_url 部分
音乐 POST /v1/music/generations (无)
从文本生成语音 POST /v1/audio/speech (无)
从录音生成文本 POST /v1/audio/transcriptions (无;录音放入 file)

来源图片可以是 https:// 链接、data: URI (data:image/png;base64,iVBORw0…) 或 PNG、JPEG 或 WebP 的纯 base64 编码,每次请求最大 8。图像路由也支持多部分上传(见下文)。链接必须是公共 https:// 链接;http:// 链接将被拒绝。重定向的链接(例如 https://picsum.photos/640/360)将被跟踪,最多 5 次,且仅限于其他公共 https:// 链接,模型将获取最终着陆的链接。如果链接未指向图片,或重定向到我们无法使用的位置,则会在扣费或保留任何内容之前,以 400 invalid_image_url 拒绝。内联发送图片会使请求变大:请将其保持在 10 MB 以下,或发送链接。

在聊天消息中(messages[].content 中的 image_url),UberLLM 会打开链接(https:// 或 http://),并将其作为 data: URL 发送给模型,因为大多数视觉模型只接受这种格式。每张图片最大可达 20 MB(每次请求 40 MB),重定向最多跟踪 5 次,且仅限于公共地址。Gemini 模型会按原样获取链接。如果链接未指向图片,则会以 400 invalid_image_url 拒绝,且不收取任何费用。

生成图片

图片会随回答一同返回。

curl https://api.uberllm.dev/v1/images/generations \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "venice/z-image-turbo", "prompt": "a red apple on a white table", "n": 1, "size": "1024x1024"}'
{ "created": 1792429247, "data": [{ "url": "https://api.uberllm.dev/v1/media/artifacts/<id>/0" }],
  "usage": { "cost_usd": 0.0099, "max_cost_usd": 0.0109 } }

usage.cost_usd 是图片费用(也在 X-UberLLM-Cost-USD 标头中)。在极少数价格尚未知晓的回答中,费用为 null。您支付提供商收取的费用,绝不会超过 max_cost_usd,即为此预留的金额。

response_format 默认为 url,对于 /v1/images/generations 和 /v1/images/edits 都是如此。发送 "response_format": "b64_json" 以便在回答中获取图片。当模型返回图片本身时,UberLLM 会将其作为您账户的文件保存 24 小时,并返回其链接(https://api.uberllm.dev/v1/files/file_…/content),该链接也可作为后续编辑的源图片。使用相同的密钥下载 URL:

curl -L -o image.png -H "Authorization: Bearer $UBERLLM_API_KEY" \
  "https://api.uberllm.dev/v1/media/artifacts/<id>/0"

n 是 1 到 10。

编辑图片

使用一个编辑模型(其ID通常以 -edit 结尾),并将源图片发送到 image:

curl https://api.uberllm.dev/v1/images/edits \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "google/nano-banana-pro-edit", "prompt": "make the sky a sunset",
       "image": "https://example.com/skyline.png"}'

同一张图片可以作为以下形式传入:

  • "image": "data:image/png;base64,iVBORw0…"
  • "image_url": "https://…"
  • "input_images": ["https://…", "https://…"]:第一个是要编辑的图片,其余是参考图。一个条目也可以是 {"url": "…", "role": "reference"}。
  • "images": [{"image_url": "https://…"}],OpenAI SDKs 发送的格式

普通的 base64 也可以,并且 "input_image" 会被读取为 "image"。

或者上传文件,就像使用 OpenAI 的图片编辑功能一样:

curl https://api.uberllm.dev/v1/images/edits \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -F model=google/nano-banana-pro-edit -F prompt="make the sky a sunset" \
  -F [email protected]

没有源图片的编辑请求会被 400 image_required 拒绝。不支持蒙版(局部填充)。

一次上传图片

将图片上传到 /v1/files,并在您喜欢的任意数量的请求中持续 24 小时使用它,而不是在每个请求中都发送它:

curl https://api.uberllm.dev/v1/files \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -F [email protected]
{ "id": "file_3f9c…", "object": "file", "bytes": 482113, "content_type": "image/png",
  "filename": "skyline.png", "created_at": 1792540800, "expires_at": 1792627200,
  "url": "https://api.uberllm.dev/v1/files/file_3f9c…/content" }

然后将 ID 或 url 放在任何需要源图片的地方:"image": "file_3f9c…"、"image": {"file_id": "file_3f9c…"}、"image_url": "file_3f9c…"、input_images 的一个条目,或视频的起始帧。只有您的账户才能使用其文件。

  • PNG、JPEG、WebP、GIF、HEIC 或 AVIF 格式,每张图片最大 10 MB,每个账户同时最多保留 500 张。
  • 保留 24 小时,然后删除。GET /v1/files/{id} 描述一个,GET /v1/files/{id}/content 下载它,DELETE /v1/files/{id} 立即删除它。

制作视频

视频制作需要一分钟或更长时间,因此这是一项任务:开始制作、检查进度、下载。

1. 开始制作

curl https://api.uberllm.dev/v1/video/generations \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"model": "fal-ai/vidu/q3/text-to-video/turbo", "prompt": "a red ball bouncing on green grass",
       "duration_seconds": 5, "models": ["fal-ai/kling-video/v3/standard/text-to-video"]}'

models 是可选的:仅当首选模型目前没有免费提供商时,才会按顺序尝试备用模型,这样繁忙时段您的请求也不会失败(参见 备用模型)。上面的视频大约需要一分钟,费用约为 $0.33。

要从图片开始制作,请使用图片转视频模型并添加 image_url:

  -d '{"model": "bytedance/seedance-2-0-image-to-video", "prompt": "slow push-in as the waves roll",
       "image_url": "https://example.com/first-frame.png", "duration_seconds": 5}'

融合两张图片的模型也需要 end_image_url(最后一帧)。 当请求中没有图片时,无法单独从文本制作视频的图片转视频或参考转视频模型会以 400 image_required 拒绝,且不收取任何费用。参考转视频模型会按 input_images 接收图片:

  -d '{"model": "pixverse/pixverse-c1-reference-to-video", "prompt": "the cat walks across the room",
       "input_images": [{"url": "https://example.com/cat.png", "role": "reference"}],
       "aspect_ratio": "16:9", "duration_seconds": 5}'

其他字段,如果模型提供:resolution (480p, 720p, 1080p…), aspect_ratio (16:9, 9:16, 1:1…) 和 audio (true / false; 没有声音设置的模型不会收到此设置,并会像往常一样制作片段)。参考转视频模型需要一个形状,因此当您省略 aspect_ratio 时,它会作为 16:9 发送(如果模型不制作 16:9,则为其第一个形状);模型的 schema 显示了该默认值。每个模型的选择都由 GET /v1/models/<model id> 列出(参见 每个模型的选项)。

每个模型只制作特定长度、分辨率和形状的片段。如果请求的模型无法制作,则会以一条列出其可制作选项的消息拒绝,且不收取任何费用。

HTTP 202:

{
  "id": "6f1c…",
  "object": "media.job",
  "kind": "video",
  "status": "queued",
  "model": "fal-ai/vidu/q3/text-to-video/turbo",
  "estimated_cost_usd": 0.32725,
  "estimated_cost_usdc": "327250",
  "max_cost_usd": 0.359975,
  "max_cost_usdc": "359975",
  "poll_url": "/v1/video/generations/6f1c…",
  "cancel_url": "/v1/video/generations/6f1c…"
}

model 是接受此任务的模型(当首选模型无法处理时,来自 models 的备用模型)。以 _usdc 结尾的费用以美元的百万分之一计(327250 = $0.33)。estimated_cost_usd 是您请求内容的标价:与 cost_usd 回复的 validate 和 POST /v1/quote 相同。它是模型当前价格乘以秒数(按请求的分辨率)、图片或其他单位。任务按提供商收取的费用计费,这可能更多或更少。max_cost_usd 是为该任务从您的余额中预扣的金额:在任务运行期间和结束后都是这个数字,也是该任务的最高计费金额。按 second 定价的视频模型按片段的每秒计费;按 job 定价的模型则按每个视频收取该费用。

2. 检查进度 每 5–10 秒:

curl -H "Authorization: Bearer $UBERLLM_API_KEY" \
  https://api.uberllm.dev/v1/video/generations/<job id>

任务运行时为 HTTP 202,任务结束后为 HTTP 200:

{
  "id": "6f1c…",
  "status": "succeeded",
  "results": [{ "artifact_index": 0, "url": "https://api.uberllm.dev/v1/media/artifacts/6f1c…/0",
                "content_type": "video/mp4", "duration_seconds": 5 }],
  "usage": { "cost_usdc": "40000", "cost_usd": 0.04 }
}

模型会在文件准备好后不久报告任务的确切费用,通常在 30 秒内。在此之前,succeeded 任务会显示 "usage": { "cost_usd": null, "cost_pending": true };几秒钟后请再次查询。如果费用在 30 分钟内仍未出现,则任务将按其标价 (estimated_cost_usd) 计费,并且 usage.cost_note 会说明这一点。

3. 下载

curl -L -o video.mp4 -H "Authorization: Bearer $UBERLLM_API_KEY" \
  https://api.uberllm.dev/v1/media/artifacts/<job id>/0

请求停止您不再需要的任务:DELETE /v1/video/generations/<job id>。我们会要求提供商停止它;已经制作完成的任务照常计费,而停止的任务则以 canceled 结束且不收取任何费用。

Fal 视频模型

id 以 fal-ai/ 开头的模型运行在 Fal 上,价格低于 Fal 自己的价格: 你支付的是 Fal 的价格减去当前市场上最便宜的 Fal 卖家提供的折扣后的金额 (在 2026年10月30日 减 15%;只要那个卖家在售,就减 25%)。价格由你所请求的内容决定——秒数 × 对应分辨率的费率,以及片段是否带声音——所以任务一开始成本就已知,账单金额正好是 estimated_cost_usd。失败的任务不收费。停止任务只能尽力而为:如果 Fal 已经生成片段,就会收费。

curl https://api.uberllm.dev/v1/video/generations \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "fal-ai/wan/v2.7/text-to-video", "prompt": "a woman twirls at a garden party at night",
       "duration_seconds": 15, "resolution": "720p", "aspect_ratio": "9:16"}'

Fal 自己的每秒价格(你的价格是在此基础上减去实时折扣;每个模型的页面、GET /v1/models 和 POST /v1/quote 会显示当前的准确价格):

模型 时长(秒) Fal 每秒价格,起
fal-ai/wan/v2.7/text-to-video, …/image-to-video 2–15 720p $0.10 · 1080p $0.15
fal-ai/kling-video/v3/standard/text-to-video, …/image-to-video 3–15 $0.084 · 带声音 $0.126
fal-ai/kling-video/v3/pro/text-to-video, …/image-to-video 3–15 $0.112 · 带声音 $0.168
fal-ai/kling-video/o3/standard/text-to-video, …/image-to-video 3–15 $0.084 · 带声音 $0.112
fal-ai/kling-video/v2.6/pro/text-to-video, …/image-to-video 5, 10 $0.07 · 带声音 $0.14
fal-ai/veo3.1/fast, fal-ai/veo3.1/fast/image-to-video 4, 6, 8 720p/1080p $0.10 · 带声音 $0.15 · 4k $0.30
fal-ai/veo3.1, fal-ai/veo3.1/image-to-video 4, 6, 8 720p/1080p $0.20 · 带声音 $0.40 · 4k $0.40
fal-ai/veo3.1/lite 4, 6, 8 720p $0.03 · 带声音 $0.05 · 1080p $0.05
fal-ai/ltx-2.3/text-to-video/fast, …/image-to-video/fast 6, 8, 10 1080p $0.06 · 1440p $0.12 · 2160p $0.24
fal-ai/ltx-2.3/text-to-video 6, 8, 10 1080p $0.08
fal-ai/minimax/hailuo-02/standard/text-to-video, …/image-to-video 6, 10 768P $0.045 · 512P (图片) $0.017
fal-ai/vidu/q3/text-to-video/turbo, …/image-to-video/turbo 1–16 360p/540p $0.035 · 720p/1080p $0.077
fal-ai/vidu/q3/text-to-video, …/image-to-video 1–16 360p/540p $0.07 · 720p/1080p $0.154

每个价格都是 Fal 自己的价格;任务开始时会在其基础上扣除折扣。如果最便宜的卖家拒绝任务,会有更贵的卖家来完成,任务按那个卖家的价格计费,回复中显示的金额绝不会超过 estimated_cost_usd。

有些模型我们的成本比卖家折扣所说的还低。每 6 小时,我们会把过去 7 天市场就每个模型向我们收取的费用,与 Fal 对相同任务的收费进行比较。如果某个模型在那段时间内至少有 20 个任务,就按那个实际占比加 5% 来定价,前提是这样更低。模型页面、/v1/models 和账单都使用同一个价格。如果那个数字已超过 3 天未更新,就再次应用卖家折扣。

这些字段是我们自己的:duration_seconds、resolution、aspect_ratio、audio 和 image_url(或 input_images)。Fal 自己的拼写(duration、 generate_audio、start_image_url)也可以。Kling、Veo 和 Kling 2.6 会添加声音, 除非你发送 "audio": false。

任务状态

status HTTP 含义
queued 202 已接受,等待模型开始处理
running 202 正在制作中;当模型报告时,progress 从 0 变为 1
succeeded 200 已完成;下载 results[].url
failed 200 未制作。error.message 说明原因;error.retryable 说明是否可以重试
canceled 200 在制作前已停止
expired 200 未在规定时间内完成

这六个是唯一的值。failed、canceled 和 expired 不收取任何费用。DELETE 是停止请求,而非承诺:提供商无论如何完成的任务最终会以 succeeded 状态结束并计费。

繁忙时段我们会为您重试。 当没有提供商有空制作您的视频,或者当前过于繁忙时,UberLLM 会在 10 分钟内自动重新开始该任务,最多重试两次。它会保留相同的任务 ID 和相同的最高费用。任务只是会花费更长一点的时间。您只有在每次尝试都失败时才会看到 failed,并且失败的任务不收取任何费用。

等待。 发送 callback_url,我们会告诉您任务何时结束(参见 Callbacks),或者每 5–10 秒查询一次轮询 URL。大多数视频需要 1–5 分钟;一些长视频或 4K 任务需要更长时间。您无需一直查询账单结算情况:即使没有人查看的任务,UberLLM 也会完成并计费(或退款),并显示在 Dashboard → Activity 中。

回调

为视频或音乐任务添加 callback_url:一个位于公共主机的 https:// 链接。当任务彻底结束后,UberLLM 会向其发送一个 POST,包含与 GET 返回的任务信息相同的 JSON。

{ "model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5,
  "callback_url": "https://your-app.example/uberllm/jobs" }
  • 何时。 一次,当任务结束且账单最终确定时:succeeded 且 usage.cost_usd 已设置(绝非 cost_pending),或 failed、canceled 或 expired(费用 0)。费用到达时不会再次发送,因为它只在之后发送。对于 output_upload_url 也是如此,回调会在上传完成后发送,因此 output_upload.status 已经处于 delivered 或 failed 状态。
  • 请求头。 Content-Type: application/json、UberLLM-Event: job.succeeded(或 job.failed、job.canceled、job.expired)、UberLLM-Event-Id: <job id>:<status> 和 UberLLM-Signature: t=<unix seconds>,v1=<hex>。
  • 重试。 在 15 秒内回复任意 2xx 状态码。任何其他回复,或无回复,将在 30 秒、2 分钟、10 分钟、30 分钟和 2 小时后重试,之后放弃。您仍然可以随时轮询任务状态。
  • 重复。 消息可能会多次到达(例如当您的回复丢失时)。事件 ID 保持不变,因此请丢弃您已处理过的消息。
  • 状态。 任务会显示其执行情况:"callback": { "status": "delivered", "attempts": 1, "http_status": 200, "delivered_at": 1792540990 }。status 为 pending、delivered 或 failed(error 为纯文本描述)。
  • 链接必须是位于公共主机上的 https:// 链接,其中不包含用户名或密码。它绝不会被回显,并在回调结束后删除。webhook_url 被读取为相同的字段。图像和语音不使用它:它们会在回复本身中返回。

检查签名

每条消息都使用您账户的 webhook 密钥进行签名。在 Dashboard → API keys → Webhook signing secret] 中查找;它在您首次打开时生成,点击 Replace secret 即可立即更换。

v1 是 <t>.<raw body> 的十六进制 HMAC-SHA256,使用完整的密钥(whsec_…)进行加密。在您收到的原始字节(解析 JSON 之前)上计算它,以恒定时间进行比较,并拒绝超过 5 分钟的 t。

Node.js (Express):

import crypto from "node:crypto";
import express from "express";

const app = express();
const SECRET = process.env.UBERLLM_WEBHOOK_SECRET; // whsec_…

app.post("/uberllm/jobs", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("UberLLM-Signature") || "";
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
  const expected = crypto.createHmac("sha256", SECRET)
    .update(`${parts.t}.`).update(req.body).digest("hex");
  const ok = parts.v1 && parts.v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected)) &&
    Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  if (!ok) return res.status(400).send("bad signature");
  const job = JSON.parse(req.body);
  // Drop a repeat: req.get("UberLLM-Event-Id") is the same each time.
  console.log(job.id, job.status, job.usage?.cost_usd);
  res.sendStatus(204);
});

Python (Flask):

import hashlib, hmac, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = os.environ["UBERLLM_WEBHOOK_SECRET"].encode()  # whsec_…

@app.post("/uberllm/jobs")
def uberllm_job():
    raw = request.get_data()  # the raw bytes, before any JSON parsing
    parts = dict(p.split("=", 1) for p in request.headers.get("UberLLM-Signature", "").split(",") if "=" in p)
    expected = hmac.new(SECRET, parts.get("t", "").encode() + b"." + raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(parts.get("v1", ""), expected) or abs(time.time() - int(parts.get("t", "0"))) > 300:
        abort(400)
    job = request.get_json()
    # Drop a repeat: request.headers["UberLLM-Event-Id"] is the same each time.
    print(job["id"], job["status"], job.get("usage", {}).get("cost_usd"))
    return "", 204

通过 webhook 发送警报

警报邮件也可以发送到 webhook:在 Dashboard → Credits → For developers: also send alerts to a webhook] 下设置链接,或 PUT /api/v1/billing/alerts {"alerts_webhook_url": "https://…"}(null 表示关闭)。消息的签名、重试和识别方式与回调相同。消息体为:

{ "id": "evt_…", "object": "event", "type": "balance.low", "created": 1792540990,
  "data": { "balance_usd": 4.2, "threshold_usd": 5, "message": "Your balance is $4.20, below the $5.00 you set. Requests stop once it runs out.",
            "add_credits_url": "https://uberllm.dev/dashboard/credits" } }
  • balance.low:余额低于您为低余额警报邮件设置的金额。每次低于该金额时发送一次;在您设置金额之前不会发送任何内容。
  • hold.not_released:为任务预留的资金在任务结束后 15 分钟仍被保留。data.jobs 列出了它们(id、kind、model、ended_at、held_usd),data.held_usd 是总金额。这笔钱仍然属于您,我们的团队已收到通知。

文件保留时长

请在结果生成后尽快下载:

  • 视频和音乐文件在任务结束后会保留约 3 小时。
  • 指向 /v1/media/artifacts/… 的图片链接会保留约 15 分钟;指向 /v1/files/… 的图片链接会保留24 小时。请求 "response_format": "b64_json" 可将图片直接包含在回复中,方便您自行保存。
  • 您上传到 /v1/files 的图片会保留24 小时。

此后,下载请求会返回 404 artifact_expired。

将结果发送到您自己的存储空间

为视频或音乐任务添加 output_upload_url:这是一个接受 HTTP PUT 的 https:// 链接,例如预签名的 S3, R2 或 Google Cloud Storage 上传链接。任务成功后,UberLLM 会将文件及其内容类型上传到该链接。对于生成多个文件的任务,请发送 output_upload_urls,每个文件一个链接,按顺序排列(最多 4 个)。

{ "model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5,
  "output_upload_url": "https://my-bucket.s3.amazonaws.com/ball.mp4?X-Amz-Signature=…" }

任务状态将包含 output_upload:

"output_upload": { "status": "delivered", "attempts": 1, "delivered_at": 1792540990,
  "files": [{ "artifact_index": 0, "http_status": 200, "bytes": 5242880 }] }
  • status 在上传完成前为 pending,完成后变为 delivered 或 failed(并附有 error 的文字说明)。
  • 上传失败后,会在 30 秒、2, 10 和 30 分钟后重试,然后标记为 failed;文件在保留期间仍可从 results[].url 下载。请确保链接至少一小时内有效。
  • 该链接必须是公共主机上的 https://,不包含用户名或密码。它绝不会被回显,并在上传结束后立即删除。
  • 图片不接受此功能:图片会直接在回复中返回。

音乐

同样的三步在 /v1/music/generations。curl -OJ 将音轨保存为我们发送的文件名。

语音

文本输入,返回音频文件作为结果。

curl https://api.uberllm.dev/v1/audio/speech \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "x-ai/tts-xai-v1", "input": "Hello from UberLLM."}' \
  -o speech.mp3

您还可以发送 voice、response_format(例如 mp3 或 wav)和 speed。 每个模型都有自己的语音(GET /v1/models/{id} 列出了它们)。使用 best-price:speech 或 fastest:speech 时,您无法提前知道使用了哪个模型, 因此语音会进行适配:模型自带的语音会被保留,OpenAI 的语音名称会映射到 模型中对应的语音(如果模型有的话)(alloy → af_alloy),任何其他语音,或 未指定语音时,则使用模型的第一个语音。当您指定模型时,您的语音会按原样发送。 费用按 input 每 1K 个字符(不足 1K 个字符按 1K 个字符计费)收取。返回结果是音频文件;它的 X-UberLLM-Cost-USD 头部会显示费用,而 X-Request-Id 是在“活动”中列出的请求 ID。 "validate": true、max_cost、metadata、models 和 provider.max_price 的作用与图像处理相同(参见 您需要支付的费用)。

将录音转为文本

以表单形式发送录音,包含 file 和 model:

curl https://api.uberllm.dev/v1/audio/transcriptions \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -F model=venice/whisper-large-v3 \
  -F [email protected]
{ "text": "Hello from UberLLM.", "duration": 4.2,
  "usage": { "type": "duration", "seconds": 5, "cost_usd": 0.00055, "max_cost_usd": 0.00726 } }

usage.cost_usd 是其费用 (也在 X-UberLLM-Cost-USD 标题中,这是 text、srt 和 vtt 答案的唯一位置)。我们自己的字段也包含在表单中,并且绝不会发送给模型:-F max_cost=0.10、-F "metadata[project]=podcast"、-F validate=true。

您还可以发送 language、prompt、temperature 和 response_format:json (默认),或者 text、srt 或 vtt 以获取纯文本。按音频时长每分钟计费。文件最大可达 40 MB。格式 (mp3, wav, ogg, flac, m4a/mp4, webm, aac) 是从录音本身读取的,而不是从文件名读取,因此名为 tmp123.out 的上传文件也能正常工作。

使用 OpenAI SDK

from openai import OpenAI

client = OpenAI(base_url="https://api.uberllm.dev/v1", api_key="<your UberLLM key>")

speech = client.audio.speech.create(model="x-ai/tts-xai-v1", voice="eve", input="Hello from UberLLM.")
speech.write_to_file("speech.mp3")

with open("speech.mp3", "rb") as f:
    text = client.audio.transcriptions.create(model="venice/whisper-large-v3", file=f)
print(text.text)

您需要支付的费用

  • 所生成内容的费用:供应商收取的费用,不含 UberLLM 手续费。图像或转录结果以及已完成的工作会显示为 usage.cost_usd(美元);每一个生成了内容的响应也会在 X-UberLLM-Cost-USD 响应头中包含此费用(对于语音,由于响应是音频文件,因此费用仅显示在响应头中)。它显示在 控制面板 → 活动 中。剩余的预扣款项会退还。
  • 对于 failed、canceled 或 expired 的工作,不收取任何费用;对于失败的图像、语音或转录请求,也不收取任何费用。
  • 能够完全满足您要求的、最便宜的卖家。许多图像和视频模型都有不止一个卖家;每个请求都会发送给能够根据您的设置生成内容的最便宜的卖家,如果该卖家无法处理,则会发送给另一个卖家。模型列表和每个模型页面都会显示当前最便宜的卖家的价格。
  • 请参阅 GET /v1/balance(下方)以查看您的余额和预扣款项。

消费前核对价格

将 "validate": true 添加到任何图像、视频、音乐或语音请求中(对于转录,请将 validate=true 作为表单字段与录音一起发送)。请求会像真实请求一样进行检查(模型、选项、源图片),不会生成任何内容,也不会收取任何费用。HTTP 200 会显示按标价(cost_usd,模型页面上显示的价格;您支付的是供应商收取的费用,这可能有所不同)计算的成本,以及运行时预扣的款项(max_cost_usd,最高计费金额):

{ "object": "quote", "model": "bytedance/seedance-2-0-image-to-video", "kind": "video",
  "valid": true, "cost_usd": 0.2117, "max_cost_usd": 0.4235, "unit": "second", "units": 5, "duration_seconds": 5,
  "note": "Nothing was charged. …" }

如果模型的卖家需要您遗漏的设置(例如,一个参考视频模型需要 aspect_ratio),发送时使用的默认设置会显示在模型的 schema 中,并在报价中显示为 defaults_applied,例如 "defaults_applied": {"aspect_ratio": "16:9"}。

会被拒绝的请求会以同样的方式被拒绝,并附带原因。

为 15 分钟锁定价格

POST /v1/quote 接受与图像、视频、音乐或语音请求相同的请求体,并返回标价(cost_usd)、运行时预扣的款项(max_cost_usd,最高计费金额)以及一个 quote_id(对于转录,请发送 model 和 duration_seconds;转录本身不收取 quote_id,请使用 max_cost 进行限制):

curl https://api.uberllm.dev/v1/quote \
  -H "Authorization: Bearer $UBERLLM_API_KEY" -H "Content-Type: application/json" \
  -d '{"model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5}'
{ "object": "quote", "id": "6f1c…", "quote_id": "6f1c…", "model": "kling/kling-o3",
  "kind": "video", "cost_usd": 0.225, "max_cost_usd": 0.495, "unit": "job", "units": 1,
  "expires_at": 1792541700, "note": "Nothing was charged. …" }

在 15 分钟内使用 "quote_id": "6f1c…" 发送相同的请求,将按照供应商收取的费用计费,最高不超过 max_cost_usd;如果开始时必须预扣的款项超过 max_cost_usd,则免费取消。报价本身不收取任何费用,也不预扣任何款项。

  • 一个报价启动一个请求。再次使用它会返回 409 quote_used;从未到达模型的工作会退还报价。
  • 请求必须要求相同的内容:相同的模型和相同的设置(prompt、size、clip length、source pictures 等)。任何其他情况都会被 400 quote_mismatch 拒绝。max_cost、metadata 和 output_upload_url 可以不同。
  • 15 分钟后,它会返回 400 quote_expired。聊天模型按 token 计费,没有报价:使用 provider.max_price 限制它们。

备用模型和价格上限

"models": ["model-b", "model-c"] 按顺序指定要尝试的模型,当第一个模型当前无法提供服务(no_available_provider)或超出您的 provider.max_price 时。任何其他拒绝都会立即响应。响应的 model 会指明生成内容的模型(语音响应本身就是音频文件:活动会显示其模型)。带有 quote_id 的请求不收取 models,转录也不收取。

"provider": {"max_price": 0.05} 是一个单位(模型的定价 unit:图像、秒、百万像素、分钟、1K 字符或请求)可能花费的最高美元金额。超出此价格的模型会被 400 max_price_exceeded 拒绝,并且请求的计费永远不会超过其单位的 max_price 倍。其他 provider 选项会被 400 unsupported_routing_option 拒绝,因为媒体请求的卖家选择无法按请求进行引导。

"model": "best-price:image"(或 image-edit、text-to-video、image-to-video、music、speech、transcription)会选择当前最便宜的模型来完成工作;fastest: 则选择测量到的最快的模型。请参阅 模型别名。

标签

"metadata": {"project": "spring-ads"}(最多 16 个文本值)会随工作一起存储,在其状态中返回,显示在活动和 CSV 导出中,并且永远不会发送给模型。在转录中,将它们作为表单字段发送:-F "metadata[project]=spring-ads"。请参阅 标签。

设置上限

随任何图像、视频、音乐或语音请求发送 "max_cost"(美元,例如 0.50)(在转录中作为表单字段)。如果费用可能超过此金额,则会以 400 max_cost_too_low 拒绝,不收取任何费用。对于视频或音乐工作,确切的上限在工作开始时设置;如果之后超出您的 max_cost,则免费取消该工作。使用 "validate": true,报价会增加 within_max_cost。

无需重复付费即可重试

在启动视频或音乐工作时,发送一个 Idempotency-Key header(任何最多 255 个字符的唯一字符串,例如 UUID)。如果您的连接中断,并且您在 24 小时内使用相同的 key 再次发送相同的请求,您将获得相同的工作,而不是第二个。具有不同请求的相同 key 会被 409 idempotency_key_reused 拒绝。图像、语音和转录请求不接受 key:失败的请求未收费,因此请再次发送。

您的余额

curl -H "Authorization: Bearer $UBERLLM_API_KEY" https://api.uberllm.dev/v1/balance
{ "balance_usd": 12.40, "held_usd": 0.35, "available_usd": 12.05 }

held_usd 已预留给仍在运行的请求;当这些请求结束时,这笔金额(扣除实际费用后)将退回。available_usd 是新请求可以使用的金额。

每个模型的选项

GET /v1/models?type=image (或 video, music, speech, transcription, audio 同时包含两者, chat, all; 多个用逗号连接; 不带 type 则列表仅显示聊天模型) 列出了您现在可以调用的模型,每个模型都带有其 type、发送请求的 endpoints 和其 pricing。GET /v1/models/<model id> 提供一个模型,对于媒体模型,则提供一个 parameters 对象:一个请求体的 JSON Schema,其中包含它支持的剪辑长度、分辨率、宽高比和大小,以及它所需的源图片。

curl -H "Authorization: Bearer $UBERLLM_API_KEY" \
  https://api.uberllm.dev/v1/models/pixverse/pixverse-c1-reference-to-video

pricing 包含 usd (目前一个 unit 的最高价格) 和 list_usd (模型制造商的自有价格);聊天模型则包含 input_usd、output_usd 及其每 1M tokens 的 list_ 价格。

错误

HTTP code 含义
400 wrong_endpoint 例如,将图像模型发送到 /v1/video/generations,将聊天模型发送到图像路由,或将语音模型发送到 /v1/audio/transcriptions;消息会指出正确的路径。不会收取任何费用,且“活动”中会将其列为“已拒绝”。
400 invalid_request 请求有误(消息会说明原因,例如模型不支持的持续时间或缺少源图片)
400 image_required 编辑、图像转视频或参考转视频模型,但没有源图片
400 max_cost_too_low 费用可能超过您的 max_cost;未收取任何费用
409 idempotency_key_reused 该 Idempotency-Key 已用于其他请求
400 quote_mismatch / quote_expired 请求与报价不符,或报价已超过 15 分钟
404 quote_not_found 您的账户中没有此报价
409 quote_used 该报价已启动一个请求
400 max_price_exceeded 该模型的单位成本高于您的 provider.max_price
400 unsupported_routing_option provider 选项不是 max_price
404 file_not_found 您的账户中没有此上传文件,或文件已过期
413 file_too_large 上传文件超过 10 MB
429 too_many_files 已保留 500 个上传文件;请删除部分或等待其过期
503 files_unavailable 当前无法上传文件
413 request_too_large 请求超出大小限制(40 MB);请以 https:// 链接形式发送图片并分割长录音
402 insufficient_credits 您的余额不足以支付该任务的最大费用;消息会说明所需金额
404 model_not_found / not_found 无此模型,或您的账户中无此任务
404 artifact_expired 文件已不再保留(见上文)
429 rate_limited 请等待 Retry-After 中指定的秒数(如果缺失则为几秒),然后重试;X-RateLimit-Remaining 显示本分钟剩余的请求数量
503 no_available_provider 目前没有卖家可以处理;UberLLM 已尝试过其他卖家。消息会列出当前可用的同类模型