Mulai Cepat Integrasi

Di panduan ini, Anda akan autentikasi dengan Bearer token, melakukan POST body minimal ke https://api.korinai.com/api/chat yang berisi participantEmail dan messages, lalu melakukan streaming respons menggunakan SSE agar keluaran tampil bertahap. Kita juga membahas field opsional: roomId untuk penyimpanan percakapan, dan previousMessages untuk konteks.

Ringkasan

Panggil KorinAI Chat API langsung dari aplikasi Anda menggunakan Bearer token dan body minimal yang memuat participantEmail dan messages. API mengalirkan respons melalui Server‑Sent Events (SSE) sehingga Anda bisa merender token secara bertahap. Gunakan token pengguna/sesi di klien; gunakan kunci API hanya di server tepercaya. Opsional sertakan roomId untuk persistensi dan previousMessages untuk konteks.

Fitur Utama

  • POST sederhana ke https://api.korinai.com/api/chat.
  • Streaming default (SSE) untuk UI responsif.
  • participantEmail wajib (peserta yang diajak chat; lihat di bawah).
  • roomId (persistensi) dan previousMessages (konteks) opsional.

Memulai

  1. Masuk ke dashboard.
  2. Buat token di Dashboard → Settings → API Keys (atau gunakan token pengguna/sesi dari lapisan auth Anda).
  3. (Opsional) Di Your Agents, pilih agen yang ingin digunakan (nanti Anda pass participantEmail‑nya).

Quick Start

Panggil API dengan Bearer token. Anda bisa memakai token pengguna/sesi (klien) atau kunci API (server/integrasi tepercaya).

Sematkan Widget Chat

Jika Anda ingin UI siap pakai untuk situs web, sertakan skrip CDN dan inisialisasi:

html
<script src="https://cdn.jsdelivr.net/npm/@korinai/embed@latest/dist/embed.js"></script>
<div id="korin-floating-chat"></div>
<script>
  window.KorinAI.init({
    target: "#korin-floating-chat",
    baseUrl: "https://api.korinai.com",
    chatApi: "https://api.korinai.com/api/chat",
    language: "id",
    props: { title: "Chat dengan KorinAI" }
  });
</script>

Contoh Fetch Node.js

ts
// sseParser.ts
export async function parseKorinSSE(stream: ReadableStream<Uint8Array>) {
  const reader = stream.getReader();
  const decoder = new TextDecoder();
  let buffer = "";
  let finalText = "";
  let metadata: any = undefined;

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    buffer += decoder.decode(value, { stream: true });
    const lines = buffer.split("\n");
    buffer = lines.pop() || "";
    for (const line of lines) {
      if (!line.startsWith("data: ")) continue;
      const data = line.slice(6);
      if (data === "[DONE]") return { text: finalText, metadata };
      try {
        const evt = JSON.parse(data);
        if (evt.type === "text-start") finalText = "";
        else if (evt.type === "text-delta") finalText += evt.delta || "";
        else if (evt.type === "message-metadata")
          metadata = evt.messageMetadata;
        else if (evt.type === "error")
          throw new Error(evt.errorText || "Stream error");
      } catch {}
    }
  }
  return { text: finalText, metadata };
}

type MinimalMessage = {
  role: "user" | "assistant" | "system";
  content: string;
};

async function sendMessage(
  token: string,
  prompt: string,
  options: {
    participantEmail: string; // WAJIB: penerima chat (lihat catatan di bawah)
    roomId?: string;
    previousMessages?: MinimalMessage[]; // riwayat opsional untuk konteks
  }
) {
  const res = await fetch("https://api.korinai.com/api/chat", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${token}`,
    },
    body: JSON.stringify({
      participantEmail: options.participantEmail,
      messages: [
        ...(options?.previousMessages || []),
        { role: "user", content: prompt },
      ],
      ...(options?.roomId ? { roomId: options.roomId } : {}),
    }),
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  if (!res.body) throw new Error("No response body");
  return await parseKorinSSE(res.body);
}

Payload minimal

Kirim payload paling kecil yang valid. Tambahkan field hanya saat diperlukan.

json
{
  "participantEmail": "user@example.com",
  "messages": [{ "role": "user", "content": "Hello!" }]
}

Untuk persistensi dan konteks, Anda juga dapat menyertakan:

json
{
  "roomId": "room_abc123",
  "messages": [
    { "role": "user", "content": "Hi" },
    { "role": "assistant", "content": "Hello!" }
  ]
}

Field body request

  • participantEmail (wajib): email peserta yang diajak chat. Gunakan email pengguna terautentikasi untuk chat ke diri sendiri; atau gunakan email pengguna lain untuk chat dengan pengguna/agen tersebut.
  • messages: urutan percakapan. Sertakan pesan sebelumnya untuk konteks; yang terakhir biasanya prompt pengguna baru.
  • roomId (opsional): kaitkan pertukaran dengan percakapan untuk penamaan dan riwayat.

Contoh Respons

Respons dialirkan sebagai Server‑Sent Events (SSE). Uraikan potongan secara bertahap; UI Anda dapat merender saat tiba. Untuk penggunaan satu kali, buffer stream dan uraikan pesan asisten final.

Pemecahan Masalah

  • 401 Unauthorized: pastikan token valid.
  • 403 Kredit tidak cukup: periksa saldo kredit dan paket.
  • Tidak ada streaming: baca dari response.body.getReader() dan tambahkan potongan yang didekode.
  • Tools tidak aktif: sertakan participantEmail yang valid dengan Tools diaktifkan.

Topik Terkait


Ingin komponen UI siap pakai? Lihat Korin UI.