وثائق Rivya AI

Rivya TypeScript SDK

استخدم الإصدار التجريبي من Rivya TypeScript SDK لاستدعاء Public API v1 للنماذج، والتوليد، والملفات، والرصيد، والويبهوكات، وChat بما في ذلك بث SSE.

آخر مراجعة في 2026/05/11

توفر Rivya إصدارا تجريبيا من TypeScript SDK لتكاملات Public API من جهة الخادم.

SDK هو عميل خفيف فوق Rivya Public API v1. يبقى العقد الأدنى مستوى هو OpenAPI and Schema Contract، ويجب أن تظل طرق SDK متوافقة مع هذا الـ schema.

الحالة

تتم صيانة الحزمة حاليا داخل هذا المستودع كإصدار beta خاص. لن تنشر إلى npm حتى تتم الموافقة صراحة على اسم الحزمة، والبيانات الوصفية، وسجل التغييرات، وعملية الإصدار.

يدعم SDK:

  • سرد النماذج
  • إنشاء التوليدات غير المتزامنة واسترجاعها
  • رفع الملفات واسترجاعها عبر Files API
  • استرجاع رصيد الائتمان
  • إدارة نقاط الويبهوك، وتسليمات الاختبار، وقوائم الأحداث، وقوائم التسليم، وتدوير السر
  • التحقق من توقيع الويبهوك
  • إكمالات Chat غير المتدفقة والمتدفقة، إضافة إلى جلسات المحادثة التي تنشئها API

يتوفر بث Chat في هذا الإصدار التجريبي الخاص عبر تحليل SSE من جهة الخادم. أبق مفاتيح API السرية على خادمك.

التثبيت في هذا المستودع

استخدم مصدر الحزمة المحلي ما دام SDK في المرحلة التجريبية:

pnpm --dir packages/rivya-sdk typecheck

يجب أن يحتفظ كود التطبيق بمفتاح API السري على الخادم:

import { RivyaClient } from "@rivya/sdk";

const rivya = new RivyaClient({
  apiKey: process.env.RIVYA_API_KEY
});

لا تضع مفاتيح API السرية في حزم المتصفح، أو localStorage، أو أحداث التحليلات، أو لقطات الشاشة، أو التذاكر المشتركة.

سرد النماذج

models.list عام ولا يتطلب مفتاح API:

const models = await rivya.models.list();

for (const model of models.data) {
  console.log(model.id, model.api_status, model.supported_api_inputs);
}

إنشاء توليد

استخدم 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:

const current = await rivya.generations.retrieve(generation.id);
console.log(current.status, current.result?.primary_url);

استخدم Idempotency-Key لطلبات الكتابة في الإنتاج. يعرض SDK هذا الحقل باسم idempotencyKey.

رفع الملفات

استخدم 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);

استخدم files.retrieve لقراءة بيانات الملف المرفوع مرة أخرى:

const sameFile = await rivya.files.retrieve(uploaded.id);
console.log(sameFile.mime_type, sameFile.duration_token);

عند استخدام ملف في توليد، مرر الحقول العامة العائدة عبر 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
      }
    ]
  }
});

التحقق من الرصيد

const credits = await rivya.credits.retrieve();
console.log(credits.current_credits);

إدارة Webhooks

أنشئ نقطة 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);

لا يعاد signing_secret إلا بعد استدعاءات الإنشاء أو التدوير. خزنه على خادمك.

مساعدات 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 });

تحقق من توقيعات التسليم قبل الوثوق بحمولات 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");
}

يستخدم مساعد SDK العقد نفسه HMAC-SHA256 الموثق في API Webhooks.

Chat

استخدم chat.completions.create لإرسال دورة Chat API واحدة غير متدفقة:

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:

await rivya.chat.sessions.list({ limit: 20 });
await rivya.chat.sessions.retrieve(completion.session_id);

استخدم chat.completions.stream لاستهلاك Server-Sent Events كمكرر async:

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 مخصص للعرض فقط. النتيجة المعتمدة تكون متاحة بعد message.completed، ويمكن قراءتها لاحقا باستخدام chat.sessions.retrieve.

الأخطاء

يرمي SDK الخطأ RivyaAPIError لاستجابات Public API غير 2xx:

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، وكود الخطأ العام، والرسالة، ومعرف الطلب عند توفره، ومجموعة فرعية آمنة من رؤوس الاستجابة.

التحقق

شغل فحوص SDK قبل اعتبار أي تغيير مكتملا:

pnpm sdk:check
pnpm --dir packages/rivya-sdk typecheck
pnpm content:api-docs

يتضمن pnpm sdk:check فحص عقد ثابت وفحص runtime بلا شبكة لتحليل الأخطاء، ورؤوس الخطأ الآمنة، ورؤوس idempotency، ومصادقة Bearer، وسرد النماذج العام، وتحليل Chat streaming SSE، وأحداث أخطاء Chat streaming، والتحقق من توقيع webhook.

الصفحات ذات الصلة

جدول المحتويات