Rivya TypeScript SDK
Rivya TypeScript SDK beta를 사용해 models, generations, files, credits, webhooks, SSE streaming을 포함한 Chat용 Public API v1을 호출하세요.
최근 검토일 2026/05/11
Rivya는 server-side Public API integrations를 위한 TypeScript SDK beta를 제공합니다.
SDK는 Rivya Public API v1 위의 얇은 client입니다. lower-level contract는 OpenAPI와 Schema Contract로 유지되며, SDK methods는 해당 schema와 계속 정렬되어야 합니다.
Status
현재 package는 이 repository 안에서 private beta로 유지됩니다. package name, metadata, changelog, release process가 명시적으로 승인되기 전까지 npm에 publish되지 않습니다.
SDK는 다음을 지원합니다.
- model listing
- asynchronous generation create and retrieve
- Files API upload and retrieve
- credit balance retrieval
- webhook endpoint management, test deliveries, event listing, delivery listing, secret rotation
- webhook signature verification
- non-streaming 및 streaming Chat completions, API-created chat sessions
Chat streaming은 이 private beta에서 server-side SSE parsing을 통해 사용할 수 있습니다. secret API keys는 server에 보관하세요.
이 Repo에서 설치
SDK가 beta인 동안 local package source를 사용하세요.
pnpm --dir packages/rivya-sdk typecheckApplication code는 secret API key를 server에 보관해야 합니다.
import { RivyaClient } from "@rivya/sdk";
const rivya = new RivyaClient({
apiKey: process.env.RIVYA_API_KEY
});secret API keys를 browser bundles, localStorage, analytics events, screenshots, shared tickets에 넣지 마세요.
Models 나열
models.list는 public이며 API key가 필요하지 않습니다.
const models = await rivya.models.list();
for (const model of models.data) {
console.log(model.id, model.api_status, model.supported_api_inputs);
}Generation 만들기
비동기 image, video, audio generation에는 generations.create를 사용하세요.
const generation = await rivya.generations.create(
{
model: "z-image",
prompt: "A clean editorial product image on a soft studio background",
client_request_id: "order-123-preview"
},
{
idempotencyKey: "order-123-preview"
}
);
console.log(generation.id, generation.status);그다음 generations.retrieve로 poll하세요.
const current = await rivya.generations.retrieve(generation.id);
console.log(current.status, current.result?.primary_url);production write requests에는 Idempotency-Key를 사용하세요. SDK는 이것을 idempotencyKey로 노출합니다.
Files 업로드
reference images, videos, audio에는 files.upload를 사용하세요.
import { readFile } from "node:fs/promises";
const file = new Blob([await readFile("./reference.png")], {
type: "image/png"
});
const uploaded = await rivya.files.upload({
file,
filename: "reference.png",
kind: "image",
model: "nano-banana-2",
client_request_id: "asset-123"
});
console.log(uploaded.id, uploaded.url);업로드한 metadata를 다시 읽으려면 files.retrieve를 사용하세요.
const sameFile = await rivya.files.retrieve(uploaded.id);
console.log(sameFile.mime_type, sameFile.duration_token);generation에서 file을 사용할 때는 반환된 public fields를 params.referenceMediaItems로 전달하세요.
await rivya.generations.create({
model: "nano-banana-2",
prompt: "Restyle this product photo for a clean editorial catalog page",
params: {
referenceMediaItems: [
{
url: uploaded.url,
kind: uploaded.kind,
name: uploaded.file_name,
mimeType: uploaded.mime_type,
durationSeconds: uploaded.duration_seconds ?? undefined,
durationToken: uploaded.duration_token ?? undefined
}
]
}
});Credits 확인
const credits = await rivya.credits.retrieve();
console.log(credits.current_credits);Webhooks 관리
webhook endpoint 만들기:
const endpoint = await rivya.webhooks.create({
name: "Production webhook",
url: "https://example.com/rivya/webhook",
event_types: ["generation.succeeded", "generation.failed"]
});
console.log(endpoint.id, endpoint.signing_secret);signing_secret은 create 또는 rotate calls 후에만 반환됩니다. server에 저장하세요.
다른 webhook helpers:
await rivya.webhooks.list();
await rivya.webhooks.retrieve(endpoint.id);
await rivya.webhooks.update(endpoint.id, { status: "disabled" });
await rivya.webhooks.test(endpoint.id);
await rivya.webhooks.rotateSecret(endpoint.id);
await rivya.webhooks.deliveries.list(endpoint.id, { limit: 20 });
await rivya.webhookEvents.list({ limit: 20 });webhook payload를 신뢰하기 전에 delivery signatures를 검증하세요.
import { verifyRivyaWebhookSignature } from "@rivya/sdk";
const ok = await verifyRivyaWebhookSignature({
rawBody,
timestamp: request.headers.get("rivya-webhook-timestamp") || "",
signatureHeader: request.headers.get("rivya-webhook-signature") || "",
signingSecret: process.env.RIVYA_WEBHOOK_SIGNING_SECRET || ""
});
if (!ok) {
throw new Error("Invalid Rivya webhook signature");
}SDK helper는 API Webhooks에 문서화된 동일한 HMAC-SHA256 contract를 사용합니다.
Chat
non-streaming Chat API turn 하나에는 chat.completions.create를 사용하세요.
const completion = await rivya.chat.completions.create(
{
model: "gpt-5-2-chat",
message: "Write a concise launch plan for a new product image campaign",
client_request_id: "chat-001"
},
{
idempotencyKey: "chat-001"
}
);
console.log(completion.session_id, completion.message.content);반환된 session_id로 이어가세요.
await rivya.chat.completions.create({
model: "gpt-5-2-chat",
session_id: completion.session_id,
message: "Now turn that into a 5-step execution checklist."
});API-created sessions 읽기:
await rivya.chat.sessions.list({ limit: 20 });
await rivya.chat.sessions.retrieve(completion.session_id);Server-Sent Events를 async iterator로 소비하려면 chat.completions.stream을 사용하세요.
const stream = await rivya.chat.completions.stream(
{
model: "gpt-5-2-chat",
message: "Write a concise launch plan for a new product image campaign",
client_request_id: "chat-stream-001"
},
{
idempotencyKey: "chat-stream-001"
}
);
for await (const event of stream) {
if (event.event === "message.delta") {
process.stdout.write(event.data.delta);
}
if (event.event === "message.completed") {
console.log(event.data.message.id);
}
}message.delta는 display 전용입니다. committed result는 message.completed 이후 사용할 수 있으며, 나중에 chat.sessions.retrieve로 읽을 수 있습니다.
Errors
non-2xx Public API responses의 경우 SDK는 RivyaAPIError를 throw합니다.
import { RivyaAPIError } from "@rivya/sdk";
try {
await rivya.generations.retrieve("task_missing");
} catch (error) {
if (error instanceof RivyaAPIError) {
console.log(error.status, error.code, error.requestId);
}
}RivyaAPIError에는 HTTP status, public error code, message, 사용 가능한 경우 request id, safe response-header subset이 포함됩니다.
Validation
change를 완료로 보기 전에 SDK checks를 실행하세요.
pnpm sdk:check
pnpm --dir packages/rivya-sdk typecheck
pnpm content:api-docspnpm sdk:check에는 static contract check와 no-network runtime check가 포함되며, error parsing, safe error headers, idempotency headers, Bearer auth, public model listing, Chat streaming SSE parsing, Chat streaming error events, webhook signature verification을 다룹니다.