Laras RouterDocs

Referensi API

Membuat message

POST /v1/messages menghasilkan pesan assistant berikutnya untuk sebuah percakapan dalam format Anthropic Messages, sebagai JSON atau stream. Ini endpoint yang dipanggil Claude Code dan SDK Anthropic.

Di halaman ini
POSThttps://api.larasrouter.com/v1/messages

Menghasilkan pesan assistant berikutnya untuk sebuah percakapan, dalam format Anthropic Messages. Ini endpoint yang dipanggil Claude Code dan SDK Anthropic. Modelnya sama dengan harga yang sama seperti chat completions.

Autentikasi
Kirim kunci di salah satu header berikut:Authorization: Bearer lr_live_…x-api-key: lr_live_…
Tipe konten
application/json

Ini adalah Anthropic Messages API, jadi Claude Code dan SDK resmi Anthropic bisa dipakai cukup dengan mengganti base URL dan key. Modelnya sama dengan chat completions, dengan harga dan batas yang sama, dan ditagih dari pemakaian yang dilaporkan model. Untuk menghubungkan Claude Code, ikuti panduan Claude Code.

SDK Anthropic menambahkan /v1/messages ke base URL sendiri, jadi beri mereka https://api.larasrouter.com tanpa /v1. Error dari endpoint ini memakai envelope error Anthropic, bukan envelope OpenAI.

Body request

  • modelstringwajib

    ID model. Kirim deepseek-flash, bukan nama model Claude. Akhiran [1m] diabaikan.

  • max_tokensintegerwajib

    Batas output, 1 sampai 384.000. Wajib, seperti di API Anthropic. Nilai yang lebih besar ditolak, tidak pernah diturunkan diam-diam. Token reasoning ikut dihitung.

  • messagesarraywajib

    Percakapan sejauh ini, dari yang paling lama. Setiap pesan punya role user atau assistant dan content berupa string atau array blok: text, tool_use, tool_result, dan thinking. Blok gambar dan dokumen ditolak.

  • systemstring | array

    System prompt, sebagai string atau array blok teks.

  • streamboolean

    Kirim respons sebagai Server-Sent Events. Default false.

  • toolsarray

    Tool yang boleh dipanggil model: {name, description, input_schema}. Tool yang berjalan di server Anthropic, seperti web search, diabaikan.

  • tool_choiceobject

    {"type": "auto"}, "any", "none", atau {"type": "tool", "name": …}.

  • thinkingobject

    {"type": "enabled"} atau {"type": "disabled"} menyalakan atau mematikan reasoning; budget_tokens diabaikan. deepseek-flash melakukan reasoning secara default.

  • output_configobject

    {"effort": "low" | "medium" | "high" | "xhigh" | "max"} mengatur tingkat usaha reasoning.

  • temperature, top_p, stop_sequences, metadata—

    Parameter sampling dan metadata.user_id, diteruskan ke model. top_k dan cache_control diterima dan diabaikan.

Contoh request

curl https://api.larasrouter.com/v1/messages \
  -H "x-api-key: $LARAS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-flash",
    "max_tokens": 1024,
    "system": "Anda asisten yang ringkas.",
    "messages": [
      {"role": "user", "content": "Sebutkan tiga kegunaan hash map."}
    ]
  }'

Body respons

  • idstring

    ID message, msg_ diikuti ID request penagihan.

  • typestring

    Selalu message.

  • rolestring

    Selalu assistant.

  • modelstring

    Model yang menjawab.

  • contentarray

    Jawaban sebagai blok, berurutan: blok thinking opsional berisi penalaran model, lalu blok text dan tool_use.

  • stop_reasonstring

    end_turn, max_tokens (batas output tercapai), atau tool_use.

  • usageobject

    Jumlah token yang menjadi dasar perhitungan biaya.

    • input_tokensinteger

      Token input yang tidak dilayani dari cache. Seperti di API Anthropic, token cache tidak dihitung di sini.

    • cache_read_input_tokensinteger

      Token input yang dilayani dari cache, ditagih dengan tarif cache hit.

    • cache_creation_input_tokensinteger

      Selalu 0.

    • output_tokensinteger

      Token output, termasuk reasoning.

200 OK
{
  "id": "msg_0f8fad5bd9cb469fa16570867728950e",
  "type": "message",
  "role": "assistant",
  "model": "deepseek-flash",
  "content": [
    { "type": "thinking", "thinking": "Pengguna meminta tiga kegunaan…", "signature": "lr1-…" },
    { "type": "text", "text": "1. Menyimpan hasil berdasarkan key…" }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 24,
    "output_tokens": 180,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0
  }
}

