11 KiB
Intégration de LLM Lab avec Cursor
Ce guide détaille comment intégrer et utiliser LLM Lab spécifiquement avec l'éditeur de code Cursor.
Qu'est-ce que Cursor ?
Cursor est un éditeur de code moderne basé sur VS Code, enrichi par des capacités d'IA pour améliorer le développement. Par défaut, Cursor utilise des modèles cloud (comme Claude ou GPT-4), mais vous pouvez le configurer pour utiliser LLM Lab et ses modèles locaux via Ollama.
Avantages de l'intégration
- Confidentialité : Votre code reste local, sans être envoyé à des serveurs externes
- Personnalisation : Contrôle total sur les modèles et leurs paramètres
- Performance : Exploitation directe de votre GPU local
- Coût : Aucun frais d'API ou d'abonnement
Options d'intégration
1. Agent en ligne de commande + Copier-coller
La méthode la plus simple pour commencer :
-
Ouvrir deux fenêtres :
- Cursor pour le développement
- Terminal pour LLM Lab
-
Lancer l'agent Cursor :
# Windows run.bat chat cursor # Linux ./run.sh chat cursor -
Workflow :
- Copiez le code ou la question depuis Cursor
- Collez dans le terminal LLM Lab
- Copiez la réponse générée
- Collez dans Cursor
2. Serveur API local pour Cursor
Pour une expérience plus intégrée, configurez un serveur API local :
- Créer un fichier
api_server.pydans le dossier racine de LLM Lab :
#!/usr/bin/env python3
"""
Serveur API pour intégrer LLM Lab avec Cursor
"""
from flask import Flask, request, jsonify, Response
from flask_cors import CORS
import json
import os
from utils.agent_manager import AgentManager
import logging
# Configuration du logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("logs/api_server.log"),
logging.StreamHandler()
]
)
logger = logging.getLogger("api_server")
# Initialisation de l'application Flask
app = Flask(__name__)
CORS(app) # Permet les requêtes cross-origin
@app.route('/v1/chat/completions', methods=['POST'])
def chat_completion():
"""
Endpoint compatible avec l'API OpenAI Chat pour Cursor
"""
try:
data = request.json
logger.info(f"Requête reçue: {json.dumps(data)}")
# Extraire les messages et les paramètres
messages = data.get('messages', [])
model = data.get('model', 'codellama:13b-python')
temperature = data.get('temperature', 0.7)
# Construire le prompt à partir des messages
system_message = next((msg['content'] for msg in messages if msg['role'] == 'system'), None)
user_messages = [msg['content'] for msg in messages if msg['role'] == 'user']
# Utiliser le dernier message utilisateur comme prompt
prompt = user_messages[-1] if user_messages else ""
# Détecter le type de tâche pour choisir l'agent approprié
agent_name = "cursor" # Par défaut
if "javascript" in prompt.lower() or "js" in prompt.lower():
agent_name = "webdev"
elif "python" in prompt.lower():
agent_name = "python"
# Créer et configurer l'agent
agent = AgentManager.create(agent_name)
# Remplacer le system prompt si fourni
if system_message:
agent.system_prompt = system_message
# Ajuster les paramètres
agent.params["temperature"] = temperature
# Générer la réponse
response = agent.generate(prompt)
logger.info(f"Réponse générée pour l'agent {agent_name}")
# Formatage compatible avec l'API OpenAI
return jsonify({
"id": f"llmlab-{agent_name}-{hash(prompt) % 10000}",
"object": "chat.completion",
"created": int(__import__('time').time()),
"model": agent.model,
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": response
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": len(prompt.split()),
"completion_tokens": len(response.split()),
"total_tokens": len(prompt.split()) + len(response.split())
}
})
except Exception as e:
logger.error(f"Erreur: {str(e)}", exc_info=True)
return jsonify({
"error": {
"message": str(e),
"type": "server_error",
"code": 500
}
}), 500
@app.route('/models', methods=['GET'])
def list_models():
"""
Liste les modèles disponibles
"""
agents = AgentManager.list_agents()
models = []
for agent_name, info in agents.items():
models.append({
"id": info['model'],
"object": "model",
"owned_by": "llmlab",
"permission": [{"id": agent_name, "object": "model_permission"}]
})
return jsonify({
"object": "list",
"data": models
})
if __name__ == '__main__':
# Créer le dossier logs s'il n'existe pas
os.makedirs("logs", exist_ok=True)
print("=== Serveur API LLM Lab pour Cursor ===")
print("Serveur démarré sur http://localhost:8000")
print("Utilisez cette URL dans les paramètres API de Cursor")
print("Modèles disponibles:")
for agent in AgentManager.list_agents():
print(f"- {agent}")
print("\nLog des requêtes dans logs/api_server.log")
print("Appuyez sur Ctrl+C pour arrêter le serveur")
app.run(host='0.0.0.0', port=8000, debug=False)
-
Ajouter les dépendances Flask : Modifiez
requirements.txtpour ajouter :flask>=2.0.0 flask-cors>=3.0.10 -
Mettre à jour
run.batpour inclure la commande API :) else if "%1"=="api" ( python api_server.py -
Lancer le serveur API :
# Windows run.bat api # Linux ./run.sh api -
Configurer Cursor :
- Ouvrez Cursor
- Allez dans Paramètres > AI
- Sélectionnez "Custom endpoint"
- Entrez l'URL :
http://localhost:8000/v1 - Activez l'option "Use custom endpoint for all AI features"
3. Extension Cursor (Avancé)
Pour les développeurs avancés, vous pouvez créer une extension Cursor dédiée :
-
Initialiser un projet d'extension :
mkdir cursor-llmlab-extension cd cursor-llmlab-extension npm init -
Créer la structure du projet conformément à la documentation de Cursor
-
Implémenter l'intégration avec LLM Lab via l'API locale
Conseils d'utilisation
Commandes utiles dans Cursor
Ctrl+I: Invoquer l'IA pour une requêteCtrl+L: Chat avec l'IA/edit: Demander une édition de code/doc: Générer de la documentation/test: Générer des tests unitaires
Invites (prompts) efficaces pour CodeLlama
- Être spécifique : "Refactor cette fonction pour utiliser des list comprehensions au lieu des boucles for"
- Fournir le contexte : "J'utilise Flask avec SQLAlchemy dans une application REST"
- Demander des explications : "Explique comment ce code fonctionne ligne par ligne"
- Indiquer les contraintes : "Utilise uniquement des bibliothèques standard, sans dépendances externes"
Exemples pratiques
1. Complétion de fonction
Prompt : "Complète cette fonction qui doit convertir des dates au format ISO en timestamp Unix"
def iso_to_timestamp(iso_date):
# À compléter
pass
2. Débogage
Prompt : "Ce code lève une IndexError. Identifie le problème et propose une correction"
3. Refactoring
Prompt : "Refactorise ce code pour améliorer sa lisibilité et ses performances"
Développement avancé
Personnaliser l'agent Cursor
Vous pouvez personnaliser l'agent Cursor dans agents/roles.py :
"cursor": {
"model": "codellama:13b-python",
"description": "Agent de programmation optimisé pour Cursor",
"system_prompt": (
"Tu es un expert en programmation spécialisé dans l'écriture et la révision de code. "
"Pour répondre à des questions de programmation, tu dois : "
"1. Fournir du code complet, fonctionnel et bien structuré "
"2. Suivre les meilleures pratiques du langage demandé "
"3. Privilégier la lisibilité et la maintenabilité "
"4. Expliquer brièvement les concepts importants "
"Quand on te demande de déboguer, d'améliorer ou de refactoriser du code, "
"tu dois analyser en détail le code fourni et proposer des solutions concrètes. "
"Tes réponses doivent être précises et contenir du code prêt à l'emploi."
),
"params": {
"temperature": 0.2, # Valeur basse pour du code précis
"top_p": 0.95,
"num_ctx": 4096
}
}
Créer des agents spécialisés
Vous pouvez créer des agents spécialisés pour différents langages ou tâches :
"python": {
"model": "codellama:13b-python",
"description": "Expert Python pour le développement et la résolution de problèmes",
"system_prompt": (
"Tu es un expert Python avec une connaissance approfondie de l'écosystème Python, "
"des bibliothèques standard et des frameworks populaires comme Django, Flask, "
"Pandas, NumPy et TensorFlow. Ton objectif est d'aider à écrire du code Python "
"élégant, performant et idiomatique, en suivant les principes PEP 8 et les "
"bonnes pratiques Python. Tu dois favoriser les approches pythoniques comme "
"les compréhensions de liste, les générateurs et les fonctions de haut niveau."
),
"params": {
"temperature": 0.2,
"top_p": 0.95,
"num_ctx": 4096
}
}
Dépannage
Problèmes courants
-
Erreur de connexion à l'API :
- Vérifiez que le serveur API est bien en cours d'exécution
- Confirmez que l'URL dans Cursor est correcte (http://localhost:8000/v1)
- Vérifiez les logs dans
logs/api_server.log
-
Réponses trop lentes :
- Optimisez les paramètres d'Ollama avec
optimize_ollama.bat - Réduisez la taille du contexte ou utilisez un modèle plus petit
- Optimisez les paramètres d'Ollama avec
-
Qualité de code insuffisante :
- Ajustez la température (valeurs plus basses pour plus de précision)
- Améliorez le prompt système de l'agent
- Essayez un modèle plus performant (comme Mixtral ou Llama3)
Support
Pour obtenir de l'aide supplémentaire :
- Consultez les logs dans le dossier
logs/ - Vérifiez les issues connues sur le dépôt GitHub du projet
- Posez vos questions sur le forum de la communauté