489 lines
13 KiB
Python
489 lines
13 KiB
Python
"""Documentation détaillée des schémas pour l'assistant IA."""
|
|
|
|
SCRAPER_SCHEMA_DOC = """
|
|
# Schéma Scraper Fluximmo
|
|
|
|
Tu dois générer un JSON valide pour configurer un scraper de recherche immobilière.
|
|
Le JSON doit respecter exactement la structure suivante.
|
|
|
|
## Structure principale
|
|
|
|
```json
|
|
{
|
|
"location": [...], // Obligatoire: liste des localisations
|
|
"type": [...], // Obligatoire: types de biens
|
|
"offer": [...], // Obligatoire: type d'offre
|
|
"meta": {...}, // Optionnel: filtres temporels
|
|
"price": {...}, // Optionnel: filtres de prix
|
|
"habitation": {...}, // Optionnel: caractéristiques du bien
|
|
"land": {...}, // Optionnel: caractéristiques du terrain
|
|
"adverts": [...], // Optionnel: filtres sur les annonces
|
|
"process": [...], // Optionnel: statut des annonces
|
|
"tags": [...] // Optionnel: tags personnalisés
|
|
}
|
|
```
|
|
|
|
## Champs détaillés
|
|
|
|
### location (OBLIGATOIRE)
|
|
Liste d'objets de localisation. UTILISE UNIQUEMENT les codes suivants:
|
|
|
|
1. **Pour une région/département entier**: utilise `department` avec le code département à 2 chiffres
|
|
- Bretagne: "22" (Côtes-d'Armor), "29" (Finistère), "35" (Ille-et-Vilaine), "56" (Morbihan)
|
|
- Autres exemples: "44" (Loire-Atlantique), "75" (Paris), "13" (Bouches-du-Rhône)
|
|
|
|
2. **Pour des communes spécifiques**: utilise `inseeCode` avec le code INSEE à 5 chiffres
|
|
- Exemples: "35238" (Rennes), "56260" (Vannes), "29019" (Brest), "22278" (Saint-Brieuc)
|
|
|
|
IMPORTANT: N'utilise JAMAIS de codes postaux ! Utilise uniquement `department` ou `inseeCode`.
|
|
|
|
Exemple pour toute la Bretagne:
|
|
```json
|
|
"location": [
|
|
{ "department": "22" },
|
|
{ "department": "29" },
|
|
{ "department": "35" },
|
|
{ "department": "56" }
|
|
]
|
|
```
|
|
|
|
Exemple pour des communes spécifiques:
|
|
```json
|
|
"location": [
|
|
{ "inseeCode": "35238" },
|
|
{ "inseeCode": "56260" }
|
|
]
|
|
```
|
|
|
|
### type (OBLIGATOIRE)
|
|
Liste des types de biens. Valeurs possibles:
|
|
- "CLASS_HOUSE" - Maison
|
|
- "CLASS_FLAT" - Appartement
|
|
- "CLASS_BUILDING" - Immeuble
|
|
- "CLASS_LAND" - Terrain
|
|
- "CLASS_PARKING" - Parking
|
|
- "CLASS_SHOP" - Commerce
|
|
- "CLASS_OFFICE" - Bureau
|
|
- "CLASS_PREMISES" - Local commercial
|
|
- "CLASS_PROGRAM" - Programme neuf
|
|
|
|
Exemple:
|
|
```json
|
|
"type": ["CLASS_HOUSE", "CLASS_FLAT"]
|
|
```
|
|
|
|
### offer (OBLIGATOIRE)
|
|
Liste d'objets d'offre. Chaque objet contient:
|
|
- `type`: string - Type de transaction:
|
|
- "OFFER_BUY" - Achat
|
|
- "OFFER_RENT" - Location
|
|
- "OFFER_LIFE_ANNUITY_SALE" - Viager
|
|
- "OFFER_BUSINESS_TAKE_OVER" - Reprise de commerce
|
|
- "OFFER_HOLIDAYS" - Location vacances
|
|
|
|
Exemple:
|
|
```json
|
|
"offer": [
|
|
{ "type": "OFFER_BUY" }
|
|
]
|
|
```
|
|
|
|
### meta (optionnel)
|
|
Filtres temporels sur les annonces:
|
|
- `firstSeenAt`: { "min": "date ISO", "max": "date ISO" } - Date de première apparition
|
|
- `lastSeenAt`: { "min": "date ISO", "max": "date ISO" } - Date de dernière vue
|
|
- `lastPublishedAt`: { "min": "date ISO", "max": "date ISO" } - Date de publication
|
|
- `isTotallyOffline`: boolean - Annonces retirées
|
|
|
|
### price (optionnel)
|
|
Filtres de prix:
|
|
- `latest.value`: { "min": number, "max": number } - Fourchette de prix en euros
|
|
- `latest.valuePerArea`: { "min": number, "max": number } - Prix au m²
|
|
- `isAuction`: boolean - Vente aux enchères
|
|
- `scope`: ["PRICING_ONE_OFF"] pour achat, ["PRICING_MENSUAL"] pour location
|
|
|
|
Exemple:
|
|
```json
|
|
"price": {
|
|
"latest": {
|
|
"value": { "min": 50000, "max": 200000 }
|
|
}
|
|
}
|
|
```
|
|
|
|
### habitation (optionnel)
|
|
Caractéristiques du bien:
|
|
- `roomCount`: { "min": number, "max": number } - Nombre de pièces
|
|
- `bedroomCount`: { "min": number, "max": number } - Nombre de chambres
|
|
- `bathroomCount`: { "min": number, "max": number } - Salles de bain
|
|
- `surface.total`: { "min": number, "max": number } - Surface totale m²
|
|
- `surface.livingSpace`: { "min": number, "max": number } - Surface habitable m²
|
|
- `characteristics`: objet avec booléens:
|
|
- `hasGarden`, `hasPool`, `hasGarage`, `hasParking`, `hasTerrace`, `hasBalcony`
|
|
- `hasCellar`, `hasLift`, `hasFireplace`, etc.
|
|
- `climate.epcEnergy`: Liste de classes DPE ["ENERGY_CLASSIFICATION_A", ..., "ENERGY_CLASSIFICATION_G"]
|
|
- `climate.epcClimate`: Liste de classes GES
|
|
|
|
Exemple:
|
|
```json
|
|
"habitation": {
|
|
"bedroomCount": { "min": 3 },
|
|
"surface": {
|
|
"total": { "min": 80, "max": 150 }
|
|
},
|
|
"characteristics": {
|
|
"hasGarden": true
|
|
}
|
|
}
|
|
```
|
|
|
|
### land (optionnel)
|
|
Pour les terrains:
|
|
- `surface`: { "min": number, "max": number } - Surface en m²
|
|
- `canConstruct`: boolean - Constructible
|
|
- `isServiced`: boolean - Viabilisé
|
|
- `type`: ["LAND_BUILDING_PLOT", "LAND_AGRICULTURAL", ...]
|
|
|
|
### adverts (optionnel)
|
|
Filtres sur les annonces:
|
|
- `isOnline`: boolean - Annonce en ligne
|
|
- `isPro`: boolean - Annonce professionnelle
|
|
- `isExclusive`: boolean - Exclusivité
|
|
|
|
Exemple:
|
|
```json
|
|
"adverts": [
|
|
{ "isOnline": true }
|
|
]
|
|
```
|
|
|
|
### process (optionnel)
|
|
Statut de l'annonce. Valeurs possibles:
|
|
- "PROCESS_AVAILABLE_ON_MARKET" - Disponible
|
|
- "PROCESS_UNDER_COMPROMISE" - Sous compromis
|
|
- "PROCESS_RENTED_SOLD" - Vendu/Loué
|
|
- "PROCESS_RESERVED" - Réservé
|
|
|
|
## VALEURS PAR DÉFAUT OBLIGATOIRES
|
|
|
|
IMPORTANT: Tous les scrapers générés DOIVENT inclure la section habitation.climate avec toutes les classes DPE et GES:
|
|
|
|
```json
|
|
"habitation": {
|
|
"climate": {
|
|
"epcClimate": [
|
|
"GREENHOUSE_CLASSIFICATION_A",
|
|
"GREENHOUSE_CLASSIFICATION_B",
|
|
"GREENHOUSE_CLASSIFICATION_C",
|
|
"GREENHOUSE_CLASSIFICATION_D",
|
|
"GREENHOUSE_CLASSIFICATION_E",
|
|
"GREENHOUSE_CLASSIFICATION_F",
|
|
"GREENHOUSE_CLASSIFICATION_G"
|
|
],
|
|
"epcEnergy": [
|
|
"ENERGY_CLASSIFICATION_A",
|
|
"ENERGY_CLASSIFICATION_B",
|
|
"ENERGY_CLASSIFICATION_C",
|
|
"ENERGY_CLASSIFICATION_D",
|
|
"ENERGY_CLASSIFICATION_E",
|
|
"ENERGY_CLASSIFICATION_F",
|
|
"ENERGY_CLASSIFICATION_G"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Exemples complets
|
|
|
|
### Maisons en Bretagne à acheter
|
|
```json
|
|
{
|
|
"location": [
|
|
{ "department": "22" },
|
|
{ "department": "29" },
|
|
{ "department": "35" },
|
|
{ "department": "56" }
|
|
],
|
|
"type": ["CLASS_HOUSE"],
|
|
"offer": [
|
|
{ "type": "OFFER_BUY" }
|
|
],
|
|
"habitation": {
|
|
"climate": {
|
|
"epcClimate": [
|
|
"GREENHOUSE_CLASSIFICATION_A",
|
|
"GREENHOUSE_CLASSIFICATION_B",
|
|
"GREENHOUSE_CLASSIFICATION_C",
|
|
"GREENHOUSE_CLASSIFICATION_D",
|
|
"GREENHOUSE_CLASSIFICATION_E",
|
|
"GREENHOUSE_CLASSIFICATION_F",
|
|
"GREENHOUSE_CLASSIFICATION_G"
|
|
],
|
|
"epcEnergy": [
|
|
"ENERGY_CLASSIFICATION_A",
|
|
"ENERGY_CLASSIFICATION_B",
|
|
"ENERGY_CLASSIFICATION_C",
|
|
"ENERGY_CLASSIFICATION_D",
|
|
"ENERGY_CLASSIFICATION_E",
|
|
"ENERGY_CLASSIFICATION_F",
|
|
"ENERGY_CLASSIFICATION_G"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Appartements à louer à Rennes avec 2+ chambres
|
|
```json
|
|
{
|
|
"location": [
|
|
{ "inseeCode": "35238" }
|
|
],
|
|
"type": ["CLASS_FLAT"],
|
|
"offer": [
|
|
{ "type": "OFFER_RENT" }
|
|
],
|
|
"habitation": {
|
|
"bedroomCount": { "min": 2 },
|
|
"climate": {
|
|
"epcClimate": [
|
|
"GREENHOUSE_CLASSIFICATION_A",
|
|
"GREENHOUSE_CLASSIFICATION_B",
|
|
"GREENHOUSE_CLASSIFICATION_C",
|
|
"GREENHOUSE_CLASSIFICATION_D",
|
|
"GREENHOUSE_CLASSIFICATION_E",
|
|
"GREENHOUSE_CLASSIFICATION_F",
|
|
"GREENHOUSE_CLASSIFICATION_G"
|
|
],
|
|
"epcEnergy": [
|
|
"ENERGY_CLASSIFICATION_A",
|
|
"ENERGY_CLASSIFICATION_B",
|
|
"ENERGY_CLASSIFICATION_C",
|
|
"ENERGY_CLASSIFICATION_D",
|
|
"ENERGY_CLASSIFICATION_E",
|
|
"ENERGY_CLASSIFICATION_F",
|
|
"ENERGY_CLASSIFICATION_G"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Immeubles de rapport en Bretagne
|
|
```json
|
|
{
|
|
"location": [
|
|
{ "department": "35" },
|
|
{ "department": "56" }
|
|
],
|
|
"type": ["CLASS_BUILDING"],
|
|
"offer": [
|
|
{ "type": "OFFER_BUY" }
|
|
],
|
|
"price": {
|
|
"latest": {
|
|
"value": { "max": 500000 }
|
|
}
|
|
},
|
|
"habitation": {
|
|
"climate": {
|
|
"epcClimate": [
|
|
"GREENHOUSE_CLASSIFICATION_A",
|
|
"GREENHOUSE_CLASSIFICATION_B",
|
|
"GREENHOUSE_CLASSIFICATION_C",
|
|
"GREENHOUSE_CLASSIFICATION_D",
|
|
"GREENHOUSE_CLASSIFICATION_E",
|
|
"GREENHOUSE_CLASSIFICATION_F",
|
|
"GREENHOUSE_CLASSIFICATION_G"
|
|
],
|
|
"epcEnergy": [
|
|
"ENERGY_CLASSIFICATION_A",
|
|
"ENERGY_CLASSIFICATION_B",
|
|
"ENERGY_CLASSIFICATION_C",
|
|
"ENERGY_CLASSIFICATION_D",
|
|
"ENERGY_CLASSIFICATION_E",
|
|
"ENERGY_CLASSIFICATION_F",
|
|
"ENERGY_CLASSIFICATION_G"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
IMPORTANT: Réponds UNIQUEMENT avec le JSON, sans texte avant ou après. Le JSON doit être valide et parsable. N'oublie JAMAIS d'inclure la section habitation.climate avec toutes les classes DPE et GES!
|
|
"""
|
|
|
|
PROFILE_SCHEMA_DOC = """
|
|
# Schéma Profile d'Investissement
|
|
|
|
Tu dois générer un JSON valide pour configurer un profil d'investissement immobilier.
|
|
Le JSON doit respecter exactement la structure suivante.
|
|
|
|
## Structure principale
|
|
|
|
```json
|
|
{
|
|
"transaction_type": "sale", // Type de transaction
|
|
"property_type": [...], // Types de biens
|
|
"codes_insee": [...], // Codes INSEE des communes
|
|
"min_price": number, // Prix minimum
|
|
"max_price": number, // Prix maximum
|
|
"min_size": number, // Surface minimale m²
|
|
"max_size": number, // Surface maximale m²
|
|
"min_bedrooms": number, // Chambres minimum
|
|
"max_bedrooms": number, // Chambres maximum
|
|
"dpe_classes": [...], // Classes DPE acceptées
|
|
"ges_classes": [...], // Classes GES acceptées
|
|
"characteristics": [...], // Caractéristiques requises
|
|
"target_yield": number, // Rendement cible %
|
|
"require_address": boolean // Adresse requise
|
|
}
|
|
```
|
|
|
|
## Champs détaillés
|
|
|
|
### transaction_type
|
|
Type de transaction:
|
|
- "sale" - Achat/Vente
|
|
- "rent" - Location
|
|
- "viager" - Viager
|
|
|
|
### property_type
|
|
Liste des types de biens recherchés:
|
|
- "house" - Maison
|
|
- "apartment" - Appartement
|
|
- "building" - Immeuble
|
|
- "land" - Terrain
|
|
- "parking" - Parking
|
|
|
|
Exemple:
|
|
```json
|
|
"property_type": ["house", "apartment"]
|
|
```
|
|
|
|
### codes_insee
|
|
Liste des codes de localisation. UTILISE UNIQUEMENT:
|
|
- **Codes département** (2 chiffres) pour une région entière: "22", "29", "35", "56"
|
|
- **Codes INSEE** (5 chiffres) pour des communes spécifiques: "35238", "56260"
|
|
|
|
IMPORTANT: N'utilise JAMAIS de codes postaux !
|
|
|
|
Exemple pour toute la Bretagne:
|
|
```json
|
|
"codes_insee": ["22", "29", "35", "56"]
|
|
```
|
|
|
|
Exemple pour des communes spécifiques:
|
|
```json
|
|
"codes_insee": ["35238", "56260", "22168", "29039"]
|
|
```
|
|
|
|
### Filtres de prix
|
|
- `min_price`: number - Prix minimum en euros
|
|
- `max_price`: number - Prix maximum en euros
|
|
|
|
### Filtres de surface
|
|
- `min_size`: number - Surface minimale en m²
|
|
- `max_size`: number - Surface maximale en m²
|
|
|
|
### Filtres de chambres
|
|
- `min_bedrooms`: number - Nombre minimum de chambres
|
|
- `max_bedrooms`: number - Nombre maximum de chambres
|
|
- `min_bathrooms`: number - Nombre minimum de salles de bain
|
|
|
|
### dpe_classes / ges_classes
|
|
Classes énergétiques acceptées: ["A", "B", "C", "D", "E", "F", "G", "NC"]
|
|
|
|
Exemple:
|
|
```json
|
|
"dpe_classes": ["A", "B", "C", "D"]
|
|
```
|
|
|
|
### characteristics
|
|
Liste de groupes de caractéristiques. Chaque groupe:
|
|
```json
|
|
{
|
|
"type": "any" | "all" | "none",
|
|
"description": "Description du groupe",
|
|
"items": ["has_garden", "has_pool", ...]
|
|
}
|
|
```
|
|
|
|
Caractéristiques disponibles:
|
|
- has_alarm, has_balcony, has_cellar, has_lift, has_pool
|
|
- has_garage, has_garden, has_terrace, has_parking, has_fireplace
|
|
- has_mezzanine, has_concierge, has_digicode, has_interphone
|
|
- has_jacuzzi, has_land, has_land_division, has_grenier
|
|
- has_vis_a_vis, is_peaceful, has_two_doors_at_entrance, is_squatted
|
|
|
|
Exemple:
|
|
```json
|
|
"characteristics": [
|
|
{
|
|
"type": "any",
|
|
"items": ["has_garden", "has_terrace"]
|
|
}
|
|
]
|
|
```
|
|
|
|
### target_yield
|
|
Rendement locatif cible en pourcentage (ex: 7.5 pour 7.5%)
|
|
|
|
### require_address
|
|
Boolean - Exiger une adresse complète pour les biens
|
|
|
|
## Exemples complets
|
|
|
|
### Maisons en Bretagne à acheter (toute la région)
|
|
```json
|
|
{
|
|
"transaction_type": "sale",
|
|
"property_type": ["house"],
|
|
"codes_insee": ["22", "29", "35", "56"],
|
|
"max_price": 200000
|
|
}
|
|
```
|
|
|
|
### Appartements pour investissement locatif à Rennes
|
|
```json
|
|
{
|
|
"transaction_type": "sale",
|
|
"property_type": ["apartment"],
|
|
"codes_insee": ["35238"],
|
|
"min_size": 40,
|
|
"max_size": 80,
|
|
"min_bedrooms": 2,
|
|
"target_yield": 6,
|
|
"dpe_classes": ["A", "B", "C", "D"]
|
|
}
|
|
```
|
|
|
|
### Immeubles de rapport en Ille-et-Vilaine et Morbihan
|
|
```json
|
|
{
|
|
"transaction_type": "sale",
|
|
"property_type": ["building"],
|
|
"codes_insee": ["35", "56"],
|
|
"max_price": 500000,
|
|
"target_yield": 8
|
|
}
|
|
```
|
|
|
|
### Maisons avec terrain divisible en Bretagne
|
|
```json
|
|
{
|
|
"transaction_type": "sale",
|
|
"property_type": ["house"],
|
|
"codes_insee": ["22", "29", "35", "56"],
|
|
"characteristics": [
|
|
{
|
|
"type": "all",
|
|
"items": ["has_land_division"]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
IMPORTANT: Réponds UNIQUEMENT avec le JSON, sans texte avant ou après. Le JSON doit être valide et parsable. N'utilise JAMAIS de codes postaux, uniquement des codes département (2 chiffres) ou INSEE (5 chiffres)!
|
|
"""
|