Blok thinking berisi penalaran model, yang ditagih sebagai output. Kirim kembali tanpa diubah pada giliran berikutnya dalam percakapan yang memakai tool: model memerlukan penalarannya sebelumnya untuk melanjutkan percakapan tool. signature adalah nilai buram; Laras Router tidak memverifikasinya saat dikirim kembali.

Penggunaan tool

Deklarasikan tool di tools. Saat model memanggil salah satunya, balasan memiliki stop_reason: "tool_use" dan blok tool_use berisi id, name, dan objek input. Jalankan tool, lalu kirim hasilnya di pesan user berikutnya sebagai blok tool_result dengan tool_use_id yang sama.

Streaming

Dengan "stream": true, respons berupa aliran event Anthropic: message_start, lalu content_block_start, content_block_delta, dan content_block_stop untuk setiap blok, ping saat model sedang bekerja, dan terakhir message_delta serta message_stop. Input tool datang sebagai potongan input_json_delta yang digabung menjadi objek input.

message_delta membawa alasan berhenti dan usage akhir. Event ini dan message_stop baru dikirim setelah pemakaian request tercatat, jadi klien yang sudah melihat message_stop tahu bahwa tagihannya final. Jika stream terputus, stream berakhir dengan event error tanpa message_stop.

text/event-stream
event: message_start
data: {"type":"message_start","message":{"id":"msg_…","type":"message","role":"assistant","model":"deepseek-flash","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":0,"output_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":0}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"1. Menyimpan"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":24,"output_tokens":180,"cache_creation_input_tokens":0,"cache_read_input_tokens":0}}

event: message_stop
data: {"type":"message_stop"}

Yang tidak didukung

  • Blok gambar dan dokumen ditolak dengan 400 invalid_request_error, karena model hanya menerima teks.
  • Tool yang berjalan di server Anthropic, seperti web search, diabaikan. Tool Anda sendiri berfungsi.
  • POST /v1/messages/count_tokens tidak tersedia. Claude Code beralih ke perkiraan.
  • top_k, cache_control, dan budget_tokens diterima dan diabaikan.

Error

Error memakai envelope Anthropic, dengan tipe yang diharapkan SDK Anda:

Respons error
{
  "type": "error",
  "error": {
    "type": "billing_error",
    "message": "Saldo tidak mencukupi. Isi ulang saldo untuk melanjutkan."
  },
  "request_id": "req_0f8fad5bd9cb469fa16570867728950e"
}

request_id adalah identitas penagihan request, ada setelah request sampai ke billing. Gunakan error.type dan status HTTP sebagai dasar logika; pesan berbahasa Inggris secara default dan berbahasa Indonesia jika request membawa Accept-Language: id. Lihat Error & retry.

Respons

200Message: objek JSON, atau stream SSE berisi event Messages jika stream bernilai true.
application/jsontext/event-stream
  • X-Laras-Request-ID string — Identitas penagihan request (UUID). Sertakan saat Anda menghubungi support soal tagihan.
400Request tidak valid (invalid_request_error): max_tokens tidak ada, ada blok gambar atau dokumen, atau batas output di atas batas model. Pesan menyebut bagian request yang ditolak. Tidak ada saldo yang ditahan atau ditagih.
application/json
401Kunci tidak ada, formatnya salah, sudah dicabut, atau tidak dikenal, atau Authorization dan x-api-key berisi kunci berbeda (authentication_error).
application/json
402Wallet atau anggaran kunci tidak cukup untuk request ini (billing_error). Ditolak sebelum model dipanggil; tidak ada saldo yang ditahan.
application/json
403Kunci tidak memiliki scope chat:write (permission_error).
application/json
404Model tidak tersedia (not_found_error). Claude Code mengirim nama model Claude kecuali Anda menyetel ANTHROPIC_MODEL; gunakan deepseek-flash.
application/json
413Body request lebih besar dari 16 MB (request_too_large).
application/json
429Batas per kunci tercapai (rate_limit_error). Tunggu sesuai Retry-After.
application/json
  • Retry-After integer — Jumlah detik yang perlu ditunggu sebelum mencoba lagi.
502Penyedia model gagal atau tidak bisa dihubungi (api_error). Coba lagi dengan backoff.
application/json
503Billing sementara tidak tersedia; request tidak dijalankan (api_error). Coba lagi nanti. Anda tidak ditagih.
application/json