DE ▾
API-Schlüssel erhalten

Lokales LLM OpenAI-API: Lokal ausführen, zu gehostet wechseln

Eine lokale LLM OpenAI API ist ein Modellserver auf deiner eigenen Maschine, der auf dieselben HTTP-Anfragen antwortet, die die OpenAI SDKs senden. Da das Anfrageformat geteilt wird, läuft der Code, den du dafür schreibst, auch gegen einen gehosteten Endpunkt, und diese Seite zeigt, was übernommen wird und was nicht.

Aktualisiert

Desktop-Computer und Cloud-Server, verbunden durch ein Kabel mit einem Switch, die lokale und gehostete LLM-Endpunkte zeigen.

Wichtige Punkte

Was die Phrase bedeutet

Leute nutzen „lokales LLM OpenAI-API“ für zwei verwandte Dinge. Das erste ist ein Sprachmodell, das du selbst auf einem Laptop oder einem Heimserver ausführst, das an einem lokalen Port lauscht und das OpenAI-Chat-Format spricht. Das zweite ist die Gewohnheit, deine App gegen dieses Format zu schreiben, sodass das dahinterstehende Modell ausgetauscht werden kann.

Das Format ist ein einfacher Vertrag. Deine App sendet einen JSON-Body mit einem model-Namen und einer Liste von messages, jede mit einer Rolle von system, user oder assistant. Der Server antwortet mit einem JSON-Objekt, das die generierte Nachricht enthält, oder mit einem Stream kleiner Chunks, wenn du Streaming anforderst. Offizielle SDKs für Python und JavaScript kapseln dies, und sie lassen dich die Base URL überschreiben, was der ganze Trick ist.

Viele lokale Tools bieten diese Schnittstelle. Ollama, LM Studio, der llama.cpp-Server und vLLM bieten jeweils eine OpenAI-kompatible Route. Gehostete Dienste tun das ebenfalls, weshalb dieselben zwanzig Zeilen Client-Code mit beiden kommunizieren können. Der Endpunkt auf dieser Seite ist eine der gehosteten Arten. Er akzeptiert POST /v1/chat/completions und GET /v1/models, und er ist erreichbar unter https://api.onekeyllmapi.com/v1.

Lokal versus gehostet auf einen Blick

Keines ist allgemein besser. Sie tauschen Kontrolle gegen Aufwand. Die Tabelle beschränkt sich auf Unterschiede, die für die Kategorie gelten, nicht für ein bestimmtes Produkt.

FrageLokaler RunnerGehostete OpenAI-ähnliche API
Wo die Prompts landenBleiben auf deiner MaschineVerbindung zum Anbieter über HTTPS
HardwareDu stellst GPU oder CPU und Speicher bereitKeine auf deiner Seite
ModellgrößeBegrenzt durch deinen SpeicherWas der Anbieter bereitstellt
KostenmodellHardware und StromPro Token, vom Prepaid-Guthaben hier
VerfügbarkeitSolange deine Maschine an istImmer-aktiv-Server, geteilte Limits
EinrichtungInstallieren, Gewichte herunterladen, anpassenErstelle einen Schlüssel, setze die Base URL

Wenn deine Daten die Maschine, die du kontrollierst, niemals verlassen dürfen, gewinnt lokal und gehostet ist das falsche Werkzeug. Wenn du ein größeres Modell brauchst, als deine Hardware hergibt, oder einen Bot, der von vielen Orten aus erreichbar sein muss, gewinnt gehostet. Ein übliches Setup hält beide und wählt pro Aufgabe.

Einen Client von lokal zu gehostet wechseln

Wenn dein Code bereits mit einem lokalen Runner spricht, ist der Wechsel drei Werte. Alles andere, einschließlich wie du Nachrichten baust und Stream-Chunks liest, bleibt gleich.

  1. Base URL. Nutze https://api.onekeyllmapi.com/v1 statt deiner lokalen Adresse.
  2. API-Schlüssel. Lokale Server ignorieren den Schlüssel oft. Ein gehosteter benötigt ihn als Authorization: Bearer <key>, und das SDK sendet ihn für dich.
  3. Modell-ID. Lokale Namen sind, was du geladen hast. Hier ist die ID uncensored.

Eine saubere Möglichkeit, dies flexibel zu halten, ist, alle drei aus Umgebungsvariablen zu lesen, sodass eine Datei an beiden Orten funktioniert.

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.onekeyllmapi.com/v1"),
    api_key=os.environ.get("LLM_API_KEY", "YOUR_KEY"),
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

models = client.models.list()
print([m.id for m in models.data])

