Endpoint & Format

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 endpointBase URL
Pakai OpenAI SDK / library, atau tool yang minta “OpenAI base URL”/v1/chat/completionshttps://api.nexotao.com/v1
Pakai Anthropic SDK, atau ingin format Anthropic native/v1/messageshttps://api.nexotao.com
Pakai Codex (OpenAI Responses API)/v1/responseshttps://api.nexotao.com/v1

Aturan emas: /v1/chat/completions menerima 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:

  • stop diganti nama menjadi stop_sequences (padanan Anthropic-nya), jadi maksudmu tetap terjaga. Kalau stop_sequences sudah ada, stop dibuang saja.
  • context_management dibuang — beta context-editing Anthropic belum ada di upstream kami, dan request akan gagal kalau field itu diteruskan.
  • temperature, top_p, dan top_k dibuang khusus untuk claude-opus-5, claude-opus-4-8, dan claude-opus-4-7 — ketiga model itu memang sudah tidak menerima parameter sampling. Pada claude-opus-4-6 dan claude-sonnet-4-6 ketiganya tetap diteruskan dan berfungsi normal.

Yang benar-benar membuat request gagal

  • role: "system" di dalam messages. Messages API hanya mengenal role user dan assistant; instruksi sistem adalah field system terpisah di level atas.
  • max_tokens tidak 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
FormatOpenAIAnthropic native
Base URL…/v1 (tanpa /v1)
Header keyAuthorization: Bearerx-api-key
ModelSemua (GPT, DeepSeek, Grok, Claude)Claude saja
systemdi dalam messagesfield terpisah
Wajib max_tokenstidakya

Belum tahu bedanya token, model, atau API key? Baca dulu Konsep Dasar. Mau langsung coba tanpa ngoding? Buka Playground.