localaiforum
Anmelden
Guide › Betrieb & Serving

Einen OpenAI-kompatiblen Endpunkt serven

Führen Sie eine Engine einmal aus und reden Sie in einem Chat-Fenster mit ihr, und Sie haben ein Spielzeug. Serven Sie sie über HTTP in der Form, die schon alle sprechen, und Sie haben Infrastruktur: Editoren, UIs, Agenten und Ihre eigenen Skripte können alle dasselbe lokale Model steuern. Diese Seite bringt einen lokalen Endpunkt hoch und deckt dann Streaming, SDKs, Sicherheit und warmes Laden ab.

Warum die OpenAI-Form gewann

Das Chat-Completions-Anfrageformat — ein Modellname, eine Liste von {role, content}-Nachrichten, ein paar Regler — wurde der De-facto-Standard, weil jeder Werkzeugautor zuerst einen Client dafür schrieb. Was auch immer Sie von der Firma halten, die Form ist neutral: Sie ist nur JSON über POST. Praktische Konsequenz: Jeder lokale Server, der sie nachahmt, ist sofort mit einem gewaltigen Haufen existierender Software kompatibel. Ihre Engine-Wahl und Ihre Client-Wahl werden unabhängige Entscheidungen (siehe Engines).

llama-server in einer Minute

llama-server -m model.gguf -c 8192 --port 8080
# UI unter http://127.0.0.1:8080 — API unter /v1/chat/completions

Eine kommentierte Anfrage:

curl http://127.0.0.1:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"model","messages":[{"role":"user","content":"Why run local? One sentence."}],"temperature":0.7,"max_tokens":60}'
  • model — llama-server servt, was auch immer Sie gestartet haben; das Feld wird oft ignoriert, aber senden Sie einen vernünftigen Namen.
  • messages — die ganze Konversation, System-Prompt zuerst; zustandsloser Server, Sie halten den Verlauf.
  • max_tokens — die Antwort begrenzen; schützt Sie vor durchgehenden Generierungen.

Die Antwort (gekürzt) trägt die Antwort plus die Token-Buchhaltung, die Sie für kostenloses Debuggen haben wollen:

{
  "choices": [
    { "message": { "role": "assistant", "content": "No accounts, no rate limits, and your data never leaves the machine." } }
  ],
  "usage": { "prompt_tokens": 14, "completion_tokens": 15 }
}

usage ist, wie Sie erfahren, was Ihre Prompts im Kontext wirklich kosten — prüfen Sie es, bevor Sie ein Model des „Vergessens“ bezichtigen (siehe Tokens).

Streaming

Fügen Sie "stream": true hinzu, und der Server schaltet auf Server-Sent-Events um: durch Zeilenumbrüche getrennte data:-Stücke, von denen jedes ein kleines Delta trägt, beendet durch einen Sentinel.

data: {"choices":[{"delta":{"content":"No "}}]}
data: {"choices":[{"delta":{"content":"accounts"}}]}
data: [DONE]

Client-seitig: delta.content akkumulieren, bis die [DONE]-Zeile kommt. Streaming macht die Generierung nicht schneller — es macht das Warten erträglich, was für die Chat-UX dasselbe ist (siehe Geschwindigkeit).

Ollama: ein Dienst, zwei APIs

Ollamas native API ist etwas reicher — Optionen pro Anfrage und Steuerung des Modell-Lebenszyklus:

curl http://127.0.0.1:11434/api/chat -d '{"model":"qwen3:8b","messages":[{"role":"user","content":"hi"}],"stream":false,"keep_alive":-1}'

Er servt auch die OpenAI-kompatible Route unter /v1/chat/completions, also funktionieren OpenAI-geformte Clients gegen Ollama ohne Änderungen. Nutzen Sie die native API, wenn Sie keep_alive oder Engine-Optionen pro Anfrage wollen; nutzen Sie /v1 für alles andere.

vLLM für GPU-Server

vllm serve Qwen/Qwen3-8B --max-model-len 16384 --port 8000

vLLM zieht Safetensors-Gewichte, lädt einmal und servt dieselbe OpenAI-Form mit Continuous Batching darunter — das richtige Werkzeug, sobald gleichzeitige Nutzer auftauchen (siehe Parallelität). Es will NVIDIA-VRAM und eine echte GPU; bemühen Sie es nicht für einen Einzelnutzer-Desktop.

Richten Sie die offiziellen SDKs auf localhost

Die offiziellen OpenAI-Bibliotheken sind nur HTTP-Clients; tauschen Sie die Base-URL, und das API-Schlüssel-Feld wird dekorativ:

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="local")
r = client.chat.completions.create(
    model="qwen3-8b",
    messages=[{"role": "user", "content": "Why run local?"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "ollama" });
const r = await client.chat.completions.create({
  model: "qwen3:8b",
  messages: [{ role: "user", content: "Why run local?" }],
});

Jede Zeichenkette funktioniert als Schlüssel, außer der Server hat einen konfiguriert. Dieser Base-URL-Tausch ist der ganze Trick hinter jedem „funktioniert mit lokalen Modellen“-Werkzeug.

Was das freischaltet

  • Editoren und Chat-UIs — siehe UIs & Integrationen.
  • Ihre eigenen Apps: ein lokales Model hinter Ihrem eigenen Backend, null Kosten pro Token.
  • Skript-Pipelines mit garantiertem Schema — siehe Strukturierte Ausgabe.
  • Agenten-Schleifen, die Tools aufrufen und iterieren — siehe Agenten.
  • Die Spieleecke dieses Forums: Die Schach- und Janggi-Agenten spielen, indem sie einen lokalen Chat-Completions-Endpunkt genau wie das curl oben treffen.

Schließen Sie die Tür ab

Ein Modellserver ist ein Gratis-LLM für jeden, der den Port erreichen kann. Defaults sind sicher — llama-server und Ollama binden 127.0.0.1 —, also lassen Sie es auf Laptops so. Um in einem LAN zu exponieren: Setzen Sie einen API-Schlüssel (--api-key bei llama-server und vLLM plus Auth in jeder vorgelagerten UI) und bevorzugen Sie einen Reverse Proxy für TLS. Binden Sie nie 0.0.0.0 ohne Authentifizierung: Jeder im Netzwerk kann Ihre GPU verbrennen, Ihren Kontext füllen und Ihr Setup abtasten.

Warm halten

Kaltladung — Gewichte von der Platte in den VRAM — kostet Sekunden bis Dutzende Sekunden TTFT. llama-server und vLLM laden beim Start und bleiben resident, also zahlt nur die erste Anfrage. Ollama entlädt nach keep_alive (Standard ~5 Minuten): Senden Sie "keep_alive": -1, um das Model unbegrenzt zu halten, oder 0, um VRAM unmittelbar nach einem Burst freizugeben. Fühlt sich Ihr Setup „anfangs langsam, danach gut“ an, ist das eine Kaltladung, kein langsames Model — und unter Last ist ein Ladesturm ein echtes Fehlermodus (siehe Parallelität).

Verwandt: Parallelität · UIs & Integrationen · Engines · Strukturierte Ausgabe