OpenAI-kompatible APIs verfügen inzwischen über zwei主要 Anforderungsformate: das etablierte /v1/chat/completions und das neuere /v1/responses. GetVibe API akzeptiert beide mit einem Schlüssel und einer Basis-URL: https://getvibeapi.com/v1. Hier erfahren Sie, wie sie sich in der Praxis unterscheiden, welche Variante Sie wählen sollten und welcher Fallstrick beim Wechsel zwischen ihnen zu beachten ist.
Die Kurzfassung
| Chat Completions | Responses | |
|---|---|---|
| Endpunkt | POST /v1/chat/completions | POST /v1/responses |
| Eingabe | ein messages-Array | input: ein String oder ein Array von Elementen |
| System-Prompt | eine Nachricht mit der Rolle system | das Feld instructions |
| Antwort | choices[0].message | ein output-Array: Reasoning, Nachricht, Funktionsaufrufe |
| Ausgabelimit | max_tokens | max_output_tokens |
| Wer es verwendet | die meisten SDKs, Frameworks und Chat-Apps | Codex CLI und neuere Agent-SDKs |
Das Format ändert weder das Modell noch den Preis oder die Tokenanzahl: Sie bezahlen in beiden Fällen für die Eingabe- und Ausgabetokens des Modells.
Dieselbe Anfrage in beiden Formaten
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": "Antworten Sie in einem Satz."},
{"role": "user", "content": "Was bedeutet 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": "Antworten Sie in einem Satz.",
"input": "Was bedeutet HTTP 429?",
"max_output_tokens": 300
}'
Bei Chat Completions befindet sich der Text in choices[0].message.content. Bei Responses liegt er innerhalb von output: Bei Reasoning-Modellen ist das erste Element ein reasoning-Element, und die Antwort befindet sich im Element vom Typ message. Sie müssen das Array nicht manuell durchlaufen; das Python-SDK verfügt über eine Eigenschaft 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": "Antworten Sie in einem Satz."},
{"role": "user", "content": "Was bedeutet HTTP 429?"}],
)
print(chat.choices[0].message.content)
resp = client.responses.create(
model="gpt-6-luna",
instructions="Antworten Sie in einem Satz.",
input="Was bedeutet HTTP 429?",
)
print(resp.output_text)
Responses ist nicht auf OpenAI-Modelle beschränkt. Vor der Veröffentlichung haben wir dieselbe Responses-Anfrage an gpt-6-luna, claude-sonnet-5.5 und deepseek-v4.1-flash gesendet, und alle drei haben geantwortet. DeepSeek gab vor seiner message ein reasoning-Element zurück, genau wie oben beschrieben.
Konversationsverlauf: Sie müssen ihn selbst senden
Das ist der wichtigste Punkt, den Sie vor dem Wechsel kennen sollten. Die eigene Responses API von OpenAI kann eine Konversation auf dem Server speichern, sodass die nächste Anfrage mit previous_response_id auf die vorherige verweist. GetVibe API speichert Ihre Konversationen nicht. Daher wird previous_response_id nicht unterstützt und store ignoriert. Bei unserem Test wurde die Anfrage mit einem 400-Fehler abgelehnt.
Das funktionierende Muster ist dasselbe wie bei Chat Completions: Senden Sie den gesamten Verlauf in input.
history = [{"role": "user", "content": "Mein Name ist Ana. Merken Sie ihn sich."}]
first = client.responses.create(model="gpt-6-luna", input=history)
history.append({"role": "assistant", "content": first.output_text})
history.append({"role": "user", "content": "Wie lautet mein Name? Ein Wort."})
second = client.responses.create(model="gpt-6-luna", input=history)
print(second.output_text) # Ana
Tools: eine andere Struktur
Function Calling funktioniert in beiden Formaten, aber die Tool-Definition sieht unterschiedlich aus. Bei Chat Completions sind die Funktionsfelder in einem function-Objekt verschachtelt; bei Responses befinden sie sich direkt im Tool. Der Aufruf wird als separates function_call-Element empfangen, und Sie geben das Ergebnis als function_call_output-Element mit derselben call_id zurück.
import json
tools = [{
"type": "function",
"name": "get_weather",
"description": "Aktuelles Wetter in einer Stadt",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
"additionalProperties": False,
},
}]
items = [{"role": "user", "content": "Wie ist das Wetter in 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"} # Ihre Funktion
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)
Bei unserem Durchlauf rief das Modell get_weather mit {"city":"Denver"} auf, und die zweite Anfrage antwortete, dass es in Denver 54 °F und bedeckt sei. Die Chat-Completions-Version derselben Schleife finden Sie in unserem Leitfaden zu Function Calling.
Streaming
Beide Formate unterstützen "stream": true, aber die Ereignisse unterscheiden sich. Chat Completions sendet einheitliche data:-Zeilen, wobei sich jedes neue Textstück in choices[0].delta.content befindet. Responses sendet benannte Ereignisse: zuerst response.created, dann response.output_text.delta mit den Textstücken und am Ende response.completed. Wenn Sie den Stream selbst statt über ein SDK verarbeiten, benötigen Sie einen Parser für das jeweilige Format.
Welche Variante sollten Sie wählen?
- Chat Completions, wenn Sie bereits darauf basierenden Code haben oder ein Framework, eine Chat-App oder eine No-Code-Plattform verwenden. Fast jedes Tool unterstützt dieses Format, und es gibt keinen Grund, funktionierenden Code nur wegen eines Formatwechsels neu zu schreiben.
- Responses, wenn ein Tool dieses Format voraussetzt. Das wichtigste Beispiel ist Codex CLI, das mit
/v1/responseskommuniziert; die Einrichtung wird in der Codex-CLI-Dokumentation und in unserem Codex-CLI-Leitfaden beschrieben.
In beiden Fällen sind die Modellliste und die Preise identisch. Eine Übersicht über jedes Feld finden Sie in der API-Referenz; aktuelle Preise finden Sie auf der Modellseite.
