Ollama expose une API HTTP locale sur le port 11434. Nous allons envoyer une conversation, lire la réponse et ajouter les contrôles nécessaires à une application.
Préparer
~~~bash ollama pull nom-du-modele ollama list python -m venv .venv source .venv/bin/activate pip install -U ollama ~~~
Choisissez un identifiant présent dans le catalogue Ollama actif et compatible avec votre mémoire.
Premier appel
~~~python from ollama import Client
client = Client(host='http://127.0.0.1:11434') response = client.chat( model='nom-du-modele', messages=[ {'role': 'system', 'content': 'Réponds clairement en français.'}, {'role': 'user', 'content': 'Explique une API REST en trois phrases.'}, ], options={'temperature': 0.2}, ) print(response['message']['content']) ~~~
Streamer
~~~python stream = client.chat( model='nom-du-modele', messages=[{'role': 'user', 'content': 'Donne trois usages de PostgreSQL.'}], stream=True, ) for chunk in stream: print(chunk['message']['content'], end='', flush=True) ~~~
Annulez la génération si le client en aval se déconnecte. Le streaming améliore le temps perçu, pas le temps total.
Gérer les erreurs
Vérifiez avant l’appel que le modèle est disponible. Traitez séparément service arrêté, modèle absent, délai dépassé et mémoire insuffisante. Ne relancez pas en boucle une erreur de capacité.
Production
N’exposez pas directement le port Ollama. Placez une API authentifiée devant lui, autorisez une liste de modèles et limitez contexte, sortie et concurrence. Journalisez latence, tokens et modèle sans conserver les prompts sensibles par défaut.
FAQ
Peut-on changer de modèle avec le même code ?
Oui, mais revalidez template de chat, outils, contexte, vitesse et qualité.
Pourquoi la première réponse est-elle lente ?
Le modèle doit être chargé en mémoire. Utilisez ollama ps et une requête de chauffe.
Client Python avec contrôle des erreurs
~~~python import requests
response = requests.post( "http://localhost:11434/api/generate", json={ "model": "gemma3", "prompt": "Explique le RAG en une phrase.", "stream": False, "options": {"temperature": 0}, }, timeout=120, ) response.raise_for_status() data = response.json()
print(data["response"]) print({ "input_tokens": data["prompt_eval_count"], "output_tokens": data["eval_count"], "generation_seconds": data["eval_duration"] / 1_000_000_000, }) ~~~
Pour le streaming, l’API renvoie du JSON ligne par ligne : traitez chaque objet et détectez done=true. Ajoutez un timeout, gérez connexion refusée et modèle absent, puis journalisez durées et comptes de tokens sans stocker le prompt s’il contient des données sensibles.