1. Ringkasan
API ini menerima 1 pesan teks (dan opsional 1 gambar) dari iPhone Shortcut, lalu mengembalikan jawaban singkat yang siap dibacakan Text-to-Speech. Teks ditangani Groq (default), sedangkan gambar otomatis dianalisis Google Gemini AI (3.6 Flash) — sama seperti web chat utama. Bisa juga membuat gambar baru dari teks (Text to Image via Pollinations, gratis) dengan field image_prompt. Seluruh percakapan otomatis tersimpan ke D1 database dan bisa dilihat di web chat utama.
Alur
Shortcut → POST → Groq/Gemini → JSON → Suara
Endpoint
https://chatbox-shortcut-api.cocnantok.workers.dev
2. Endpoint & Autentikasi
- Method: POST (selain POST → 405). Preflight CORS OPTIONS → 204.
- CORS: Access-Control-Allow-Origin: * — bisa dipanggil dari browser & Shortcuts tanpa hambatan.
- API Key Groq (gsk_…) untuk semua request teks. Kalau mengirim gambar, butuh juga Gemini API key (lihat bawah). Urutan prioritas API key Groq:
- Header Authorization: Bearer KEY
- Field api_key di JSON body
- Secret env API_KEY / GROQ_API_KEY di dashboard Workers (opsional)
- Pembagian tugas AI: teks → Groq (default provider), gambar → Google Gemini AI — begitu body berisi field image / image_base64, request otomatis dialihkan ke model vision gemini-3.6-flash. Tanpa gambar, Gemini tidak digunakan sama sekali.
- Text to Image (membuat gambar baru): kirim field image_prompt (atau action: "generate_image") — gambar dibuat gratis lewat Pollinations.ai tanpa API key tambahan. ratio opsional: 1:1 / 16:9 / 9:16 (default 1:1). Api key tetap diminta (hanya untuk otentikasi request).
- Gemini API Key (untuk analisis gambar): field gemini_key di body > secret env GEMINI_API_KEY > Gemini API Key di Pengaturan web (dibaca otomatis dari D1).
- Provider/endpoint teks: default Groq. Bisa ditimpa dengan secret env BASE_URL di dashboard Workers.
- Model: opsional. Teks default openai/gpt-oss-120b; vision default gemini-3.6-flash (bisa ditimpa env GEMINI_MODEL).
- System prompt bawaan: jawaban disetel singkat, padat, ramah, tanpa markdown — ramah untuk TTS.
3. Format Request & Response
Request (JSON body)
{
"message": "Halo, jam berapa sekarang di Jakarta?",
"api_key": "gsk-xxxxxxxxxxxx",
"model": "openai/gpt-oss-120b"
}
// message wajib (kecuali pakai gambar) ; api_key & model opsional
// Teks → Groq. Kirim field "image" / "image_base64" untuk gambar → Gemini.
Request dengan gambar (analisis foto otomatis via Gemini)
{
"message": "Baca teks di gambar ini",
"api_key": "gsk-xxxxxxxxxxxx",
"image": { "base64": "<isi base64 gambar tanpa prefix data URI>", "mime": "image/jpeg" }
}
// Begitu field "image" ada, langsung diproses Gemini Vision (3.6 Flash).
// Format alternatif (lebih simpel untuk Shortcut): "image_base64" + "image_mime".
// "message" boleh dikosongkan — AI memakai pertanyaan default.
// api_key = key Groq (tetap wajib untuk otentikasi request).
// Gemini key untuk analisis: field "gemini_key" di body > env GEMINI_API_KEY >
// Gemini API Key di Pengaturan web (dipakai otomatis).
Request membuat gambar baru (Text to Image — tanpa API key gambar, gratis via Pollinations)
{
"image_prompt": "seekor kucing memakai baju astronot di bulan, ilustrasi kartun",
"ratio": "16:9",
"api_key": "gsk-xxxxxxxxxxxx"
}
// image_prompt wajib ; ratio opsional ("1:1" / "16:9" / "9:16", default 1:1)
// action opsional: "generate_image" / "text_to_image" (gaya alternatif).
// API key tetap wajib (hanya dipakai untuk otentikasi, bukan untuk gambar).
Response sukses Text to Image (HTTP 200)
{
"ok": true,
"ratio": "16:9",
"width": 1280, "height": 720,
"seed": 82007965,
"mime": "image/jpeg",
"base64": "<data gambar, kalau mau disimpan manual>",
"url": "https://image.pollinations.ai/prompt/...?..."
}
// url = link gambar langsung (simpan/diunduh pakai link ini, paling mudah).
// base64 = isi gambar bila ingin disimpan/disimpan sebagai file.
// Proses bisa butuh 10-60+ detik (gambar dikerjakan di server Pollinations).
// Antar request disarankan jeda ~12 detik agar tidak menumpuk antrean.
Response sukses (HTTP 200)
{ "reply": "Sekarang pukul 09.15 WIB." }
Response error (contoh)
{ "error": "Provider menolak request: Invalid API Key" }
Tabel status code
| Kode | Arti | Contoh pesan |
|---|---|---|
| 200 | Sukses | {"reply": "…"} |
| 204 | Preflight CORS (OPTIONS) | — |
| 400 | Body invalid / message kosong (tanpa gambar) / key Groq hilang / gambar tanpa key Gemini | Field "message" wajib diisi. · Gemini API Key belum diatur untuk analisis gambar. |
| 405 | Bukan POST | Metode tidak diizinkan. Gunakan HTTP POST. |
| 422 | Pollinations menolak prompt (konten tidak aman / hasil gambar kosong) | Pollinations menolak prompt ini: … · Gambar yang dihasilkan kosong/rusak … |
| 502 | Provider menolak (key salah / model tidak tersedia) | Provider menolak request: Invalid API Key |
| 504 | Pollinations belum selesai memproses dalam batas waktu (~66 dtk) | Pollinations belum selesai memproses gambar (timeout…). Coba lagi. |
| 500 | Kesalahan tak terduga di server | Terjadi kesalahan server: … |
4. Tes dari Terminal (curl)
Dengan header Authorization (macOS / Linux)
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY_HERE" \
-d '{"message":"Halo, siapa kamu?"}'
Dengan api_key di body (PowerShell — pakai file agar tak masalah tanda kutip)
Set-Content body.json '{"message":"Halo, siapa kamu?","api_key":"YOUR_API_KEY_HERE"}' -NoNewline -Encoding utf8
curl.exe -X POST -H "Content-Type: application/json" --data-binary "@body.json" https://chatbox-shortcut-api.cocnantok.workers.dev
3 varian request — teks saja / gambar saja / teks + gambar (macOS / Linux)
GROQ="gsk-YOUR_GROQ_KEY"
# 1) Teks saja → ditangani Groq
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROQ" \
-d '{"message":"Halo, jam berapa sekarang?"}'
# 2) Gambar saja → otomatis Gemini Vision (pakai pertanyaan default)
B64=$(base64 -w 0 foto.jpg 2>/dev/null || base64 -i foto.jpg)
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROQ" \
-d "{\"image_base64\":\"$B64\",\"image_mime\":\"image/jpeg\"}"
# 3) Teks + gambar → Gemini Vision (teks jadi instruksinya)
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROQ" \
-d "{\"message\":\"Baca teks di gambar ini\",\"image\":{\"base64\":\"$B64\",\"mime\":\"image/jpeg\"}}"
# Gemini key dipakai otomatis dari Pengaturan web. Kalau tidak ada,
# tambah field "gemini_key":"AIza-..." di body JSON.
Khusus: Analisis gambar (foto / screenshot) → Gemini
GROQ="gsk-YOUR_GROQ_KEY"
B64=$(base64 -w 0 foto.jpg 2>/dev/null || base64 -i foto.jpg)
# Minta Gemini menganalisis isi gambar
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROQ" \
-d "{\"message\":\"Analisis gambar ini, jelaskan isinya\",\"image\":{\"base64\":\"$B64\",\"mime\":\"image/jpeg\"}}"
# Ganti "message" sesuai keperluan:
# "Baca semua teks di gambar ini" -> OCR
# "Apa saja benda yang terlihat?" -> deteksi objek
# "Nilai mobil di foto ini berapa?" -> dsb.
# Kalau "message" dikosongkan, Gemini memakai pertanyaan default.
Text to Image — buat gambar baru dari teks (gratis, tanpa API key gambar)
GROQ="gsk-YOUR_GROQ_KEY"
# Buat gambar (ratio 16:9). Bisa butuh 10-60+ detik.
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROQ" \
-d '{"image_prompt":"seekor kucing memakai baju astronot di bulan, ilustrasi kartun","ratio":"16:9"}'
# Response: { "ok":true, "ratio":"16:9", "width":1280, "height":720, "seed":123,
# "mime":"image/jpeg", "base64":"…", "url":"https://image.pollinations.ai/…" }
# -> url = link gambar langsung (paling mudah untuk disimpan/ditampilkan).
# -> base64 = isi gambar bila ingin disimpan manual sebagai file.
# Contoh lain: buka hasilnya di browser (macOS/Linux, pakai python)
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Authorization: Bearer $GROQ" \
-d '{"image_prompt":"matahari terbenam di atas laut, style anime","ratio":"1:1"}' \
| python -c 'import sys,json,webbrowser; webbrowser.open(json.load(sys.stdin)["url"])'
# Alternatif gaya "action": {"action":"generate_image","image_prompt":"…","ratio":"9:16"}
# Ratio: "1:1" (persegi, default) | "16:9" (lebar) | "9:16" (tinggi).
# Pollinations gratis — jangan ragu ulangi sampai hasilnya bagus.
# Beri jeda ±12 detik antar request agar tidak menumpuk antrean.
Paling cepat — contoh siap pakai (copy-paste, langsung coba)
curl -X POST https://chatbox-shortcut-api.cocnantok.workers.dev \
-H "Content-Type: application/json" \
-H "Authorization: Bearer gsk-YOUR_GROQ_KEY" \
-d '{"message":"Jelaskan isi gambar ini","image":{"base64":"iVBORw0KGgoAAAANSUhEUgAAANwAAABaCAYAAADTszhEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARtSURBVHhe7ZrNbdwwFAZTiZtKPe4hLRhIETnnmhZycgFpYSPCIbAQxKeP4qdHJpkB5mbrZ6NZPtH59ACANAgOIBGCA0iE4AASITiARAgOIBGCA0iE4AASITiARAgOIBE5uJcviNhSheAQDaoQHKJBFYJDNKhCcIgGVQgO0aAKwSEaVCE4RIMqBIdoUIXgEA2qEByiQRWCQzSoQnCIBlUIDtGgCsEhGlQhOESDKgSHaFCF4BANqhAcokEVgkM0qEJwiAZVCA7RoArBBT5+ftz7nrdfxz8f+f7jzy/v+L559POqrWt85sr1Vu+67hHfvn5cQ0T29akQXODqwb1uKrxvvmwP6dExzlwlOCWyFiNfOKoqBBe4enDfv30cQ+F1u5ejY5w5O7jPm4/t83Zw9TNQVCG4wNWDU8bJytXzzAxOXcF7uOu6VQgucOXgroxYL9uKeHSsyFnBjYyQZ9xx7SoEF7hycM3jlfGrMYJdGalmBKeubK0vEGXUdl+/CsEFrhpc9F7zeTuP81wzgjsblcs9Hv3e3ta1V5zvdCoEF7hqcK1xq+5GRuNY71iZHdzZKNl7/dFqN7J7u1eF4AJXDa51rHpd0QrYe+3ZwUWrm7qy7W3dQ8G1yqkQXOCKwZ2Nk/XnWufr/VbPDC5a3a585tXoM3PdhwrBBa4YXGtE2ocUPbw9K0VmcNH4d3V1q7buo3Bl93avCsEFrhicek2usTIzuNa9Od61oi8gx1ipQnCBqwUXbZcfrQCtc/Y8wFnBOd87j4w+O8fxVQgusBWck54HVx0nq46xMiu4u4O4+z1OheACVwuud8V1PGQrBGfbSWx8fgS3iCsF1ztOVlvBFJTNAoLTVCG4wJWC6x0nq6ObBQSnqUJwgasEN7KhMDpWEpymCsEFtv6BrrzEjzy4o5sfI2PlCsGxafKfuEpwrd9Vt/dHxsqs4O4O4u6gVQgucIXgogfRwVm0WcEVW593z98NW/KH77/AFYKLHhQXV3Y57wiO/9r1xNFJ/nVXCC56UFxE95MZXPTlMnK+aJx03YcKwQXODi56UJxEI1tmcMXWZ164uspFx7TtgIoQXODs4KIRy03rYc4O7myE7o2udf0Fx7thVYXgAmcH1zr/1Qflyk5ddnDFaEUqqNFFsRVcq1tRheACZwZ31zZ29DAfbR7MCE4dpXtX5Wfc169CcIEzg7trxy467tE3vvLwXuFslb5zd/aOLwsVggucGVzr3KPvHb07drOCK96xaXRHbEUVggucFVz07T4yTlZ7xsqZwVWj6+3B+c62V4XgAmcFFz3kI+NktWesXCG44shqd9eq9qwKwQXOCC76r1yj42S1Z6xcJbhnlfgyIntWheAQDaoQHKJBFYJDNKhCcIgGVQgO0aAKwSEaVCE4RIMqBIdoUIXgEA2qEByiQRWCQzSoQnCIBlUIDtGgCsEhGlQhOESDKgSHaFBFDg4AxiE4gEQIDiARggNIhOAAEiE4gEQIDiARggNIhOAAEiE4gDQej9+4dHCP1TO/GAAAAABJRU5ErkJggg==","mime":"image/png"}}'
# Gambar contoh: persegi biru bertuliskan "HALO".
# Ganti "gsk-YOUR_GROQ_KEY" dengan key Anda → jalan, jawabannya muncul di "reply".
# Kalau muncul HTTP 429 / 503, itu jatah gratis Gemini sedang penuh —
# tunggu beberapa detik/menit lalu ulangi. Format ini terverifikasi bekerja.
5. Setup di iPhone Shortcut (langkah demi langkah)
Nama aksi ditulis versi Inggris (posisinya sama pada iPhone berbahasa Indonesia).
-
5.1. Buka Shortcuts → tombol + → beri nama (mis. Asisten).
-
5.2. Tambah aksi Get Contents of URL dan isi:
- Method: POST
- URL: https://chatbox-shortcut-api.cocnantok.workers.dev
- Headers — ketuk area headers → tambah baris:
- Content-Type = application/json
- Authorization = Bearer gsk-xxxxxxxxxxxx (opsional kalau Anda kirim api_key di body)
- Request Body — pilih tipe JSON, tambah field:
- message = variable (mis. Shortcut Input atau Ask Each Time)
- api_key = gsk-xxxxxxxxxxxx (boleh dihapus kalau sudah pakai header Authorization)
- model = openai/gpt-oss-120b (opsional)
-
5.3. Baca respons → ambil reply
- Ketuk output Get Contents of URL → pilih Dictionary (bila tidak otomatis, tambah aksi Get Dictionary from Input).
- Tambah aksi Get Value for Key → ketik kunci: reply.
-
5.4. Bacakan jawabannya
Tambah aksi Speak Text → masukkan variable dari langkah 5.3. Jalankan shortcut, harus ada suara membacakan jawaban.
-
5.5. (Opsional) Mode suara penuh — pengganti Siri
- Letakkan aksi Dictate Text di paling atas shortcut (prompt: “Katakan pertanyaanmu”).
- Field message di body JSON → pilih variable Dictated Text.
- Di pengaturan shortcut, aktifkan Use with Siri.
- Sekarang ucapkan “Hey Siri, Asisten” → shortcut merekam suara → dikirim → jawaban dibacakan.
-
5.6. (Opsional) Debug error
Tambahkan aksi Show Alert berisi respons mentah URL sebelum parsing, lalu bandingkan dengan tabel status di bagian 3.
-
5.7. (Opsional) Analisis gambar — kirim foto/Screenshot
Untuk meminta AI menganalisis gambar (teks di foto, objek, dll.), tambahkan field gambar pada Request Body JSON:
- Aksi Choose from Menu atau cukup beri nilai di message seperti “Apa teks di gambar ini?”
- Pilih gambar: aksi Select Photos, lalu Base64 Encode hasilnya.
- Di Request Body JSON tambah field image_base64 = variable hasil Base64 Encode (atau tulis object image: { base64: …, mime: … }).
- (Opsional) Tambah image_mime = image/jpeg / image/png.
- Butuh Gemini API Key: isi field gemini_key di body, atau set secret env GEMINI_API_KEY di dashboard Workers, atau isi Gemini API Key di Pengaturan web — key dari web otomatis dipakai.
- Maksimal ±2 MB base64 agar tersimpan aman di riwayat; gambar yang gagal dianalisis tetap tampil di chat web.
-
5.8. (Opsional) Text to Image — buat gambar dari suara/teks
Minta AI membuat gambar baru dari deskripsimu dan simpan otomatis ke Foto:
- Di awal shortcut tambah Choose from Menu, mis. item “Buat Gambar” dan “Analisis Gambar” (langkah 5.7).
- Di jalur “Buat Gambar”: tambah Dictate Text (atau Ask Each Time) — ini jadi deskripsi gambarnya.
- Di Request Body JSON (aksi Get Contents of URL — Method POST) tukar/isi field:
- image_prompt = variable hasil Dictate Text / Ask Each Time
- ratio = 1:1 / 16:9 / 9:16 (fungsional)
- api_key = gsk-xxxxxxxxxxxx (tetap wajib untuk otentikasi)
- Pastikan message, image, image_base64 kosong/dihapus agar tidak masuk mode chat/Vision.
- Parse respons: Get Dictionary from Input → Get Value for Key dengan kunci url.
- Simpan ke Foto: aksi Get Contents of URL (method GET, URL = variable dari langkah sebelumnya) → Save to Photo Album.
- (Opsional) Pakai Show Notification berisi judul/prompt sebagai konfirmasi.
- Proses bisa butuh 10-60+ detik (Pollinations memproses di server). Kalau timeout, ulangi — sesekali Pollinations memang sibuk.
6. Penyimpanan & Konteks
- Setiap percakapan tersimpan di D1 (tabel topics + messages) — satu topik per hari bernama Asisten Suara YYYY-MM-DD.
- Percakapan lanjutan tetap membawa konteks: riwayat hari itu ikut dikirim ke AI (batas 20 pesan terakhir, masing-masing dipotong bila terlalu panjang).
- Reset otomatis tengah malam — topik baru, konteks kosong lagi.
- History muncul di web chat utama di sidebar (butuh PIN).
- Kalau Anda lanjutkan dari web (buka topik "Asisten Suara …"), konteks juga jalan karena web membaca pesan yang sama.
7. Ganti Provider dari Web UI
Anda bisa berganti provider AI (Groq → Mistral → Gemini → OpenRouter dll.) langsung dari menu Pengaturan tanpa edit kode.
- Buka web chat utama → login PIN → klik Pengaturan (ikon gear).
- Isi API Key dengan kunci provider baru ( Mistral / Groq / OpenRouter / dll.).
- Isi API Base URL dengan endpoint lengkap:
- Groq: https://api.groq.com/openai/v1/chat/completions
- Mistral: https://api.mistral.ai/v1/chat/completions
- Gemini (OpenAI-compat): https://generativelanguage.googleapis.com/v1beta/openai/chat/completions
- OpenRouter: https://openrouter.ai/api/v1/chat/completions
- Pilih Model yang sesuai provider (mis. mistral-small-latest untuk Mistral).
- Klik Simpan. Chat sekarang pakai provider baru — kapan saja mau ganti, ulangi langkah di atas.
8. FAQ & Catatan
- Key API saya aman? Ya — dikirim dari iPhone langsung ke endpoint (HTTPS), tidak lewat server web utama. Kalau ditaruh di body/header Shortcut, hanya tersimpan di iPhone.
- Bisa analisis gambar lewat Shortcut? Bisa — kirim field image_base64 (atau image + mime) di body; request otomatis diproses Gemini Vision (3.6 Flash). Butuh Gemini API Key (di body / env / Pengaturan web). Gambar ikut tersimpan di riwayat web.
- Bisa bikin gambar (AI art) lewat Shortcut? Bisa — cukup kirim image_prompt (+ ratio) di body. API membuatnya lewat Pollinations (gratis, tanpa API key tambahan; api_key hanya untuk otentikasi) lalu mengembalikan url + base64. Tanpa image_prompt = mode chat biasa (Groq/Gemini). Ringkasan "Gambar dibuat: <url>" ikut tersimpan di riwayat web.
- Shortcut saya masih mengirim model lama (groq/compound-mini)? Tidak masalah — kalau model yang dikirim sudah tidak tersedia, API otomatis memakai default openai/gpt-oss-120b. Boleh juga hapus field model di Shortcut untuk selalu memakai default.
- Kenapa teks pakai Groq dan gambar pakai Gemini? Groq dipakai default untuk teks karena cepat & jatah gratisnya besar untuk chat biasa. Gemini 3.6 Flash dipakai khusus untuk analisis gambar (Groq tidak bisa melihat gambar). Keduanya dipilih otomatis — Anda cukup menyertakan gambar di body saat ingin minta analisis foto.
- Bisa kasih beberapa provider sekaligus? Di web utama, endpoint AI bisa diganti kapan saja dari menu Pengaturan → API Base URL. Di API Shortcut, teks default ke openai/gpt-oss-120b (gambar tetap otomatis ke Gemini); untuk ganti provider teks, update base URL + key di dashboard Workers atau edit worker.js.
- API bisa dipakai dari aplikasi lain? Bisa — selama mengirim POST + key, endpoint itu terbuka (CORS *).
- Konteks tidak melewati batas jam 00.00. Untuk lanjutan lintas hari dibutuhkan pengiriman topic_id — belum diimplementasikan agar tetap simpel.
- Provider mana yang paling irit token? Default openai/gpt-oss-120b sudah gratis di Groq (1.000 permintaan/hari). Kalau mau balasan lebih cepat pakai openai/gpt-oss-20b; untuk kuota harian lebih besar lagi ganti ke Mistral mistral-small-latest via Pengaturan web / env BASE_URL.
WebChatbox AI · API Shortcut · Kembali ke chat