Tutorial API iPhone Shortcut

Asisten suara pribadi pengganti Siri

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

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

KodeArtiContoh pesan
200Sukses{"reply": "…"}
204Preflight CORS (OPTIONS)—
400Body invalid / message kosong (tanpa gambar) / key Groq hilang / gambar tanpa key GeminiField "message" wajib diisi. · Gemini API Key belum diatur untuk analisis gambar.
405Bukan POSTMetode tidak diizinkan. Gunakan HTTP POST.
422Pollinations menolak prompt (konten tidak aman / hasil gambar kosong)Pollinations menolak prompt ini: … · Gambar yang dihasilkan kosong/rusak …
502Provider menolak (key salah / model tidak tersedia)Provider menolak request: Invalid API Key
504Pollinations belum selesai memproses dalam batas waktu (~66 dtk)Pollinations belum selesai memproses gambar (timeout…). Coba lagi.
500Kesalahan tak terduga di serverTerjadi 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.
Catatan PowerShell: kalau menulis JSON inline dengan tanda kutip ganda di dalamnya, gunakan --data-binary "@file.json" seperti di atas — quoting inline sering bermasalah.

5. Setup di iPhone Shortcut (langkah demi langkah)

Nama aksi ditulis versi Inggris (posisinya sama pada iPhone berbahasa Indonesia).

  1. 5.1. Buka Shortcuts → tombol + → beri nama (mis. Asisten).

  2. 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)
  3. 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.
  4. 5.4. Bacakan jawabannya

    Tambah aksi Speak Text → masukkan variable dari langkah 5.3. Jalankan shortcut, harus ada suara membacakan jawaban.

  5. 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.
  6. 5.6. (Opsional) Debug error

    Tambahkan aksi Show Alert berisi respons mentah URL sebelum parsing, lalu bandingkan dengan tabel status di bagian 3.

  7. 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.
  8. 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

7. Ganti Provider dari Web UI

Anda bisa berganti provider AI (Groq → Mistral → Gemini → OpenRouter dll.) langsung dari menu Pengaturan tanpa edit kode.

  1. Buka web chat utama → login PIN → klik Pengaturan (ikon gear).
  2. Isi API Key dengan kunci provider baru ( Mistral / Groq / OpenRouter / dll.).
  3. 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
  4. Pilih Model yang sesuai provider (mis. mistral-small-latest untuk Mistral).
  5. Klik Simpan. Chat sekarang pakai provider baru — kapan saja mau ganti, ulangi langkah di atas.
Catatan: Kosongkan API Base URL jika ingin kembali ke Groq (default). Field model juga bisa diketik manual apabila model yang diinginkan tidak ada di daftar dropdown.

8. FAQ & Catatan

WebChatbox AI · API Shortcut · Kembali ke chat