Endpoint & Format
Nexotao punya dua “pintu masuk” untuk chat. Keduanya memakai model yang sama — yang berbeda cuma format request-nya. Halaman ini bantu kamu memilih yang benar supaya request-mu tidak ditolak.
Pilih dalam 5 detik
| Kalau kamu… | Pakai endpoint | Base URL |
|---|---|---|
| Pakai OpenAI SDK / library, atau tool yang minta “OpenAI base URL” | /v1/chat/completions | https://api.nexotao.com/v1 |
| Pakai Anthropic SDK, atau ingin format Anthropic native | /v1/messages | https://api.nexotao.com |
| Pakai Codex (OpenAI Responses API) | /v1/responses | https://api.nexotao.com/v1 |
Aturan emas:
/v1/chat/completionsmenerima semua model — termasuk Claude. Kalau ragu, pakai ini. Nexotao otomatis menerjemahkan formatnya.
Kesalahan paling umum
Mengirim body format OpenAI ke endpoint /v1/messages.
/v1/messages adalah jalur Anthropic native: body diteruskan ke upstream tanpa
diterjemahkan. Ciri OpenAI yang tersisa di body ditangani dengan dua cara berbeda —
sebagian dibuang diam-diam, sebagian menyebabkan request gagal.
Field yang dibuang diam-diam (bukan ditolak)
Field khusus OpenAI berikut tidak punya padanan di Messages API. Gateway membuangnya dari body sebelum meneruskan ke upstream, jadi request tetap jalan — tapi nilai yang kamu kirim tidak berpengaruh sama sekali, dan tidak ada peringatan apa pun di respons:
frequency_penalty, presence_penalty, n, seed, user, logit_bias,
logprobs, top_logprobs, stream_options, parallel_tool_calls,
response_format, output_format
Selain itu:
stopdiganti nama menjadistop_sequences(padanan Anthropic-nya), jadi maksudmu tetap terjaga. Kalaustop_sequencessudah ada,stopdibuang saja.context_managementdibuang — beta context-editing Anthropic belum ada di upstream kami, dan request akan gagal kalau field itu diteruskan.temperature,top_p, dantop_kdibuang khusus untukclaude-opus-5,claude-opus-4-8, danclaude-opus-4-7— ketiga model itu memang sudah tidak menerima parameter sampling. Padaclaude-opus-4-6danclaude-sonnet-4-6ketiganya tetap diteruskan dan berfungsi normal.
Yang benar-benar membuat request gagal
role: "system"di dalammessages. Messages API hanya mengenal roleuserdanassistant; instruksi sistem adalah fieldsystemterpisah di level atas.max_tokenstidak diisi. Di format Anthropic field ini wajib.- Field OpenAI di luar daftar buang di atas, misalnya
max_completion_tokens. Field itu diteruskan apa adanya dan ditolak upstream sebagai input asing.
Kegagalan-kegagalan itu muncul sebagai 400 dengan code upstream.invalid_request.
Solusi: kirim ke /v1/chat/completions saja (base URL berakhiran /v1).
Endpoint itu menerima format OpenAI persis apa adanya, termasuk untuk model Claude,
lalu menerjemahkannya untukmu — role: "system" dipindahkan ke field system, dan
max_tokens diisi default kalau kamu tidak mengirimnya.
- POST https://api.nexotao.com/v1/messages (format Anthropic saja)
+ POST https://api.nexotao.com/v1/chat/completions (format OpenAI, semua model)Cara 1 — Format OpenAI (paling umum)
Endpoint /v1/chat/completions. Base URL berakhiran /v1, key dikirim lewat
Authorization: Bearer. Bekerja untuk GPT, DeepSeek, Grok, dan Claude.
from openai import OpenAI
# Cukup ganti base URL — model apa pun, termasuk Claude
client = OpenAI(base_url="https://api.nexotao.com/v1", api_key="sk-nexo-...")
resp = client.chat.completions.create(
model="claude-opus-4-8", # atau gpt-5.6-terra, DeepSeek-V4-Pro, dst.
messages=[
{"role": "system", "content": "Kamu asisten yang ringkas."},
{"role": "user", "content": "Jelaskan apa itu QRIS"},
],
)
print(resp.choices[0].message.content)curl https://api.nexotao.com/v1/chat/completions \
-H "Authorization: Bearer sk-nexo-..." \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-8",
"messages": [{"role": "user", "content": "Halo"}]
}'Cara 2 — Format Anthropic native
Endpoint /v1/messages. Base URL tanpa /v1, key dikirim lewat x-api-key.
Hanya untuk model Claude, dan body harus format Anthropic (system di luar
messages, wajib max_tokens).
from anthropic import Anthropic
client = Anthropic(base_url="https://api.nexotao.com", api_key="sk-nexo-...")
msg = client.messages.create(
model="claude-opus-4-8",
max_tokens=256,
system="Kamu asisten yang ringkas.", # di luar messages
messages=[{"role": "user", "content": "Jelaskan apa itu QRIS"}],
)
print(msg.content[0].text)curl https://api.nexotao.com/v1/messages \
-H "x-api-key: sk-nexo-..." \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-8",
"max_tokens": 256,
"messages": [{"role": "user", "content": "Halo"}]
}'Perbedaan singkat
/v1/chat/completions | /v1/messages | |
|---|---|---|
| Format | OpenAI | Anthropic native |
| Base URL | …/v1 | … (tanpa /v1) |
| Header key | Authorization: Bearer | x-api-key |
| Model | Semua (GPT, DeepSeek, Grok, Claude) | Claude saja |
system | di dalam messages | field terpisah |
Wajib max_tokens | tidak | ya |
Belum tahu bedanya token, model, atau API key? Baca dulu Konsep Dasar. Mau langsung coba tanpa ngoding? Buka Playground.