9.6 Ollama-API
Die Anbindung von Werkzeugen an die Ollama-Plattform erfolgt, egal ob bei Open WebUI oder Continue, stets über standardisierte REST-Schnittstellen. Diese können nicht nur über Werkzeuge, sondern auch direkt in Ihren eigenen Applikationen genutzt werden.
Ollama stellt Ihnen gleich zwei REST-APIs zur Auswahl, über die Sie sowohl Ihre eigenen Applikationen als auch KI-gestützte Werkzeuge anbinden können. Sie können entweder die eigene API von Ollama nutzen (siehe den folgenden Abschnitt) oder eine weitere REST-Schnittstelle, die mit der OpenAI-API kompatibel ist. Letztere befindet sich aktuell noch in einer experimentellen Phase und soll Ihnen in Zukunft ermöglichen, Werkzeuge, die die OpenAI-API verwenden, auch lokal einzusetzen.
Ollama-REST-API
Führen Sie Ollama lokal auf Ihrem System entweder direkt oder in einem Container aus, erreichen Sie die Plattform über die Adresse http://localhost:11434. Über eine HTTP-POST-Anfrage auf den Pfad /api/generate können Sie mit der Ollama-API kommunizieren. Die OpenAI-API erreichen Sie über den Pfad /v1. Im Folgenden sehen Sie, wie Sie mit Node.js die Ollama-API nutzen können. Da es sich um eine einfache HTTP-Kommunikation handelt, können Sie das Beispiel auch auf jeder anderen Plattform umsetzen.
const response = await fetch(
"http://localhost:11434/api/generate",
{
method: "POST",
body: JSON.stringify({
model: "llama3.1",
prompt:
"Create a TypeScript function that adds two numbers",
}),
}
);
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { value, done } = await reader.read();
if (done === true) {
break;
}
const payload = JSON.parse(
decoder.decode(value, { stream: true })
);
process.stdout.write(payload.response);
}
Die Grundlage für dieses kurze Beispiel bildet eine HTTP-POST-Anfrage an http://localhost:11434/api/generate. Als Body übergeben Sie ein Objekt, mit dem Sie Ollama und das verwendete Modell steuern können. Die beiden wichtigsten Eigenschaften sind model, mit der Sie das verwendete Modell, in diesem Fall Llama 3.1, festlegen, und prompt, die die Anfrage an das Modell enthält. Zusätzlich dazu können Sie beispielsweise das standardmäßig verwendete Streaming mit stream: false deaktivieren.
Das Streaming, also die Übermittlung einzelner Token pro Paket, erschwert die Kommunikation mit dem Modell etwas. Es sorgt jedoch auch dafür, dass Sie die Antwort schneller erhalten, nämlich sobald das Modell das Token generiert hat. Um die einzelnen Token zu konsumieren und auf der Konsole auszugeben, erzeugen Sie ein Reader-Objekt mit der getReader-Methode. In einer Endlosschleife lesen Sie ein Paket, sobald dieses mit der reader.read()-Methode vorliegt. Die fetch-API arbeitet hier mit Binärdaten, die Sie mit dem TextDecoder in Klartext umwandeln müssen. Das Token, das das Modell generiert hat, schreiben Sie mit process.stdout.write auf die Konsole Ihres Systems.
Speichern Sie den Code in einer Datei mit dem Namen api.js. Anschließend können Sie das Skript mit node api.js ausführen und erhalten Wort für Wort die Antwort des Modells.
Neben der Einzelabfrage über den /api/generate-Endpunkt bietet die Ollama-API noch weitere Endpunkte:
-
/api/chat: Über diesen Endpunkt können Sie eine Chat-Session mit dem Modell starten.
-
/api/create: Ollama erlaubt Ihnen, über ein Modelfile ein neues Modell zu erstellen.
-
/api/blobs/<digest>: Mit diesem Endpunkt können Sie überprüfen, ob die Blob-Datei zur Erstellung eines neuen Modells auf dem Server existiert. Außerdem können Sie über diesen Endpunkt eine neue Blob-Datei erzeugen (POST).
-
/api/tags: Ollama gibt Ihnen über diesen Endpunkt eine Liste der lokal verfügbaren Modelle zurück.
-
/api/show: Über diesen Pfad können Sie sich mit einer POST-Anfrage zusätzliche Details zu einem Modell anzeigen lassen.
-
/api/copy: Dieser Endpunkt ermöglicht es Ihnen, ein existierendes Modell zu kopieren.
-
/api/delete: Über diesen Endpunkt können Sie ein bestehendes Modell wieder löschen.
-
/api/pull: Mit diesem Endpunkt können Sie ein Modell aus der Ollama-Bibliothek auf Ihren lokalen Server laden.
-
/api/push: Falls Sie bei Ollama.ai registriert sind, können Sie über die Ollama-API auch ein Modell hochladen.
-
/api/embed: Dieser Endpunkt lässt Sie Embeddings aus einem Modell erzeugen.
-
/api/ps: Dieser Endpunkt gibt Ihnen eine Liste der Modelle zurück, die aktuell in den Speicher geladen sind.
Über die REST-API können Sie also alle Operationen durchführen, die Sie auch über die Ollama-Kommandozeile erledigen können. Wenn Sie Ollama als Server in Ihrem lokalen Netz betreiben, sollten Sie beachten, dass für die Verwendung der API keinerlei Authentifizierung erforderlich ist, die Schnittstelle also für jeden offen steht. Um potenzielle Probleme zu vermeiden, sollten Sie einen Authentifizierungsserver vorschalten, der nur berechtigte Zugriffe zulässt.
Bibliotheken für den Zugriff auf die Ollama-API
Da der direkte Zugriff auf die Ollama-APIs etwas umständlich sein kann, gibt es zwei offizielle Bibliotheken, die Ihnen hierbei helfen: ollama-js für JavaScript und ollama-python für Python (siehe Abschnitt 10.2, »Ollama-API«). Mit diesen Bibliotheken können Sie alle Operationen durchführen, die Ihnen auch die REST-API bietet, jedoch in der komfortablen Form von Funktionen.
Das folgende Listing zeigt Beispiel-Code für ollama-js, um einen Prompt abzusetzen:
import ollama from "ollama";
const response = await ollama.generate({
model: "llama3.1",
prompt: "Create a TypeScript function that adds two numbers",
stream: true,
});
for await (const chunk of response) {
process.stdout.write(chunk.response);
}
ollama-js funktioniert sowohl serverseitig mit Node.js als auch im Browser. Um die Bibliothek zu verwenden, müssen Sie das Paket zunächst mit dem Kommando npm install ollama installieren.
Standardmäßig nutzt ollama-js kein Streaming, sodass Sie über response.response direkt auf die Rückgabe zugreifen können. Alternativ können Sie, wie in diesem Beispiel, das Streaming-Feature aktivieren und den Inhalt über eine asynchrone for-Schleife konsumieren.
Der Vorteil der Verwendung der von Ollama bereitgestellten Bibliotheken besteht darin, dass Ihr Code deutlich kompakter wird und Sie sich um weniger Details kümmern müssen.