coffreobsidian/Serveur perso/Création de classes agents pour LLM locaux avec Cursor et Ollama.md
2025-03-24 22:19:57 +01:00

4.2 KiB
Raw Blame History


🎯 Objectif du document

Mettre en place une architecture de classes Python orientées agent pour exploiter tes modèles locaux avec Ollama, accessibles facilement depuis Cursor, tout en permettant :

  • Une configuration précise des modèles (température, top-k, top-p, prompt system).
  • Une gestion unifiée des LLM installés sur plusieurs machines.
  • Une structure extensible pour ajouter ou spécialiser des agents par tâche.

🧠 Vision : Agents = Interfaces contrôlées sur tes LLM

n8n + MCP toffrent une vision visuelle et événementielle des agents, mais en Python tu peux :

  • Instancier des "agents" comme classes Python.
  • Utiliser des paramètres dynamiques, prompts, fonctions de routage.
  • Contrôler finement lappel à chaque LLM local via API Ollama.

📦 Organisation des fichiers Python

llm_agents/
├── base_agent.py          # Classe de base commune à tous les agents
├── ollama_interface.py   # Interface API Ollama
├── agent_mistral.py      # Agent général Mistral
├── agent_code.py         # Agent codellama spécialisé
├── agent_docs.py         # Agent lecture & synthèse de documents
└── main.py               # Exemple dappel centralisé depuis Cursor

🧩 ollama_interface.py Appels API Ollama centralisés

import requests

class OllamaInterface:
    def __init__(self, model="mistral", temperature=0.7, top_k=40, top_p=0.9):
        self.model = model
        self.temperature = temperature
        self.top_k = top_k
        self.top_p = top_p
        self.api_url = f"http://localhost:11434/api/generate"

    def generate(self, prompt):
        payload = {
            "model": self.model,
            "prompt": prompt,
            "temperature": self.temperature,
            "top_k": self.top_k,
            "top_p": self.top_p
        }
        response = requests.post(self.api_url, json=payload)
        return response.json().get("response", "")

🧬 base_agent.py Classe de base

from ollama_interface import OllamaInterface

class BaseAgent:
    def __init__(self, name, model="mistral", **kwargs):
        self.name = name
        self.llm = OllamaInterface(model=model, **kwargs)

    def respond(self, prompt):
        raise NotImplementedError("Chaque agent doit définir sa méthode respond.")

🤖 agent_mistral.py Agent généraliste

from base_agent import BaseAgent

class MistralAgent(BaseAgent):
    def respond(self, prompt):
        system_prompt = "Tu es un assistant personnel expert et structuré."
        full_prompt = f"{system_prompt}\n\n{prompt}"
        return self.llm.generate(full_prompt)

💻 agent_code.py Agent spécialisé codellama

from base_agent import BaseAgent

class CodeAgent(BaseAgent):
    def respond(self, prompt):
        full_prompt = f"Tu es un assistant Python. Corrige, commente ou optimise ce code :\n{prompt}"
        return self.llm.generate(full_prompt)

📚 agent_docs.py Agent pour résumer ou structurer des documents

from base_agent import BaseAgent

class DocAgent(BaseAgent):
    def respond(self, content):
        full_prompt = f"Voici un document brut, résume-le de manière claire et concise :\n{content}"
        return self.llm.generate(full_prompt)

🚀 main.py Exemple d'utilisation dans Cursor

from agent_code import CodeAgent
from agent_mistral import MistralAgent

code_agent = CodeAgent(name="CodeLLM", model="codellama")
mistral_agent = MistralAgent(name="Assistant")

print(mistral_agent.respond("Organise-moi un plan de projet pour une API REST en FastAPI."))
print(code_agent.respond("def addition(a, b): return a + b"))

🧩 Extensions possibles

  • Ajouter un système de profil JSON par agent.
  • Intégrer la gestion via n8n (webhook qui déclenche un agent).
  • Exécuter lagent depuis une interface Streamlit locale ou TUI.
  • Ajout futur : classe MultiAgentRouter qui oriente la requête selon le besoin (code, doc, discussion).

Avantages

  • Contrôle total sur les modèles.
  • Usage rapide dans Cursor.
  • Base solide pour agents orchestrables.