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 Completions | Responses | |
|---|---|---|
| Endpoint | POST /v1/chat/completions | POST /v1/responses |
| Input | array messages | input: string atau array item |
| System prompt | pesan dengan role system | field instructions |
| Jawaban | choices[0].message | array output: reasoning, message, function calls |
| Batas output | max_tokens | max_output_tokens |
| Pengguna | sebagian besar SDK, framework, dan aplikasi chat | Codex 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.
