# Chat API Chat API memungkinkan pesan asinkron antara manusia dan agen LLM. Berbeda dengan chat sinkron (gaya ChatGPT), manusia dapat meninggalkan pesan saat agen sedang bekerja — agen melakukan polling di antara pemanggilan alat. ## Cara Kerja ``` Human (browser) ──POST /chat/send──▶ Synapse ◀──GET /chat/poll── Agent (LLM) │ └── marks messages as read on poll ``` 1. Manusia mengirim pesan melalui web UI (menggunakan JWT) 2. Pesan disimpan, ditandai sebagai belum dibaca 3. Agen melakukan polling `GET /chat/poll` di antara pemanggilan alat 4. Polling mengembalikan semua pesan belum dibaca dan menandainya sebagai sudah dibaca 5. Agen memproses pesan, secara opsional membalas melalui `POST /chat/reply` ## Endpoint ### GET /chat/poll Polling pesan baru dari manusia. Mengembalikan pesan belum dibaca dan menandainya sebagai sudah dibaca. Gunakan ini di antara pemanggilan alat. ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ https://synapse.schaefer.zone/chat/poll ``` Respons: ```json { "messages": [ { "id": "msg_001", "role": "human", "content": "How's the deployment going?", "created_at": "2026-06-27T..." } ] } ``` ### POST /chat/reply Mengirim pesan sebagai agen. ```bash curl -X POST https://synapse.schaefer.zone/chat/reply \ -H "Authorization: Bearer YOUR_MIND_KEY" \ -H "Content-Type: application/json" \ -d '{"content": "Deployment is 80% done. CI is green, just waiting for Docker push."}' ``` ### POST /chat/send Mengirim pesan sebagai manusia (memerlukan JWT, bukan Mind Key). ```bash curl -X POST https://synapse.schaefer.zone/chat/send \ -H "Authorization: Bearer YOUR_JWT" \ -H "Content-Type: application/json" \ -d '{"content": "Can you check the logs?"}' ``` ### GET /chat/history Mengambil riwayat chat terbaru (kedua peran). ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/chat/history?limit=50" ``` ### GET /chat/unread Mengambil jumlah pesan belum dibaca. ```bash # Menghitung pesan belum dibaca dari manusia (untuk agen) curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/chat/unread?role=agent" # Menghitung pesan belum dibaca dari agen (untuk manusia) curl -H "Authorization: Bearer YOUR_JWT" \ "https://synapse.schaefer.zone/chat/unread?role=human" ``` ### GET /chat/status Mengambil status sesi chat (timestamp pesan terakhir, jumlah belum dibaca). ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ https://synapse.schaefer.zone/chat/status ``` ### POST /chat/upload Mengunggah lampiran file untuk pesan tertentu (form multipart). ```bash curl -X POST https://synapse.schaefer.zone/chat/upload \ -H "Authorization: Bearer YOUR_JWT" \ -F "message_id=msg_001" \ -F "file=@screenshot.png" ``` ### GET /chat/files/:message_id Mendaftar lampiran file untuk sebuah pesan. ```bash curl -H "Authorization: Bearer YOUR_JWT" \ https://synapse.schaefer.zone/chat/files/msg_001 ``` ### GET /chat/file/:file_id Mengunduh lampiran file. ```bash curl -H "Authorization: Bearer YOUR_JWT" \ https://synapse.schaefer.zone/chat/file/file_001 --output download.png ``` ## Pola Polling > [!TIP] > Lakukan polling setiap 30-60 detik di antara pemanggilan alat. Jangan polling > lebih sering dari itu — ini membuang kuota API dan tidak memberikan manfaat. ```python # Pseudo-code while working: messages = poll_chat() for msg in messages: process_message(msg) reply(f"Acknowledged: {msg.content}") do_one_tool_call() ``` ## Langkah Berikutnya - [Tasks API](/docs/api/tasks) - [Pola Polling Chat](/docs/llm-cookbook/chat-polling-pattern)