Rivya TypeScript SDK
Use o beta do Rivya TypeScript SDK para chamar a Public API v1 em modelos, gerações, arquivos, créditos, webhooks e Chat, incluindo streaming SSE.
Última revisão em 2026/05/11
A Rivya fornece um beta do TypeScript SDK para integrações server-side com a Public API.
O SDK é um cliente fino sobre a Rivya Public API v1. O contrato de nível mais baixo continua sendo Contrato de OpenAPI e Schema, e os métodos do SDK devem permanecer alinhados com esse schema.
Status
O pacote atualmente é mantido dentro deste repositório como beta privado. Ele não será publicado no npm até que o nome do pacote, metadados, changelog e processo de release sejam aprovados explicitamente.
O SDK oferece suporte a:
- listagem de modelos
- criação e recuperação de gerações assíncronas
- upload e recuperação pela Files API
- recuperação de saldo de créditos
- gerenciamento de endpoints de webhook, entregas de teste, listagem de eventos, listagem de entregas e rotação de segredo
- verificação de assinatura de webhook
- conclusões de Chat sem streaming e com streaming, além de sessões de chat criadas pela API
O streaming de Chat está disponível neste beta privado por parsing SSE do lado do servidor. Mantenha chaves secretas de API no seu servidor.
Instalar Neste Repo
Use o código-fonte do pacote local enquanto o SDK está em beta:
pnpm --dir packages/rivya-sdk typecheckO código da aplicação deve manter a chave secreta de API no servidor:
import { RivyaClient } from "@rivya/sdk";
const rivya = new RivyaClient({
apiKey: process.env.RIVYA_API_KEY
});Não coloque chaves secretas de API em bundles de navegador, localStorage, eventos de analytics, capturas de tela ou tickets compartilhados.
Listar Modelos
models.list é público e não exige chave de API:
const models = await rivya.models.list();
for (const model of models.data) {
console.log(model.id, model.api_status, model.supported_api_inputs);
}Criar uma Geração
Use generations.create para geração assíncrona de imagem, vídeo ou áudio:
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);Depois consulte com generations.retrieve:
const current = await rivya.generations.retrieve(generation.id);
console.log(current.status, current.result?.primary_url);Use Idempotency-Key para solicitações de escrita em produção. O SDK expõe isso como idempotencyKey.
Fazer Upload de Arquivos
Use files.upload para imagens, vídeos ou áudio de referência:
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);Use files.retrieve para ler novamente os metadados enviados:
const sameFile = await rivya.files.retrieve(uploaded.id);
console.log(sameFile.mime_type, sameFile.duration_token);Ao usar um arquivo em uma geração, envie os campos públicos retornados por 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
}
]
}
});Verificar Créditos
const credits = await rivya.credits.retrieve();
console.log(credits.current_credits);Gerenciar Webhooks
Crie um endpoint de webhook:
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);O signing_secret é retornado apenas após chamadas de criação ou rotação. Armazene-o no seu servidor.
Outros helpers de webhook:
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 });Verifique assinaturas de entrega antes de confiar em payloads de webhook:
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");
}O helper do SDK usa o mesmo contrato HMAC-SHA256 documentado em Webhooks da API.
Chat
Use chat.completions.create para um turno da Chat API sem streaming:
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);Continue com o session_id retornado:
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."
});Leia sessões criadas pela API:
await rivya.chat.sessions.list({ limit: 20 });
await rivya.chat.sessions.retrieve(completion.session_id);Use chat.completions.stream para consumir Server-Sent Events como um async iterator:
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 serve apenas para exibição. O resultado confirmado fica disponível após message.completed e pode ser lido depois com chat.sessions.retrieve.
Erros
O SDK lança RivyaAPIError para respostas não 2xx da Public API:
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 inclui o status HTTP, código público de erro, mensagem, request id quando disponível e um subconjunto seguro de headers de resposta.
Validação
Execute as checagens do SDK antes de tratar uma mudança como concluída:
pnpm sdk:check
pnpm --dir packages/rivya-sdk typecheck
pnpm content:api-docspnpm sdk:check inclui uma checagem estática de contrato e uma checagem de runtime sem rede para parsing de erros, headers seguros de erro, headers de idempotência, autenticação Bearer, listagem pública de modelos, parsing SSE de streaming de Chat, eventos de erro em streaming de Chat e verificação de assinatura de webhook.
Páginas Relacionadas
Quickstart da Rivya API
Crie uma chave de API, escolha um modelo, envie um job assíncrono de geração e envie um turno da Chat API com streaming SSE opcional.
Webhooks da API
Crie endpoints de webhook assinados da Rivya API, verifique assinaturas de entrega, inspecione tentativas de entrega e envie eventos de teste seguros.