# Knowledge Base


Knowledge Base adalah perpustakaan artikel internal yang dikelola oleh Admin dan Supervisor. Agent dapat mencarinya kapan saja sebagai referensi — prosedur layanan, panduan produk, FAQ, kebijakan pengembalian, dan sejenisnya — tanpa perlu meninggalkan aplikasi.

**Rute frontend:** `/knowledge`

## Ringkasan

Artikel tersimpan di tabel PostgreSQL `knowledge_articles`. Setiap artikel memiliki judul, isi teks bebas, kategori opsional, dan tag JSONB. Pencarian menggunakan indeks GIN PostgreSQL (`to_tsvector` / `plainto_tsquery`) pada kolom `title` dan `content`, sehingga kueri kata kunci menemukan artikel secara akurat tanpa memerlukan layanan pencarian eksternal.

| Field | Keterangan |
|---|---|
| **Title** | Judul artikel (maks. 500 karakter) |
| **Content** | Isi artikel, teks biasa multi-baris |
| **Category** | Pengelompokan bebas (contoh: `Billing`, `Technical`, `FAQ`) |
| **Tags** | Label tambahan dipisah koma (disimpan sebagai array JSON) |
| **Status** | **Published** (terlihat semua agent) atau **Draft** (hanya Admin/Supervisor) |

## Hak akses

| Peran | Baca artikel published | Baca draft | Buat/Edit/Hapus |
|---|:---:|:---:|:---:|
| Admin | Ya | Ya | Ya |
| Supervisor | Ya | Ya | Ya |
| Agent | Ya | Tidak | Tidak |

Kontrol ini diterapkan di backend (`settings.manage` permission) — agent reguler tidak akan melihat tombol **New Article**, **Edit**, atau **Delete** di antarmuka.

## Mengelola artikel (Admin / Supervisor)

### Membuat artikel baru

1. Buka halaman `/knowledge`.
2. Klik tombol **New Article** di pojok kanan atas.
3. Isi formulir:
   - **Title** — wajib diisi, tidak boleh kosong.
   - **Content** — isi artikel, teks biasa multi-baris.
   - **Category** — opsional; mulai mengetik dan pilih dari saran kategori yang sudah ada, atau buat baru.
   - **Tags** — opsional; masukkan beberapa tag dipisah koma (contoh: `billing, faq, password`).
4. Klik **Create**.

Artikel baru langsung berstatus **Published** sehingga langsung terlihat oleh semua agent.

Endpoint yang dipanggil:
[`POST /api/knowledge`](/api) dengan body:

```json
{
  "title": "Cara reset password pelanggan",
  "content": "1. Buka halaman Pengaturan Akun...",
  "category": "Technical",
  "tags": ["password", "akun", "reset"]
}
```

### Mengedit artikel

1. Temukan artikel di daftar `/knowledge` (gunakan pencarian atau filter kategori).
2. Klik kartu artikel untuk meluaskan isinya.
3. Klik **Edit** di bagian bawah konten yang terbuka.
4. Ubah field yang diperlukan — semua field bersifat opsional saat update.
5. Untuk menyembunyikan artikel dari agent sementara, matikan toggle **Published** (artikel menjadi **Draft**).
6. Klik **Update**.

Endpoint: [`PATCH /api/knowledge/{id}`](/api)

### Menghapus artikel

1. Luaskan artikel.
2. Klik **Delete** → konfirmasi dengan **Confirm**.

:::warning
Penghapusan bersifat permanen. Tidak ada mekanisme undo — salin isi artikel terlebih dahulu jika mungkin diperlukan lagi.
:::

Endpoint: [`DELETE /api/knowledge/{id}`](/api)

### Status Draft vs Published

Saat mengedit artikel, toggle **Published** menentukan visibilitas:

| Status | Terlihat oleh Agent | Terlihat oleh Supervisor/Admin |
|---|:---:|:---:|
| Published | Ya | Ya |
| Draft | Tidak | Ya |

Gunakan status **Draft** untuk artikel yang sedang disusun atau sedang direvisi sebelum disebarluaskan.

## Menggunakan Knowledge Base saat bertugas

Agent membuka `/knowledge` di tab terpisah atau melalui navigasi samping kapan saja selama shift.

### Mencari artikel

1. Buka `/knowledge`.
2. Ketik kata kunci di kotak pencarian — pencarian berjalan otomatis setelah 300 ms (debounced).
3. Hasil muncul sesuai relevansi berdasarkan indeks full-text pada judul dan isi.

:::tip
Gunakan kata kunci spesifik dari konteks percakapan — misalnya `"refund kebijakan 7 hari"` alih-alih hanya `"refund"` — agar hasil lebih tepat sasaran.
:::

### Filter berdasarkan kategori

Di bawah kotak pencarian, pill kategori menampilkan semua kategori yang ada. Klik satu kategori untuk memfilter daftar. Klik **All** untuk kembali ke tampilan penuh.

### Membaca dan menyalin isi artikel

1. Klik kartu artikel — konten lengkap akan terbuka di bawah judul.
2. Salin bagian yang relevan untuk ditempelkan ke kotak pesan di inbox atau dijadikan referensi saat berbicara dengan pelanggan.

:::note
Tidak ada tombol "Sisipkan ke percakapan" secara langsung. Salin teks secara manual dari artikel yang terbuka, lalu tempel di kotak input percakapan. Untuk balasan pendek yang sering dipakai, pertimbangkan membuat [Quick Reply](/panduan/agent/quick-replies) agar lebih cepat disisipkan.
:::

### Pagination

Daftar artikel menampilkan 20 artikel per halaman (maks. 100 per permintaan via API). Gunakan tombol **Previous** / **Next** di bagian bawah untuk berpindah halaman.

## Praktik terbaik

- **Bagi artikel menjadi topik tunggal** — satu artikel untuk satu prosedur, bukan satu artikel yang mencakup segalanya.
- **Gunakan kategori konsisten** — tetapkan daftar kategori resmi bersama tim (`Billing`, `Technical`, `Pengiriman`, dll.) agar filter berguna.
- **Tambahkan tag deskriptif** — tag memudahkan pencarian ketika judul artikel tidak menyertakan kata kunci yang dicari agent.
- **Gunakan Draft** saat artikel sedang direvisi — jangan hapus dan buat ulang; cukup nonaktifkan sementara.
- **Tinjau ulang secara berkala** — kebijakan produk berubah; artikel usang lebih berbahaya dari tidak ada artikel.

## Langkah kerja khas (agent)

1. Terima percakapan masuk tentang topik yang tidak Anda hafal prosedurnya.
2. Buka `/knowledge` di tab baru.
3. Ketik kata kunci relevan di kotak pencarian.
4. Klik artikel yang sesuai untuk melihat isi lengkapnya.
5. Salin bagian yang relevan, tempel ke kotak input percakapan atau gunakan sebagai panduan respons Anda.
6. Kembali ke inbox dan kirim pesan.

## Langkah kerja khas (supervisor)

1. Identifikasi pertanyaan yang sering diajukan agent atau pelanggan.
2. Buka `/knowledge` → klik **New Article**.
3. Tulis prosedur atau jawaban, pilih kategori, tambahkan tag.
4. Klik **Create** — artikel langsung tersedia untuk semua agent.

Baca selanjutnya: [Kontak](/panduan/agent/kontak).
