
---

## 🎯 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 t’offrent 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 l’appel à chaque LLM local via API Ollama.

---

## 📦 Organisation des fichiers Python

```bash
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 d’appel centralisé depuis Cursor
```

---

## 🧩 `ollama_interface.py` – Appels API Ollama centralisés

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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 l’agent 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.

---