resp = client.chat.completions.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "Answer in two sentences."},
        {"role": "user", "content": "Why do OpenAI-style endpoints make switching models easy?"},
    ],
    temperature=0.5,
)
print(resp.choices[0].message.content)

Derselbe Aufruf über die Kommandozeile, nützlich für eine schnelle Funktionsprüfung:

curl https://api.onekeyllmapi.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "uncensored", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 20}'

Mit Node ist das Muster identisch:

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: process.env.LLM_BASE_URL ?? "https://api.onekeyllmapi.com/v1",
  apiKey: process.env.LLM_API_KEY,
});

const res = await client.chat.completions.create({
  model: process.env.LLM_MODEL ?? "uncensored",
  messages: [{ role: "user", content: "Name three uses for JSON mode." }],
});
console.log(res.choices[0].message.content);

Was OpenAI-kompatibel bedeutet und was nicht

Kompatibel bedeutet, dass das Protokollformat übereinstimmt. Es verspricht nicht, dass jedes Feature, das der Originaldienst bietet, vorhanden ist. Bevor du eine echte App migrierst, prüfe jedes dieser Features gegen das Ziel.

Was diese API unterstützt

  • Chat-Vervollständigungen unter POST /v1/chat/completions und eine Modellliste unter GET /v1/models.
  • Streaming über Server-Sent Events mit stream: true, Nutzung am Streamende gemeldet.
  • Function Calling über tools und tool_choice, gestreamte tool_calls, Ergebnisse als role: "tool"-Nachrichten.
  • JSON-Modus über response_format: {"type": "json_object"}.
  • Sampling-Steuerungen: temperature, top_p, stop, seed und die Penalty-Parameter werden durchgereicht.

Was es nicht tut

  • Keine Bilder-, Audio- oder Videogenerierung. Es ist nur Text.
  • Kein Embedding-Endpunkt und kein Fine-Tuning. Wenn deine App einen Vektorindex aufbaut, brauchst du eine separate Embedding-Quelle.
  • Nur ein Modell. Das Modell ist ein Open-Weight-Modell, das von einem unabhängigen Anbieter betrieben wird. Es ist nicht die offizielle API eines großen Anbieters und kein Router über Anbieter hinweg, also kannst du nicht zwischen Modellfamilien wählen, indem du die ID änderst.

Lokale Runner unterscheiden sich manchmal in die andere Richtung: Ein lokaler Server kann eine Embeddings-Schnittstelle anbieten oder dich mehrere Modelle laden lassen, und die Kontextgröße ist das, was du konfigurierst. Lies die Docs des Ziels für jedes Feature und halte eine kurze Liste der Features bereit, die deine App wirklich nutzt. Die Quickstart-Docs zeigen die Anfragefelder im Detail.

Kontext, Limits und Kostenunterschiede

Drei Zahlen ändern sich, wenn du einen lokalen Server verlässt. Das erste ist das Fenster. Die Kontextlänge eines lokalen Runners ist eine Einstellung, die mit deinem Speicher verknüpft ist. Hier ist sie auf 100.000 Token festgelegt, gemeinsam von Prompt und Vervollständigung, und max_tokens ist optional. Das zweite ist die Parallelität. Deine eigene Maschine kann so tief wie gewünscht in der Warteschlange stehen, aber ein voller Schlüssel erlaubt hier 8 parallele Anfragen und 300 pro Minute, und ein Test-Key 2 und 60. Das dritte ist die Rechnung.

Gehostete Nutzung kostet $0,15 pro 1M Input-Token und $0,50 pro 1M Output-Token, Pay as you go vom Prepaid-Guthaben. Gehe eine tägliche Aufgabe als Beispiel durch: Ein Zusammenfassungstool verarbeitet 400 Dokumente pro Tag, jedes mit 3.000 Input-Token und 300 Output-Token. Input ist 400 x 3.000 = 1.200.000 Token, was 1,2 x $0,15 = $0,18 kostet. Output ist 400 x 300 = 120.000 Token, was 0,12 x $0,50 = $0,06 kostet. Der Tag summiert sich auf $0,24, und ein 30-Tage-Monat ist $7,20. Vergleiche das mit den Kosten, eine GPU am Laufen zu halten und der Karte selbst, bevor du entscheidest.

Wenn du ein Limit überschreitest, antwortet die API mit HTTP 429 und dem Code rate_limited oder concurrency. Bei kurzer Überlastung fügt sie Retry-After: 5 hinzu. Behalte deine Retry-Logik, die wartet und es erneut versucht. Anfragen, die fehlschlagen oder abgelehnt werden, werden nicht berechnet. Guthaben verfällt nie, also kostet ein inaktiver Monat nichts.

