mirror of
https://github.com/Ladebeze66/llm_lab_perso.git
synced 2025-12-16 00:16:50 +01:00
343 lines
11 KiB
Markdown
343 lines
11 KiB
Markdown
# 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](https://cursor.sh/).
|
|
|
|
## 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 :
|
|
|
|
1. **Ouvrir deux fenêtres** :
|
|
- Cursor pour le développement
|
|
- Terminal pour LLM Lab
|
|
|
|
2. **Lancer l'agent Cursor** :
|
|
```cmd
|
|
# Windows
|
|
run.bat chat cursor
|
|
|
|
# Linux
|
|
./run.sh chat cursor
|
|
```
|
|
|
|
3. **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 :
|
|
|
|
1. **Créer un fichier `api_server.py`** dans le dossier racine de LLM Lab :
|
|
|
|
```python
|
|
#!/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)
|
|
```
|
|
|
|
2. **Ajouter les dépendances Flask** :
|
|
Modifiez `requirements.txt` pour ajouter :
|
|
```
|
|
flask>=2.0.0
|
|
flask-cors>=3.0.10
|
|
```
|
|
|
|
3. **Mettre à jour `run.bat`** pour inclure la commande API :
|
|
```batch
|
|
) else if "%1"=="api" (
|
|
python api_server.py
|
|
```
|
|
|
|
4. **Lancer le serveur API** :
|
|
```cmd
|
|
# Windows
|
|
run.bat api
|
|
|
|
# Linux
|
|
./run.sh api
|
|
```
|
|
|
|
5. **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 :
|
|
|
|
1. **Initialiser un projet d'extension** :
|
|
```cmd
|
|
mkdir cursor-llmlab-extension
|
|
cd cursor-llmlab-extension
|
|
npm init
|
|
```
|
|
|
|
2. **Créer la structure du projet** conformément à la documentation de Cursor
|
|
|
|
3. **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ête
|
|
- `Ctrl+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"
|
|
|
|
```python
|
|
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` :
|
|
|
|
```python
|
|
"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
|
|
"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
|
|
|
|
1. **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`
|
|
|
|
2. **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
|
|
|
|
3. **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é |