Skip to content
Open

Dev #23

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
137 changes: 137 additions & 0 deletions QUICKSTART.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# 🚀 Guide de démarrage - immo-agent

## Installation rapide

```bash
# 1. Cloner et entrer dans le projet
git clone https://github.com/Arno37/immo-agent.git
cd immo-agent

# 2. Configurer l'environnement
cp .env.example .env
# Éditer .env avec ta clé MISTRAL_API_KEY

# 3. Installer les dépendances
pip install -r requirements.txt
# ou pour dev : pip install -e ".[dev]"
```

## 🎯 Utiliser le projet

### Option 1️⃣ : API Web (Recommandé)
```bash
python scripts/run_api.py
```
Puis ouvrez : **http://127.0.0.1:8000**

### Option 2️⃣ : CLI interactive
```bash
python scripts/run_cli.py
```

### Option 3️⃣ : Importer comme module Python
```python
from immo_agent.runIA import outil_dvf_estimation

# Estimer un bien
estimation = outil_dvf_estimation(
ville="Paris",
surface="120",
type_bien="Maison",
etat="bon"
)
print(estimation)
```

## 📁 Architecture du projet

**Voir [STRUCTURE.md](STRUCTURE.md)** pour la description complète

Dossiers clés :
- 📦 **immo_agent/** → Code source (développeurs)
- 🎯 **scripts/** → Points d'entrée (utilisateurs)
- 🎨 **frontend/** → Interface web
- 📊 **data/** → Bases de données
- 🧪 **tests/** → Tests unitaires

## ⚙️ Configuration

Les paramètres se trouvent dans 2 fichiers :

1. **`.env`** (secrets)
```
MISTRAL_API_KEY=sk_...
GROQ_API_KEY=gsk_...
```

2. **`config/settings.py`** (paramètres publics)
```python
DB_PATH = "data/immo_ventes.db"
API_PORT = 8000
DEFAULT_MODEL = "mistral-large-latest"
```

## ✅ Vérifier l'installation

```bash
python immo_agent/check_setup.py
```

## 🧪 Lancer les tests

```bash
pytest tests/
# ou avec couverture : pytest --cov=immo_agent tests/
```

## 📚 Documentation

- [STRUCTURE.md](STRUCTURE.md) - Organisation du projet
- [README.md](README.md) - Description générale
- [documentation/](documentation/) - Spécifications détaillées

## 🐛 Troubleshooting

| Problème | Solution |
|----------|----------|
| `ModuleNotFoundError: immo_agent` | Installer avec `pip install -e .` |
| Port 8000 occupé | `python scripts/run_api.py --port 8001` |
| Clé API manquante | Créer `.env` avec `MISTRAL_API_KEY=...` |
| BD non trouvée | Lancer `python immo_agent/csv_to_sqlite.py` |

## 💡 Développement

```bash
# Format le code
black immo_agent/

# Vérifier les types
mypy immo_agent/

# Lint
flake8 immo_agent/

# Développement en mode auto-reload
python scripts/run_api.py # reload=True par défaut
```

## 📦 Structure recommandée pour ajouter du code

```python
# immo_agent/features/ma_feature.py
from immo_agent.runIA import model
from config import DB_PATH

def ma_fonction():
"""Ma nouvelle fonction bien organisée."""
pass
```

Puis importer :
```python
from immo_agent.features import ma_fonction
```

---

**Besoin d'aide ?** Consultez [STRUCTURE.md](STRUCTURE.md) ou les docstrings du code.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,10 @@ L'agent support les demandes comme :

```
immo-agent/
├── runIA.py # Définition des outils IA (DVF, estimations)
├── api.py # API FastAPI web
├── main.py # CLI chat (WIP - dépendances manquantes)
├── immo_agent/ # code Python principal (package)
│ ├── runIA.py # Définition des outils IA (DVF, estimations)
│ ├── api.py # API FastAPI web
│ ├── main.py # CLI chat (WIP - dépendances manquantes)
├── frontend/ # Interface web React
├── data/
│ └── immo_ventes.db # Base de données SQLite
Expand Down
100 changes: 100 additions & 0 deletions STRUCTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# 📁 Structure du projet immo-agent

```
immo-agent/
├── immo_agent/ 📦 Package principal (code source)
│ ├── __init__.py
│ ├── runIA.py 🔧 Définition des outils IA & LLM
│ ├── api.py 🌐 API FastAPI
│ ├── main.py 💬 CLI interactive
│ ├── agent_memory.py 🧠 Gestion de la mémoire (langgraph)
│ ├── api_auth.py 🔐 Authentification
│ ├── db_session.py 💾 Gestion sessions BD
│ ├── check_setup.py ✅ Vérification configuration
│ ├── csv_to_sqlite.py 📊 Import données CSV
│ ├── init_and_run.py 🚀 Initialisation
│ ├── test_mcp.py 🧪 Tests MCP
│ └── weather_mcp.py 🌤️ MCP serveur météo
├── scripts/ 🎯 Points d'entrée
│ ├── run_api.py → python scripts/run_api.py
│ └── run_cli.py → python scripts/run_cli.py
├── frontend/ 🎨 Interface web
│ ├── index.html
│ ├── script.js
│ ├── style.css
│ └── auth.js
├── data/ 📊 Données
│ ├── immo_ventes.db (SQLite - DVF data)
│ ├── memory.db (historique conversations)
│ ├── auth_system.db
│ └── ValeursFoncieres-2025-S1.csv
├── documentation/ 📚 Documentation
│ ├── benchmark projIA.md
│ └── note-cadrage projIA.md
├── exploration/ 🔍 Scripts d'exploration
│ ├── expl_mcp.py
│ ├── expl_mcp2.py
│ ├── expl_mcp_full.py
│ ├── explograph.py
│ ├── explograph2.py
│ └── explotools.py
├── tests/ 🧪 Tests unitaires
│ └── __init__.py
├── config/ ⚙️ Configuration
│ └── settings.py (paramètres globaux)
├── .env.example (À copier en .env)
├── .gitignore
├── README.md (guide utilisateur)
├── pyproject.toml (configuration build/dependencies)
└── requirements.txt (dépendances pip)
```

## 🚀 Comment utiliser

### Via API Web
```bash
python scripts/run_api.py
# → http://127.0.0.1:8000
```

### Via CLI
```bash
python scripts/run_cli.py
```

### Importer le package
```python
from immo_agent.runIA import outil_dvf_historique, outil_dvf_estimation
from immo_agent.api import app
from immo_agent.main import chat_loop
```

## 📋 Organisation par rôle

| Dossier | Usage | Qui ? |
|---------|-------|-------|
| `immo_agent/` | Code métier | Développeurs |
| `scripts/` | Lancer l'app | Utilisateurs finaux |
| `frontend/` | Interface | Frontend dev |
| `data/` | BD, données | Données scientifique |
| `tests/` | Validation | QA / CI-CD |
| `config/` | Paramètres | DevOps / Config |
| `documentation/` | Spécs | Analystes |
| `exploration/` | Prototypage | Recherche |

## ✨ Avantages de cette structure

✅ **Clair** : chaque dossier a un rôle distinct
✅ **Scalable** : facile d'ajouter des modules
✅ **Professionnel** : suit les conventions Python
✅ **Maintenable** : organisation logique
✅ **Extensible** : prêt pour CI/CD et tests
51 changes: 51 additions & 0 deletions add_gps_columns.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
"""Script pour ajouter les colonnes latitude et longitude à la BD."""

import sqlite3
import os

db_path = "data/immo_ventes.db"

if not os.path.exists(db_path):
print(f"❌ BD non trouvée: {db_path}")
exit(1)

try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()

# Récupérer le schéma actuel
cursor.execute("PRAGMA table_info(transactions)")
colonnes = [col[1] for col in cursor.fetchall()]

print(f"📊 Colonnes existantes: {colonnes}\n")

# Ajouter latitude si elle n'existe pas
if "latitude" not in colonnes:
print("➕ Ajout colonne: latitude")
cursor.execute("ALTER TABLE transactions ADD COLUMN latitude FLOAT")
print("✅ Colonne latitude ajoutée")
else:
print("✓ Colonne latitude existe déjà")

# Ajouter longitude si elle n'existe pas
if "longitude" not in colonnes:
print("➕ Ajout colonne: longitude")
cursor.execute("ALTER TABLE transactions ADD COLUMN longitude FLOAT")
print("✅ Colonne longitude ajoutée")
else:
print("✓ Colonne longitude existe déjà")

conn.commit()
conn.close()

print("\n✅ BD mise à jour avec succès !")

except sqlite3.OperationalError as e:
print(f"❌ Erreur: {e}")
print(" → La table 'transactions' n'existe peut-être pas")
print(" → Vérifiez le nom exact de votre table dans la BD")
exit(1)
except Exception as e:
print(f"❌ Erreur: {e}")
exit(1)
6 changes: 3 additions & 3 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

app.include_router(IA_chat.router)

app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
app.mount("/static", StaticFiles(directory="frontend"), name="static")
templates = Jinja2Templates(directory="frontend")

@app.get("/", response_class=HTMLResponse)
def read_root(request: Request):
return templates.TemplateResponse("chat.html", {"request": request})
return templates.TemplateResponse("index.html", {"request": request})
30 changes: 23 additions & 7 deletions app/routers/IA_chat.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, JSONResponse

from pydantic import BaseModel
from app.services.agent import async_run_agent

router = APIRouter()

@router.get("/chat", response_class=HTMLResponse)
def chat_page(request: Request):
return JSONResponse({"message": "Bienvenue sur la page de chat!"})
class ChatRequest(BaseModel):
message: str

@router.post("/chat")
def chat_post(request: Request):
# Ici, tu peux traiter le message utilisateur
return JSONResponse({"message": "Message reçu!"})
@router.post("/api/chat")
async def chat_post(req: ChatRequest):
try:
# Appel à la fonction run_agent asynchrone
# On utilise une session ("default") pour l'instant
result = await async_run_agent(req.message, "default_session")

# Le retour est généralement un dict avec une clé "messages" (langgraph)
reply_content = ""
if result and "messages" in result and len(result["messages"]) > 0:
last_msg = result["messages"][-1]
reply_content = last_msg.content if hasattr(last_msg, 'content') else str(last_msg)
else:
reply_content = str(result)

return {"reply": reply_content}
except Exception as e:
return {"reply": f"⚠️ Erreur côté serveur: {str(e)}"}
Loading