Rivya AI ডকস

Rivya TypeScript SDK নির্দেশিকা

SSE স্ট্রিমিংসহ মডেল, তৈরির কাজ, ফাইল, ক্রেডিট, ওয়েবহুক ও কথোপকথনের জন্য প্রকাশ্য API v1 কল করতে Rivya TypeScript SDK পরীক্ষামূলক সংস্করণ ব্যবহার করুন।

শেষ পর্যালোচনা 2026/08/29

সার্ভার-পক্ষের প্রকাশ্য API সংযোগের জন্য Rivya একটি TypeScript SDK পরীক্ষামূলক সংস্করণ দেয়।

SDK হলো Rivya প্রকাশ্য API v1-এর ওপর হালকা একটি গ্রাহক। নিচের স্তরের সংযোগের চুক্তি এখনও OpenAPI ও স্কিমা সংযোগের চুক্তি; SDK-র পদ্ধতিগুলোকে সেই স্কিমার সঙ্গে সামঞ্জস্যপূর্ণ থাকতে হবে।

SDK বাস্তবায়িত গ্রাহক আচরণ ব্যাখ্যা করে। অনুরোধ পাঠাতে স্থাপনায় প্রকাশ্য API চালু থাকতে হবে, অ্যাকাউন্টে বৈধ কী থাকতে হবে এবং মডেলের বর্তমান API অবস্থায় ওই কাজের অনুমতি থাকতে হবে।

অবস্থা

প্যাকেজ-টি বর্তমানে এই কোডভান্ডার-এর ভিতরে ব্যক্তিগত পরীক্ষামূলক সংস্করণ হিসেবে রক্ষণাবেক্ষণ করা। প্যাকেজ নাম, সহায়ক তথ্য, পরিবর্তনের নথি এবং প্রকাশ প্রক্রিয়া স্পষ্টভাবে অনুমোদিত না হওয়া পর্যন্ত এটি npm-এ প্রকাশিত নয়।

SDK সমর্থন করে:

  • মডেলের তালিকা দেখা

  • অসমকালীন তৈরির কাজ শুরু ও আবার দেখা

  • ফাইল API-তে আপলোড ও আবার দেখা

  • ক্রেডিটের পরিমাণ দেখা

  • ওয়েবহুক সংযোগবিন্দু পরিচালনা, পরীক্ষামূলক সরবরাহ, ঘটনা ও সরবরাহের তালিকা এবং গোপন মান বদলানো

  • ওয়েবহুকের স্বাক্ষর যাচাই

  • স্ট্রিমবিহীন ও স্ট্রিমিং কথোপকথন সম্পূর্ণ করা এবং API-তে তৈরি কথোপকথনের সেশন

কথোপকথন স্ট্রিমিং এই ব্যক্তিগত পরীক্ষামূলক সংস্করণে সার্ভার-পাশের 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);
}

তৈরি A তৈরি

অসমকালীন ছবি, ভিডিও বা শব্দ তৈরির জন্য 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-lite",
  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-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 ও Grok Imagine Image 2.0 রেফারেন্স ছবির জন্য মডেল-নির্দিষ্ট মূল আপলোডের উত্তরের width, height, size_bytesimage_dimensions_token দরকার। পরে files.retrieve কল করলে টোকেনটি null হতে পারে; MIME ধরন, মাপ বা বাইটের আকার অনুমান না করে উৎস ছবি আবার আপলোড করুন। Layer Decomposition একটি ছবির জ্যামিতিক সীমাও প্রয়োগ করে; Grok Imagine Image 2.0 সাধারণ ছবি সম্পাদনার জন্য সাইন ইন করে দেওয়া 1–5টি JPEG, PNG বা WebP রেফারেন্স গ্রহণ করে।

Video8 রেফারেন্স ভিডিওর ক্ষেত্রে মডেল-নির্দিষ্ট মূল আপলোডের উত্তরের video_width, video_height, frames_per_second, video_bitrate_mbps, video_file_size_bytesvideo_metadata_token যথাক্রমে width, height, framesPerSecond, videoBitrateMbps, sizeBytesvideoMetadataToken হিসেবে ব্যবহার করুন। সাইন ইন করে দেওয়া সময়কালের প্রমাণ আলাদা রাখতে durationSecondsdurationToken ব্যবহার করুন। পরে files.retrieve-এ টোকেন দুটির কোনোটি না থাকলে উৎস ভিডিও আবার আপলোড করুন।

