seamless.ai.id

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.