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
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.
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
modelstringwajibID model. Kirim
deepseek-flash, bukan nama model Claude. Akhiran[1m]diabaikan.max_tokensintegerwajibBatas output, 1 sampai 384.000. Wajib, seperti di API Anthropic. Nilai yang lebih besar ditolak, tidak pernah diturunkan diam-diam. Token reasoning ikut dihitung.
messagesarraywajibPercakapan sejauh ini, dari yang paling lama. Setiap pesan punya
roleuseratauassistantdancontentberupa string atau array blok:text,tool_use,tool_result, danthinking. Blok gambar dan dokumen ditolak.systemstring | arraySystem prompt, sebagai string atau array blok teks.
streambooleanKirim respons sebagai Server-Sent Events. Default
false.toolsarrayTool 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_tokensdiabaikan.deepseek-flashmelakukan 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_kdancache_controlditerima 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."}
]
}'
import os
import anthropic
client = anthropic.Anthropic(
base_url="https://api.larasrouter.com",
api_key=os.environ["LARAS_API_KEY"],
)
message = client.messages.create(
model="deepseek-flash",
max_tokens=1024,
system="Anda asisten yang ringkas.",
messages=[{"role": "user", "content": "Sebutkan tiga kegunaan hash map."}],
)
print(message.content[-1].text)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.larasrouter.com",
apiKey: process.env.LARAS_API_KEY,
});
const message = await client.messages.create({
model: "deepseek-flash",
max_tokens: 1024,
system: "Anda asisten yang ringkas.",
messages: [{ role: "user", content: "Sebutkan tiga kegunaan hash map." }],
});
console.log(message.content.at(-1));
Body respons
idstringID message,
msg_diikuti ID request penagihan.typestringSelalu
message.rolestringSelalu
assistant.modelstringModel yang menjawab.
contentarrayJawaban sebagai blok, berurutan: blok
thinkingopsional berisi penalaran model, lalu bloktextdantool_use.stop_reasonstringend_turn,max_tokens(batas output tercapai), atautool_use.usageobjectJumlah token yang menjadi dasar perhitungan biaya.
input_tokensintegerToken input yang tidak dilayani dari cache. Seperti di API Anthropic, token cache tidak dihitung di sini.
cache_read_input_tokensintegerToken input yang dilayani dari cache, ditagih dengan tarif cache hit.
cache_creation_input_tokensintegerSelalu
0.output_tokensintegerToken output, termasuk reasoning.
{
"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.
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_tokenstidak tersedia. Claude Code beralih ke perkiraan.top_k,cache_control, danbudget_tokensditerima dan diabaikan.
Error
Error memakai envelope Anthropic, dengan tipe yang diharapkan SDK Anda:
{
"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
stream bernilai true.X-Laras-Request-IDstring — Identitas penagihan request (UUID). Sertakan saat Anda menghubungi support soal tagihan.
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.Authorization dan x-api-key berisi kunci berbeda (authentication_error).billing_error). Ditolak sebelum model dipanggil; tidak ada saldo yang ditahan.chat:write (permission_error).not_found_error). Claude Code mengirim nama model Claude kecuali Anda menyetel ANTHROPIC_MODEL; gunakan deepseek-flash.request_too_large).rate_limit_error). Tunggu sesuai Retry-After.Retry-Afterinteger — Jumlah detik yang perlu ditunggu sebelum mencoba lagi.
api_error). Coba lagi dengan backoff.api_error). Coba lagi nanti. Anda tidak ditagih.