Eine gestreamte Anfrage behält ihren Parallelitäts-Slot, bis der Stream endet, also schließe Streams, die du nicht mehr liest. Aufladungen beginnen bei 20 $; die Stufen und Boni findest du auf der Preisseite.

Debugging bei Problemen beim Wechsel

Die meisten fehlgeschlagenen Migrationen lassen sich auf wenige Ursachen zurückführen. Gehe sie in dieser Reihenfolge durch.

  • 404- oder Verbindungsfehler. Die Base URL enthält wahrscheinlich nicht das /v1-Suffix oder hat einen zusätzlichen Pfad. Verwende sie exakt wie https://api.onekeyllmapi.com/v1.
  • Authentifizierungsfehler. Der Key fehlt oder wird im falschen Header gesendet. Das Format lautet Authorization: Bearer <key>. SDK-Nutzer sollten bestätigen, dass die Umgebungsvariable tatsächlich geladen wurde.
  • Modell nicht gefunden. Der alte lokale Modellname steht noch in deiner Konfiguration. Rufe GET /v1/models auf und verwende die ID, die sie auflistet, also uncensored.
  • 429 bei Last. Du hast 8 parallele Anfragen oder 300 pro Minute bei einem Voll-Key überschritten. Füge eine Warteschlange oder ein Semaphor hinzu.
  • Ein Parameter scheint ignoriert zu werden. Prüfe, ob es sich um eines der oben aufgeführten durchgereichten Felder handelt, und vergleiche das Verhalten mit einem festen seed und niedriger Temperatur.

Jede Antwort enthält einen X-Request-Id-Header. Logge ihn neben deiner eigenen Anfrage-ID, damit eine schlechte Antwort später nachverfolgt werden kann. Wenn du Produktionsverkehr ausführst und die Qualität über die Zeit messen möchtest, ist der Site-Artikel LLM Observability: Myths vs Facts eine gute Lektüre für den nächsten Schritt. Die Antwort-Header X-Balance-USD, X-RateLimit-Limit-Requests und X-RateLimit-Limit-Concurrency sind ebenfalls das Erfassen wert.

Es ohne Verpflichtung ausprobieren

Der günstigste Weg zu testen, ob dein Code sauber portiert wird, ist, ihn einmal auszuführen. Erstelle ein Konto mit Google oder E-Mail und Passwort, und beanspruche dann das $0,50 Testguthaben von der API-Schlüssel-Seite. Es dauert einen Klick, benötigt keine Karte, ist auf eine pro Person begrenzt und bleibt 7 Tage gültig. Hol dir deinen Schlüssel unter der API-Schlüssel-Seite, setze die drei Umgebungsvariablen von oben und führe deine bestehende Testsuite aus.

Wenn die Tests bestehen und die Nutzung in dein Budget passt, lade ab $20 auf, mit Karte (Visa, Mastercard, Apple Pay, Google Pay) oder Krypto (USDT auf TRC20, USDC auf Base). Prompts werden nicht zum Training verwendet. Das Modell ist darauf abgestimmt, ohne Inhaltsabweisungen für die rechtmäßige Nutzung durch Erwachsene zu antworten, mit einer festen Regel: keine sexuellen Inhalte, die Minderjährige involvieren.

Fragen und Antworten

Kann ich ein lokales LLM mit einer OpenAI-kompatiblen API ausführen?

Ja. Runner wie Ollama, LM Studio, der llama.cpp-Server und vLLM können OpenAI-kompatible Endpunkte bereitstellen, und du leitest das OpenAI SDK auf diese lokale Adresse.

Was muss ich ändern, um meine App zu dieser gehosteten API zu migrieren?

Drei Werte: die Base URL, der API-Schlüssel und die Modell-ID. Hier sind es die Base URL, wie in den Beispielen gezeigt, ein Bearer-Schlüssel aus deinem Konto und die Modell-ID uncensored.

Unterstützt diese API Embeddings oder Bildgenerierung?

Nein. Sie ist nur für Text ausgelegt, mit Chat-Completion, Streaming, Function Calling und JSON-Modus. Nutze einen separaten Dienst für Embeddings oder Bilder.

Ist dies die offizielle API eines Modell-Anbieters?

Nein. Sie bedient ein Open-Weight-Modell, das von einem unabhängigen Anbieter betrieben wird, und ist kein Router über Anbieter hinweg.

Dein Schlüssel ist nur ein Formular entfernt

Erstelle ein Konto, kopiere den Schlüssel, ändere die Basis-URL. Das ist die gesamte Einrichtung.