요청당 결제 (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헤더의 영수증이 함께 제공됩니다.
각 서명은 하나의 요청에 대한 비용을 지불합니다. 다른 요청을 하려면 다시 서명하세요.
결제 방식
402는 요청에 대해 발생할 수 있는 최대 비용을 제시합니다. 이는 요청이 취할 수 있는 가장 비싼 경로를 기준으로, 귀하의 프롬프트와 max_tokens의 출력을 합한 금액입니다. 견적을 낮게 유지하려면 max_tokens을(를) 설정하세요.
결제 방법은 두 가지입니다:
upto(가장 먼저 제공됩니다). 귀하는 견적을 상한선으로 서명합니다. 응답 후에는 실제 비용만 청구되며, 달러의 백만분의 일 단위로 올림 처리됩니다. 첫 결제 시 일회성 USDC 승인이 필요합니다. 결제 서비스가 지원하는 경우, 해당 승인에는 gas가 필요하지 않습니다.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헤더는 없습니다. 지갑에 전송 내역이 표시됩니다. - 하나의 지갑으로 동시에 최대 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개의 유료 요청이 이미 실행 중입니다 | 하나가 완료될 때까지 기다리세요 |
503 service_unavailable |
결제 서비스가 잠시 중단되었습니다 | 1분 후에 다시 시도하세요 |