Design
Sprache
·4 Min. Lesezeit

Responses API vs. Chat Completions: Was unterscheidet sie und welche sollten Sie verwenden?

Die praktischen Unterschiede zwischen /v1/responses und /v1/chat/completions bei einer OpenAI-kompatiblen API: Anfrageformat, Konversationsverlauf, Tools, Streaming-Ereignisse und die Entscheidung, welche Sie verwenden sollten. Jedes Beispiel wurde live mit der GetVibe API ausgeführt.

Responses API vs. Chat Completions: Was unterscheidet sie und welche sollten Sie verwenden?

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 CompletionsResponses
EndpunktPOST /v1/chat/completionsPOST /v1/responses
Eingabeein messages-Arrayinput: ein String oder ein Array von Elementen
System-Prompteine Nachricht mit der Rolle systemdas Feld instructions
Antwortchoices[0].messageein output-Array: Reasoning, Nachricht, Funktionsaufrufe
Ausgabelimitmax_tokensmax_output_tokens
Wer es verwendetdie meisten SDKs, Frameworks und Chat-AppsCodex 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/responses kommuniziert; 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.

Responses API vs. Chat CompletionsOpenAI Responses API/v1/responsesChat-Completions-APIprevious_response_idCodex CLI Responses API

GetVibe API kostenlos testen

GPT, Claude, Gemini und mehr über eine einzige OpenAI-kompatible API. Bezahle in USD per Karte oder Kryptowährung.

Ähnliche Artikel

Responses API vs. Chat Completions: Was unterscheidet sie und welche sollten Sie verwenden? | GetVibe API