Wan 3.0-এর পারস্পরিকভাবে স্বতন্ত্র text, framesreference দৃশ্য একই SDK ঘর-বিন্যাস ব্যবহার করে। প্রতিটি রেফারেন্স model: "wan-3-0-video" দিয়ে আপলোড করুন। ছবির জন্য ফেরত পাওয়া ছবির ঘরগুলো, ভিডিওর জন্য ফেরত পাওয়া সময়কাল ও ভিডিওর সহায়ক তথ্য—দুই ধরনের তথ্যই—এবং শব্দের জন্য মূল mime_type, size_bytes, duration_secondsduration_token প্রয়োজন। params-এর মধ্যে seedance_scene, variant, resolution, aspect_ratio, duration, audio এবং ঐচ্ছিক seed দিন। স্বয়ংক্রিয় সময়কালের মান -1; এতে 30 সেকেন্ডের ক্রেডিট সংরক্ষিত হয় এবং এটি রেফারেন্স ভিডিওর সঙ্গে ব্যবহার করা যায় না। ফাইল বা লিংক থেকে সরাসরি ভিডিও তৈরির সংক্ষিপ্ত পথ এখানে নেই।

যাচাই করুন ক্রেডিট

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

ওয়েবহুক পরিচালনা করুন

ব্যবস্থাপনা ও হিসাব-এর জন্য ওয়েবহুক প্রবেশাধিকার চালু থাকলে ওয়েবহুক সংযোগবিন্দু তৈরি করুন:

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 শুধু তৈরি বা ঘোরে কল-এর পরে ফেরত দেয় হয়। এটি আপনার সার্ভার-এ দোকান করুন।

ওয়েবহুকের অন্যান্য সহায়ক পদ্ধতি:

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 });

ওয়েবহুকের পেলোড বিশ্বাস করার আগে সরবরাহের স্বাক্ষর যাচাই করুন:

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-এর সহায়ক পদ্ধতি API ওয়েবহুক-এ নথিভুক্ত একই HMAC-SHA256 সংযোগের চুক্তি ব্যবহার করে।

কথোপকথন

একটি স্ট্রিমবিহীন কথোপকথন API কথোপকথনের পালা-এর জন্য chat.completions.create ব্যবহার করুন:

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);

ফেরত পাওয়া session_id দিয়ে কাজ চালিয়ে যান:

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-তৈরি করা সেশন পড়া করুন:

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

সার্ভারের পাঠানো ঘটনা অসমকালীন ইটারেটর হিসেবে গ্রহণ করতে chat.completions.stream ব্যবহার করুন:

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 শুধু দেখানোর জন্য। স্থায়ীভাবে সংরক্ষিত ফলাফল message.completed-এর পরে পাওয়া যায় এবং পরে chat.sessions.retrieve দিয়ে পড়া যায়।

ত্রুটি

2xx নয় এমন প্রকাশ্য API প্রতিক্রিয়ার জন্য SDK RivyaAPIError ছুড়ে দেয়:

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 অবস্থা, প্রকাশ্য ত্রুটি কোড, বার্তা, অনুরোধ ID পাওয়া গেলে তা এবং প্রতিক্রিয়ার নিরাপদ শিরোনামের অংশ থাকে।

যাচাইকরণ

পরিবর্তন সম্পূর্ণ ধরে নেওয়ার আগে SDK যাচাই চালান:

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

pnpm sdk:check স্থির চুক্তি ও নেটওয়ার্কবিহীন চালনা যাচাই করে। এর মধ্যে ত্রুটি বিশ্লেষণ, নিরাপদ ত্রুটি শিরোনাম, একই-অনুরোধ নিশ্চিত করার শিরোনাম, Bearer পরিচয় যাচাই, প্রকাশ্য মডেলের তালিকা, কথোপকথন স্ট্রিমিংয়ের SSE বিশ্লেষণ ও ত্রুটির ঘটনা এবং ওয়েবহুকের স্বাক্ষর যাচাই অন্তর্ভুক্ত।

সংশ্লিষ্ট পাতা