リクエストごとの支払い (x402)
暗号資産ウォレットを持つエージェントは、アカウントも API キーも不要で UberLLM を利用できます。各リクエストの支払いは、オープンな x402 支払い標準 (バージョン 2) を使用して、Base 上の USDC で行われます。
これはチャットに適用されます: POST /v1/chat/completions および POST /v1/messages。画像、動画、音楽、音声には引き続きキーが必要です。
リクエストごとの支払いが有効になっているか確認するには、api.uberllm.dev/x402 を開いてください。ネットワーク、USDC コントラクト、支払いを受け取るウォレットが表示されます。「404 not found」と表示された場合、リクエストごとの支払いは無効です。代わりにキーを使用してください (クイックスタート)。
仕組み
- キーなしでリクエストを送信します。応答はHTTP 402 Payment Requiredです。
PAYMENT-REQUIREDヘッダーには (base64 JSON 形式で、ボディにも含まれています)、リクエストの最大費用と、利用可能な支払い方法が記載されています。 - ウォレットでいずれかのオプションに署名します。同じリクエストを再度、
PAYMENT-SIGNATUREヘッダーに署名を含めて送信します。 - UberLLM は支払いを確認し、応答を返し、その後支払いを回収します。通常の (ストリーミングではない) 応答には、
PAYMENT-RESPONSEヘッダーにレシートが含まれており、これにはオンチェーン取引が含まれます。
各署名は1つのリクエストの支払いとなります。別のリクエストを行うには、再度署名してください。
お支払いについて
402 は、リクエストにかかる最大費用を見積もります。これは、お客様のプロンプトと max_tokens の出力、そしてリクエストがたどる可能性のある最も高価なルートに基づいています。見積もりを低く抑えるには、max_tokens を設定してください。
お支払い方法は2種類あります。
upto(最初に提示されます)。お客様は見積もりを上限として承認します。回答後、実際の費用のみが、1ドルの100万分の1の位に切り上げて請求されます。初回のお支払いには、1回限りのUSDC承認が必要です。支払いサービスが対応している場合、その承認にガスは不要です。exact。リクエストの使用量が少なくても、見積もり額の全額が請求されます。返金はありません。ウォレットがuptoに対応していない場合にのみ、exactを選択してください。
お客様が承認した金額を超える請求は決してありません。何も提供されなかった場合(利用可能なモデルがない、回答開始前のエラーなど)、何も請求されません。
curlで試す
curl -i https://api.uberllm.dev/v1/chat/completions \
-H 'content-type: application/json' \
-d '{"model":"deepseek/deepseek-v4-flash","max_tokens":200,"messages":[{"role":"user","content":"Hello"}]}'
# HTTP/1.1 402 Payment Required
# PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6Mi…
#
# {"x402Version":2,"error":"PAYMENT-SIGNATURE header is required",
# "accepts":[{"scheme":"upto","network":"eip155:8453","amount":"…","asset":"0x8335…2913","payTo":"0x…",…},
# {"scheme":"exact",…}]}
amountはUSDCベース単位です: 1,000,000は$1です。ウォレットでacceptsのいずれかのエントリに署名してください。その後、-H 'PAYMENT-SIGNATURE: <base64 payment>'を付けて同じリクエストを再度送信してください。
コードから
x402 クライアントライブラリが、402, 署名とリトライを自動的に行います。JavaScriptの場合:
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
});
const res = await pay("https://api.uberllm.dev/v1/chat/completions", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
model: "deepseek/deepseek-v4-flash",
max_tokens: 200,
messages: [{ role: "user", content: "Hello" }],
}),
});
console.log(await res.json());
実費のみを支払うには、@x402/evm/upto/client から UptoEvmScheme も登録してください。GoとPython用のライブラリは、x402.org に掲載されています。
ご留意ください
- ストリーミングは動作します。
"stream": trueを使用すると、回答は通常通りストリーミングされます。支払いはストリームが終了したときに回収されます。ヘッダーはすでに送信されているため、PAYMENT-RESPONSEヘッダーはありません。ウォレットに送金が表示されます。 - 1つのウォレットにつき、同時に最大4件の有料リクエスト。
- 回答後に支払いを回収できない場合(例えば、その間にウォレットが空になった場合など)、通常の回答は保留され、
402 payment_failedを受け取ります。そのウォレットはその後24時間支払いができません。 - バージョン1 x402(
X-PAYMENTヘッダー)は受け付けられません。バージョン2のクライアントを使用してください。 - リクエストが多いですか?プリペイドクレジット付きのアカウントはよりシンプルで、オンチェーンのステップがありません:サインアップ。
エラー
| HTTP | 意味 | 対応 |
|---|---|---|
402 + PAYMENT-REQUIRED |
支払いがありません、または支払いが拒否されました (errorフィールドに理由が記載されています) |
acceptsのいずれかに署名し、再試行してください |
402 payment_failed |
回答は準備できましたが、支払いを回収できませんでした | ウォレットに資金を補充してください。そのウォレットは24時間後に再度支払うことができます |
400 invalid_payment |
PAYMENT-SIGNATUREはbase64 x402 v2の支払いではありません |
クライアントを修正してください |
429 rate_limited |
このウォレットから4件の支払い済みリクエストがすでに実行中です | いずれか1つが完了するまでお待ちください |
503 service_unavailable |
支払いサービスが一時的に停止しています | 1分後に再試行してください |