# Chatbot WhatsApp n8n — Iterasi & Konfigurasi Node

## Workflow Files
| Versi | Path | Status |
|-------|------|--------|
| v1 (original) | `doc_8dbe429a681d_chatbot_whattapp (9).json` | Baseline |
| v2_menu | `Program Aplikasi/chatbot_whatsapp_v2_menu.json` | Bermasalah — force 2x tanya |
| **v3_optimized** | `Program Aplikasi/chatbot_whatsapp_optimized.json` | **BERHASIL — gunakan ini** |

## Alur v3_optimized (yang berhasil)

```
WhatsApp Trigger → Mark as Read → Simple Memory (contextWindow=2) → AI Agent
                                                                    ↓
                                              Code (chunk + append menu) → Send WA
                                                                    ↓
                                                              Append row (log)
```

**Prinsip**: User dapat jawaban + menu dalam 1 alur. Menu di-append sebagai item terakhir di output array node Code. Tidak ada blocking.

## Node Penting — Code "Chunk & Menu"

Gunakan `$node` dengan optional chaining (BUKAN `$('WhatsApp Trigger')`):

```javascript
// Ambil output dari AI Agent
const agentOutput = $input.first().json.output || $input.first().json.text;
if (!agentOutput) { return []; }

const cleanedText = agentOutput.replace(/\*\*/g, '');
const phoneNumber = $node["WhatsApp Trigger"]?.json?.messages?.[0]?.from || 'unknown';

// Chunk dengan limit 2800 (sisa untuk menu)
const limit = 2800;
const chunks = [];
for (let i = 0; i < cleanedText.length; i += limit) {
  chunks.push(cleanedText.substring(i, i + limit));
}

// Menu teks — SINGKAT (~150 chars)
const menuText = "─────────────────────\n1️⃣ PMK  2️⃣ LSD  3️⃣ Rabies\n4️⃣ Vaksinasi  5️⃣ PHMS  6️⃣ RPH\n7️⃣ Lainnya - ketik nomor/pertanyaan";

const items = [];
chunks.forEach((chunk) => {
  items.push({ json: { text_chunk: chunk, phone_number: phoneNumber } });
});

// Kirim menu setiap 3 turn
const messageCount = $input.first().json.memory?.histories?.length || 0;
if (messageCount % 3 === 0) {
  items.push({ json: { text_chunk: menuText, phone_number: phoneNumber } });
}

return items;
```

**KENAPA `$node` BUKAN `$('NodeName')`**: Referensi `$('NodeName')` error saat import JSON karena nama node berbeda per environment. Optional chaining `$node["WhatsApp Trigger"]?.json?.messages?.[0]?.from` lebih robust.

## System Prompt — Rules untuk Menu Selection

Tambahkan di BARIS PALING ATAS system prompt AI Agent:

```
ATURAN PEMAHAMAN MENU:
- Jika pengguna mengetik ANGKA 1-7, itu adalah KODE MENU. Artinya:
  1 = PMK (Penyakit Mulut dan Kuku)
  2 = LSD (Lumpy Skin Disease)
  3 = Rabies
  4 = Vaksinasi
  5 = Surveilans PHMS
  6 = RPH / RPU
  7 = Lainnya
- Jika pengguna mengetik angka, LANGSUNG jawab topik yang sesuai DENGAN PENJELASAN LENGKAP.
- Jangan sapa lagi jika sudah paham ini reply ke menu!
```

## Optimasi Token (untuk banyak user)

| Parameter | Default | Optimized | Hemat |
|-----------|---------|-----------|-------|
| `contextWindowLength` | 4 | **2** | ~50% |
| Menu size | ~400 chars | **~150 chars** | ~35 tokens/turn |
| Menu frequency | setiap turn | **setiap 3 turn** | ~66% |

**Estimasi**: 1000 farmers/hari → ~$0.5-1.5/hari (vs $2-5 sebelum optimasi)

## Konfigurasi Node Simple Memory

```json
{
  "sessionIdType": "customKey",
  "sessionKey": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}",
  "contextWindowLength": 2
}
```

## Design Principle — JANGAN PAKSA USER BERTANYA 2 KALI

Iterasi bermasalah:
- Cek `first contact` → kirim menu SAJA → user harus ulang pertanyaan → 2x tanya ❌

Design yang benar:
- **Langsung proses** pertanyaan user — tidak halangi dengan menu
- **Menu di-append di akhir jawaban** — user dapat jawaban + opsi下一次 dalam 1 kali balas
- Menu dikirim **setiap 3 turn**, bukan setiap turn

## Credential Reference
- WhatsApp account: `whatsAppApi` (id: `zWSbPqUqE1Re9s2y`)
- Google Sheets account: `googleApi` (service account)
- WhatsApp Trigger: `whatsAppTriggerApi` (id: `UT5RE2jfAkES1Fxf`)

## Google Sheets
- Log sheet: `1x0pAx5uqI-ttgr9x3qk8gah_72oudcINyr2S_ffPxUQ` (Sheet1)
- Kata kunci: `1GCywX8Iq4b32gfin9sylngwr5hcIgEf8ZceUF69aQ0U` (kata_kunci sheet)
