Dokumentasi seamless.ai.id
seamless.ai.id adalah satu API kompatibel OpenAI untuk 4 model dari 4 pembuat, dibayar dengan saldo prabayar dalam rupiah. SDK dan alat yang sudah bisa memanggil OpenAI cukup diganti base URL dan API key-nya.
https://api.seamless.ai.id/v1
Mulai dalam empat langkah
- Minta API key ke operator (pendaftaran mandiri belum dibuka).
- Simpan API key pertama Anda: key hanya ditampilkan sekali.
- Isi saldo dengan QRIS dari dashboard, lalu coba model di Playground dashboard tanpa menulis kode.
- Ikuti panduan untuk alat Anda: curl, Python (SDK OpenAI), JavaScript / TypeScript (SDK OpenAI), LangChain, n8n.
Model yang tersedia: 3 model chat, 1 model embedding. Harga, konteks, dan kemampuan setiap model ada di daftar model, juga sebagai JSON di /pricing.
Saldo dalam rupiah: isi, tahan, tagih
- Isi saldo. Top-up dibayar dengan QRIS dari aplikasi bank atau e-wallet apa pun; saldo bertambah begitu pembayaran diterima dan kuitansi terbit. Jumlah minimum dan maksimum, bonus yang berlaku, dan cara PPN dihitung tampil di dashboard sebelum Anda membayar dan di halaman harga.
- Tahan. Sebelum request diteruskan ke provider, gateway menahan batas atas biayanya dari saldo: seluruh body dihitung seolah setiap byte satu token prompt, ditambah
max_tokenstoken jawaban (tanpamax_tokens, batas bawaan model), dengan harga tertinggi yang bisa berlaku selama request berjalan. Kalau saldo yang tersedia tidak cukup, request ditolak sebelum dikirim. Mengisimax_tokensmembuat yang ditahan lebih kecil. - Tagih. Setelah jawaban selesai, yang ditagih adalah token yang dilaporkan provider dengan harga provider yang menjawab, dan sisa yang ditahan kembali ke saldo. Tagihan tidak pernah melebihi yang ditahan. Request yang gagal sebelum ada isi jawaban tidak ditagih. Kalau provider tidak melaporkan jumlah token (misalnya stream dihentikan sebelum laporan pemakaian), jumlahnya diperkirakan dari ukuran prompt dan jawaban yang sudah terkirim; untuk penalaran yang tidak terlihat (thinking model Anthropic) yang ditagih adalah seluruh batas jawaban.
Model berharga Gratis tidak memakai saldo. Harga token ditulis per 1 juta token; model pembuat gambar, transkripsi suara, dan teks ke suara dihargai per gambar, per jam audio, atau per 1 juta karakter, dan sebagian model rerank per 1.000 pencarian (lihat di bawah). Saldo, yang sedang ditahan, pemakaian per hari, dan daftar request tampil di dashboard atau lewat GET /v1/balance, /v1/usage, dan /v1/requests. Isi prompt dan jawaban (termasuk audio, transkrip, dan gambar yang dibuat) tidak pernah kami simpan, hanya metadata (model, jumlah token, gambar, detik audio, karakter, atau pencarian, biaya). Pengecualiannya hanya dua: Batch API (file JSONL yang Anda unggah ke /v1/files dan hasil setiap barisnya kami simpan sampai Anda menghapusnya, DELETE /v1/files/{id}, atau masa simpannya habis), dan preset (/v1/presets: prompt sistem dan pengaturan yang Anda simpan sendiri, sampai Anda menghapusnya).
API key dan scope
Setiap key memegang satu atau beberapa scope:
| Scope | Boleh memanggil |
|---|---|
inference | POST /v1/chat/completions, POST /v1/responses, POST /v1/embeddings, POST /v1/images/generations, POST /v1/audio/transcriptions, POST /v1/audio/speech, POST /v1/rerank, POST /v1/moderations, Batch API (/v1/files, /v1/batches), GET /v1/models, GET /v1/models/{id}, dan GET /v1/requests/{id} untuk request key itu sendiri |
read | saldo, pemakaian, analitik, daftar request, kuitansi, status top-up, kode referral (GET /v1/referral), daftar preset (GET /v1/presets), peringatan belanja (GET /v1/spend-alerts) |
admin | membuat, mengubah, dan mencabut key; membuat top-up; mengurus anggota; pengaturan email; membuat dan mengubah preset (bersama read) |
- Key pertama dari pendaftaran memegang ketiganya. Untuk aplikasi, buat key sendiri yang hanya ber-scope
inference(dashboard, atauPOST /v1/keysdengan keyadmin), supaya key yang bocor tidak bisa mengubah akun. - Key bisa diberi batas belanja per bulan (WIB) atau seumur key, routing default (misalnya hanya provider yang tidak melatih model dengan prompt), dan batasan: model yang boleh dipakai (misalnya
anthropic/*), provider yang boleh, dan biaya maksimum per request. Request di luar batasan ditolak sebelum saldo ditahan;GET /v1/modelsuntuk key itu hanya menampilkan model yang boleh. - Key hanya tampil sekali saat dibuat; gateway menyimpan hash-nya saja. Key yang dicabut langsung berhenti bekerja.
- Tim: akun bisa punya anggota (pemilik, admin, developer, penagihan) dengan key masing-masing, dan admin bisa memberi developer anggaran rupiah per bulan untuk semua key-nya bersama-sama (panel Anggota di dashboard); request yang melewatinya ditolak sebelum dikirim (lihat batas).
- Preset: simpan model (atau beberapa model berurutan), prompt sistem, parameter bawaan, dan batas token keluaran di gateway (panel Preset di dashboard atau
/v1/presets), lalu kirim"model": "@preset/nama"ke/v1/chat/completionsatau/v1/responses. Mengganti model cukup di preset, tanpa deploy ulang; nilai yang dikirim request tetap menang, kecuali batas token keluaran danmax_price(yang lebih rendah yang berlaku). - Peringatan belanja: pasang batas belanja harian atau bulanan (WIB) untuk seluruh akun atau satu key, atau persentase dari batas belanja sebuah key (
POST /v1/spend-alertsdengan{"metric": "daily_spend", "threshold_idr": 500000}, atau panel Peringatan belanja di dashboard; pemilik, admin, dan anggota penagihan). Setiap batas memberi tahu sekali per periode, sekitar semenit setelah pemakaian yang melewatinya ditagih: spanduk di dashboard dan email ke pemilik dan anggota penagihan.
Responses API
POST /v1/responses menerima format Responses API OpenAI untuk setiap model chat, jadi SDK dan framework agent yang memanggil responses.create bisa memakai model mana pun di sini. Gateway menerjemahkannya ke chat completions: routing, fallback, harga, saldo yang ditahan, dan tagihannya sama persis dengan request chat yang sama, dan usage di jawaban adalah token yang ditagih.
- Tanpa penyimpanan: jawaban tidak disimpan di server. Kirim seluruh percakapan di
input, termasuk itemoutputjawaban sebelumnya.previous_response_id,conversation,prompt,store: true, danbackground: trueditolak 400; tanpastore, jawaban menulis"store": false. - Input: teks, item
message(peran user, assistant, system, atau developer, yang dikirim sebagai system; bagianinput_text,output_text, daninput_imageberupa URL atau data URL ke model dengan badge input gambar),function_call, danfunction_call_output(teks). Itemreasoningjawaban sebelumnya diterima tetapi tidak dikirim ulang ke model. File (input_file,file_id),item_reference, dan item tool bawaan ditolak. - Tool: hanya tool
function, dengantool_choicenone,auto,required, atau satu fungsi. Tool bawaan (web search, file search, code interpreter, image generation, MCP, computer, shell) tidak dijual dan ditolak 400unsupported_value. - Format dan penalaran:
text.format(text,json_object,json_schema),text.verbosity, danreasoning.effort(diperiksa sepertireasoning_effort, lihat penalaran) diteruskan seperti di chat. Diabaikan karena tidak mengubah jawaban maupun tagihan:reasoning.summary,include: ["reasoning.encrypted_content"],max_tool_calls, danstream_options.include_obfuscation;metadatahanya dikembalikan di jawaban. - Jawaban: item
reasoning(teks penalaran, kalau model mengirimnya),message, danfunction_call.max_output_tokensmembatasi jawaban dan saldo yang ditahan; jawaban yang terpotong berstatusincomplete. Stream mengirim eventresponse.createdsampairesponse.completed; stream yang putus diakhiriresponse.faileddan tetap ditagih untuk bagian yang sudah terkirim, seperti chat.
Penalaran: reasoning_effort
Model dengan badge Reasoning berpikir sebelum menjawab. Seberapa banyak diatur dengan satu field untuk semua provider: reasoning_effort di POST /v1/chat/completions (argumen reasoning_effort di SDK OpenAI) atau reasoning.effort di POST /v1/responses. Nilainya, dari yang paling sedikit berpikir: none, minimal, low, medium, high, xhigh, max. Gateway menerjemahkannya untuk setiap provider (untuk Claude menjadi effort Anthropic).
Saat ini tidak ada model di daftar harga yang menerima reasoning_effort.
- Nilai yang tidak diterima ditolak, gratis. Nilai yang tidak diterima model, atau tidak diterima provider mana pun yang boleh dipakai request itu (
gateway.routing, routing default dan batasan key), dijawab 400unsupported_valuedenganparamreasoning_effort(reasoning.effortdi Responses API) sebelum saldo ditahan; pesannya menyebut nilai yang diterima. Model berbayar yang tidak menerima nilai apa pun menolak field ini: tidak pernah diam-diam diabaikan. Model gratis tanpa daftar meneruskannya apa adanya. - Provider dipilih sebelum harga. Provider sebuah model yang tidak menerima nilai itu dilewati, jadi saldo ditahan dengan harga provider yang memang bisa menjawab.
seamless/autodanmodels: [..]hanya memakai model yang menerimanya. Preset boleh menyimpanreasoning_effort; nilainya diperiksa dengan cara yang sama. - Biaya. Token penalaran adalah token output: ditagih dengan harga output model dan dihitung di dalam
max_tokens, batas yang juga menentukan saldo yang ditahan. Effort yang lebih tinggi biasanya memakai lebih banyak token; naikkanmax_tokenssupaya jawaban tidak terpotong (finish_reason: "length").usage.completion_tokens_details.reasoning_tokensmenyebut berapa token output yang dipakai untuk berpikir, kalau provider melaporkannya; jumlah itu sudah termasuk dicompletion_tokens. - Teks penalaran. Ringkasan penalaran (Claude) atau teks penalaran (misalnya DeepSeek) ada di
message.reasoning_content; saat stream, didelta.reasoning_contentsebelum jawaban. Klien yang tidak membacanya tidak terganggu. Di Responses API teks itu menjadi itemreasoning. Sebagian model berpikir tanpa mengirim teksnya; token penalarannya tetap ditagih sebagai output. - Waktu berpikir. Model yang berpikir mendapat waktu lebih lama untuk jawabannya (atau, saat stream, untuk potongan pertamanya), sekitar lima menit kecuali operator mengubahnya. Untuk
xhighdanmax, pakaistream: true: teks dikirim begitu ditulis. Kalau waktu itu habis sebelum ada jawaban, request dijawab 504 tanpa biaya denganx-should-retry: false(SDK OpenAI tidak mengulangnya: ulangannya akan berpikir sama lama). - Pergi sebelum jawaban tetap dibayar. Model yang tidak menampilkan penalarannya tetap ditagih provider untuk penalaran yang sudah dibuat. Klien yang menutup koneksi sebelum jawaban (tanpa stream) atau sebelum potongan terakhir yang menyebut
finish_reason(stream) membayar prompt dan seluruh batas jawaban (max_completion_tokensataumax_tokens), paling banyak saldo yang ditahan; tagihannya bertandaunseen_output. Batasi denganmax_completion_tokensyang wajar; playground dashboard mengirim batas 2.048 token. Di model yang mengirim teks penalarannya (reasoning_content), klien yang pergi membayar teks yang sudah diterimanya, seperti biasa.
Contoh kode akan tampil di panduan begitu ada model yang menerimanya.
Batch API
Pekerjaan besar yang tidak perlu dijawab seketika dikirim sebagai satu file JSONL dan dijalankan gateway dalam 24 jam, dengan bentuk Batch API OpenAI, jadi client.files.create dan client.batches.create SDK OpenAI langsung bekerja. Contoh langkah demi langkah: curl, Python, JavaScript.
- Endpoint (scope
inference):POST /v1/files(multipart,purpose=batchdanfile),POST /v1/batches(input_file_id,endpoint/v1/chat/completionsatau/v1/embeddings,completion_window: "24h",metadataopsional),GET /v1/batches,GET /v1/batches/{id},POST /v1/batches/{id}/cancel,GET /v1/files/{id}/content,DELETE /v1/files/{id}. - Baris file:
{"custom_id": "…", "method": "POST", "url": "/v1/chat/completions", "body": {…}};bodysama dengan body permintaan langsung ke endpoint itu, tanpastream;custom_idunik di satu file. Semua baris diperiksa saat batch dibuat: baris pertama yang salah ditolak 400 dengan nomor barisnya, dan tidak ada yang disimpan atau ditahan. - Dana ditahan saat dibuat. Biaya terburuk seluruh baris ditahan sekaligus: setiap baris seperti permintaan langsung (setiap byte body satu token prompt, ditambah
max_tokenstoken jawaban), dengan harga batch tertinggi di antara provider model itu sepanjang jendela 24 jam dan kurs saat batch dibuat, ditambah ruang 3% untuk pembulatan harga yang tidak pernah ditagih. Saldo, batas belanja key, dan anggaran anggota harus menutupinya; kalau tidak, batch ditolak 429 seperti permintaan biasa. Jumlahnya ada dihold_micro_idrobjek batch (mikro-rupiah; 1 rupiah = 1.000.000) dan di tab Batch di Playground dashboard. - Tagihan per baris. Setiap baris yang selesai ditagih token yang dilaporkan provider yang menjawab, dengan harga batch (lebih murah kalau model punya diskon batch; tertulis di halaman modelnya), tidak pernah lebih dari bagian yang ditahan untuknya; baris yang gagal sebelum provider menerimanya tidak ditagih. Penolakan sementara (batas rate, provider sedang sibuk atau gangguan sebelum menerima request) tidak menggagalkan baris: baris dicoba lagi selama jendela 24 jam. Membatalkan batch atau batch yang kedaluwarsa melepas dana baris yang belum jalan saat itu juga; baris yang sedang jalan tetap selesai dan ditagih. Baris yang harga terburuknya naik melewati bagian yang ditahan sejak batch dibuat gagal tanpa biaya (
batch_price_changed). - Status dan hasil.
statusin_progress,cancelling,completed,cancelled, atauexpired;request_countsmenghitung baris selesai dan gagal. Fileoutput_file_idmemuat jawaban yang berhasil danerror_file_idbaris yang gagal, satu baris JSON per permintaan:{"id", "custom_id", "response": {"status_code", "request_id", "body"}, "error"}, denganbodyjawaban endpoint-nya. - Batas. Operator menetapkan ukuran file (sedikit di bawah batas body request), jumlah baris per file, dan jumlah batch yang berjalan per akun. Ruang simpan dibatasi per akun (file unggahan yang belum dihapus ditambah hasil baris) dan untuk seluruh layanan: unggahan yang melewati ruang akun ditolak 400
file_storage_limit_reached, dan kalau ruang seluruh layanan penuh 507batch_storage_full; keduanya sebelum ada dana yang ditahan, dengan pesan yang menyebut batasnya. Kalau ruang penuh saat batch berjalan, baris berikutnya dan sisa baris batch itu gagal tanpa biaya (batch_storage_fulldi file error) dan dananya dilepas; hapus file yang tidak dipakai lagi lalu kirim sisanya. Ukuran hasil satu baris juga dibatasi: jawaban yang lebih besar tidak disimpan dan barisnya gagal denganbatch_result_too_large, tetapi tetap ditagih karena provider sudah mengerjakannya. - Penyimpanan. Berbeda dengan permintaan langsung, file yang Anda unggah dan hasil setiap barisnya kami simpan sampai Anda menghapusnya (
DELETE /v1/files/{id}) atau masa simpannya habis.
Preset
Preset adalah pengaturan bernama milik akun: model (atau sampai tiga model berurutan), prompt sistem, parameter bawaan (temperature, top_p, frequency_penalty, presence_penalty, seed, stop, reasoning_effort), preferensi routing, dan batas jawaban. Contoh: curl, Python, JavaScript.
- Pemakaian:
"model": "@preset/<slug>"diPOST /v1/chat/completionsatauPOST /v1/responses. Prompt sistem preset selalu menjadi pesan pertama; nilai yang dikirim request menang atas nilai bawaan preset, kecuali batas jawaban danmax_price, yang memakai yang lebih rendah. Request tidak boleh mengirimmodelssendiri bersama preset. - Uang: preset hanya mengisi request; saldo ditahan dan ditagih dari request yang sudah diisi (prompt sistem preset ikut dihitung), sama dengan request yang ditulis lengkap.
- Mengelola:
GET /v1/presetsdanGET /v1/presets/{slug}dengan scoperead;POST /v1/presets,PUT /v1/presets/{slug}(mengganti seluruh isi), danDELETE /v1/presets/{slug}denganadminjuga. Slug 1–64 huruf kecil, angka,.,_, atau-. Jumlah preset per akun dan panjang prompt sistem dibatasi. - Error: 404
preset_not_found(slug salah); 400preset_model_unavailablekalau model preset tidak dijual lagi (tidak pernah diam-diam diganti model lain: perbarui presetnya); 400preset_not_supporteddi endpoint selain chat dan Responses API (embeddings, gambar, suara, rerank, moderation, dan baris batch). - Penyimpanan: prompt sistem dan pengaturan preset kami simpan sampai Anda menghapusnya; ikut ekspor data akun dan terhapus saat akun dihapus.
Batas
- Request per menit dan request bersamaan per key ditetapkan operator. Kalau tercapai: 429
rate_limit_exceededdengan headerRetry-After, yang diulang otomatis oleh SDK OpenAI. - Saldo, batas belanja key, anggaran anggota: request yang bisa melewatinya ditolak sebelum dikirim, 429
insufficient_quotadenganx-should-retry: false(SDK OpenAI tidak mengulangnya);code-nyainsufficient_quota,key_spend_limit_reached, ataumember_budget_reached, dan pesannya menyebut sisa dan kapan diperbarui. - Gagal tetapi ditagih: kalau provider sudah bekerja (jawaban yang tidak terbaca atau tidak muat, gambar atau audio yang timeout setelah terkirim), error 5xx-nya tetap ditagih dan membawa
x-should-retry: falsetanpaRetry-After, supaya SDK tidak membayar ulangan yang sama. Tagihannya terlihat diGET /v1/requests/{request_id}denganx-request-id-nya. Sebaliknya tidak berlaku: beberapa error gratis yang pasti gagal lagi juga membawax-should-retry: false. - Ukuran request: body yang terlalu besar dijawab 413
request_too_large. - Konteks dan jawaban: panjang konteks dan batas jawaban setiap model tertulis di halaman modelnya.
Error
Setiap error berformat OpenAI:
{"error": {"message": "…", "type": "invalid_request_error", "param": "model", "code": "model_not_found"}}
| Status | code | Arti dan yang perlu dilakukan |
|---|---|---|
| 401 | missing_api_key, invalid_api_key, revoked_api_key | header Authorization: Bearer … kosong, salah, atau key sudah dicabut |
| 403 | insufficient_scope | key tidak punya scope endpoint itu; pesannya menyebut scope yang kurang |
| 403 | model_not_allowed_for_key, provider_not_allowed_for_key | model atau provider di luar batasan key itu; pilih model lain atau minta admin mengubah batasannya. Tidak ditagih |
| 400 | request_above_key_max_price | biaya terburuk request di atas harga maksimum per request key itu; kecilkan max_tokens atau prompt. Tidak ditagih |
| 404 | model_not_found | id model salah ketik atau tidak dijual; ambil id dari daftar model |
| 400 | invalid_value, invalid_field, unsupported_value, unsupported_parameter | field request yang salah atau fitur yang tidak bisa dilayani model itu; param menunjuk field-nya. Tidak ditagih |
| 400 | invalid_image, unsupported_content | gambar yang tidak valid, atau gambar/audio/file ke model yang tidak menerimanya |
| 400 | no_eligible_provider, price_above_max | preferensi routing tidak menyisakan provider; ditolak sebelum saldo ditahan |
| 400 | max_price_not_applicable, unsupported_model | max_price (di request atau di key) dipakai untuk model pembuat gambar atau transkripsi, yang tidak berharga per token: pakai key dan request tanpa max_price; atau model dikirim ke endpoint jenis lain (lihat gambar dan transkripsi) |
| 413 | request_too_large | body terlalu besar |
| 429 | rate_limit_exceeded | tunggu Retry-After |
| 429 | insufficient_quota, key_spend_limit_reached, member_budget_reached | isi saldo, naikkan batas, atau kecilkan max_tokens; jangan diulang otomatis |
| 502, 503, 504 | upstream_error, no_provider_available, upstream_timeout | provider sedang bermasalah; gateway sudah mencoba provider lain model itu kalau ada. Ulangi nanti (Retry-After kalau ada) |
Kondisi setiap model sekarang, riwayat 90 hari, dan insiden yang diumumkan ada di halaman status. Setiap jawaban membawa header x-request-id; sebutkan saat menghubungi operator.
Memilih provider dan membatasi harga
Satu model bisa dilayani beberapa provider dengan harga dan kebijakan data masing-masing (tertulis di halaman model). Tanpa pengaturan, gateway memilih sendiri dan pindah ke provider lain kalau satu gagal. Request ditagih dengan harga provider yang menjawab, paling tinggi harga "hingga" model itu. Pengaturannya dikirim di body sebagai gateway.routing (SDK Python dan LangChain: extra_body):
order: provider yang dicoba lebih dulu;only: hanya provider ini;exclude: jangan provider ini;fallback: false: paling banyak satu percobaan.data_policy:"no_training"(provider tidak melatih model dengan prompt) atau"zero_retention"(provider tidak menyimpan apa pun).max_price:{"input_idr_per_mtok": 5000, "output_idr_per_mtok": 15000}, rupiah utuh per 1 juta token. Provider di atas batas tidak dipakai; kalau tidak ada yang muat, request ditolak 400price_above_maxsebelum saldo ditahan. Hanya untuk harga per token: request ke model pembuat gambar atau transkripsi yang membawamax_price, atau dikirim dengan key yang routing default-nya memuatmax_price, ditolak 400max_price_not_applicable.sort: "latency": provider tercepat (waktu ke token pertama) lebih dulu.
Harga "mulai" di halaman model hanya dijamin dengan only (atau order + fallback: false) ke provider termurah, atau max_price setinggi harga itu. Admin akun bisa memasang pengaturan yang sama sebagai routing default sebuah key; request hanya bisa memperketatnya.
Model cadangan dan model router
Field models (milik gateway, tidak diteruskan ke provider) berisi model cadangan. Gateway mencoba model dulu dengan semua providernya, lalu model berikutnya di models sesuai urutan, paling banyak 3 model (termasuk model, duplikat diabaikan). Pindah ke model berikutnya hanya kalau model sebelumnya tidak bisa melayani request (misalnya tidak menerima gambar, tidak mendukung field yang dikirim, tidak ada provider yang cocok dengan gateway.routing atau max_price) atau semua providernya menolak sebelum menerima request (koneksi gagal, error 5xx atau 429, provider sedang diistirahatkan). Setelah provider mungkin sudah mulai bekerja (waktu habis, koneksi terputus di tengah jawaban) atau request Anda sendiri ditolak (400), gateway tidak pernah pindah ke model lain: provider lain dari model yang sama masih boleh mengambil alih (seperti request satu model), dan kalau semuanya gagal Anda menerima error itu tanpa ditagih. Jawaban yang sudah dibuat provider tetapi tidak bisa dikembalikan (lebih dari 32 MiB, atau tidak terbaca) ditagih perkiraan prompt dan seluruh batas outputnya (paling banyak saldo yang ditahan) dan tidak pernah dibuat ulang; minta lebih sedikit n atau logprobs, atau pakai stream. Stream tidak pernah berganti model setelah potongan pertama terkirim.
- Saldo yang ditahan adalah biaya terburuk dari semua model kandidat (yang termahal), dilepas begitu jawaban selesai. Yang ditagih hanya harga model yang menjawab.
- Field
modeldi jawaban dan headerx-gateway-modelmenyebut model yang menjawab;GET /v1/requestsdan ekspor CSV mencatatnya, denganrequested_modelberisi model yang Anda minta kalau model lain yang menjawab. - Model yang tidak ada atau bukan model chat ditolak 400 sebelum saldo ditahan, dengan
paramyang menyebut posisinya, misalnyamodels[1]. Berlaku juga untukPOST /v1/responses; tidak berlaku untuk baris Batch API. - Preset dengan beberapa model memakai aturan yang sama. Model yang Anda sebut tetapi tidak boleh dipakai API key Anda ditolak 403 yang menyebut model itu; model router hanya memilih dari model yang boleh dipakai key.
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",
"models": ["meta/llama-3.2-1b-instruct"],
"messages": [{"role": "user", "content": "Halo!"}]
}'
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.seamless.ai.id/v1",
api_key=os.environ["SEAMLESS_API_KEY"],
)
reply = client.chat.completions.create(
model="qwen/qwen2.5-0.5b-instruct",
messages=[{"role": "user", "content": "Halo!"}],
# Model cadangan: field milik gateway, lewat extra_body.
extra_body={"models": ["meta/llama-3.2-1b-instruct"]},
)
print(reply.model, reply.choices[0].message.content)
Input gambar
Model dengan badge Input gambar menerima bagian image_url di pesan user: data URL base64 (data:image/png;base64,…) atau URL https:// yang diambil penyedia model (gateway tidak pernah membukanya; URL ke alamat IP atau nama internal ditolak). Format JPEG, PNG, GIF, atau WebP, dikenali dari isi byte-nya; detail boleh auto, low, high, atau original. Operator membatasi jumlah dan ukuran gambar per request; yang melanggar dijawab 400 invalid_image dengan param yang menunjuk gambarnya. Saldo yang ditahan menghitung setiap gambar dengan batas token terbanyak per gambar model itu; tagihannya tetap dari token yang dilaporkan penyedia. Contoh kode ada di setiap panduan.
Gambar, transkripsi, teks ke suara, dan rerank
POST /v1/images/generations(JSON):prompt(wajib),n(1–10, bawaan 1),sizedanquality(salah satu yang tertulis di halaman model; tanpa keduanya dipakai bawaan model,autoditolak),response_format(urlataub64_json, kalau model menerimanya). Harga per gambar menurut ukuran dan kualitas, ditambah token teks prompt dengan harga input model itu.POST /v1/images/edits(multipart, hanya model yang punyaunit_pricing.editsdi/v1/models):imageatauimage[](1–16 berkas PNG, JPEG, atau WebP),mask(opsional, PNG dengan kanal alfa, seukuran gambar pertama),prompt, dan field yang sama dengan pembuatan gambar. Gambar hasil dihargai seperti pembuatan gambar; teks prompt, gambar masukan, dan mask ditagih sebagai token input dengan harga input model menurut laporan provider. Dana yang ditahan sementara menghitung setiap gambar masukan dan mask sampaimax_input_image_tokens.POST /v1/audio/transcriptions(multipart):file(flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, atau webm),model,language,prompt,temperature,response_format(json,text,verbose_json,srt, atauvtt; srt dan vtt disusun dari segmen transkrip, tagihannya sama). Harga per jam audio, ditagih per detik dari durasi yang dilaporkan provider, dibulatkan ke atas sekali per request; sebagian provider menagih minimal beberapa detik (tertulis di halaman model). Dana yang ditahan sementara dihitung dari isi berkas: WAV PCM pasti, MP3 paling rendah 8 kbit/s, Ogg dan WebM (Opus, Vorbis), M4A/MP4 (AAC), dan FLAC dari frame audionya dan setiap durasi yang tertulis di berkas; berkas lain, rusak, atau yang bisa diputar lebih lama dari batas operator ditolak tanpa biaya. Berkas di atas batas ukuran operator dijawab 413request_too_large.POST /v1/audio/speech(JSON):input(wajib, paling banyak sepanjang konteks model, dalam karakter),voice(wajib, salah satu yang tertulis di halaman model),response_format(format audio yang tertulis di halaman model; tanpa itu format bawaannya),speed(0,25–4, kalau model menerimanya). Jawabannya audio yang dikirim sambil dibuat. Harga per 1 juta karakterinput; satu karakter adalah satu kode Unicode (huruf, angka, spasi, tanda baca, atau emoji masing-masing satu). Jumlah karakter sudah pasti sebelum dikirim, jadi yang ditahan sama dengan yang ditagih.POST /v1/rerank(JSON):query(wajib),documents(wajib, 1–1.000 teks),top_n(jumlah hasil teratas),return_documents(sertakan teks dokumen di hasil). Jawaban:resultsberisiindex,relevance_score, dandocument, dari yang paling relevan, plususageyang ditagih. Model per token menagih token yang dilaporkan provider (kueri dihitung sekali untuk setiap dokumen, ditambah semua dokumen); model per pencarian menagih pencarian yang dilaporkan provider (satu kueri dengan sampai 100 dokumen; dokumen panjang dihitung per potongan). Saldo yang ditahan adalah batas atasnya: setiap byte dihitung satu token.- Tahan dan tagih. Sebelum dikirim, gateway menahan
ngambar dengan harga varian itu yang tertinggi di antara provider yang bisa menjawab (ditambah token prompt), atau untuk audio durasi terpanjang yang mungkin untuk ukuran berkasnya. Yang ditagih adalah gambar yang dikembalikan provider atau detik audio yang dilaporkannya, dengan harga provider yang menjawab, tidak pernah lebih dari yang ditahan. Kalau hasilnya tidak bisa dipastikan setelah request diterima provider (koneksi Anda terputus, waktu habis), yang ditagih jumlah yang diminta:ngambar, atau untuk audio durasi yang ditahan. Teks ke suara ditagih karakternya begitu provider menerima request, walaupun audionya terputus; rerank yang hasilnya tidak bisa dipastikan ditagih perkiraan dari ukuran kueri dan dokumen (4 byte per token). Request yang ditolak provider (error) tidak ditagih dan boleh dicoba ke provider berikutnya. max_pricetidak berlaku untuk harga per unit (juga rerank per pencarian; rerank per token tetap dibatasimax_price): request atau key denganmax_priceditolak 400max_price_not_applicable. Preferensionly,order,exclude, dandata_policyberlaku seperti biasa. Model pembuat gambar, transkripsi, teks ke suara, dan rerank hanya dipanggil lewat endpoint-nya sendiri (400unsupported_model).
Saat ini tidak ada model pembuat gambar, transkripsi suara, teks ke suara, atau rerank di daftar harga.
Moderation
POST /v1/moderations(JSON, seperti OpenAI):modeldaninput, yaitu satu teks, daftar sampai 256 teks (satu hasil per teks), atau daftar bagian{"type": "text", "text": ...}dan{"type": "image_url", "image_url": {"url": ...}}(satu hasil untuk semuanya; gambar hanya di model yanginput_modalities-nya memuatimage, URL http(s) atau data URL base64). Field lain ditolak 400.- Satu bentuk jawaban. Provider mana pun yang menjawab, setiap hasil memuat 13 kategori OpenAI (
harassment,harassment/threatening,hate,hate/threatening,illicit,illicit/violent,self-harm,self-harm/instructions,self-harm/intent,sexual,sexual/minors,violence,violence/graphic) dicategories(true/false),category_scores(skor), dancategory_applied_input_types. Kategori yang tidak dinilai provider bernilai false dengan skor 0 dan daftar jenis input yang kosong: periksa daftar itu sebelum menganggap teks aman untuk kategori tersebut.flaggedtrue kalau salah satu dari 13 kategori true. - Kategori khusus provider yang tidak punya padanan (Mistral:
pii,health,financial,law,jailbreaking) ada diother_categoriesdanother_category_scoresdengan nama dari provider, dan tidak ikutflagged. - Pemetaan Mistral:
sexual→sexual,hate_and_discrimination→hate,violence_and_threats→violence,dangerous_and_criminal_content(ataudangerousdancriminal) →illicit(skor tertinggi),selfharm→self-harm. Satu kategori provider tidak pernah diisikan ke beberapa kategori OpenAI. Jawaban OpenAI diteruskan dengan kategorinya sendiri (nulldibaca false). - Harga dan batas. Model moderation dihargai per 1 juta token input seperti embedding, dan banyak yang gratis: model gratis tidak butuh saldo, tetapi setiap akun dibatasi jumlah request per menit ke model gratis (429
rate_limit_exceededdenganRetry-After). Model berbayar menahan setiap byte teks sebagai satu token dengan harga provider termahal yang bisa menjawab, lalu menagih token yang dilaporkan provider, atau perkiraan 4 byte per token kalau provider tidak melaporkannya (usagedi jawaban menyebut angka yang dihitung). Request yang hasilnya tidak bisa dipastikan setelah diterima provider ditagih perkiraan itu dan tidak dikirim ke provider lain; koneksi yang gagal dibuat dan jawaban error provider tidak ditagih.
Saat ini tidak ada model moderation di daftar harga.