Programmgesteuerter Zugriff auf die Ollama-REST-API

Nach der Installation stellt Ollama eine vollständige REST-API auf dem lokalen Port 11434 bereit, die Textgenerierung, Chat, Vektor-Embeddings und Modellverwaltung sowie zwei kompatible Protokolle abdeckt: OpenAI und Anthropic.

Dieser Artikel erklärt die Kern-APIs einzeln: Anfragestruktur, Streaming-Verarbeitung, Nutzungsstatistiken und Fehlerbehandlung, sodass jede Sprache lokale Modelle integrieren kann.


Zwei Basis-URLs und Authentifizierungsmethoden

Die API von Ollama hat zwei Endpunkte: lokal und Cloud, mit unterschiedlichen Authentifizierungsregeln.

Ollama API 全景:调用方、服务端点、本地模型与 Cloud

EndpunktBasis-URLAuthentifizierung
Lokaler Diensthttp://localhost:11434/apiKeine Authentifizierung erforderlich
Lokaler Dienst (kompatibles Protokoll)http://localhost:11434/v1Keine Authentifizierung erforderlich, api_key kann beliebig ausgefüllt werden
Ollama Cloudhttps://ollama.com/apiAuthorization: Bearer + API Key

Lokale Dienste erfordern standardmäßig keine Authentifizierung und funktionieren sofort; wenn Sie direkt eine Verbindung zur Cloud-API von Ollama unter ollama.com herstellen, erstellen Sie zuerst einen API-Schlüssel auf der Einstellungsseite der offiziellen Website und fügen ihn in den Anfrage-Header ein.


Textgenerierung: /api/generate

generate ist die grundlegendste Single-Turn-Generierungs-API; übergeben Sie einfach den Modellnamen und den Prompt:

Beispiel

curl http://localhost:11434/api/generate -d '{
  "model": "qwen3.5",
"prompt": "Stelle Python in einem Satz vor",
  "stream": false
}'

Wenn stream auf false gesetzt ist, wird ein einzelnes JSON-Objekt zurückgegeben:

{
  "model": "qwen3.5",
  "created_at": "2026-08-29T03:20:00.499127Z",
  "response": "Example是一个面向编程初学者的免费中文教程网站。",
  "done": true,
  "total_duration": 10706818083,
  "load_duration": 6338219291,
  "prompt_eval_count": 26,
  "prompt_eval_duration": 130079000,
  "eval_count": 42,
  "eval_duration": 4232710000
}

Übliche Parameter sind wie folgt:

ParameterBeschreibung
modelErforderlich, Modellname
promptPrompt; kann leer gelassen werden, um das Modell vorab zu laden
streamStandardmäßig true gibt Streaming zurück; bei false wird das vollständige Ergebnis auf einmal zurückgegeben
systemVorübergehend einen System-Prompt angeben, der die Einstellung in Modelfile überschreibt
optionsGenerierungsparameter-Objekt, z. B. temperature, num_ctx (identisch mit Modelfile-Parametern)
format"json" oder ein vollständiges JSON-Schema, erzwingt strukturierte Ausgabe
keep_aliveDauer, die das Modell nach der Anfrage im Speicher bleibt, z. B. "10m", -1 für dauerhaften Verbleib, 0 für sofortiges Entladen
rawWenn true, wird die Template-Zusammenstellung übersprungen und direkt der vollständige Prompt verwendet, den Sie angeben
suffixText, der nach der Modellausgabe angehängt wird, für Textvervollständigungs-Szenarien
imagesBase64-Bildarray, verwendet bei multimodalen Modellen

Zwei praktische Tipps: Das Senden eines leeren Prompts kann das Modell in den Speicher vorladen, wodurch die Lade-Wartezeit für die erste Anfrage entfällt; das Setzen von keep_alive auf 0 zusammen mit einem leeren Prompt kann das Modell sofort entladen und VRAM freigeben.

Beispiel

# Modell vorladen (kein Inhalt generiert)
curl http://localhost:11434/api/generate -d '{"model": "qwen3.5"}'

# Modell sofort entladen, VRAM freigeben
curl http://localhost:11434/api/generate -d '{"model": "qwen3.5", "keep_alive": 0}'

Chat-Generierung: /api/chat

chat ist eine API für mehrstufige Konversationen; der Nachrichtenverlauf wird vom Aufrufer verwaltet, was der wesentliche Unterschied zu generate ist.

Beispiel

curl http://localhost:11434/api/chat -d '{
  "model": "qwen3.5",
  "messages": [
{ "role": "user", "content": "Was ist Python?" },
{ "role": "assistant", "content": "Eine chinesische Tutorial-Website für Anfänger." },
{ "role": "user", "content": "Ist es kostenlos? Antworte in einem Satz" }
  ],
  "stream": false
}'

