Anthropic Messages API
GenZi AI menerima format Anthropic Messages API di endpoint yang sama dengan katalog OpenAI-compatible: Claude Code, Anthropic Agent SDK, dan lib anthropic cukup ganti base URL + token. Tidak ada langganan, tidak ada jalur billing kedua — request-nya diterjemahkan ke jalur chat yang sama (hold, settlement, dan aturan "gagal tidak ditagih" persis sama).
Endpoint
| Metode | Path | Keterangan |
|---|---|---|
| POST | /v1/messages | Messages API — stream & non-stream, tool use, vision |
| POST | /v1/messages/count_tokens | Estimasi token prompt (approximate, ±4 karakter/token) — tanpa inference & tanpa tagihan |
| POST | /v1/chat/completions | Jalur OpenAI-compatible yang sama (hold, settlement, aturan gagal-tidak-ditagih identik) |
| POST | /v1/responses | Model codex/reasoning yang menolak chat completions |
Variabel environment
| Nama | Nilai | Keterangan |
|---|---|---|
ANTHROPIC_BASE_URL | https://ai.genzicorp.com | Tanpa /v1 — klien Anthropic menambahkannya sendiri |
ANTHROPIC_AUTH_TOKEN | gzi_x… | API key dari Console → API Keys (hanya tampil sekali) |
ANTHROPIC_MODEL | claude-fable-5 | Slug apa pun dari katalog (bukan cuma model Anthropic) |
ANTHROPIC_SMALL_FAST_MODEL | claude-fable-5-1 | Opsional (Claude Code) untuk tugas ringan |
# .env (Claude Code / SDK Anthropic) — jangan commit ke git ANTHROPIC_BASE_URL=https://ai.genzicorp.com ANTHROPIC_AUTH_TOKEN=gzi_xxxxxxxxxxxxxxxx ANTHROPIC_MODEL=claude-fable-5
Claude Code
export ANTHROPIC_BASE_URL="https://ai.genzicorp.com" export ANTHROPIC_AUTH_TOKEN="gzi_xxxxxxxxxxxxxxxx" export ANTHROPIC_MODEL="claude-fable-5" # lalu jalankan claude seperti biasa (setting di atas dibaca otomatis)
Test cepat (curl)
curl https://ai.genzicorp.com/v1/messages \
-H "x-api-key: $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"claude-fable-5","max_tokens":256,"messages":[{"role":"user","content":"ping"}]}'
SDK Python (anthropic)
from anthropic import Anthropic # pip install anthropic
import os
client = Anthropic(
base_url="https://ai.genzicorp.com", # TANPA /v1
api_key=os.environ["ANTHROPIC_AUTH_TOKEN"], # API key GenZi (gzi_...)
)
msg = client.messages.create(
model="claude-fable-5",
max_tokens=256,
messages=[{"role": "user", "content": "ping"}],
)
print(msg.content[0].text)
Streaming
POST https://ai.genzicorp.com/v1/messages (stream=true) # SSE berurutan: message_start → content_block_start / content_block_delta / content_block_stop # → message_delta (stop_reason + usage) → message_stop
Klien Anthropic boleh mengirim header anthropic-version (tidak divalidasi server) dan anthropic-beta (diabaikan).
Yang diterjemahkan & yang dibuang
| Hal | Perilaku |
|---|---|
| Diterjemahkan | system (string/array), text, image (URL / data URL), tool_use, tool_result, tools, tool_choice, max_tokens, temperature, top_p, stop_sequences |
| Dibuang dan dicatat di log | thinking, redacted_thinking, document tanpa teks, top_k, metadata, cache_control |
| Header | x-api-key (konvensi Anthropic) atau Authorization: Bearer — dua-duanya diterima |
| Nama model | Nama vendor-prefix (anthropic/claude-…) dan alias bertanggal dipetakan ke slug katalog yang aktif; slug asing = 404 |
| max_tokens | Di bawah minimum platform dinaikkan otomatis — jangan pakai angka sangat kecil untuk mengukur biaya |
| Usage di stream | message_start datang lebih awal sehingga input_tokens-nya 0; angka asli ada di message_delta (dari upstream) |
| Billing | Satu jalur dengan chat: hold (maks $1,00) → settle pakai usage asli; request gagal tidak ditagih |
| Error | Envelope Anthropic {"type":"error","error":{"type","message"}} dengan status HTTP yang sama seperti endpoint lain |
| Tidak didukung | Embeddings (tidak ada /v1/embeddings), Batch API, Files API, citations, server-side prompt caching |
Model yang menolak /v1/chat/completions (keluarga codex/reasoning) tetap bisa dipakai lewat /v1/messages? Tidak — jalur itu diterjemahkan ke chat completions. Untuk model tersebut pakai /v1/responses. Contoh slug yang sudah teruji: claude-fable-5, claude-fable-5-1.
Catatan jujur: jumlah token di message_start masih 0 (upstream baru melaporkan usage di frame akhir) dan count_tokens memakai estimasi ±4 karakter/token — response-nya menandai approximate: true, jadi jangan pakai untuk audit biaya. Angka tagihan yang sah ada di Console → Usage.