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

Body
{
  "model": "MODEL_ID",
  "messages": [
    {"role": "system", "content": "..."},
    {"role": "user", "content": "..."}
  ],
  "max_tokens": 500,
  "temperature": 0.7,
  "stream": false
}
ParameterWajibKeterangan
modelyaID dari GET /v1/models.
messagesya1 sampai 5.000 pesan. Isi pesan (teks, gambar, tool call) diteruskan apa adanya ke model.
max_tokens atau max_completion_tokenstidak, disarankanBatas token keluaran. Bila kosong dipakai batas model. Nilai di atas max_output_tokens model ditolak 400. Batas ini juga menentukan tahanan saldo.
streamtidaktrue untuk respons SSE. Lihat Streaming.
stream_options.include_usagetidaktrue agar chunk terakhir memuat usage.
ntidakHanya 1.
temperature, top_p, stop, tools, tool_choice, response_format, dan lainnyatidakDiteruskan apa adanya. Dukungannya bergantung model.
user, metadatatidakDibuang 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

200 OK
{
  "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.

text/event-stream
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.

Body dengan tools
{
  "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.