画像、動画、音楽、音声
テキストに使用するキーで、同じ残高から画像、動画、音楽、音声を生成し、録音をテキストに変換することもできます。モデル表 (または ?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 で、1リクエストあたり最大 8 です。画像ルートは、マルチパートアップロード (下記参照) も受け付けます。リンクは公開 https:// リンクである必要があります。http:// リンクは拒否されます。リダイレクトするリンク (例: https://picsum.photos/640/360) は、最大 5 回まで、他の公開 https:// リンクにのみ追跡され、モデルは最終的に到達したリンクを受け取ります。画像に繋がらないリンク、または使用できない場所にリダイレクトするリンクは、保留または課金される前に 400 invalid_image_url で拒否されます。インラインで送信された画像はリクエストを大きくします。10 MB 未満に抑えるか、リンクを送信してください。
チャットメッセージ (messages[].content の image_url) では、リンク (https:// または http://) は UberLLM によって開かれ、ほとんどのビジョンモデルがそれのみを受け付けるため、data: URL としてモデルに送信されます。各画像は最大 20 MB (1リクエストあたり 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は、/v1/images/generationsと/v1/images/editsの両方で、デフォルトでurlです。代わりに、回答内に画像を含めるには"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 SDKが送信する形式
プレーンな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分以上かかるため、開始、確認、ダウンロードという作業が必要です。
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はオプションです。最初のモデルに現在空きプロバイダーがない場合にのみ、バックアップモデルが順番に試されるため、忙しい時でもリクエストが失敗することはありません(フォールバックモデル]を参照)。上記の動画は約1分かかり、費用は約$0.33です。
画像から開始するには、image-to-videoモデルを使用し、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}'
2枚の画像をブレンドするモデルは、end_image_url(最後のフレーム)も受け取ります。
テキストのみから動画を作成できないimage-to-videoまたはreference-to-videoモデルは、リクエストに画像がない場合、料金が請求される前に400 image_requiredで拒否されます。reference-to-videoモデルは、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; サウンド設定のないモデルには送信されず、常に通りにクリップを作成します)。reference-to-videoモデルは形状を必要とするため、aspect_ratioを省略すると16:9として送信されます(または、モデルが16:9を作成しない場合は、その最初の形状)。モデルのスキーマはそのデフォルトを示しています。各モデルの選択肢は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で終わる費用は1ドルの100万分の1です(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の正規料金(1秒あたり)(お客様の料金は、この正規料金からリアルタイム割引を差し引いたものです。各モデルのページ(GET /v1/modelsおよびPOST /v1/quote)で現在の正確な料金をご確認いただけます):
| モデル | 長さ(秒) | Falの1秒あたりの料金(開始価格) |
|---|---|---|
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 · with sound $0.126 |
fal-ai/kling-video/v3/pro/text-to-video, …/image-to-video |
3–15 | $0.112 · with sound $0.168 |
fal-ai/kling-video/o3/standard/text-to-video, …/image-to-video |
3–15 | $0.084 · with sound $0.112 |
fal-ai/kling-video/v2.6/pro/text-to-video, …/image-to-video |
5, 10 | $0.07 · with sound $0.14 |
fal-ai/veo3.1/fast, fal-ai/veo3.1/fast/image-to-video |
4, 6, 8 | 720p/1080p $0.10 · with sound $0.15 · 4k $0.30 |
fal-ai/veo3.1, fal-ai/veo3.1/image-to-video |
4, 6, 8 | 720p/1080p $0.20 · with sound $0.40 · 4k $0.40 |
fal-ai/veo3.1/lite |
4, 6, 8 | 720p $0.03 · with sound $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 (image) $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 | 時間内に完了しませんでした |
これら6つが唯一の値です。failed、canceled、およびexpiredは費用がかかりません。
DELETEは停止のリクエストであり、約束ではありません:プロバイダーがとにかく完了させたジョブは、
succeededで終了し、請求されます。
混雑時は自動で再試行されます。 プロバイダーが動画作成に空いていない場合、
または現在忙しすぎる場合、UberLLMは、10分以内に最大2回まで、自動的にジョブを再開します。
同じジョブIDと、最大費用は変わりません。ジョブは少し時間がかかるだけです。
すべての試行が失敗した場合にのみfailedが表示され、失敗したジョブには費用はかかりません。
待機中。 callback_urlを送信すると、ジョブが終了したときにお知らせします(
Callbacks]を参照)。または、5~10秒ごとにポーリングURLに問い合わせてください。
ほとんどの動画は1~5分かかります;一部の長いジョブや4Kジョブは、より時間がかかります。
請求が確定したかどうかを何度も問い合わせる必要はありません:誰も確認しないジョブでも、
UberLLMによって完了され、請求(または返金)され、
Dashboard → Activity]に表示されます。
コールバック
ビデオまたは音楽のジョブにcallback_urlを追加します。これは公開ホスト上のhttps://リンクです。
ジョブが完全に終了すると、UberLLMはジョブでGETが返すのと同じJSONを含めて、それにPOSTを送信します。
{ "model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5,
"callback_url": "https://your-app.example/uberllm/jobs" }
- いつ。 ジョブが終了し、請求が確定したときに一度だけ送信されます。
usage.cost_usdが設定されたsucceeded(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 secretで署名されています。それはダッシュボード → API keys → Webhook signing secret]で見つけることができます。最初に開いたときに作成され、シークレットを置き換えるですぐに交換できます。
v1は、シークレット全体(whsec_…)をキーとする、<t>.<raw body>の16進HMAC-SHA256です。受信した生のバイト(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
ウェブフックへのアラート
アラートメールはウェブフックにも送信できます。ダッシュボード → クレジット → 開発者向け: アラートもウェブフックに送信する]でリンクを設定するか、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を追加します。これは、署名済みS3, R2やGoogle Cloud Storageのuploadリンクなど、HTTP PUTを受け入れるhttps://リンクです。ジョブが成功すると、UberLLMはファイルとそのcontent typeをそこにuploadします。複数のファイルを作成するジョブの場合、output_upload_urlsを送信します。これは、ファイルごとに1つのリンクを順番に指定するものです(最大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=…" }
その後のジョブのstatusにはoutput_uploadが含まれます。
"output_upload": { "status": "delivered", "attempts": 1, "delivered_at": 1792540990,
"files": [{ "artifact_index": 0, "http_status": 200, "bytes": 5242880 }] }
statusはuploadが完了するまでpendingであり、その後deliveredまたはfailedになります(errorは平易な言葉で)。- 失敗したuploadは、30秒後、2, 10、および30分後に再試行され、その後
failedとマークされます。ファイルは保持されている間、results[].urlから引き続きダウンロードできます。リンクは少なくとも1時間有効にしてください。 - リンクは、ユーザー名やpasswordを含まず、public host上で
https://である必要があります。それは決して表示されず、uploadが完了すると削除されます。 - 画像はこれを受け入れません。画像は回答自体の中に返されます。
音楽
/v1/music/generationsと同じ3つのステップです。
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文字開始ごとに課金されます。応答は音声ファイルです。その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を使用します。料金は音声の1分あたりで課金されます。ファイルサイズは最大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が必要)を必要とする場合、送信されるデフォルト値はモデルのスキーマと見積もりで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を超える場合、料金はかからずにキャンセルされます。見積もり自体には何も請求されたり保留されたりしません。
- 1つの見積もりで1つのリクエストが開始されます。それを再度使用すると
409 quote_usedが返されます。モデルに到達しなかったジョブは見積もりを返します。 - リクエストは同じ内容を要求する必要があります:同じモデルと、同じ設定(プロンプト、サイズ、クリップ長、ソース画像など)。それ以外は
400 quote_mismatchで拒否されます。max_cost、metadata、およびoutput_upload_urlは異なる場合があります。 - 15分後には
400 quote_expiredが返されます。チャットモデルはトークンごとに課金され、見積もりはありません。provider.max_priceで上限を設定してください。
フォールバックモデルと価格上限
"models": ["model-b", "model-c"]は、最初のモデルが現在サービスを提供できない(no_available_provider)場合や、お客様のprovider.max_priceを超える場合に、順に試行するモデルを指定します。その他の拒否はすぐに回答されます。回答のmodelは、それを作成したモデルの名前を示します(音声回答はオーディオファイル自体です。アクティビティでそのモデルが表示されます)。quote_idを含むリクエストにはmodelsはかからず、文字起こしにはどちらもかかりません。
"provider": {"max_price": 0.05}は、1単位(モデルの料金設定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ヘッダー(UUIDのような最大255文字の一意の文字列)を送信してください。接続が切断され、24時間以内に同じキーで同じリクエストを再度送信した場合、2つ目のジョブではなく、同じジョブが返されます。異なるリクエストで同じキーを使用すると、409 idempotency_key_reusedで拒否されます。画像、音声、文字起こしリクエストはキーを受け付けません。失敗したものは請求されなかったため、再度送信してください。
残高
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>は1つのモデルを提供し、メディアモデルの場合、対応するクリップの長さ、解像度、アスペクト比、サイズ、および必要なソース画像を含むリクエストボディのJSONスキーマであるparametersオブジェクトを提供します。
curl -H "Authorization: Bearer $UBERLLM_API_KEY" \
https://api.uberllm.dev/v1/models/pixverse/pixverse-c1-reference-to-video
pricingにはusd(現在、1つのunitが最も高価なもの)とlist_usd(モデル作成者自身の価格)があります。チャットモデルには、input_usd、output_usd、およびそれらのlist_価格が1M tokensあたりで設定されています。
エラー
| HTTP | code | meaning |
|---|---|---|
| 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 |
max_price以外のproviderオプション |
| 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はすでに他の販売者を試しました。メッセージには、現在機能している同じ種類のモデルが示されます |