Vom message-Objekt unterstützte Felder:

FeldBeschreibung
roleVier Rollen: system / user / assistant / tool
contentNachrichteninhalt
imagesOptional, base64-Bildliste (multimodale Modelle)
thinkingOptional, der Denkprozess von Thinking-Modellen (wird mit dem think-Parameter verwendet)
tool_callsOptional: die Liste der Tools, deren Aufruf das Modell anfordert (siehe Abschnitt zum Tool-Aufruf für praktische Übungen)

Der korrekte Weg für eine Multi-Turn-Konversation: Hänge die vom Modell in jeder Runde zurückgegebene Assistant-Nachricht wieder an das messages-Array an und sende sie dann zusammen mit der neuen Frage; das Modell kann sich dann an den vollständigen Kontext „erinnern“.

Da die messages vollständig von dir verwaltet werden, kann der Verlauf in einer Datenbank gespeichert, durch Zusammenfassung komprimiert oder über Sitzungen hinweg wiederhergestellt werden — das in Teil 5 von „Befehlszeilen-Beendigungen verlieren den Speicher“ erwähnte Problem hat hier nun eine technische Lösung.


Vektor-Embeddings: /api/embed

Die embed-API wandelt Text in Vektoren um und dient als Rohstoffwerkstatt für RAG und semantische Suche.

Beispiel

# Einzelner Text
curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
"input": "EXAMPLE is a programming tutorial website"
}'


# Batch: Ein Array an input übergeben, gibt mehrere Vektoren auf einmal zurück
curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
"input": ["first text", "second text", "third text"]
}'

Die Embeddings in der Antwort sind ein 2D-Array, wobei jeder Vektor bereits L2-normalisiert (Einheitslänge) ist, sodass die Kosinusähnlichkeit direkt zum Vergleich verwendet werden kann.

Zwei erwähnenswerte Parameter: dimensions kann die Dimension des Ausgabevektors angeben (wenn vom Modell unterstützt, spart eine Reduzierung der Dimensionen Speicherplatz); truncate ist standardmäßig true und kürzt automatisch übermäßig langen Text, und das Setzen auf false führt zu einem Fehler, wenn der Text zu lang ist.


Streaming vs. Non-Streaming: Wie man Antworten verarbeitet

Generierungs-APIs geben standardmäßig Streaming zurück, im NDJSON-Format: Jede Zeile ist ein eigenständiges JSON-Objekt.

{"model":"qwen3.5","created_at":"...","response":"EXAMPLE","done":false}
{"model":"qwen3.5","created_at":"...","response":"(Example)","done":false}
{"model":"qwen3.5","created_at":"...","response":"是编程初学者的入门网站。","done":false}
{"model":"qwen3.5","created_at":"...","response":"","done":true,"done_reason":"stop"}

Der Client liest Zeile für Zeile und verkettet die Antwortfelder, um die vollständige Antwort zu bilden; der Verkettungsprozess kann in Echtzeit auf der Oberfläche dargestellt werden.

Abwägungen zwischen den beiden Modi:

ModeVorteilAnwendungsfall
Streaming (Standard)Geringe Zeit bis zum ersten Token, kann in Echtzeit angezeigt werdenChat-Oberflächen, Langtextgenerierung
Nicht-Streaming stream:falseVollständiges Ergebnis auf einmal, einfach zu verarbeitenBatch-Verarbeitung, strukturierte Ausgabe, Skriptaufrufe

Im Streaming-Modus können Fehler mitten in der Ausgabe auftreten; zu diesem Zeitpunkt kann der HTTP-Statuscode nicht mehr geändert werden. Der Fehler erscheint als Zeile {"error": "..."} am Ende des Datenstroms, und der Client sollte diese Zeile beim Parsen prüfen.


Nutzungsstatistiken und Fehlerbehandlung

Jede Generierungsantwort endet mit Feldern für Leistungsstatistiken, die Daten aus erster Hand zur Bewertung des Inferenz-Overheads liefern.

FeldBedeutung
total_durationGesamte Anfragezeit (Nanosekunden)
load_durationModellladezeit (spürbar bei der ersten Anfrage)
prompt_eval_countAnzahl der durch die Eingabe verbrauchten Tokens
prompt_eval_durationVerarbeitungszeit der Eingabe
eval_countAnzahl der durch die Ausgabe generierten Tokens
eval_durationZeit für die Ausgabegenerierung

Die Formel für die Generierungsgeschwindigkeit (token/s): eval_count / eval_duration * 10^9; alle Zeiteinheiten sind Nanosekunden.

