24 KiB
Guide complet : IA locale pour le code sur Windows WSL
Guide d'installation d'une IA locale performante orientée développement sur Windows avec WSL2 et GPU NVIDIA.
Prérequis
- Windows 10/11 (version 21H2 ou supérieure)
- Carte graphique NVIDIA avec 8GB+ VRAM
- WSL2 installé
- Au moins 50GB d'espace disque libre
Étape 1 : Configuration WSL2 avec support GPU
1.1 Installer/Mettre à jour WSL2
Ouvrir PowerShell en administrateur :
# Installer WSL2 avec Ubuntu
wsl --install -d Ubuntu-22.04
# Ou mettre à jour WSL si déjà installé
wsl --update
Redémarrer si nécessaire, puis lancer Ubuntu depuis le menu démarrer.
1.2 Installer les drivers NVIDIA pour WSL
Sur Windows (pas dans WSL) :
- Télécharger les derniers drivers NVIDIA : https://www.nvidia.com/Download/index.aspx
- Installer normalement sur Windows
- Les drivers WSL sont inclus automatiquement
Vérification dans WSL :
# Lancer WSL Ubuntu
wsl
# Vérifier que le GPU est détecté
nvidia-smi
Tu devrais voir ton GPU et la version CUDA.
1.3 Configurer WSL pour plus de RAM
Créer/éditer le fichier .wslconfig dans Windows :
Sur Windows, créer C:\Users\VOTRE_NOM\.wslconfig :
[wsl2]
memory=16GB
processors=8
swap=8GB
localhostForwarding=true
[experimental]
sparseVhd=true
Redémarrer WSL :
wsl --shutdown
wsl
Étape 2 : Installation de Docker dans WSL
# Mise à jour du système
sudo apt update && sudo apt upgrade -y
# Installer les dépendances
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# Ajouter le repository Docker
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installer Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Ajouter votre user au groupe docker
sudo usermod -aG docker $USER
# Activer Docker au démarrage
sudo systemctl enable docker
sudo systemctl start docker
# IMPORTANT : Se déconnecter et reconnecter pour appliquer les permissions
exit
Relancer WSL et vérifier :
docker --version
docker run hello-world
2.1 Installer NVIDIA Container Toolkit
# Ajouter le repository NVIDIA
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Installer le toolkit
sudo apt update
sudo apt install -y nvidia-container-toolkit
# Configurer Docker pour utiliser le GPU
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# Tester le GPU dans Docker
docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi
Étape 3 : Installer Ollama
# Télécharger et installer Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Démarrer le service Ollama
ollama serve &
# Attendre 5 secondes que le serveur démarre
sleep 5
# Vérifier que Ollama fonctionne
ollama list
3.1 Télécharger les modèles optimisés pour le code
# Qwen2.5 Coder - Le meilleur rapport qualité/vitesse
ollama pull qwen2.5-coder:7b
# DeepSeek Coder V2 - Excellente qualité (plus lourd)
ollama pull deepseek-coder-v2:16b
# Llama 3.1 - Bon généraliste
ollama pull llama3.1:8b
# Modèle d'embeddings pour le RAG
ollama pull nomic-embed-text
3.2 Tester un modèle
# Test simple
ollama run qwen2.5-coder:7b "Écris une fonction Python pour calculer Fibonacci"
Étape 4 : Installer Open WebUI avec support GPU
# Lancer Open WebUI avec GPU NVIDIA
docker run -d \
--gpus all \
-p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:cuda
# Vérifier que le container tourne
docker ps
# Voir les logs
docker logs open-webui
Accéder à l'interface :
- Ouvrir navigateur Windows :
http://localhost:3000 - Créer un compte (local, pas de cloud)
- Les modèles Ollama seront détectés automatiquement
Étape 5 : Créer des modèles personnalisés pour le code
5.1 Créer un Modelfile pour assistant code
# Créer un dossier pour les modelfiles
mkdir -p ~/ollama-models
cd ~/ollama-models
# Créer le fichier
cat > CodeExpert.modelfile << 'EOF'
FROM qwen2.5-coder:7b
PARAMETER temperature 0.2
PARAMETER top_p 0.95
PARAMETER top_k 40
PARAMETER num_ctx 8192
PARAMETER repeat_penalty 1.1
SYSTEM """
Tu es un expert en développement logiciel avec 15 ans d'expérience.
RÈGLES :
- Écris du code propre, lisible et maintenable
- Inclus la gestion d'erreurs appropriée
- Ajoute des commentaires pour la logique complexe
- Suis les conventions du langage utilisé
- Propose des optimisations quand pertinent
- Utilise les design patterns appropriés
- Format : markdown avec syntax highlighting
LANGAGES MAÎTRISÉS :
Python, JavaScript/TypeScript, Java, C++, Go, Rust, SQL, Shell
SPÉCIALITÉS :
- Architecture logicielle
- Optimisation de performance
- Sécurité applicative
- Tests unitaires
- Clean Code
"""
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
"""
EOF
# Créer le modèle custom
ollama create code-expert -f CodeExpert.modelfile
# Tester
ollama run code-expert "Crée une API REST avec FastAPI pour gérer des utilisateurs"
5.2 Modelfile pour code review
cat > CodeReviewer.modelfile << 'EOF'
FROM qwen2.5-coder:7b
PARAMETER temperature 0.1
PARAMETER top_p 0.9
PARAMETER num_ctx 8192
SYSTEM """
Tu es un expert en code review avec un œil pour les détails.
ANALYSE :
1. 🐛 BUGS : Erreurs logiques, edge cases non gérés
2. 🔒 SÉCURITÉ : Injections SQL, XSS, secrets exposés
3. ⚡ PERFORMANCE : Complexité algorithmique, optimisations
4. 📖 LISIBILITÉ : Nommage, structure, commentaires
5. ✅ BEST PRACTICES : Patterns, conventions, maintenabilité
FORMAT :
- Liste les problèmes par ordre de priorité
- Donne des suggestions concrètes
- Indique le niveau : CRITIQUE / IMPORTANT / SUGGESTION
"""
EOF
ollama create code-reviewer -f CodeReviewer.modelfile
5.3 Modelfile pour debugging
cat > Debugger.modelfile << 'EOF'
FROM deepseek-coder-v2:16b
PARAMETER temperature 0.1
PARAMETER top_p 0.95
PARAMETER num_ctx 16384
SYSTEM """
Tu es un expert en debugging et résolution de problèmes.
MÉTHODOLOGIE :
1. Analyse le code et l'erreur fournie
2. Identifie la cause racine
3. Explique pourquoi le bug se produit
4. Propose une correction avec explication
5. Suggère des tests pour éviter la régression
FOCUS :
- Stack traces
- Erreurs runtime
- Memory leaks
- Race conditions
- Edge cases
"""
EOF
ollama create debugger -f Debugger.modelfile
Étape 6 : Configuration VS Code avec Continue.dev
6.1 Installer VS Code (si pas déjà fait)
Sur Windows, télécharger depuis : https://code.visualstudio.com/
6.2 Installer l'extension WSL
Dans VS Code :
- Extensions (Ctrl+Shift+X)
- Chercher "WSL"
- Installer "WSL" par Microsoft
6.3 Se connecter à WSL
Ctrl+Shift+P→ "WSL: Connect to WSL"- Ou cliquer sur le bouton vert en bas à gauche → "Connect to WSL"
6.4 Installer Continue.dev
Dans VS Code (connecté à WSL) :
- Extensions → Chercher "Continue"
- Installer "Continue - Codestral, Claude, and more"
6.5 Configurer Continue
Créer le fichier de config :
mkdir -p ~/.continue
cat > ~/.continue/config.json << 'EOF'
{
"models": [
{
"title": "Code Expert",
"provider": "ollama",
"model": "code-expert",
"apiBase": "http://localhost:11434"
},
{
"title": "Qwen Coder",
"provider": "ollama",
"model": "qwen2.5-coder:7b",
"apiBase": "http://localhost:11434"
},
{
"title": "DeepSeek Coder",
"provider": "ollama",
"model": "deepseek-coder-v2:16b",
"apiBase": "http://localhost:11434"
}
],
"tabAutocompleteModel": {
"title": "Qwen Fast Autocomplete",
"provider": "ollama",
"model": "qwen2.5-coder:7b",
"apiBase": "http://localhost:11434"
},
"embeddingsProvider": {
"provider": "ollama",
"model": "nomic-embed-text",
"apiBase": "http://localhost:11434"
},
"contextProviders": [
{
"name": "code",
"params": {}
},
{
"name": "docs",
"params": {}
},
{
"name": "diff",
"params": {}
},
{
"name": "terminal",
"params": {}
},
{
"name": "problems",
"params": {}
},
{
"name": "folder",
"params": {}
},
{
"name": "codebase",
"params": {}
}
],
"slashCommands": [
{
"name": "edit",
"description": "Edit selected code"
},
{
"name": "comment",
"description": "Write comments for selected code"
},
{
"name": "share",
"description": "Export conversation to markdown"
},
{
"name": "cmd",
"description": "Generate shell command"
}
]
}
EOF
6.6 Utiliser Continue dans VS Code
Raccourcis clavier :
Ctrl+L: Ouvrir le chat ContinueCtrl+I: Edit inline (modifier le code sélectionné)Ctrl+Shift+L: Nouveau chat
Commandes slash :
/edit: Modifier le code sélectionné/comment: Ajouter des commentaires/fix: Corriger les erreurs/test: Générer des tests
Étape 7 : Optimisations avancées
7.1 Script de démarrage automatique
cat > ~/start-ai-stack.sh << 'EOF'
#!/bin/bash
echo "🚀 Démarrage de la stack IA..."
# Démarrer Ollama en arrière-plan
echo "📦 Démarrage Ollama..."
ollama serve > /dev/null 2>&1 &
sleep 3
# Vérifier que Ollama tourne
if curl -s http://localhost:11434/api/tags > /dev/null; then
echo "✅ Ollama démarré"
else
echo "❌ Erreur : Ollama n'a pas démarré"
exit 1
fi
# Démarrer Open WebUI si pas déjà lancé
if ! docker ps | grep -q open-webui; then
echo "🌐 Démarrage Open WebUI..."
docker start open-webui 2>/dev/null || \
docker run -d \
--gpus all \
-p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:cuda
echo "✅ Open WebUI démarré sur http://localhost:3000"
else
echo "✅ Open WebUI déjà actif"
fi
echo ""
echo "🎉 Stack IA prête !"
echo "📊 GPU Status:"
nvidia-smi --query-gpu=name,memory.total,memory.used --format=csv,noheader,nounits
echo ""
echo "🔗 Accès:"
echo " - Open WebUI: http://localhost:3000"
echo " - Ollama API: http://localhost:11434"
echo ""
echo "📝 Modèles disponibles:"
ollama list
EOF
chmod +x ~/start-ai-stack.sh
Utilisation :
~/start-ai-stack.sh
7.2 Créer un alias dans .bashrc
echo "alias ai='~/start-ai-stack.sh'" >> ~/.bashrc
echo "alias ai-stop='docker stop open-webui && pkill ollama'" >> ~/.bashrc
source ~/.bashrc
Maintenant tu peux juste taper ai pour tout lancer.
7.3 Monitoring GPU en temps réel
# Installer nvtop pour monitoring GPU
sudo apt install -y nvtop
# Lancer
nvtop
Ou utiliser :
watch -n 1 nvidia-smi
7.4 Script pour tester les performances
cat > ~/benchmark-models.sh << 'EOF'
#!/bin/bash
echo "🎯 Benchmark des modèles..."
PROMPT="Écris une fonction Python qui implémente QuickSort avec commentaires"
for MODEL in "qwen2.5-coder:7b" "code-expert" "deepseek-coder-v2:16b"; do
echo ""
echo "⏱️ Testing $MODEL..."
START=$(date +%s)
ollama run $MODEL "$PROMPT" > /dev/null 2>&1
END=$(date +%s)
DURATION=$((END - START))
echo "✅ $MODEL: ${DURATION}s"
done
EOF
chmod +x ~/benchmark-models.sh
Étape 8 : Utilisation avancée avec API
8.1 Script Python pour interagir avec Ollama
# Installer les dépendances Python
pip install ollama requests rich
# Créer ~/ai_assistant.py
cat > ~/ai_assistant.py << 'EOF'
#!/usr/bin/env python3
import ollama
from rich.console import Console
from rich.markdown import Markdown
console = Console()
def code_review(code: str, language: str = "python"):
"""Effectue une review de code."""
response = ollama.chat(
model='code-reviewer',
messages=[{
'role': 'user',
'content': f'Review ce code {language}:\n\n```{language}\n{code}\n```'
}]
)
md = Markdown(response['message']['content'])
console.print(md)
def debug_error(code: str, error: str, language: str = "python"):
"""Debug une erreur."""
response = ollama.chat(
model='debugger',
messages=[{
'role': 'user',
'content': f'''
Code {language}:
```{language}
{code}
Erreur:
{error}
Trouve et corrige le bug. ''' }] )
md = Markdown(response['message']['content'])
console.print(md)
def generate_code(description: str, language: str = "python"): """Génère du code.""" response = ollama.chat( model='code-expert', messages=[{ 'role': 'user', 'content': f'Génère du code {language} pour: {description}' }] )
md = Markdown(response['message']['content'])
console.print(md)
if name == "main": import sys
if len(sys.argv) < 2:
print("Usage:")
print(" python ai_assistant.py review <fichier>")
print(" python ai_assistant.py debug <fichier> <erreur>")
print(" python ai_assistant.py generate '<description>'")
sys.exit(1)
command = sys.argv[1]
if command == "review" and len(sys.argv) >= 3:
with open(sys.argv[2]) as f:
code = f.read()
code_review(code)
elif command == "generate" and len(sys.argv) >= 3:
generate_code(sys.argv[2])
else:
print("Commande invalide")
EOF
chmod +x ~/ai_assistant.py
Utilisation :
```bash
# Review de code
python ~/ai_assistant.py review mon_script.py
# Génération de code
python ~/ai_assistant.py generate "API REST avec authentification JWT"
8.2 API REST custom avec FastAPI
pip install fastapi uvicorn
# Créer ~/code_api.py
cat > ~/code_api.py << 'EOF'
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import ollama
app = FastAPI(title="Code AI API")
class CodeRequest(BaseModel):
code: str
language: str = "python"
class PromptRequest(BaseModel):
prompt: str
model: str = "code-expert"
@app.post("/review")
async def review_code(request: CodeRequest):
"""Review du code."""
try:
response = ollama.chat(
model='code-reviewer',
messages=[{
'role': 'user',
'content': f'Review ce code {request.language}:\n\n```{request.language}\n{request.code}\n```'
}]
)
return {"review": response['message']['content']}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/generate")
async def generate_code(request: PromptRequest):
"""Génération de code."""
try:
response = ollama.chat(
model=request.model,
messages=[{
'role': 'user',
'content': request.prompt
}]
)
return {"code": response['message']['content']}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/models")
async def list_models():
"""Liste les modèles disponibles."""
try:
models = ollama.list()
return {"models": [m['name'] for m in models['models']]}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
EOF
Lancer l'API :
python ~/code_api.py
Tester :
# Review de code
curl -X POST http://localhost:8000/review \
-H "Content-Type: application/json" \
-d '{"code": "def add(a,b):\n return a+b", "language": "python"}'
# Générer du code
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{"prompt": "Fonction pour valider un email", "model": "code-expert"}'
Étape 9 : Intégration RAG (Retrieval Augmented Generation)
Pour que l'IA utilise ta documentation/codebase :
pip install chromadb langchain
# Créer ~/rag_codebase.py
cat > ~/rag_codebase.py << 'EOF'
#!/usr/bin/env python3
import chromadb
from chromadb.config import Settings
import ollama
import os
from pathlib import Path
class CodebaseRAG:
def __init__(self, codebase_path: str):
self.client = chromadb.Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="./chroma_db"
))
self.collection = self.client.get_or_create_collection("codebase")
self.codebase_path = Path(codebase_path)
def index_codebase(self):
"""Indexe tous les fichiers de code."""
extensions = ['.py', '.js', '.ts', '.java', '.cpp', '.go', '.rs']
for ext in extensions:
for file_path in self.codebase_path.rglob(f'*{ext}'):
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Générer l'embedding avec Ollama
embedding_response = ollama.embeddings(
model='nomic-embed-text',
prompt=content
)
self.collection.add(
ids=[str(file_path)],
embeddings=[embedding_response['embedding']],
documents=[content],
metadatas=[{"path": str(file_path), "ext": ext}]
)
print(f"✅ Indexé: {file_path}")
except Exception as e:
print(f"❌ Erreur {file_path}: {e}")
def query_codebase(self, question: str, n_results: int = 3):
"""Recherche dans la codebase."""
# Générer l'embedding de la question
query_embedding = ollama.embeddings(
model='nomic-embed-text',
prompt=question
)
# Chercher les documents similaires
results = self.collection.query(
query_embeddings=[query_embedding['embedding']],
n_results=n_results
)
return results
def ask(self, question: str):
"""Pose une question sur la codebase."""
# Récupérer les documents pertinents
results = self.query_codebase(question)
# Construire le contexte
context = "\n\n".join([
f"Fichier: {meta['path']}\n```\n{doc}\n```"
for doc, meta in zip(results['documents'][0], results['metadatas'][0])
])
# Générer la réponse avec le contexte
response = ollama.chat(
model='code-expert',
messages=[{
'role': 'system',
'content': 'Tu es un expert qui répond aux questions sur une codebase. Utilise le contexte fourni.'
}, {
'role': 'user',
'content': f'''Contexte:\n{context}\n\nQuestion: {question}'''
}]
)
return response['message']['content']
if __name__ == "__main__":
import sys
if len(sys.argv) < 3:
print("Usage:")
print(" python rag_codebase.py index <chemin_projet>")
print(" python rag_codebase.py ask '<question>'")
sys.exit(1)
rag = CodebaseRAG("./chroma_db")
if sys.argv[1] == "index":
rag.codebase_path = Path(sys.argv[2])
rag.index_codebase()
print("✅ Indexation terminée")
elif sys.argv[1] == "ask":
answer = rag.ask(sys.argv[2])
print(answer)
EOF
chmod +x ~/rag_codebase.py
Utilisation :
# Indexer un projet
python ~/rag_codebase.py index /chemin/vers/projet
# Poser une question
python ~/rag_codebase.py ask "Comment fonctionne l'authentification dans ce projet ?"
Étape 10 : Dépannage et optimisations
10.1 Problèmes courants
Ollama ne démarre pas :
# Vérifier les processus
ps aux | grep ollama
# Tuer et relancer
pkill ollama
ollama serve &
GPU non détecté :
# Vérifier CUDA
nvidia-smi
# Réinstaller nvidia-container-toolkit
sudo apt remove --purge nvidia-container-toolkit
sudo apt install nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Open WebUI ne charge pas :
# Voir les logs
docker logs open-webui
# Redémarrer
docker restart open-webui
# Si problème persistant, recréer
docker rm -f open-webui
# Puis relancer la commande docker run de l'étape 4
Manque de mémoire GPU :
# Lister les processus GPU
nvidia-smi
# Utiliser des modèles plus petits ou quantizés
ollama pull qwen2.5-coder:7b-q4_0 # Version plus légère
10.2 Optimiser les performances
Ajuster les paramètres Ollama :
# Créer un fichier de config Ollama
mkdir -p ~/.ollama
cat > ~/.ollama/config.json << 'EOF'
{
"num_gpu": 1,
"gpu_layers": 35,
"num_thread": 8,
"num_ctx": 8192,
"batch_size": 512
}
EOF
Utiliser la quantization appropriée :
# Pour 8GB VRAM
ollama pull qwen2.5-coder:7b-q5_K_M # Meilleure qualité
ollama pull qwen2.5-coder:7b-q4_K_M # Équilibré
ollama pull qwen2.5-coder:7b-q3_K_M # Plus rapide, moins précis
10.3 Surveillance et monitoring
# Script de monitoring
cat > ~/monitor-ai.sh << 'EOF'
#!/bin/bash
echo "📊 Monitoring de l'IA"
echo "===================="
echo ""
echo "🖥️ GPU:"
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader,nounits
echo ""
echo "🐳 Docker Containers:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "📦 Ollama Service:"
if curl -s http://localhost:11434/api/tags > /dev/null; then
echo "✅ Running"
echo "Modèles chargés:"
curl -s http://localhost:11434/api/tags | python3 -m json.tool | grep '"name"'
else
echo "❌ Not running"
fi
echo ""
echo "💾 Espace disque WSL:"
df -h / | tail -1
EOF
chmod +x ~/monitor-ai.sh
Récapitulatif des commandes essentielles
# Démarrer tout
ai # (alias créé précédemment)
# Ou manuellement
ollama serve &
docker start open-webui
# Arrêter tout
ai-stop # (alias créé précédemment)
# Ou manuellement
docker stop open-webui
pkill ollama
# Lister les modèles
ollama list
# Utiliser un modèle en CLI
ollama run code-expert "ton prompt ici"
# Monitoring
~/monitor-ai.sh
watch -n 1 nvidia-smi
# Nettoyer l'espace disque
docker system prune -a
ollama rm <model-name> # Supprimer un modèle non utilisé
Accès et URLs
- Open WebUI : http://localhost:3000
- Ollama API : http://localhost:11434
- API REST custom : http://localhost:8000 (si lancée)
Prochaines étapes recommandées
- Personnaliser les modèles avec tes propres Modelfiles
- Indexer ta codebase avec le RAG
- Créer des prompts spécialisés pour tes langages favoris
- Intégrer avec Git pour des commits auto-générés
- Automatiser les tests avec l'IA
Ressources
- Documentation Ollama : https://ollama.ai/docs
- Open WebUI : https://docs.openwebui.com
- Continue.dev : https://continue.dev/docs
- Modèles Ollama : https://ollama.ai/library
🎉 Félicitations ! Ton IA locale est prête.
Teste-la avec :
ollama run code-expert "Crée une API REST complète avec FastAPI pour gérer des tâches avec authentification JWT"