> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sunra.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a chat completion

Mengirim permintaan respons model untuk percakapan chat yang diberikan. Mendukung mode streaming dan non-streaming. Kompatibel dengan format OpenAI Chat Completions API.

## Autentikasi

<ParamField header="Authorization" type="string" required>
  Bearer token. Gunakan kunci API Anda sebagai bearer token di header Authorization.

  Format: `Bearer <SUNRA_KEY>`
</ParamField>

## Permintaan

Endpoint ini menerima sebuah objek.

<ParamField body="messages" type="object[]" required>
  Daftar pesan untuk percakapan.

  <Expandable title="properties">
    <ParamField body="role" type="string" required>
      Peran penulis pesan. Nilai yang didukung: `system`, `user`, `assistant`, `tool`.
    </ParamField>

    <ParamField body="content" type="string | object[]" required>
      Konten pesan. Dapat berupa string atau array bagian konten untuk input multimodal.
    </ParamField>

    <ParamField body="name" type="string">
      Nama opsional untuk peserta. Memberikan informasi kepada model untuk membedakan antara peserta dengan peran yang sama.
    </ParamField>

    <ParamField body="tool_calls" type="object[]">
      Panggilan alat yang dihasilkan oleh model, seperti panggilan fungsi. Hanya ada dalam pesan `assistant`.
    </ParamField>

    <ParamField body="tool_call_id" type="string">
      Panggilan alat yang direspons oleh pesan ini. Hanya ada dalam pesan `tool`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="model" type="string" required>
  Model yang digunakan untuk penyelesaian. Jelajahi model yang tersedia di [sunra.ai/models](https://sunra.ai/models).
</ParamField>

<ParamField body="stream" type="boolean" default={false}>
  Jika diatur ke `true`, delta pesan parsial akan dikirim sebagai server-sent events (SSE).
</ParamField>

<ParamField body="max_tokens" type="integer">
  Jumlah maksimum token yang akan dihasilkan dalam penyelesaian. Total panjang token input dan token yang dihasilkan dibatasi oleh panjang konteks model.
</ParamField>

<ParamField body="temperature" type="number" default={1}>
  Temperatur sampling antara 0 dan 2. Nilai lebih tinggi seperti 0.8 membuat output lebih acak, nilai lebih rendah seperti 0.2 membuatnya lebih terfokus dan deterministik.
</ParamField>

<ParamField body="top_p" type="number" default={1}>
  Parameter nucleus sampling (0-1). Alternatif untuk temperature sampling di mana model mempertimbangkan token dengan massa probabilitas top\_p.
</ParamField>

<ParamField body="frequency_penalty" type="number" default={0}>
  Angka antara -2.0 dan 2.0. Nilai positif menghukum token baru berdasarkan frekuensi kemunculannya dalam teks sejauh ini, mengurangi kemungkinan model mengulangi baris yang sama secara verbatim.
</ParamField>

<ParamField body="presence_penalty" type="number" default={0}>
  Angka antara -2.0 dan 2.0. Nilai positif menghukum token baru berdasarkan apakah mereka muncul dalam teks sejauh ini, meningkatkan kemungkinan model membahas topik baru.
</ParamField>

<ParamField body="stop" type="string | string[]">
  Hingga 4 urutan di mana API akan berhenti menghasilkan token lebih lanjut.
</ParamField>

<ParamField body="n" type="integer" default={1}>
  Berapa banyak pilihan penyelesaian chat yang dihasilkan untuk setiap pesan input.
</ParamField>

<ParamField body="logprobs" type="boolean" default={false}>
  Apakah akan mengembalikan probabilitas log dari token output. Jika true, mengembalikan probabilitas log dari setiap token output yang dikembalikan dalam konten pesan.
</ParamField>

<ParamField body="top_logprobs" type="integer">
  Bilangan bulat antara 0 dan 20 yang menentukan jumlah token paling mungkin yang dikembalikan di setiap posisi token. `logprobs` harus diatur ke `true` jika parameter ini digunakan.
</ParamField>

<ParamField body="response_format" type="object">
  Objek yang menentukan format yang harus dikeluarkan oleh model.

  <Expandable title="properties">
    <ParamField body="type" type="string" required>
      Tipe format respons. Nilai yang didukung: `text`, `json_object`, `json_schema`.
    </ParamField>

    <ParamField body="json_schema" type="object">
      Objek JSON schema. Diperlukan ketika type adalah `json_schema`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="seed" type="integer">
  Jika ditentukan, sistem akan melakukan upaya terbaik untuk melakukan sampling secara deterministik, sehingga permintaan berulang dengan seed dan parameter yang sama akan mengembalikan hasil yang sama.
</ParamField>

<ParamField body="tools" type="object[]">
  Daftar alat yang dapat dipanggil oleh model. Saat ini, hanya fungsi yang didukung sebagai alat.

  <Expandable title="properties">
    <ParamField body="type" type="string" required>
      Tipe alat. Saat ini, hanya `function` yang didukung.
    </ParamField>

    <ParamField body="function" type="object" required>
      Definisi fungsi.

      <Expandable title="properties">
        <ParamField body="name" type="string" required>
          Nama fungsi yang akan dipanggil.
        </ParamField>

        <ParamField body="description" type="string">
          Deskripsi tentang apa yang dilakukan fungsi tersebut.
        </ParamField>

        <ParamField body="parameters" type="object">
          Parameter yang diterima fungsi, dijelaskan sebagai objek JSON Schema.
        </ParamField>

        <ParamField body="strict" type="boolean" default={false}>
          Apakah akan mengaktifkan kepatuhan skema yang ketat.
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="tool_choice" type="string | object">
  Mengontrol alat mana (jika ada) yang dipanggil oleh model. `none` berarti model tidak akan memanggil alat apa pun. `auto` berarti model dapat memilih antara menghasilkan pesan atau memanggil alat. `required` berarti model harus memanggil satu atau lebih alat. Dapat juga menentukan fungsi tertentu melalui `{"type": "function", "function": {"name": "my_function"}}`.
</ParamField>

<ParamField body="parallel_tool_calls" type="boolean" default={true}>
  Apakah akan mengaktifkan pemanggilan fungsi paralel selama penggunaan alat.
</ParamField>

<ParamField body="user" type="string">
  Pengenal unik yang mewakili pengguna akhir Anda, yang dapat membantu memantau dan mendeteksi penyalahgunaan.
</ParamField>

## Respons

Respons penyelesaian chat yang berhasil.

<ResponseField name="id" type="string">
  Pengenal unik untuk penyelesaian chat.
</ResponseField>

<ResponseField name="object" type="string">
  Tipe objek. Selalu `chat.completion`.
</ResponseField>

<ResponseField name="created" type="integer">
  Timestamp Unix (dalam detik) kapan penyelesaian chat dibuat.
</ResponseField>

<ResponseField name="model" type="string">
  Model yang digunakan untuk penyelesaian chat.
</ResponseField>

<ResponseField name="choices" type="object[]">
  Daftar pilihan penyelesaian chat. Dapat lebih dari satu jika `n` lebih besar dari 1.

  <Expandable title="properties">
    <ResponseField name="index" type="integer">
      Indeks pilihan dalam daftar pilihan.
    </ResponseField>

    <ResponseField name="message" type="object">
      Pesan penyelesaian chat yang dihasilkan oleh model.

      <Expandable title="properties">
        <ResponseField name="role" type="string">
          Peran penulis pesan ini. Selalu `assistant`.
        </ResponseField>

        <ResponseField name="content" type="string | null">
          Konten pesan.
        </ResponseField>

        <ResponseField name="tool_calls" type="object[]">
          Panggilan alat yang dihasilkan oleh model, seperti panggilan fungsi.

          <Expandable title="properties">
            <ResponseField name="id" type="string">
              ID panggilan alat.
            </ResponseField>

            <ResponseField name="type" type="string">
              Tipe alat. Saat ini, hanya `function` yang didukung.
            </ResponseField>

            <ResponseField name="function" type="object">
              Fungsi yang dipanggil oleh model.

              <Expandable title="properties">
                <ResponseField name="name" type="string">
                  Nama fungsi yang dipanggil.
                </ResponseField>

                <ResponseField name="arguments" type="string">
                  Argumen untuk memanggil fungsi, dihasilkan oleh model dalam format JSON.
                </ResponseField>
              </Expandable>
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="finish_reason" type="string">
      Alasan model berhenti menghasilkan token. Dapat berupa `stop`, `length`, `tool_calls`, atau `content_filter`.
    </ResponseField>

    <ResponseField name="logprobs" type="object | null">
      Informasi probabilitas log untuk pilihan tersebut.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="usage" type="object">
  Statistik penggunaan untuk permintaan penyelesaian.

  <Expandable title="properties">
    <ResponseField name="prompt_tokens" type="integer">
      Jumlah token dalam prompt.
    </ResponseField>

    <ResponseField name="completion_tokens" type="integer">
      Jumlah token dalam penyelesaian yang dihasilkan.
    </ResponseField>

    <ResponseField name="total_tokens" type="integer">
      Jumlah total token yang digunakan dalam permintaan (prompt + penyelesaian).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="system_fingerprint" type="string | null">
  Sidik jari ini mewakili konfigurasi backend tempat model berjalan. Dapat digunakan dengan parameter `seed` untuk memahami kapan perubahan backend telah dilakukan.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api-llm.sunra.ai/v1/chat/completions \
    -H "Authorization: Bearer <SUNRA_KEY>" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "openai/gpt-4o",
      "messages": [
        {
          "role": "system",
          "content": "You are a helpful assistant."
        },
        {
          "role": "user",
          "content": "What is the capital of France?"
        }
      ]
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api-llm.sunra.ai/v1/chat/completions",
      headers={
          "Authorization": "Bearer <SUNRA_KEY>",
          "Content-Type": "application/json"
      },
      json={
          "model": "openai/gpt-4o",
          "messages": [
              {"role": "system", "content": "You are a helpful assistant."},
              {"role": "user", "content": "What is the capital of France?"}
          ]
      }
  )
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api-llm.sunra.ai/v1/chat/completions", {
    method: "POST",
    headers: {
      "Authorization": "Bearer <SUNRA_KEY>",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      model: "openai/gpt-4o",
      messages: [
        { role: "system", content: "You are a helpful assistant." },
        { role: "user", content: "What is the capital of France?" }
      ]
    })
  });
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "chatcmpl-abc123",
    "object": "chat.completion",
    "created": 1677652288,
    "model": "openai/gpt-4o",
    "choices": [
      {
        "index": 0,
        "message": {
          "role": "assistant",
          "content": "The capital of France is Paris."
        },
        "finish_reason": "stop",
        "logprobs": null
      }
    ],
    "system_fingerprint": "fp_44709d6fcb",
    "usage": {
      "prompt_tokens": 25,
      "completion_tokens": 8,
      "total_tokens": 33
    }
  }
  ```
</ResponseExample>
