Ollamas API mit Python nutzen

In einem älteren Artikel wurde gezeigt, wie in der Shell mit dem Befehl curl eine Frage an ein vom Ollama verwaltetes Sprachmodell gesendet werden kann. Falls auf dem System als lokale KI das Sprachmodell gemma3 verwendet wird, könnte dies wie folgt aussehen:

curl http://localhost:11434/api/generate -d '{
  "model": "gemma3",
  "prompt": "Who was Ernst Haas?",
  "stream": false
}'

In diesem Tutorial wird gezeigt, wie dies mit Python umgesetzt werden kann. Dabei wird ebenfalls auf die Ollama-API zugegriffen, und zwar auf folgenden Endpunkt:

http://localhost:11434/api/generate

Als Modell wird verwende ich in diesem Beispiel qwen2.5-coder. Falls ihr ein anderes Sprachmodell nutzt, müßt ihr den Code entsprechend anpassen.

Die Übermittlung der Anfrage an das Sprachmodell erfolgt im JSON-Format. Dementsprechend muss im Python-Skript die Bibliothek json importiert werden. Außerdem benötigen wir requests („HTTP for Humans“), eine Bibliothek, mit der HTTP-Anfragen gesendet werden können. Eine ausführliche Dokumentation findet ihr auf der Internetseite des Requests-Projekts. Da mögliche Verbindungsfehler abgefangen werden sollen, habe ich schließlich noch RequestException hinzugefügt. Die ersten Zeile des Python-Skripts sehen also wie folgt aus:

#!/usr/bin/env python3

import json
import requests
from requests.exceptions import RequestException

Wie auch schon beim dem curl-Befehl muss der Endpunkt angegeben werden:

URL = "http://localhost:11434/api/generate"

Es handelt sich dabei um den HTTP-Endpunkt des lokal laufenden Ollama-Dienstes. Mit anderen Worten: Hierüber greifen wir auf Ollama-AP zu. Bei api/generate handelt es sich um die API-Route für die Generierung von Text.

Kommen wir zu den zu übermittelten Daten (JSON-Format):

 data = {
    "model": "qwen2.5-coder",
    "prompt": "Erstelle in Python eine Liste mit 5 Programmiersprachen und weise sie der Variable `programmiersprachen` zu.",
    "max_tokens": 1000,
    "stream": False,
}

Dies ähnelt sehr den Daten, die mit dem Befehl curl übermittelt wurden. In diesem Beispiel it noch eine Begrenzung der Token-Anzahl hinzugekommen (max_tokens": 1000).

Die eigentliche Arbeit erledigt nun die Funktion fetch_generated_text():

def fetch_generated_text() -> str:
    """
    Fetch generated text from the Ollama API.
    """

    generated_text = ""

    try:
        # Make a POST request to the Ollama API
        response: requests.Response = requests.post(URL, json=data, stream=True)
    except RequestException as e:
        print(f"Error message:\n{e}")
        sys.exit("No connection to Ollama API. Exit program!")

    for line in response.iter_lines():
        if line:
            decoded_line = line.decode("utf-8")
            result = json.loads(decoded_line)
            # Get the generated text from the response
            generated_text = result.get("response", "")

    return generated_text

In diesem Beispiel wird die Anfrage an die Ollama-API in einem tryexcept-Block verpackt. Diese Ausnahmebehandlung soll sicherstellen, dass das Programm bei einem Verbindungsfehler durch den Aufruf von sys.exit() abbricht. Dies ist zum Beispiel der Fall, wenn Ollama auf dem Rechner nicht im Hintergrund läuft, also nicht gestartet wurde.

In der for-Schleife wird dann der generierte Text empfangen und an die aufrufende Funktion zurückgegeben. Dies könnte die Funktion main() sein, der Einstiegspunkt dieses Programms:

def main():
    answer: str = fetch_generated_text()

    print(answer, end="", flush=True)

if __name__ == "__main__":
    main()

Man könnte die Antwort zusätzlich in einem Markdown-Dokument speichern, indem zu main() folgender Code hinzugefügt wird:

with open("generated_output.md", "a", encoding="utf-8") as md_file:
    md_file.write(answer)

Die Funktion fetch_generated_text() könnte auch anders aussehen. Wenn Ihr Euch im Internet nach Beispielen zur Verwendung von requests umseht, werdet Ihr andere Implementierungen finden. Versteht die hier gewählte Variante nur also als Vorschlag für Euer eigenes Skript.