# Motif Chat Wrapper Wrapper Node.js (ESM) untuk [Chat Motif](https://chat.motiftech.io) — tanpa perlu update token/`next-action` manual. ## Fitur - Chat teks (anonymous, tanpa login) - Pilih **response level**: `small` (Low) / `medium` / `high` - **Upload & baca file** (PDF, DOCX, TXT, kode, dll.) - Lanjut **conversation** dengan ID - **Streaming** real-time (token per token) - **Auto-discover** `next-action` dari bundle JS (tahan update deploy) - **Session** (cookie + cache action) di file JSON ## Requirement - Node.js **18+** (butuh native `fetch`, `FormData`, `Blob`) - Koneksi internet Tidak ada dependency npm tambahan. ## Install / setup ```bash # kalau pakai .js, pastikan package.json punya: # { "type": "module" } ``` ## Penggunaan CLI ```bash node ChatMotifjs "pesan kamu" ``` ### Opsi | Flag | Alias | Keterangan | |------|-------|------------| | `--level ` | `-l` | `small` / `medium` / `high` (atau `low` = small) | | `--file ` | `-f` | path file yang di-upload | | `--conv ` | `-c` | lanjut conversation yang sudah ada | | `--stream` | `-s` | cetak jawaban per token (real-time) | | `--session ` | | file session JSON (default: `.motif-session.json`) | ### Contoh ```bash # Chat biasa node ChatMotif.js "halo siapa kamu?" # Level High + streaming node ChatMotif.js "jelaskan quantum computing" --level high --stream # Baca file (PDF / TXT / kode) node ChatMotif.js "apa isi dokumen ini?" --file ./dokumen.pdf --level medium # Lanjut conversation node ChatMotif.js "lanjutkan penjelasanmu" --conv 01M3YZ2GQS9W409MMEA3M3RY06 # All-in: file + high + stream + lanjut conv node ChatMotif.js "ringkas poin utamanya" \ --file "./Presentasi.pdf" \ --conv 01M3YZ2GQS9W409MMEA3M3RY06 \ --level high \ --stream ``` ## Penggunaan di kode ```js import { chat, uploadFile, chatWithFile } from './ChatMotif.js'; // Chat sederhana const res = await chat('halo', { level: 'high', stream: false, }); console.log(res.text); console.log(res.conversationId); // Chat + file (otomatis buat conversation kalau belum ada) const res2 = await chatWithFile('apa isi file ini?', './script.py', { level: 'medium', stream: true, }); // Upload manual (wajib conversationId) const { file_id } = await uploadFile('./data.txt', { conversationId: res.conversationId, }); const res3 = await chat('analisis file ini', { conversationId: res.conversationId, fileIds: [file_id], level: 'high', }); ``` ### Return value `chat()` / `chatWithFile()` ```ts { conversationId: string, // simpan untuk --conv berikutnya text: string, // jawaban lengkap rawChunks: object[], // event SSE mentah (opsional) session: object, // state session (cookie, nextAction, …) } ``` ## File yang didukung | Jenis | Ekstensi | Keterangan | |-------|----------|------------| | Dokumen | `.pdf` `.docx` `.doc` | Resmi didukung Motif | | Teks | `.txt` `.md` `.csv` `.json` `.yaml` `.log` … | OK | | Kode | `.js` `.ts` `.py` `.java` `.go` `.rs` `.php` `.sh` … | Dikirim sebagai `text/plain` | **Tidak didukung:** binary mentah (`application/octet-stream`), image murni, zip/exe, dll. > Upload **wajib** punya `conversation_id`. > `chatWithFile()` otomatis bootstrap conversation jika `--conv` tidak diberikan. ## Session File default: `.motif-session.json` Isinya antara lain: - `cookies` — cookie browser (kalau nanti login) - `nextAction` — hash server action yang sedang valid - `_candidates` — daftar hash cadangan - `updatedAt` — waktu cache Hapus file ini jika ingin force refresh discovery: ```bash rm -f .motif-session.json ``` ## Response level | Nilai CLI | Di UI Motif | Kegunaan | |-----------|-------------|----------| | `small` / `low` | Low | Jawaban cepat | | `medium` | Medium | Seimbang | | `high` | High | Reasoning lebih dalam | ## Troubleshooting | Error | Solusi | |-------|--------| | `Gagal menemukan next-action` | Hapus `.motif-session.json`, jalankan lagi (butuh akses ke `chat.motiftech.io`) | | `Upload gagal … conversation_id or project_id is required` | Pakai `chatWithFile` / beri `--conv` | | `file type is not supported` | Ganti ekstensi / pastikan bukan binary; kode harus terdeteksi sebagai teks | | `Stream gagal: 400` | Biasanya body kotor (`$undefined`) — sudah di-handle di versi terbaru | | `Init gagal` | Coba lagi; wrapper akan coba kandidat action lain | ## Catatan - Ini **bukan** API resmi. Endpoint & hash `next-action` bisa berubah sewaktu-waktu; wrapper berusaha menyesuaikan otomatis. - Gunakan secara wajar. Hormati [Terms of Use](https://motiftech.io/en/terms-of-use/) Motif. - Anonymous (tanpa login). Fitur berbayar / kuota akun tidak di-handle di sini. ## Lisensi Bebas dipakai / dimodifikasi untuk keperluan pribadi.