Guides

OpenAI-kompatible API-Migration: Endpunkte, Modelle und SDK-Setup

Migrieren Sie einen Chat-Completions-Client mit neuer Basis-URL, API-Schlüssel und Modell-ID und testen Sie Streaming, Tools, strukturierte Ausgaben, Fehler und Kompatibilitätsgrenzen.

OpenAI-kompatible API-Migration: Endpunkte, Modelle und SDK-Setup

Eine OpenAI-kompatible Migration beginnt mit drei Konfigurationsänderungen: Basis-URL, API-Schlüssel und Modell-ID. Für den Produktionseinsatz benötigen Sie zusätzlich einen Test für jeden verwendeten Endpunkt und jedes Feld.

LLMBase dokumentiert eine OpenAI-kompatible Models- und Chat-Completions-API. Die Kompatibilität umfasst nicht jeden Endpunkt und keine beliebigen anbieterspezifischen Erweiterungen.

1. SDK installieren und Schlüssel schützen

Installieren Sie das offizielle JavaScript-SDK in Ihrer serverseitigen Anwendung:

npm install openai

Erstellen Sie im LLMBase-Dashboard einen Inference-API-Schlüssel. Speichern Sie ihn als serverseitiges Secret oder als Umgebungsvariable. Legen Sie den Schlüssel nicht in Browsercode, einem Mobile-Bundle, einem öffentlichen Repository oder Analysedaten ab.

LLMBASE_API_KEY=llmbase_...
LLMBASE_MODEL_ID=<modell-id-aus-dem-aktuellen-katalog>

2. Basis-URL ändern

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.LLMBASE_API_KEY,
  baseURL: "https://api.llmbase.ai/v1",
});

Behalten Sie das Suffix /v1 bei. Das SDK ergänzt den Endpunktpfad und sendet den Schlüssel als Bearer-Token.

3. Eine aktuelle Modell-ID ermitteln

Lesen Sie die Modellliste, statt eine ID aus einem alten Artikel zu kopieren:

const models = await client.models.list();

for (const model of models.data) {
  console.log(model.id);
}

const modelId = process.env.LLMBASE_MODEL_ID;
if (!modelId || !models.data.some((model) => model.id === modelId)) {
  throw new Error("Setzen Sie LLMBASE_MODEL_ID auf eine ID aus /v1/models");
}

Prüfen Sie vor der Auswahl im aktuellen Katalog Kontext, Eingabearten, Tools, strukturierte Ausgaben, Verarbeitungsort und Preise.

4. Eine Chat-Completions-Anfrage senden

const response = await client.chat.completions.create({
  model: modelId,
  messages: [
    { role: "system", content: "Beantworten Sie Produktfragen in klarer Sprache." },
    { role: "user", content: "Erklären Sie das Zurücksetzen eines Passworts in drei Schritten." },
  ],
  max_completion_tokens: 250,
});

console.log(response.choices[0]?.message?.content);

Verwenden Sie nur dokumentierte Felder, die das gewählte Modell unterstützt. Protokollieren Sie eine Anfrage-ID und nicht sensible Fehlerangaben. Protokollieren Sie Schlüssel oder Kundeninhalte nicht standardmäßig.

5. Streaming testen

const stream = await client.chat.completions.create({
  model: modelId,
  messages: [{ role: "user", content: "Schreiben Sie vier Zeilen über klares API-Design." }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Testen Sie normalen Abschluss, Abbruch durch den Client, Zeitüberschreitungen und einen strukturierten Fehler. Ein erfolgreicher erster Chunk beweist keinen vollständigen Stream.

6. Nach einem Tool Call fortsetzen

Verwenden Sie Tools nur mit einem Modell, das native Tool-Unterstützung ausweist. Die Anwendung muss die Funktion ausführen und das Ergebnis mit der passenden Tool-Call-ID zurücksenden.

const first = await client.chat.completions.create({
  model: modelId,
  messages: [{ role: "user", content: "Welchen Status hat die Bestellung A-104?" }],
  tools: [{
    type: "function",
    function: {
      name: "get_order_status",
      description: "Aktuellen Status einer Bestellung lesen.",
      parameters: {
        type: "object",
        properties: { order_id: { type: "string" } },
        required: ["order_id"],
        additionalProperties: false,
      },
    },
  }],
  tool_choice: "required",
});

const assistantMessage = first.choices[0]?.message;
const toolCall = assistantMessage?.tool_calls?.[0];
if (!assistantMessage || !toolCall || toolCall.type !== "function") {
  throw new Error("Ein Funktionsaufruf wurde erwartet");
}

const toolResult = JSON.stringify({ order_id: "A-104", status: "processing" });
const final = await client.chat.completions.create({
  model: modelId,
  messages: [
    { role: "user", content: "Welchen Status hat die Bestellung A-104?" },
    assistantMessage,
    { role: "tool", tool_call_id: toolCall.id, content: toolResult },
  ],
});

console.log(final.choices[0]?.message?.content);

Validieren Sie Funktionsargumente, bevor Sie eigenen Code aufrufen. Prüfen Sie Berechtigungen an der Werkzeuggrenze und geben Sie nur das kleinste benötigte Ergebnis zurück.

7. Strukturierte Ausgaben anfordern

const structured = await client.chat.completions.create({
  model: modelId,
  messages: [{ role: "user", content: "Klassifizieren Sie: Der Rechnungsbetrag ist falsch." }],
  response_format: {
    type: "json_schema",
    json_schema: {
      name: "ticket_classification",
      strict: true,
      schema: {
        type: "object",
        properties: {
          category: { type: "string", enum: ["billing", "technical", "other"] },
          urgent: { type: "boolean" },
        },
        required: ["category", "urgent"],
        additionalProperties: false,
      },
    },
  },
});

const classification = JSON.parse(structured.choices[0]?.message?.content ?? "{}");

Schema-Unterstützung und Ausgabeverhalten hängen vom Modell ab. Validieren Sie die gelesenen Daten auch dann in Ihrer Anwendung, wenn ein strikter Modus verfügbar ist.

8. Einen minimalen Migrationstest behalten

Führen Sie diesen Test in Staging aus, bevor Sie Produktionsverkehr ändern:

import assert from "node:assert/strict";

const catalog = await client.models.list();
assert(catalog.data.some((model) => model.id === modelId));

const check = await client.chat.completions.create({
  model: modelId,
  messages: [{ role: "user", content: "Antworten Sie exakt mit: migration-ok" }],
  max_completion_tokens: 20,
  temperature: 0,
});

assert.equal(check.choices[0]?.message?.content?.trim(), "migration-ok");

Ergänzen Sie eine Streaming-Prüfung, wenn Ihr Produkt streamt. Ergänzen Sie einen erzwungenen Tool Call mit Fortsetzung nach dem Werkzeugergebnis, wenn Sie Tools verwenden. Ergänzen Sie eine Schemavalidierung, wenn strukturierte Ausgaben erforderlich sind.

Kompatibilitätsgrenzen dokumentieren

Dokumentieren Sie Endpunkt, SDK-Version, Anfragefelder, Modell-ID, Zeitüberschreitung, Wiederholungsregeln und erwartete Fehlerformate im Repository. Behandeln Sie Responses, Assistants, Fine-Tuning, Files, Batches oder weitere Endpunkte als nicht unterstützt, bis die LLMBase-Dokumentation sie nennt.

Nutzen Sie den Models-Endpunkt, den Leitfaden zur OpenAI-Kompatibilität und die Chat-Completions-Referenz als Implementierungsvertrag. Vergleichen Sie aktuelle Modelle und Preise auf der Seite zur europäischen KI API.

Alle Guides