Die ChatGPT API wird schnell weiterentwickelt, bricht gelegentlich bestehende Annahmen und rechnet pro Token ab — auch wenn Tests fehlschlagen. Streaming-Antworten verhalten sich anders als normale JSON-Antworten. Funktionsaufrufe bringen JSON-Schemas ins Spiel, die nicht immer exakt zu den Modellantworten passen. Ratenbegrenzungen treten oft erst in Produktion auf. Wenn Sie das alles in einer Python-REPL oder mit curl debuggen, verlieren Sie Zeit und Budget.
Dieser Leitfaden zeigt einen vollständigen ChatGPT-API-Test-Workflow in Apidog: Authentifizierung, erste Chat-Vervollständigung, SSE-Streaming, Funktionsaufrufe, Fehlerfälle, Ratenbegrenzungen und Mock-Antworten für parallele Frontend-Arbeit. Am Ende haben Sie ein wiederverwendbares Apidog-Projekt, das Vertragsabweichungen erkennt, bevor sie in Produktion landen.
Das Wichtigste in Kürze
- Legen Sie
https://api.openai.com/v1als Apidog-Umgebung an. - Speichern Sie den OpenAI-Schlüssel als geheime Variable.
- Setzen Sie Bearer-Authentifizierung auf Ordnerebene.
- Erstellen Sie
/chat/completionseinmal und verwenden Sie die Anfrage für mehrere Modelle wieder. - Testen Sie normales JSON, SSE-Streaming und Tool Calls separat.
- Validieren Sie Antworten mit Assertions.
- Nutzen Sie Apidog-Mocks, wenn Frontend-Teams ohne OpenAI-Traffic entwickeln sollen.
- Führen Sie die gespeicherten Tests in CI vor Prompt-Änderungen aus.
Warum die ChatGPT API testen?
Die OpenAI-API wirkt stabil, ändert sich aber regelmäßig. Beispiele:
-
function_callwurde durchtool_callsergänzt bzw. ersetzt. - Tool-Schemas können im strikten Modus validiert werden.
- Reasoning-Modelle wie
o1undo3akzeptieren nicht alle klassischen Parameter wietemperatureodertop_p. -
response_format: { "type": "json_schema" }bringt eigene Validierungslogik mit. - Streaming-Tool-Calls liefern Deltas in mehreren Teilen.
- Der Endpunkt
/v1/responsesüberschneidet sich funktional mit/v1/chat/completions.
Wenn Sie ohne Testschicht direkt in Ihre Anwendung integrieren, kann eine kleine Prompt-Änderung Downstream-Code brechen. Eine Apidog-Sammlung gibt Ihnen einen kontrollierten Vertrag: gleiche Anfrage, wiederholbare Antwortprüfung, klare Fehler bei Strukturänderungen.
Schritt 1: OpenAI als Umgebung in Apidog anlegen
Erstellen Sie in Apidog ein neues Projekt. Öffnen Sie die Umgebungsverwaltung und legen Sie eine Umgebung OpenAI Prod an.
| Variable | Wert |
|---|---|
baseUrl |
https://api.openai.com/v1 |
OPENAI_API_KEY |
sk-proj-... als Geheimnis |
defaultModel |
gpt-5.5 |
Markieren Sie OPENAI_API_KEY als Secret. So bleibt der Schlüssel in gemeinsamen Workspaces maskiert und wird nicht in exportierte Sammlungen geschrieben.
Schritt 2: Bearer-Authentifizierung auf Ordnerebene konfigurieren
Erstellen Sie einen Ordner ChatGPT.
Öffnen Sie die Ordnereinstellungen:
- Gehen Sie zu Auth.
- Wählen Sie Bearer Token.
- Tragen Sie ein:
{{OPENAI_API_KEY}}
Alle Requests in diesem Ordner erben nun den Header:
Authorization: Bearer {{OPENAI_API_KEY}}
Damit bleibt jede Anfrage sauber, und Schlüsselrotation ist nur noch eine Änderung an der Umgebung.
Schritt 3: Erste Chat-Vervollständigung erstellen
Erstellen Sie im Ordner ChatGPT eine neue Anfrage:
- Methode:
POST - URL:
{{baseUrl}}/chat/completions - Body: JSON
{
"model": "{{defaultModel}}",
"messages": [
{
"role": "system",
"content": "You are a senior backend engineer. Answer in under 100 words."
},
{
"role": "user",
"content": "What's the difference between idempotent and safe HTTP methods?"
}
],
"temperature": 0.2
}
Senden Sie die Anfrage. Eine erfolgreiche Antwort enthält typischerweise:
{
"choices": [
{
"message": {
"content": "..."
}
}
],
"usage": {
"total_tokens": 123
}
}
Speichern Sie die Anfrage als:
chat-completion-basic
Fehlerdiagnose:
-
401: API-Key fehlt, ist falsch oder die Umgebung ist nicht aktiv. -
429: Ratenbegrenzung erreicht. -
404: Modellname oder Endpunkt prüfen.
Schritt 4: SSE-Streaming testen
Streaming ist eine häufige Fehlerquelle. Die Antwort ist kein normales JSON, sondern text/event-stream. Jeder Chunk kommt als data:-Frame.
Duplizieren Sie chat-completion-basic und benennen Sie die Kopie um:
chat-completion-stream
Setzen Sie "stream": true:
{
"model": "{{defaultModel}}",
"stream": true,
"messages": [
{
"role": "user",
"content": "Stream the first 100 prime numbers, comma-separated."
}
]
}
Senden Sie die Anfrage. In Apidog sehen Sie die eintreffenden SSE-Frames direkt im Antwortbereich.
Achten Sie besonders auf:
- Der letzte Frame ist:
data: [DONE]
- Ohne korrekte Behandlung von
[DONE]wirft ein Client häufig JSON-Parsing-Fehler. -
usageist bei Streaming nicht automatisch enthalten. - Wenn Sie Token-Zählungen brauchen, ergänzen Sie:
{
"stream_options": {
"include_usage": true
}
}
Bei Tool Calls im Streaming kommen Argumente häufig stückweise. Testen Sie daher nicht nur den finalen Text, sondern auch den Aufbau der Deltas.
Schritt 5: Tool Calls testen
Funktionsaufrufe brechen oft, wenn Prompts geändert werden. Das Modell liefert ein tool_calls-Array. Ihr Code muss prüfen, ob Name und Argumente zum erwarteten Schema passen.
Erstellen Sie eine Anfrage:
chat-completion-tools
Body:
{
"model": "{{defaultModel}}",
"messages": [
{
"role": "user",
"content": "What is the weather in Singapore right now?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"unit": {
"type": "string",
"enum": ["c", "f"]
}
},
"required": ["city"]
},
"strict": true
}
}
],
"tool_choice": "auto"
}
Eine erwartete Antwort enthält:
{
"choices": [
{
"message": {
"tool_calls": [
{
"function": {
"name": "get_weather",
"arguments": "{\"city\":\"Singapore\",\"unit\":\"c\"}"
}
}
]
}
}
]
}
Fügen Sie im Tab Tests Assertions hinzu:
pm.test("Tool was called", () => {
const body = pm.response.json();
const call = body.choices[0].message.tool_calls?.[0];
pm.expect(call?.function?.name).to.eql("get_weather");
});
pm.test("Arguments parse as valid JSON", () => {
const body = pm.response.json();
const argsRaw = body.choices[0].message.tool_calls[0].function.arguments;
const args = JSON.parse(argsRaw);
pm.expect(args.city).to.be.a("string");
});
Diese Tests sind Ihr API-Vertrag. Wenn sich die Struktur ändert, wird der Test rot, bevor Ihr Anwendungscode fehlschlägt.
Schritt 6: Fehlerfälle und Ratenbegrenzungen testen
Legen Sie für typische Fehler jeweils eigene Requests oder Varianten an.
| Szenario | Wie auslösen | Erwartung |
|---|---|---|
| Ungültiger Schlüssel |
OPENAI_API_KEY=sk-bad in Sandbox-Umgebung |
401, error.code = "invalid_api_key"
|
| Ratenbegrenzung | Request mehrfach im Runner ausführen |
429, idealerweise mit Retry-After
|
| Token-Limit überschritten | Sehr großen Prompt an kleineres Kontextmodell senden |
400, z. B. context_length_exceeded
|
| Ungültiges Modell | "model": "gpt-99" |
404 |
| Schemaverletzung | Tool Call mit strict: true und inkompatibler Eingabe |
Modell lehnt Tool ab oder liefert Klartext |
Beispiel-Assertion für Ratenbegrenzung:
pm.test("Rate limit returns 429", () => {
pm.expect(pm.response.code).to.eql(429);
});
pm.test("Retry-After header exists", () => {
pm.expect(pm.response.headers.has("Retry-After")).to.eql(true);
});
Wichtig: Retry-After ist häufig in Sekunden angegeben und kann je nach API-Verhalten variieren. Produktionscode sollte diesen Header lesen, statt einen festen Backoff zu erzwingen.
Schritt 7: ChatGPT für Frontend-Entwicklung mocken
Wenn das Frontend schon gestreamte Tokens, Follow-up-Fragen oder Tool-Call-Karten bauen soll, muss es nicht gegen die echte OpenAI-API entwickeln.
In Apidog:
- Rechtsklick auf
chat-completion-basic. - Smart Mock auswählen.
- Mock aktivieren.
- Mock-URL an das Frontend geben.
Die Mock-URL sieht etwa so aus:
https://mock.apidog.com/m1/<projectId>/chat/completions
Sie akzeptiert denselben Body wie der echte Endpunkt und liefert eine Antwort im OpenAI-ähnlichen Schema mit:
idobjectcreatedmodelchoicesusage
Für Streaming-Mocks können Sie im erweiterten Mock ein Skript definieren, das SSE-Chunks schreibt:
data: {"choices":[{"delta":{"content":"Hello"}}]}
data: {"choices":[{"delta":{"content":" world"}}]}
data: [DONE]
So kann das Frontend SSE-Verarbeitung testen, ohne OpenAI-Tokens zu verbrauchen.
Wenn der echte Prompt bereit ist, setzen Sie im Frontend nur die Base URL zurück:
https://api.openai.com/v1
Schritt 8: Testszenario für CI speichern
Erstellen Sie in Apidog ein Testszenario, das Ihre wichtigsten Requests ausführt:
-
chat-completion-basic- Erwartung:
status === 200 - Erwartung:
usage.total_tokens > 0
- Erwartung:
-
chat-completion-stream- Erwartung: SSE endet mit
[DONE]
- Erwartung: SSE endet mit
-
chat-completion-tools- Erwartung:
tool_calls[0].function.name === "get_weather" - Erwartung:
function.argumentsist gültiges JSON
- Erwartung:
-
Fehlerfälle aus Schritt 6
- Erwartung: korrekter Statuscode
- Erwartung: erwartete Fehlerstruktur
Beispiel-Assertion für den Basic-Request:
pm.test("Status is 200", () => {
pm.expect(pm.response.code).to.eql(200);
});
pm.test("Total tokens exist", () => {
const body = pm.response.json();
pm.expect(body.usage.total_tokens).to.be.above(0);
});
pm.test("Assistant returned content", () => {
const body = pm.response.json();
pm.expect(body.choices[0].message.content).to.be.a("string");
});
Exportieren Sie das Szenario und führen Sie es in CI aus:
apidog-cli run scenario.json --env "OpenAI Prod"
Binden Sie diesen Schritt in die PR-Pipeline ein, in der Prompts geändert werden. So wird jede Prompt-Änderung gegen die Live-API geprüft, bevor sie gemergt wird.
FAQ
Funktioniert das mit Azure OpenAI?
Ja. Ersetzen Sie baseUrl durch Ihre Azure-Ressourcen-URL, ergänzen Sie den Query-Parameter api-version und verwenden Sie statt Bearer Auth den Header api-key. Die Body-Struktur bleibt weitgehend gleich.
Kann ich das für o1- und o3-Reasoning-Modelle verwenden?
Ja. Diese Modelle akzeptieren jedoch nicht alle klassischen Parameter wie temperature, top_p, presence_penalty oder frequency_penalty. Legen Sie dafür einen separaten Ordner Reasoning mit reduziertem Body-Template an.
Wie versioniere ich Prompts in Apidog?
Nutzen Sie Branches. Erstellen Sie pro Prompt-Experiment einen Branch, führen Sie das Testszenario gegen die Live-API aus, vergleichen Sie Token-Nutzung und Antwortstruktur und mergen Sie danach.
Was ist mit /v1/responses?
Legen Sie dafür einen separaten Ordner an. Authentifizierung und Base URL bleiben gleich, aber die Body-Struktur unterscheidet sich. Behalten Sie beide Ordner, wenn Sie Prompts gegen beide Endpunkte A/B-testen möchten.
Berechnet Apidog pro API-Aufruf?
Nein. OpenAI berechnet pro Token. Apidog sitzt nicht abrechnend zwischen Ihnen und OpenAI.
Zusammenfassung
Die ChatGPT API wird sich weiter ändern. Streaming, Tool Calls, JSON-Schemas und Reasoning-Modelle bringen jeweils eigene Fehlerklassen mit. Der robuste Weg ist eine kontrollierte Request-Sammlung, ein Mock-Server für Frontend-Teams und ein CI-Szenario, das Prompt-Änderungen vor dem Merge testet.
Laden Sie Apidog herunter und importieren Sie bestehende OpenAI-Aufrufe. Postman-Sammlungen und curl-Befehle lassen sich konvertieren. Erstellen Sie die Requests einmal, speichern Sie Assertions dazu und behandeln Sie zukünftige ChatGPT-Änderungen als Testlauf statt als Produktionsvorfall.
Top comments (0)