Rivya TypeScript SDK
SSE akışlı dahil Chat, modeller, üretim işleri, dosyalar, krediler ve webhook'lar için Public API v1 çağrılarında Rivya TypeScript SDK beta'yı kullanın.
Son inceleme 2026/08/29
Rivya, sunucu tarafı Public API entegrasyonları için TypeScript SDK beta sağlar.
SDK, Rivya Public API v1 üzerinde ince bir müşteri katmanıdır. Daha düşük seviyeli sözleşme OpenAPI ve Şema Sözleşmesi olarak kalır ve SDK method'ları bu şemayla uyumlu kalmalıdır.
SDK uygulanmış istemci davranışını belgeler. İstekler Public API'nin dağıtımda etkin olmasını, geçerli hesap anahtarını ve canlı API durumu işlemi destekleyen modeli gerektirir.
Durum
Package şu anda bu repository içinde özel beta olarak tutuluyor. Package adı, metadata, changelog ve release süreci açıkça onaylanmadan npm'e yayınlanmaz.
SDK şunları destekler:
model listeleme
asenkron üretim oluşturma ve alma
Dosyalar API yükleme ve alma
kredi bakiyesi alma
webhook uç nokta yönetimi, test teslimatları, olay listeleme, teslimat listeleme ve secret rotation
webhook imza doğrulama
non-akışlı ve akışlı Chat completions, ayrıca API tarafından oluşturulan sohbet sessions
Chat akışlı bu özel beta içinde sunucu tarafı SSE ayrıştırma üzerinden kullanılabilir. Secret API anahtarlarını sunucunuzda tutun.
Bu Repo İçinde Kurulum
SDK beta aşamasındayken local package kaynak kullanın:
pnpm --dir packages/rivya-sdk typecheckApplication kodu secret API anahtarını sunucuda tutmalıdır:
import { RivyaClient } from "@rivya/sdk";
const rivya = new RivyaClient({
apiKey: process.env.RIVYA_API_KEY
});Secret API anahtarlarını browser bundle'larına, localStorage'a, analytics olay'lerine, ekran görüntülerine veya paylaşılan destek kayıtlarına koymayın.
Modelleri Listeleme
models.list herkese açık'tir ve API anahtarı gerektirmez:
const models = await rivya.models.list();
for (const model of models.data) {
console.log(model.id, model.api_status, model.supported_api_inputs);
}Oluşturma İşi Başlatma
Asenkron görüntü, video veya ses üretim için generations.create kullanın:
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);Sonra generations.retrieve ile sorgulamak edin:
const current = await rivya.generations.retrieve(generation.id);
console.log(current.status, current.result?.primary_url);Üretim write istek'leri için Idempotency-Key kullanın. SDK bunu idempotencyKey olarak sunar.
Dosya Yükleme
Referans görüntüleri, videoları veya sesi yüklemek için files.upload kullanın:
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-lite",
client_request_id: "asset-123"
});
console.log(uploaded.id, uploaded.url);Yüklenen metadata bilgisini tekrar okumak için files.retrieve kullanın:
const sameFile = await rivya.files.retrieve(uploaded.id);
console.log(sameFile.mime_type, sameFile.duration_token);Bir üretim içinde dosya kullanırken dönen herkese açık alanları params.referenceMediaItems üzerinden gönderin:
await rivya.generations.create({
model: "nano-banana-2-lite",
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,
width: uploaded.video_width ?? uploaded.width ?? undefined,
height: uploaded.video_height ?? uploaded.height ?? undefined,
sizeBytes: uploaded.video_file_size_bytes ?? uploaded.size_bytes,
imageDimensionsToken: uploaded.image_dimensions_token ?? undefined,
framesPerSecond: uploaded.frames_per_second ?? undefined,
videoBitrateMbps: uploaded.video_bitrate_mbps ?? undefined,
videoMetadataToken: uploaded.video_metadata_token ?? undefined
}
]
}
});Image5 veya Grok Imagine Image 2.0 için kullanılan her referans görüntüsü, özgün modele bağlı yükleme yanıtındaki width, height, size_bytes ve image_dimensions_token değerlerini gerektirir. Daha sonraki bir files.retrieve çağrısı token'ı null olarak döndürebilir; MIME türünü, boyutları veya bayt boyutunu tahmin etmek yerine kaynak görüntüyü yeniden yükleyin. Katman Decomposition ayrıca tek görüntüye ilişkin geometri limitlerini uygular; Grok Image 2, standart görüntü düzenleme için bir ila beş imzalı JPEG, PNG veya WebP referansını kabul eder.
Bir Video8 referans videosu için özgün modele bağlı yükleme yanıtındaki video_width, video_height, frames_per_second, video_bitrate_mbps, video_file_size_bytes ve video_metadata_token değerlerini sırasıyla width, height, framesPerSecond, videoBitrateMbps, sizeBytes ve videoMetadataToken olarak kullanın. durationSeconds ile durationToken değerlerini ayrı bir imzalı süre kanıtı olarak saklayın. Daha sonraki bir files.retrieve çağrısında iki token'dan biri eksikse kaynak videoyu yeniden yükleyin.
Wan 3.0, birbirini dışlayan text, frames ve reference sahnelerinde aynı SDK alan eşlemesini kullanır. Her referansı model: "wan-3-0-video" ile yükleyin; görüntüler imzalı görüntü alanlarını, videolar hem imzalı süreyi hem de video metadata bilgilerini, ses ise özgün mime_type, size_bytes, duration_seconds ve duration_token değerlerini gerektirir. params içinde seedance_scene, variant, resolution, aspect_ratio, duration, audio ve isteğe bağlı seed değerini ayarlayın. Akıllı süre -1 değeridir, 30 saniye ayırır ve referans videosuyla kullanılamaz; dosyadan videoya ve bağlantıdan videoya kısayollar kullanılamaz.
Kredileri Kontrol Etme
const credits = await rivya.credits.retrieve();
console.log(credits.current_credits);Webhooks Yönetimi
Webhook erişimi dağıtım ve hesap için etkin olduğunda bir webhook uç nokta'i oluşturun:
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 yalnızca oluşturmak veya rotate çağrılarından sonra döner. Bunu sunucunuzda saklayın.
Diğer webhook helper'ları:
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'larına güvenmeden önce teslimat imzalarını doğrulayın:
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 içinde belgelenen aynı HMAC-SHA256 sözleşmesini kullanır.
Chat
Tek bir non-akışlı Chat API turu için chat.completions.create kullanın:
const completion = await rivya.chat.completions.create(
{
model: "claude-sonnet-5-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);Dönen session_id ile devam edin:
await rivya.chat.completions.create({
model: "claude-sonnet-5-chat",
session_id: completion.session_id,
message: "Now turn that into a 5-step execution checklist."
});API tarafından oluşturulan session'ları okuyun:
await rivya.chat.sessions.list({ limit: 20 });
await rivya.chat.sessions.retrieve(completion.session_id);Server-Sent Events'i async iterator olarak tüketmek için chat.completions.stream kullanın:
const stream = await rivya.chat.completions.stream(
{
model: "claude-sonnet-5-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 yalnızca gösterim içindir. Committed sonuç message.completed sonrasında kullanılabilir ve daha sonra chat.sessions.retrieve ile okunabilir.
Hatalar
SDK, 2xx olmayan Public API yanıt'ları için RivyaAPIError fırlatır:
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 durum, herkese açık hata kodu, mesaj, varsa istek id ve güvenli yanıt-başlık alt kümesini içerir.
Doğrulama
Bir değişikliği tamamlanmış saymadan önce SDK kontrollerini çalıştırın:
pnpm sdk:check
pnpm --dir packages/rivya-sdk typecheck
pnpm content:api-docspnpm sdk:check; hata ayrıştırma, güvenli hata başlıklar, idempotency başlıklar, Bearer auth, herkese açık model listeleme, Chat akışlı SSE ayrıştırma, Chat akışlı hata olaylar ve webhook imza doğrulama için statik sözleşme kontrolü ve no-network çalışma zamanı kontrolü içerir.
İlgili Sayfalar
OpenAPI ve Şema Sözleşmesi
Rivya API v1 şema kaynaklarını, uyumluluk kurallarını, public alanları ve salt okunur OpenAPI JSON sözleşmesini inceleyin.
API Modelleri
Rivya API modellerini listeleyin; model ID'lerini, kategorileri, prompt limitlerini, referans medyayı, readiness durumlarını ve Files API bağımlılıklarını anlayın.
