Chat AIModelHargaDocsPanduan

Cara bikin bot WhatsApp yang dijawab AI (Python + OpenAI SDK)

Daftarkan nomor di WhatsApp Cloud API dari Meta, arahkan webhook ke server Python kecil, lalu setiap pesan masuk dikirim ke AI lewat OpenAI SDK dengan base URL https://api.macloudai.com/v1 dan jawabannya dikirim balik ke pelanggan. Biaya AI dipotong dari saldo Rupiah per token; biaya dari sisi Meta mengikuti kebijakan Meta.

Diperbarui 2026-11-01 · MaCloud AI

Gambaran cara kerjanya

Contoh kasusnya toko online kecil di Jakarta yang jualan kopi bubuk. Setiap hari ada puluhan chat yang isinya mirip: "masih ada stok?", "ongkir ke Bekasi berapa?", "bisa COD?". Bot AI bisa menjawab pertanyaan rutin ini 24 jam, dan meneruskan sisanya ke admin.

  1. Pelanggan mengirim pesan ke nomor WhatsApp toko.
  2. WhatsApp Cloud API mengirim pesan itu ke alamat webhook di server kamu.
  3. Server Python mengirim pesan, beserta instruksi tentang toko, ke model AI lewat OpenAI SDK.
  4. Jawaban AI dikirim balik ke pelanggan lewat WhatsApp Cloud API.

Yang perlu disiapkan

  • Akun MaCloud AI dengan saldo (top up mulai Rp 50.000 lewat QRIS atau transfer bank) dan satu API key khusus bot.
  • Akun Meta for Developers, aplikasi dengan produk WhatsApp, dan nomor telepon yang didaftarkan ke WhatsApp Cloud API. Nomor yang sudah dipakai di aplikasi WhatsApp biasa umumnya tidak bisa langsung dipakai; ikuti ketentuan Meta.
  • Server dengan HTTPS (VPS kecil sudah cukup). Untuk uji coba di laptop bisa pakai tunnel seperti ngrok atau Cloudflare Tunnel.
  • Python 3 dan paket flask, openai, requests.

Verifikasi bisnis, persetujuan nama tampilan, batas jumlah pesan dan biaya percakapan WhatsApp semuanya diatur oleh Meta, bukan oleh MaCloud AI. Kami tidak bisa mempercepat atau menjamin persetujuan dari Meta. Selalu ikuti dokumentasi resmi WhatsApp Cloud API untuk langkah terbaru.

Langkah 1: siapkan WhatsApp Cloud API

Di dashboard Meta for Developers, buat aplikasi, tambahkan produk WhatsApp, lalu ikuti petunjuk awal di sana. Yang kamu butuhkan untuk kode di bawah:

  • Access token untuk mengirim pesan (token sementara cukup untuk uji coba; untuk produksi pakai token permanen sesuai petunjuk Meta).
  • Phone number ID dari nomor yang dipakai bot.
  • App secret dari pengaturan aplikasi, untuk memeriksa bahwa request webhook benar dari Meta.
  • Verify token: kata rahasia buatan kamu sendiri, diisi di dashboard Meta dan di server.

