Tema
Bahasa
·4 mnt baca

Responses API vs Chat Completions: apa perbedaannya dan mana yang harus digunakan

Perbedaan praktis antara /v1/responses dan /v1/chat/completions pada API yang kompatibel dengan OpenAI: bentuk permintaan, riwayat percakapan, tools, event streaming, dan mana yang harus dipilih. Setiap contoh dijalankan langsung di GetVibe API.

Responses API vs Chat Completions: apa perbedaannya dan mana yang harus digunakan

API yang kompatibel dengan OpenAI kini memiliki dua format permintaan utama: /v1/chat/completions yang sudah lama digunakan dan /v1/responses yang lebih baru. GetVibe API menerima keduanya dengan satu kunci dan satu URL dasar, https://getvibeapi.com/v1. Berikut perbedaan keduanya dalam praktik, mana yang harus dipilih, serta satu jebakan yang perlu diketahui saat Anda berpindah format.

Versi singkat

Chat CompletionsResponses
EndpointPOST /v1/chat/completionsPOST /v1/responses
Inputarray messagesinput: string atau array item
System promptpesan dengan role systemfield instructions
Jawabanchoices[0].messagearray output: reasoning, message, function calls
Batas outputmax_tokensmax_output_tokens
Penggunasebagian besar SDK, framework, dan aplikasi chatCodex CLI dan SDK agen yang lebih baru

Format tidak mengubah model, harga, atau jumlah token: Anda tetap ditagih berdasarkan token input dan output model.

Permintaan yang sama dalam kedua format

Chat Completions:

curl https://getvibeapi.com/v1/chat/completions \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-luna",
    "messages": [
      {"role": "system", "content": "Jawab dalam satu kalimat."},
      {"role": "user", "content": "Apa arti HTTP 429?"}
    ],
    "max_tokens": 300
  }'

Responses:

curl https://getvibeapi.com/v1/responses \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-luna",
    "instructions": "Jawab dalam satu kalimat.",
    "input": "Apa arti HTTP 429?",
    "max_output_tokens": 300
  }'

Dalam Chat Completions, teks berada di choices[0].message.content. Dalam Responses, teks berada di dalam output: untuk model reasoning, item pertama adalah item reasoning dan jawabannya adalah item dengan tipe message. Anda tidak perlu menelusuri array tersebut secara manual; Python SDK memiliki properti output_text.

import os
from openai import OpenAI

client = OpenAI(base_url="https://getvibeapi.com/v1", api_key=os.environ["GETVIBE_API_KEY"])

chat = client.chat.completions.create(
    model="gpt-6-luna",
    messages=[{"role": "system", "content": "Jawab dalam satu kalimat."},
              {"role": "user", "content": "Apa arti HTTP 429?"}],
)
print(chat.choices[0].message.content)

resp = client.responses.create(
    model="gpt-6-luna",
    instructions="Jawab dalam satu kalimat.",
    input="Apa arti HTTP 429?",
)
print(resp.output_text)

Responses tidak terbatas pada model OpenAI. Sebelum menerbitkan artikel ini, kami mengirim permintaan Responses yang sama ke gpt-6-luna, claude-sonnet-5.5, dan deepseek-v4.1-flash, dan ketiganya memberikan jawaban. DeepSeek mengembalikan item reasoning sebelum message, persis seperti yang dijelaskan di atas.

Riwayat percakapan: kirim sendiri

Inilah satu hal yang perlu Anda ketahui sebelum berpindah format. Responses API milik OpenAI sendiri dapat menyimpan percakapan di server, sehingga permintaan berikutnya menunjuk ke permintaan sebelumnya dengan previous_response_id. GetVibe API tidak menyimpan percakapan Anda, sehingga previous_response_id tidak didukung dan store diabaikan. Saat kami mencobanya, permintaan tersebut ditolak dengan error 400.

Pola yang berfungsi sama seperti pada Chat Completions: kirim seluruh riwayat dalam input.

history = [{"role": "user", "content": "Nama saya Ana. Ingatlah."}]
first = client.responses.create(model="gpt-6-luna", input=history)

history.append({"role": "assistant", "content": first.output_text})
history.append({"role": "user", "content": "Siapa nama saya? Satu kata."})
second = client.responses.create(model="gpt-6-luna", input=history)
print(second.output_text)  # Ana

Tools: bentuk yang berbeda

Function calling berfungsi dalam kedua format, tetapi definisi tool-nya terlihat berbeda. Dalam Chat Completions, field fungsi bersarang di dalam objek function; dalam Responses, field tersebut berada langsung pada tool. Pemanggilan fungsi diterima sebagai item function_call terpisah, dan Anda mengembalikan hasilnya sebagai item function_call_output dengan call_id yang sama.

import json

tools = [{
    "type": "function",
    "name": "get_weather",
    "description": "Cuaca saat ini di sebuah kota",
    "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"],
        "additionalProperties": False,
    },
}]

items = [{"role": "user", "content": "Bagaimana cuaca di Denver?"}]
resp = client.responses.create(model="gpt-6-luna", input=items, tools=tools)

for item in resp.output:
    if item.type == "function_call":
        result = {"city": "Denver", "temp_f": 54, "sky": "overcast"}  # fungsi Anda
        items.append({"type": "function_call", "call_id": item.call_id,
                      "name": item.name, "arguments": item.arguments})
        items.append({"type": "function_call_output", "call_id": item.call_id,
                      "output": json.dumps(result)})

final = client.responses.create(model="gpt-6-luna", input=items, tools=tools)
print(final.output_text)

Dalam pengujian kami, model memanggil get_weather dengan {"city":"Denver"}, dan permintaan kedua menjawab bahwa Denver bersuhu 54°F dan berawan. Versi Chat Completions dari loop yang sama tersedia dalam panduan function calling kami.

Streaming

Kedua format mendukung "stream": true, tetapi event-nya berbeda. Chat Completions mengirim baris data: yang seragam, dengan setiap bagian teks baru berada di choices[0].delta.content. Responses mengirim event bernama: response.created terlebih dahulu, response.output_text.delta dengan potongan teks, dan response.completed di akhir. Jika Anda mengurai stream sendiri, bukan melalui SDK, Anda memerlukan parser untuk format tertentu tersebut.

Mana yang harus dipilih

  • Chat Completions jika Anda sudah memiliki kode yang menggunakannya, atau menggunakan framework, aplikasi chat, atau platform tanpa kode. Hampir semua tool mendukungnya, dan tidak ada alasan untuk menulis ulang kode yang sudah berfungsi hanya demi mengganti format.
  • Responses jika sebuah tool mengharuskannya. Contoh utamanya adalah Codex CLI, yang berkomunikasi dengan /v1/responses; pengaturannya tersedia di dokumentasi Codex CLI dan panduan Codex CLI kami.

Apa pun pilihan Anda, daftar model dan harganya sama. Lihat referensi API untuk setiap field, dan halaman model untuk harga terbaru.

Responses API vs Chat CompletionsOpenAI Responses API/v1/responsesAPI chat completionsprevious_response_idCodex CLI Responses API

Coba GetVibe API secara gratis

GPT, Claude, Gemini, dan lainnya melalui satu API yang kompatibel dengan OpenAI. Bayar dalam USD dengan kartu atau kripto.

Artikel terkait

Responses API vs Chat Completions: apa perbedaannya dan mana yang harus digunakan | GetVibe API