Zum Hauptinhalt springen

Integrationsleitfaden

Client behalten. Basis-URL und model-Wert ändern.

Die Textmodelle hier sprechen die Protokolle, die Ihr SDK bereits spricht: Chat Completions, die zustandslose Responses-Teilmenge, Anthropic Messages und Google generateContent. Interessant wird es bei Parametern, die das Zielmodell nie deklariert hat.

Die Herausforderung

Kompatibilitätsschichten lügen meist durch Auslassung

Der klassische Fehler ist kein 500. Es ist ein Parameter, den Ihr Gateway angenommen, verworfen und nie erwähnt hat – das Modell lief ohne Ihre temperature, Ihre Werkzeugdefinitionen oder Ihr Antwortformat, und das Ergebnis wirkte nur enttäuschend statt kaputt.

01

Nicht deklarierte Parameter werden abgelehnt, nicht verworfen

messages, tools, tool_choice, response_format, max_tokens, temperature und top_p bilden auf die deklarierten Felder des Modells ab. Alles andere geht an das Modellschema und ergibt 400, wenn das Modell es nicht kennt. Stillschweigen ist nie die Antwort.

02

Die Fehlerform folgt dem aufgerufenen Protokoll

Auf /v1 ist der Körper ein OpenAI- oder Anthropic-Fehlerobjekt, nicht der Umschlag {code, msg, data, request_id} von /api/v1. Wer beide Flächen nutzt, behandelt beide Formen.

03

Streaming und Abrechnung sind zwei Dinge

stream: true liefert chat.completion.chunk-Ereignisse, abgeschlossen mit data: [DONE]. Abgerechnet wird weiterhin nach gemessener Nutzung; ein abgebrochener Stream ist keine kostenlose Anfrage.

Der Ansatz

Endpunkt tauschen, dann die Evaluationen erneut fahren

Ändern Sie base_url und api_key, ersetzen Sie die Modellzeichenkette durch einen Wert aus GET /v1/models und lassen Sie Ihre bestehende Testsuite laufen. Ein 400 für einen Parameter heißt: das gewählte Modell hat ihn nie unterstützt – eine Information, die die stille Variante nie geliefert hat.

Jeder OpenAI-kompatible Client funktioniert. Es ändern sich nur Basis-URL und model-Wert.

POST /v1/chat/completions

from openai import OpenAI

client = OpenAI(
    base_url="https://api.spicyapi.ai/v1",
    api_key=os.environ["SPICY_API_KEY"],
)

stream = client.chat.completions.create(
    model="<publisher>/<model>/chat",          # exact value from GET /v1/models
    messages=[{"role": "user", "content": "Summarise these notes in three bullets."}],
    temperature=0.7,
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

text/event-stream

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"- "}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Ships"}}]}
data: [DONE]

Vertrag

Was Sie früh festhalten sollten

OpenAI-kompatible LLM-API: Basis-URL tauschen — Was Sie früh festhalten sollten
Feld oder HeaderWert oder Grenze
POST /v1/chat/completionschat.completion · SSE with stream: true
GET /v1/modelsevery callable model value
Authorization: Bearer · x-api-key · x-goog-api-keyaccepted on /v1
undeclared parameter400 · never silently dropped

Horizontal wischen, um alle Spalten zu sehen.

Integration

Vom ersten Aufruf bis in die Produktion

  1. 01Schlüssel anlegen und mit GET /v1/models die aktuell aufrufbaren Bezeichner holen.
  2. 02Client auf die Basis-URL richten und zuerst ohne Streaming senden; zurück kommt ein normales chat.completion-Objekt.
  3. 03Streaming einschalten und prüfen, ob Ihr Leser chat.completion.chunk und das [DONE]-Signal verarbeitet.
  4. 04Nutzung je Schlüssel in der Konsole beobachten und ein Tageslimit setzen, bevor Produktionsverkehr fließt.

Passung

Wann dieser Weg der richtige ist

Dafür geeignet

  • Sie haben funktionierenden OpenAI-, Anthropic- oder Google-Clientcode und wollen nur das Modell dahinter tauschen.
  • Sie wollen Bild, Video und Text auf einem Schlüssel, einem Guthaben und einem Satz Limits.

Dafür nicht geeignet

  • Sie hängen an serverseitig gespeicherten Threads oder Assistenten. Hier wird die zustandslose Responses-Teilmenge unterstützt.
  • Sie brauchen Medienausgaben. Die laufen über createTask oder die Videos-Projektion für Clients, die diese Form bereits sprechen.

Belege

Was Sie selbst prüfen können

Vier Protokollflächen, ein Schlüssel

/v1/chat/completions, /v1/responses, /v1/messages und /v1beta/models/{model}:generateContent authentifizieren alle mit demselben Schlüssel. Authorization: Bearer, x-api-key und x-goog-api-key werden dort akzeptiert, wo das SDK sie erwartet.

Die Modellliste ist der Vertrag

GET /v1/models liefert genau die Bezeichner, die jede /v1- und /api/v1-Operation akzeptiert, mit dem Anbieter in owned_by. Preise stehen in /api/v1/models und sind kontospezifisch und damit privat.

Prüfung, Limits und Reservierungen sind gemeinsam

Die Kompatibilitätsschicht nutzt dieselbe Authentifizierung, dieselben Rate Limits, dieselbe Eingabeprüfung, dieselbe Preisbildung und dieselbe Reservierung wie die native Fläche. Nur der Umschlag unterscheidet sich.

Vor dem Start

Plattformverhalten zum Bestätigen

  • Den Schlüssel serverseitig halten; Zugangsdaten im Query-String werden nie akzeptiert.
  • Zu jedem Aufruf die protokolleigene Antwort-ID protokollieren, damit Supportfragen einen Anker haben.
  • Vor dem Start festlegen, wie ein 400 wegen eines nicht unterstützten Parameters bei Ihren Nutzern ankommt.
  • Tages-, Monats- und Gesamtlimits je Schlüssel setzen, statt sich allein auf das Guthaben zu verlassen.

Häufige Fragen

Was auf dieser Seite gefragt wird

Jeder Client, in dem sich Basis-URL und Modellzeichenkette setzen lassen. OpenAI-förmige Clients nutzen /v1/chat/completions und /v1/responses, Anthropic-Clients /v1/messages und Google-GenAI-Clients die generateContent-Pfade.

Weiter

Einen Client auf ein Textmodell richten

Bestehende OpenAI-, Anthropic- oder Google-Clients hierher zeigen lassen. Was durchgereicht wird, was bewusst abgelehnt wird und wie Text abgerechnet wird.

Weitere Leitfäden