Chat Completions (format OpenAI)
POST /v1/chat/completions mengikuti format Chat Completions OpenAI. SDK OpenAI resmi bekerja hanya dengan mengganti base URL dan API key.
Permintaan
{
"model": "MODEL_ID",
"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."}
],
"max_tokens": 500,
"temperature": 0.7,
"stream": false
}
| Parameter | Wajib | Keterangan |
|---|---|---|
model | ya | ID dari GET /v1/models. |
messages | ya | 1 sampai 5.000 pesan. Isi pesan (teks, gambar, tool call) diteruskan apa adanya ke model. |
max_tokens atau max_completion_tokens | tidak, disarankan | Batas token keluaran. Bila kosong dipakai batas model. Nilai di atas max_output_tokens model ditolak 400. Batas ini juga menentukan tahanan saldo. |
stream | tidak | true untuk respons SSE. Lihat Streaming. |
stream_options.include_usage | tidak | true agar chunk terakhir memuat usage. |
n | tidak | Hanya 1. |
temperature, top_p, stop, tools, tool_choice, response_format, dan lainnya | tidak | Diteruskan apa adanya. Dukungannya bergantung model. |
user, metadata | tidak | Dibuang sebelum diteruskan, supaya identitas Anda tidak dikirim ke penyedia model. |
Contoh
curl https://api.markas.ai.id/v1/chat/completions \
-H "Authorization: Bearer $MARKASAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_ID",
"messages": [{"role": "user", "content": "Apa itu API?"}],
"max_tokens": 300
}'
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.markas.ai.id/v1", api_key=os.environ["MARKASAI_API_KEY"])
resp = client.chat.completions.create(
model="MODEL_ID",
messages=[{"role": "user", "content": "Apa itu API?"}],
max_tokens=300,
)
print(resp.choices[0].message.content)
print(resp.usage)
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.markas.ai.id/v1", apiKey: process.env.MARKASAI_API_KEY });
const resp = await client.chat.completions.create({
model: "MODEL_ID",
messages: [{ role: "user", content: "Apa itu API?" }],
max_tokens: 300,
});
console.log(resp.choices[0].message.content);
Respons
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "MODEL_ID",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 20, "completion_tokens": 120, "total_tokens": 140}
}
Biaya dihitung dari usage. Token yang dibaca dari cache tampil di usage.prompt_tokens_details.cached_tokens bila model melaporkannya.
Streaming
Dengan "stream": true respons berupa text/event-stream dan diakhiri data: [DONE]. Detail perilaku saat putus dan batas waktu ada di Streaming.
data: {"id":"...","choices":[{"index":0,"delta":{"content":"Halo"}}]}
data: {"id":"...","choices":[{"index":0,"delta":{"content":" dunia"}}]}
data: {"id":"...","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":2,"total_tokens":14}}
data: [DONE]
Tool calling dan masukan gambar
tools, tool_choice, dan konten gambar di messages diteruskan apa adanya. Pilih model yang mendukungnya. Bila model menolak parameter, galatnya diteruskan sebagai 400 invalid_request dengan pesan dari model.
{
"model": "MODEL_ID",
"max_tokens": 500,
"messages": [{"role": "user", "content": "..."}],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}
}
]
}
Permintaan yang memuat tools atau functions tidak pernah diubah oleh optimasi prompt.