In Bezug auf die Fehlerbehandlung verwendet die API Standard-HTTP-Statuscodes, um Ergebnisse auszudrücken:

StatuscodeBedeutung
200Erfolg
400Anfragefehler (fehlende Parameter, ungültiges JSON usw.)
404Modell existiert nicht (führen Sie zuerst ollama pull aus oder überprüfen Sie den Namen)
429Ratenlimitierung aufgrund zu häufiger Anfragen
500Interner Serverfehler
502Gateway-Fehler (z. B. Cloud-Modell nicht erreichbar)

Der Fehlerantworttext ist auf die Struktur {"error": "error description"} festgelegt; Clients können das Feld error einfach einheitlich extrahieren.


Überblick über die Modellverwaltungs-API

Die API bietet ein Gegenstück für jede in der Befehlszeile verfügbare Modellverwaltungsoperation, geeignet für den Aufbau von Admin-Dashboards oder Automatisierungsskripten.

EndpunktMethodeZweck
/api/tagsGETLokale Modelle auflisten (einschließlich Parameteranzahl, Quantisierungsstufe)
/api/showPOSTModelldetails, Fähigkeiten, Template anzeigen
/api/pullPOSTEin Modell pullen, gibt Download-Fortschritt als Stream zurück
/api/pushPOSTModell in die Modellbibliothek pushen
/api/copyPOSTModell kopieren (Quelle / Ziel)
/api/deleteDELETEEin Modell löschen
/api/createPOSTEin Modell erstellen (einschließlich Quantisierung, entsprechend den Modelfile-Fähigkeiten)
/api/psGETAktuell geladene Modelle und VRAM-Nutzung anzeigen
/api/versionGETOllama-Version abfragen

Am Beispiel von /api/tags enthält die Antwort Spezifikationsdetails für jedes Modell:

{
  "models": [
    {
      "name": "qwen3.5:latest",
      "size": 6600000000,
      "details": {
        "family": "qwen3.5",
        "parameter_size": "9B",
        "quantization_level": "Q4_K_M"
      }
    }
  ]
}

Felder wie quantization_level und parameter_size können direkt verwendet werden, um eine Modellauswahl-Oberfläche zu erstellen.


OpenAI-kompatible Schnittstelle

Für bestehende OpenAI-Anwendungen, die auf lokale Modelle umsteigen möchten, muss normalerweise nur eine base_url geändert werden.

Beispiel

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.5",
"messages": [{ "role": "user", "content": "Stelle Python in einem Satz vor" }]
  }'

Kompatibilität umfasst fünf Endpunkte:

EndpunktBeschreibung
/v1/chat/completionsChat-Vervollständigungen mit Unterstützung für Streaming, Vision, Tools und JSON-Modus
/v1/completionsText-Vervollständigungen
/v1/responsesResponses-API (zustandsloser Modus)
/v1/embeddingsVektor-Einbettungen
/v1/modelsModellliste

Beachten Sie zwei häufige Unterschiede:

Erstens kennt das OpenAI-Protokoll kein num_ctx-Konzept. Wenn Sie den Kontext ändern müssen, erstellen Sie zuerst ein Modell mit PARAMETER num_ctx und rufen Sie es dann unter einem neuen Namen auf (Sie können die Modelfile aus Teil 7 verwenden oder mit cp einen Namen ausleihen).

Zweitens werden einige Felder noch nicht unterstützt: tool_choice, logit_bias, n, logprobs usw. Vor der Migration empfiehlt es sich, die Support-Liste des Handbuchs zu prüfen.


Anthropic-kompatible Schnittstelle

Ollama bietet außerdem eine Kompatibilitätsschicht für die Anthropic Messages API, mit der Tools wie Claude Code lokale Modelle direkt verwenden können.

Beispiel

curl http://localhost:11434/v1/messages \
  -H "Content-Type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "qwen3.5",
    "max_tokens": 1024,
"messages": [{ "role": "user", "content": "Stelle Python in einem Satz vor" }]
  }'

Bei der Integration von Tools wie Claude Code müssen Sie nur zwei Umgebungsvariablen festlegen:

Beispiel

export ANTHROPIC_AUTH_TOKEN=ollama
export ANTHROPIC_BASE_URL=http://localhost:11434
claude --model qwen3.5

Beachten Sie die Fähigkeitsgrenzen: Anthropic-Funktionen wie erzwungenes tool_choice, Prompt-Caching, Batch-Schnittstelle und PDF-Eingabe werden noch nicht unterstützt; die Token-Anzahl ist ungefähr.

Weitere Erweiterungen