Setelah server jalan, isi alamat webhook (misalnya https://bot.tokokamu.id/webhook) dan verify token di pengaturan webhook WhatsApp di dashboard Meta, lalu langganan (subscribe) ke kolom messages.

Langkah 2: server Python kecil

Pasang paket dengan pip install flask openai requests, simpan kode ini sebagai bot.py:

import hashlib, hmac, os, threading

import requests
from flask import Flask, request
from openai import OpenAI

app = Flask(__name__)
ai = OpenAI(base_url="https://api.macloudai.com/v1", api_key=os.environ["MACLOUD_KEY"])

VERIFY_TOKEN = os.environ["WA_VERIFY_TOKEN"]  # kata rahasia buatan sendiri
WA_TOKEN = os.environ["WA_TOKEN"]            # access token dari Meta
PHONE_ID = os.environ["WA_PHONE_ID"]          # Phone number ID dari Meta
APP_SECRET = os.environ.get("WA_APP_SECRET", "")
GRAPH_URL = os.environ["WA_GRAPH_URL"]        # alamat Graph API sesuai dokumentasi Meta

SYSTEM = (
    "Kamu admin toko online Kopi Kemang di Jakarta Selatan. "
    "Jawab singkat, ramah, bahasa Indonesia sehari-hari. "
    "Jam operasional 09.00-21.00 WIB, pengiriman lewat kurir dari Jakarta. "
    "Kalau ditanya stok, ongkir pasti atau komplain, bilang admin akan cek dan balas. "
    "Jangan mengarang harga atau janji."
)
history = {}
seen = set()


@app.get("/webhook")
def verify():
    if (request.args.get("hub.mode") == "subscribe"
            and request.args.get("hub.verify_token") == VERIFY_TOKEN):
        return request.args.get("hub.challenge", ""), 200
    return "forbidden", 403


def signature_ok(req):
    if not APP_SECRET:
        return True
    got = req.headers.get("X-Hub-Signature-256", "")
    want = "sha256=" + hmac.new(APP_SECRET.encode(), req.get_data(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(got, want)


@app.post("/webhook")
def receive():
    if not signature_ok(request):
        return "bad signature", 403
    data = request.get_json(silent=True) or {}
    for entry in data.get("entry", []):
        for change in entry.get("changes", []):
            for msg in change.get("value", {}).get("messages", []):
                if msg.get("type") != "text" or msg["id"] in seen:
                    continue
                seen.add(msg["id"])
                threading.Thread(target=reply, args=(msg["from"], msg["text"]["body"])).start()
    return "ok", 200  # balas cepat supaya Meta tidak mengirim ulang


def reply(wa_id, text):
    chat = history.setdefault(wa_id, [])
    chat.append({"role": "user", "content": text})
    del chat[:-10]  # simpan 10 pesan terakhir saja, supaya token input tidak membengkak
    try:
        r = ai.chat.completions.create(
            model="gem-3.8-flash",
            max_tokens=300,
            messages=[{"role": "system", "content": SYSTEM}] + chat,
        )
        answer = r.choices[0].message.content
    except Exception:
        answer = "Maaf, sistem lagi sibuk. Admin kami akan balas sebentar lagi ya."
    chat.append({"role": "assistant", "content": answer})
    requests.post(
        f"{GRAPH_URL}/{PHONE_ID}/messages",
        headers={"Authorization": f"Bearer {WA_TOKEN}"},
        json={"messaging_product": "whatsapp", "to": wa_id,
              "type": "text", "text": {"body": answer}},
        timeout=15,
    )


if __name__ == "__main__":
    app.run(port=8000)

Bagian yang menerima dan membalas pesan memakai bentuk payload WhatsApp Cloud API yang umum. Alamat Graph API dan versinya ditaruh di variabel WA_GRAPH_URL supaya kamu isi sesuai dokumentasi Meta yang berlaku, tanpa mengubah kode.

Langkah 3: jalankan dan uji

export MACLOUD_KEY=sk-...
export WA_VERIFY_TOKEN=rahasia-buatan-sendiri
export WA_TOKEN=...
export WA_PHONE_ID=...
export WA_APP_SECRET=...
export WA_GRAPH_URL=https://graph.facebook.com/vXX.X
python bot.py
  1. Jalankan server, lalu buka tunnel ke port 8000 kalau masih di laptop.
  2. Isi alamat webhook https://alamat-kamu/webhook dan verify token di dashboard Meta, lalu klik verifikasi. Kalau berhasil, server membalas hub.challenge.
  3. Kirim pesan WhatsApp ke nomor bot dari nomor yang diizinkan untuk uji coba.
  4. Cek konsol → tab Pemakaian: setiap balasan bot muncul dengan token dan biayanya.

Berapa biaya AI per chat?

Biaya AI dihitung per token: (token input ÷ 1.000.000 × harga input) + (token output ÷ 1.000.000 × harga output). Token input mencakup instruksi toko, riwayat 10 pesan terakhir dan pertanyaan baru. Token output adalah jawaban bot, dibatasi max_tokens=300 di kode di atas.

Contoh dengan angka bulat (bukan harga asli): harga input Rp 10.000 dan output Rp 40.000 per 1 juta token. Satu balasan dengan 1.500 token input dan 150 token output = Rp 15 + Rp 6 = Rp 21. Kalau sehari ada 300 balasan, biaya AI sekitar Rp 6.300 per hari. Harga asli tiap model ada di tabel ini:

Harga asli sekarang

Perkiraan dari harga di halaman model: 2.000 token input dan 500 token output per chat. Potongan saldo yang asli ada di konsol.

ModelPer chat1.000 chat
GEM 3.8 FlashRp 4Rp 4.434
TT-6 LunaRp 11Rp 10.642
TT-6.1 TerraRp 7Rp 7.263
HK-5.5Rp 3Rp 3.487
GEM 4 ArgonRp 85Rp 84.649
TT-6.1 SolRp 15Rp 14.526

Biaya dari sisi WhatsApp (per percakapan atau per pesan, tergantung jenisnya) ditagih oleh Meta dan mengikuti kebijakan harga Meta yang berlaku, terpisah dari saldo MaCloud AI.

Supaya bot aman dan tidak bikin malu

  • Tulis instruksi yang jelas: apa yang boleh dijawab, dan kapan harus bilang "admin akan cek". Jangan biarkan bot mengarang harga, stok atau promo.
  • Simpan data yang sering ditanya (jam buka, area kirim, cara bayar) di instruksi sistem, bukan dibiarkan ditebak model.
  • Batasi riwayat percakapan dan max_tokens supaya biaya per chat tetap kecil.
  • Jangan simpan API key di kode; pakai environment variable seperti contoh.
  • Ikuti aturan Meta soal kapan bisnis boleh membalas atau memulai percakapan; di luar ketentuan itu pesan bisa ditolak.
  • Contoh di atas menyimpan riwayat di memori server; untuk produksi, simpan di database dan jalankan di belakang server WSGI seperti gunicorn.

Kalau belum siap pakai WhatsApp Cloud API, coba dulu otomasi tanpa kode lewat panduan n8n. Contoh kode lain ada di dokumentasi.

Pertanyaan umum

Q1Apakah bisa pakai nomor WhatsApp yang sekarang dipakai jualan?
Itu diatur oleh Meta. Umumnya nomor yang dipakai di WhatsApp Cloud API tidak sekaligus dipakai di aplikasi WhatsApp biasa. Cek ketentuan terbaru di dokumentasi resmi Meta.
Q2Berapa biaya bot WhatsApp AI per bulan?
Biaya AI tergantung jumlah chat dan model, dipotong per token dari saldo Rupiah; angka aslinya terlihat di tab Pemakaian. Biaya WhatsApp ditagih terpisah oleh Meta sesuai kebijakannya.
Q3Model mana yang cocok untuk bot customer service?
Model ringan dan cepat biasanya cukup untuk menjawab pertanyaan rutin dan lebih hemat. Bandingkan harganya di halaman model.
Q4Apakah MaCloud AI bisa membantu verifikasi akun Meta?
Tidak. Verifikasi bisnis dan persetujuan akun WhatsApp sepenuhnya urusan Meta. Kami menyediakan API AI-nya.
Q5Apakah isi chat pelanggan disimpan oleh MaCloud AI?
Tidak. Kami hanya mencatat jumlah token, nama model dan waktu untuk tagihan. Riwayat chat yang disimpan hanya yang kamu simpan sendiri di server.
Q6Kenapa bot membalas dua kali?
Biasanya karena server lambat membalas webhook sehingga Meta mengirim ulang. Balas webhook secepatnya dan abaikan ID pesan yang sudah diproses, seperti di contoh kode.

Panduan lain