Mulai dengan curl
seamless.ai.id kompatibel dengan API OpenAI. Yang berbeda hanya base URL dan API key:
https://api.seamless.ai.id/v1
1. Siapkan API key
Pendaftaran mandiri belum dibuka: minta API key ke operator seamless.ai.id. Isi saldo dari dashboard (QRIS) sebelum memanggil model berbayar. Simpan key di variabel lingkungan, jangan di kode:
export SEAMLESS_API_KEY='sk-seamless-...'
2. Lihat model yang bisa dipakai
curl 'https://api.seamless.ai.id/v1/models' -H "Authorization: Bearer $SEAMLESS_API_KEY"
3. Panggilan pertama
curl 'https://api.seamless.ai.id/v1/chat/completions' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen2.5-0.5b-instruct",
"messages": [{"role": "user", "content": "Halo! Apa itu AI gateway?"}]
}'
Jawaban berformat OpenAI. Header x-gateway-provider menyebut provider yang menjawab, dan request ditagih dengan harganya.
Streaming
-N mematikan buffer curl supaya potongan jawaban tampil saat tiba (server-sent events, diakhiri data: [DONE]).
curl -N 'https://api.seamless.ai.id/v1/chat/completions' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen2.5-0.5b-instruct",
"messages": [{"role": "user", "content": "Halo! Apa itu AI gateway?"}],
"stream": true
}'
Responses API
POST /v1/responses menerima format Responses API OpenAI untuk setiap model chat, dengan harga, saldo yang ditahan, dan tagihan yang sama dengan chat completions. Server tidak menyimpan jawaban: kirim percakapan lengkap di input setiap kali. Yang didukung dan yang ditolak ada di ringkasan.
curl 'https://api.seamless.ai.id/v1/responses' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen2.5-0.5b-instruct",
"instructions": "Jawab singkat dalam bahasa Indonesia.",
"input": "Halo! Apa itu AI gateway?",
"max_output_tokens": 500
}'
Dengan "stream": true jawabannya event Responses (response.output_text.delta sampai response.completed yang memuat usage):
curl -N 'https://api.seamless.ai.id/v1/responses' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen2.5-0.5b-instruct",
"input": "Ceritakan sejarah singkat Jakarta.",
"max_output_tokens": 500,
"stream": true
}'
Input gambar
Saat ini tidak ada model di daftar harga yang menerima gambar; request bergambar ke model berbayar ditolak (400 unsupported_content).
Embeddings
curl 'https://api.seamless.ai.id/v1/embeddings' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "sentence-transformers/all-minilm-l6-v2", "input": ["Ibu kota Indonesia", "Harga beras hari ini"]}'
Batch API
Untuk pekerjaan besar yang tidak perlu dijawab seketika (ribuan permintaan chat atau embedding): kirim semuanya dalam satu file JSONL, gateway menjalankannya dalam 24 jam, lalu unduh hasilnya. Contoh ini memakai qwen/qwen2.5-0.5b-instruct. Saat batch dibuat, biaya terburuk seluruh barisnya langsung ditahan dari saldo (setiap baris seperti permintaan langsung dengan max_tokens-nya); setiap baris lalu ditagih pemakaiannya saja dan sisanya kembali ke saldo saat baris selesai, batch dibatalkan, atau kedaluwarsa. Isi max_tokens di setiap baris supaya yang ditahan tidak besar. Aturan lengkapnya di ringkasan.
Simpan baris-baris ini sebagai permintaan.jsonl, satu permintaan per baris:
{"custom_id":"soal-1","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen/qwen2.5-0.5b-instruct","messages":[{"role":"user","content":"Apa ibu kota Jawa Barat?"}],"max_tokens":300}}
{"custom_id":"soal-2","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen/qwen2.5-0.5b-instruct","messages":[{"role":"user","content":"Sebutkan tiga makanan khas Padang."}],"max_tokens":300}}
1. Unggah file. Jawabannya memuat id file (file-…); simpan di variabel: export FILE_ID=file-….
curl 'https://api.seamless.ai.id/v1/files' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-F purpose=batch \
-F file=@permintaan.jsonl
2. Buat batch. Setiap baris diperiksa dulu (baris pertama yang salah ditolak 400 dengan nomor barisnya, tanpa biaya), lalu dana ditahan. Jawabannya memuat id batch (export BATCH_ID=batch_…), status, dan hold_micro_idr.
curl 'https://api.seamless.ai.id/v1/batches' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input_file_id": "'"$FILE_ID"'", "endpoint": "/v1/chat/completions", "completion_window": "24h"}'
3. Periksa status. request_counts menghitung baris yang selesai dan gagal. Setelah status menjadi completed, output_file_id menunjuk file hasil (export OUTPUT_FILE_ID=file-…) dan error_file_id file baris yang gagal.
curl 'https://api.seamless.ai.id/v1/batches/'"$BATCH_ID" \
-H "Authorization: Bearer $SEAMLESS_API_KEY"
4. Unduh hasil. Satu baris JSON per permintaan dengan custom_id Anda dan response.body berisi jawaban endpoint-nya.
curl 'https://api.seamless.ai.id/v1/files/'"$OUTPUT_FILE_ID"'/content' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-o hasil.jsonl
Membatalkan batch yang belum selesai melepas dana baris yang belum jalan; baris yang sedang jalan tetap selesai dan ditagih.
curl -X POST 'https://api.seamless.ai.id/v1/batches/'"$BATCH_ID"'/cancel' \
-H "Authorization: Bearer $SEAMLESS_API_KEY"
Preset: ganti model tanpa deploy ulang
Simpan model, prompt sistem, parameter bawaan, dan batas jawaban sekali sebagai preset, lalu aplikasi cukup mengirim "model": "@preset/asisten-cs" ke /v1/chat/completions atau /v1/responses. Mengganti model atau prompt cukup di preset (panel Preset dashboard atau /v1/presets). Aturannya di ringkasan.
1. Simpan preset dengan key yang punya scope admin dan read (key pertama dari pendaftaran punya keduanya):
curl 'https://api.seamless.ai.id/v1/presets' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "asisten-cs",
"description": "Bot layanan pelanggan",
"model": "qwen/qwen2.5-0.5b-instruct",
"system_prompt": "Anda asisten layanan pelanggan toko online kami. Jawab singkat, sopan, dalam bahasa Indonesia.",
"parameters": {"temperature": 0.3},
"max_output_tokens": 500
}'
2. Panggil dengan namanya, dengan key aplikasi mana pun:
curl 'https://api.seamless.ai.id/v1/chat/completions' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "@preset/asisten-cs",
"messages": [{"role": "user", "content": "Paket saya belum sampai, bagaimana?"}]
}'
3. Ubah tanpa menyentuh aplikasi (PUT mengganti seluruh isi preset; misalnya model lain dari daftar model):
curl -X PUT 'https://api.seamless.ai.id/v1/presets/asisten-cs' \
-H "Authorization: Bearer $SEAMLESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "asisten-cs",
"description": "Bot layanan pelanggan",
"model": "qwen/qwen2.5-0.5b-instruct",
"system_prompt": "Anda asisten layanan pelanggan toko online kami. Jawab singkat, sopan, dalam bahasa Indonesia.",
"parameters": {"temperature": 0.7},
"max_output_tokens": 500
}'
Daftar preset akun:
curl 'https://api.seamless.ai.id/v1/presets' \
-H "Authorization: Bearer $SEAMLESS_API_KEY"
Kalau gagal
Error berformat OpenAI (error.type, error.code, error.param); daftar kode yang paling sering ada di ringkasan.