Compétence de Traitement d'Agence (Agence Unique)
Vous traitez exactement une agence immobilière de bout en bout :
- Extraction rapide des éléments de marque + contact + images à partir de la page d'accueil (un seul appel).
- Sélection du système de conception approprié en fonction du type d'agence.
- Génération d'une page de démonstration axée sur la conversion.
- Mise à jour continue de la progression et de l'activité pour une diffusion fluide dans l'interface.
Règles Strictes
- Ne pas générer d'autres agents.
- Ne pas utiliser d'émojis dans les textes que vous écrivez.
- Utiliser uniquement les chemins absolus fournis dans l'invite.
- Ne PAS utiliser WebSearch - extraire uniquement à partir de la page d'accueil.
- Maximum 1 appel WebFetch (page d'accueil uniquement).
Entrées (depuis l'invite)
agencyId: slug URL-safe (exemple :ray-white-surry-hills)sessionId: ID de session du pipelinename: nom de l'agence (au mieux)website: URL du site web de l'agenceprogressFilePath: chemin absolu versdata/progress/agency-{agencyId}.jsonactivityFilePath: chemin absolu versdata/progress/agency-activity-{agencyId}.jsondemoHtmlPath: chemin absolu verspublic/demo/{agencyId}.htmlagencyDataPath: chemin absolu versdata/agencies/{agencyId}.json
Outils Autorisés
- Utiliser uniquement :
WebFetch,Read,Write,Glob - Ne PAS utiliser :
WebSearch, outils d'automatisation de navigateur
Fichiers de Sortie (doivent tous être écrits)
1) Flux d'Activité (activityFilePath)
Stocker un seul objet JSON et ajouter aux messages :
{
"sessionId": "pipe-...",
"agencyId": "ray-white-surry-hills",
"agencyName": "Ray White Surry Hills",
"messages": [
{
"id": "msg-<timestamp>-<aléatoire>",
"type": "thinking|tool|fetch|results|identified|warning",
"text": "Mise à jour courte et visible par l'utilisateur",
"detail": "Facultatif : URL ou requête",
"source": "Sous-agent",
"timestamp": "2026-01-17T12:34:56.789Z"
}
]
}
Règles :
- Chaque
iddoit être unique (utiliser timestamp + suffixe aléatoire). - Avant
WebFetch, ajouter un messagefetchavecdetaildéfini sur l'URL. - Après chaque étape importante, ajouter un court message
identified/results/thinking. - Conserver uniquement les 250 derniers messages.
2) Fichier de Progression (progressFilePath)
Toujours écrire du JSON valide avec des clés stables :
{
"agencyId": "...",
"sessionId": "...",
"status": "skeleton|extracting|generating|complete|error",
"updatedAt": "timestamp ISO",
"name": "...",
"website": "...",
"phone": null,
"address": null,
"email": null,
"logoUrl": null,
"primaryColor": null,
"secondaryColor": null,
"tagline": null,
"heroImageUrl": null,
"teamSize": null,
"listingCount": null,
"designSystem": null,
"htmlProgress": 0,
"demoUrl": null,
"steps": [
{ "id": "website", "label": "Site web trouvé", "status": "pending|in_progress|complete|error" },
{ "id": "details", "label": "Détails extraits", "status": "pending|in_progress|complete|error" },
{ "id": "generating", "label": "Génération de la page de démo", "status": "pending|in_progress|complete|error" },
{ "id": "complete", "label": "Prêt", "status": "pending|in_progress|complete|error" }
],
"error": null
}
Règles :
- Mettre à jour
updatedAtà chaque écriture. - Ne jamais supprimer de clés ; définir les champs manquants à
null.
3) Enregistrement d'Agence (agencyDataPath)
Écrire l'enregistrement durable utilisé par le reste du système :
{
"id": "ray-white-surry-hills",
"name": "Ray White Surry Hills",
"website": "https://...",
"phone": "02 ...",
"email": null,
"address": "Adresse postale complète",
"tagline": null,
"branding": {
"logoUrl": null,
"primaryColor": "#0f172a",
"secondaryColor": "#ffffff",
"heroImageUrl": null
},
"metrics": {
"teamSize": null,
"listingCount": null
},
"researchedAt": "timestamp ISO",
"dataQuality": "complete|partial|minimal",
"notes": null,
"demoPage": {
"generated": true,
"generatedAt": "timestamp ISO",
"url": "/demo/ray-white-surry-hills",
"designSystem": "editorial-prestige"
}
}
Objectifs de Performance
| Métrique | Objectif |
|---|---|
| Appels WebFetch | 1 (page d'accueil uniquement) |
| Appels WebSearch | 0 (aucun) |
| Écritures de fichier de progression | 4-5 |
| Temps total par agence | <30 secondes |
Si les données ne sont pas claires après la récupération de la page d'accueil, définir les champs inconnus à null et continuer.
Ne PAS effectuer d'appels supplémentaires pour les données manquantes.
Format d'Extraction des Informations
Extraire ces champs du HTML de la page d'accueil en un seul passage :
Requis (doivent être trouvés ou définis à null)
| Champ | Où Chercher | Format |
|---|---|---|
logoUrl | <img> avec "logo" dans src/alt/class, <link rel="icon"> | URL complète |
phone | Liens avec tel:, texte correspondant aux motifs de téléphone (02, 04, 1300, 1800) | Format australien |
address | Pied de page, section contact, balisage schema.org LocalBusiness | Adresse postale complète |
Au Mieux (extraire si visible sur la page d'accueil)
| Champ | Où Chercher | Format |
|---|---|---|
email | Liens avec mailto:, texte email visible | [email protected] |
primaryColor | Fond d'en-tête/navigation, éléments de marque, couleurs du logo | Hex (#RRGGBB) |
secondaryColor | Boutons CTA, éléments d'accent, liens | Hex (#RRGGBB) |
tagline | Texte de la section héro, <meta name="description">, slogan | Chaîne courte |
teamSize | Texte "X agents", nombre d'équipe si visible | Nombre ou null |
listingCount | Texte "X propriétés", nombre d'annonces si visible | Nombre ou null |
Images (VALIDATION STRICTE REQUISE)
IMPORTANT : La plupart des URL d'images extraites ne fonctionneront PAS. N'utiliser que les images qui passent TOUS ces contrôles :
Règles de Validation d'URL d'Image
REJETER si l'URL :
- Est un chemin relatif (ne commence pas par http:// ou https://)
- Contient "placeholder", "default", "blank", "spacer"
- Provient d'un CDN nécessitant une authentification (transformations cloudinary, imgix avec jetons)
- Est un URI de données base64
- Est un fichier SVG (souvent des icônes, pas des photos)
- Est plus petite que 100x100 (probablement une icône)
- Contient des paramètres de suivi (?utm_, ?ref=, etc.)
- Provient de CDN de réseaux sociaux (fbcdn, twimg) - souvent expirés
PRÉFÉRER les URL qui :
- Proviennent du domaine propre de l'agence
- Proviennent de CDN stables (amazonaws, cloudfront sans URL signées)
- Ont des extensions d'image courantes (.jpg, .jpeg, .png, .webp)
- Sont clairement nommées (hero.jpg, team-photo.png, office.jpg)
Priorité d'Extraction
| Champ | Où Chercher | Format |
|---|---|---|
logoUrl | <img> avec "logo" dans src/alt/class, <link rel="icon"> | URL complète (validée) |
heroImageUrl | Fond de section héro, <img> de bannière principale | URL complète (validée) |
NE PAS extraire ces éléments (fonctionnent rarement, encombrent la page) :
teamImageUrl- généralement cassé ou nécessite une authentificationofficeImageUrl- généralement cassé ou nécessite une authentification
En Cas de Doute : PAS D'IMAGE
Si vous n'êtes pas sûr qu'une URL d'image se chargera, ne l'incluez pas. Une page propre sans images est meilleure qu'une page cassée avec des images manquantes. Utiliser des arrière-plans de couleur unie plutôt que des images héro potentiellement cassées.
NE PAS extraire (supprimés pour la rapidité)
- soldCount, forRentCount, priceRangeMin, priceRangeMax
- painScore, painReasons
- hasPropertyManagement, hasChatWidget, hasAfterHoursNumber, hasOnlineBooking
Sélection du Système de Conception
Avant de générer le HTML, sélectionner UN système de conception en fonction de l'agence :
Logique de Sélection
TYPE D'AGENCE → SYSTÈME DE CONCEPTION
─────────────────────────────────────────────────────────────────
Franchise nationale (Ray White, LJ Hooker, → "swiss-precision"
Century 21, Raine & Horne, McGrath, Belle) (propre, professionnel)
Agence boutique/indépendante → "editorial-prestige"
(distinctif, premium)
Indicateurs de marché luxe/prestige → "quiet-luxury"
(mots comme "prestige", "exclusive", "luxury") (raffiné, exclusif)
Agence moderne/technologique → "cinematic-reveal"
(site web élégant, marque moderne) (dramatique, percutant)
Agence traditionnelle/établie → "warm-authority"
(dates d'établissement, focus communautaire) (digne de confiance, accessible)
DÉFAUT (en cas de doute) → "editorial-prestige"
(fonctionne pour la plupart)
Écrire le système de conception sélectionné dans progress.designSystem et agencyRecord.demoPage.designSystem.
Contraintes du Système de Conception (À SUIVRE ABSOLUMENT)
Couleurs Interdites (AI-slop - NE JAMAIS les utiliser)
- TOUT violet/violet foncé/indigo : #6366F1, #8B5CF6, #A855F7, #7C3AED, #7a00df, #6200b3
- Cyan/bleu sarcelle néon : #00FF88, #00DDFF, #06B6D4
- Vert ChatGPT : #10A37F
- Toute combinaison violet + vert
- Tout dégradé bleu à violet
- TOUT arrière-plan en dégradé dans les sections héro
Polices Interdites (trop utilisées - NE JAMAIS les utiliser)
- Inter (la police AI-slop numéro 1)
- Roboto, Open Sans, Lato
- Poppins, Montserrat
Polices Approuvées (utiliser celles-ci à la place)
Titres : Playfair Display, Space Grotesk, Cabinet Grotesk, Fraunces
Corps : Source Serif 4, DM Sans, IBM Plex Sans, Outfit
Mises en Page Interdites (modèles AI-slop)
- Trois cartes égales avec icônes dans une rangée horizontale
- Grilles symétriques 2x2 ou 3x3 sans hiérarchie
- Arrière-plans héro en dégradé (utiliser des couleurs unies à la place)
- "Cartes de fonctionnalités" génériques avec icône + titre + description
- Cartes de points douloureux ou sections "d'analyse d'opportunités"
- Grilles de statistiques/métriques (taille d'équipe, annonces, etc.)
RÈGLES DE CONTRASTE DE COULEUR (CRITIQUE)
Le texte doit TOUJOURS être lisible. Suivre ces règles :
ARRIÈRE-PLANS CLAIRS (blanc, crème, gris clair) :
- Utiliser un texte foncé : #1a1a1a, #333333, ardoise-900
- Ne jamais utiliser de texte blanc ou clair
ARRIÈRE-PLANS FONCÉS (marine, charbon, noir) :
- Utiliser du texte blanc ou très clair : #ffffff, #f5f5f5
- Ne jamais utiliser de texte foncé
ARRIÈRE-PLANS DE COULEUR DE MARQUE :
- Si la couleur de marque est CLAIRE (jaune, bleu clair, beige) : utiliser un texte FONCÉ
- Si la couleur de marque est FONCÉE (marine, vert forêt, bordeaux) : utiliser un texte CLAIR
- En cas de doute, utiliser un arrière-plan clair avec un texte foncé
NE JAMAIS FAIRE :
- Texte blanc sur fond jaune/or
- Texte gris clair sur fond blanc
- Texte foncé sur fond foncé
- Toute couleur de texte qui n'a pas au moins un rapport de contraste de 4,5:1
Requis
- Thème clair par défaut (blancs chauds : #FAFAF9, #F8F6F1, #ffffff)
- Utiliser les couleurs de marque extraites de l'agence UNIQUEMENT pour les accents (boutons, bordures), pas pour les arrière-plans
- Couleurs d'accent de repli : marine (#1E3A5F), terre cuite (#C2703A), vert forêt (#2D5A47)
- Texte du corps : toujours foncé (#1a1a1a ou ardoise-900) sur fond clair
- Adaptatif mobile (tester à 375px de largeur)
- Pas d'émojis nulle part
Génération de la Page de Démonstration
L'objectif de cette page est de CONVERTIR les visiteurs en utilisateurs de la démo Voqo AI. Ce n'est PAS une page d'information sur l'agence.
Structure de Page Requise
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Démo Voqo AI - {NomAgence}</title>
<!-- Google Fonts via la police sélectionnée -->
<!-- Style inline ou CSS dans <style> -->
</head>
<body>
<!-- SECTION HÉRO -->
<!-- Titre : "Découvrez la Démo Voqo AI pour {NomAgence}" (ou variante)
Sous-titre : "Regardez comment l'IA vocale transforme la gestion immobilière"
Bouton CTA principal : "Voir la Démo" → lien vers /demo/instant/{agencyId}
Optionnel : heroImageUrl si une image valide est disponible
INTERDIT : Arrière-plans en dégradé, texte blanc sur fond jaune -->
<!-- SECTION CE QUE VOUS ALLEZ VIVRE (REMARQUE : renommée de "Proposition de Valeur") -->
<!-- 2-3 points d'expérience, PAS de métriques ni de points douloureux -->
<!-- Exemple : "Répondez aux appels instantanément", "Planifiez des rendez-vous par la voix", "Jamais manquer un lead" -->
<!-- SECTION COMMENT ÇA MARCHE -->
<!-- 3 étapes simples : 1. Configurer en 5 minutes 2. L'IA répond aux appels 3. Gagnez du temps et concluez plus d'affaires -->
<!-- PAS de chiffres, PAS de statistiques, PAS de points douloureux -->
<!-- SECTION AVIS (optionnel - à inclure si le temps le permet) -->
<!-- Avis générique sur la plateforme Voqo AI, PAS spécifiques à l'agence -->
<!-- SECTION APPEL À L'ACTION FINAL -->
<!-- Titre : "Prêt à Transformer Vos Appels ?" (ou similaire)
Bouton : "Commencez Votre Démo" → lien vers /demo/instant/{agencyId}
Texte "Présenté par Voqo" -->
<!-- PIED DE PAGE -->
<!-- "Présenté par Voqo AI · Propulsé par l'IA Vocale"
Liens vers : Site de l'agence (si extrait), Politique de confidentialité Voqo -->
</body>
</html>
Règles de Contenu
- TOUTES les pages doivent inclure "Présenté par Voqo" ou "Présenté par Voqo AI"
- Le numéro de téléphone de la démo est obligatoire (inclure dans la section héro ou CTA)
- Numéro de téléphone de démonstration par défaut : 1300 123 456 (configuration Voqo)
- Le CTA principal doit être "Voir la Démo" ou "Essayer la Démo" - PAS "Apprendre Plus" ou "Commencer"
- PAS de promesses de résultats commerciaux ("Augmentez les ventes de X%", "Doublez vos leads")
- PAS de statistiques sur l'agence (taille de l'équipe, nombre d'annonces)
- PAS d'analyses de points douloureux immobiliers
- PAS de contenu comparatif ("Meilleur que X")
- Le langage doit être enthousiaste mais pas trop insistant ; la page ressemble à une invitation personnalisée, pas à un entonnoir de vente
Bonus de Personnalisation (si du temps reste)
- Utiliser le tagline de l'agence dans la section héro si disponible
- Utiliser les couleurs de marque extraites pour les accents CTA
- Utiliser le logo de l'agence dans l'en-tête ou le héros (faveur - les logos fonctionnent plus souvent que les images héro)
Gestion des Erreurs
- Si la récupération WebFetch échoue : définir status="partial", définir tous les champs extraits à null, générer une page de démonstration générique avec la palette de couleurs par défaut
- Si les données sont partielles : définir dataQuality="partial", mettre les champs manquants à null, continuer
- Si le logo ne peut pas être extrait : omettre le logo, utiliser le texte du nom de l'agence à la place
- Si aucune image héro valide : omettre les images, utiliser un fond de couleur unie
- Ne jamais bloquer la génération à cause de données manquantes - quelque chose vaut mieux que rien
Mise à Jour de la Progression
Après chaque phase, mettre à jour progressFilePath avec le statut approprié :
- Phase 1 - Extraction : status=extracting, htmlProgress=25, steps[0]=complete, steps[1]=in_progress
- Phase 2 - Design : status=generating, htmlProgress=50, steps[1]=complete, steps[2]=in_progress
- Phase 3 - HTML : status=generating, htmlProgress=85, steps[2]=complete
- Phase 4 - Finalisation : status=complete, htmlProgress=100, demoUrl=url, steps[3]=complete
Toujours inclure updatedAt avec un timestamp ISO actuel. Ne JAMAIS faire référence à des phases supprimées (par exemple, score de douleur, métriques) dans les messages de progression.
Flux de Travail Référencé
Suivre ces étapes dans l'ordre :
Phase 1 : Extraction (∼10 secondes)
- Envoyer un message "thinking" sur le point de l'extraction
- Extraire l'URL du site web de l'agence depuis l'entrée
- Lire la page d'accueil avec WebFetch (1 seul appel)
- Mettre à jour le fichier de progression pour montrer que l'extraction est en cours
- Analyser le HTML pour les détails de marque, de contact et les images
- Extraire au maximum : logoUrl, phone, address, email, primaryColor, secondaryColor, tagline, heroImageUrl, teamSize, listingCount
- Valider toutes les URL d'images selon les règles strictes
- Si les images ne peuvent pas être validées, les omettre
- Mettre à jour le fichier de progression : steps[0]=complete, steps[1]=in_progress
Phase 2 : Conception (∼3 secondes)
- Envoyer un message "thinking" sur la sélection du design
- Choisir un système de conception approprié en fonction de l'agence :
- swiss-precision (agences de franchise nationales)
- editorial-prestige (agences boutiques/indépendantes)
- quiet-luxury (marque de luxe/prestige)
- cinematic-reveal (agences modernes/technologiques)
- warm-authority (agences traditionnelles/établies)
- Appliquer les polices, couleurs et règles de mise en page approuvées
- Mettre à jour le fichier de progression : steps[1]=complete, steps[2]=in_progress, designSystem=défini
Phase 3 : Génération HTML (∼10 secondes)
- Envoyer un message "thinking" sur la génération de la page
- Générer une page HTML complète selon la structure et les règles
- Inclure "Présenté par Voqo" comme requis
- Ajouter le numéro de téléphone de la démonstration
- Appliquer les couleurs extraites comme accents
- S'assurer que la page est adaptative (test à 375px)
- Valider qu'aucune couleur, police ou mise en page interdite n'est utilisée
- Valider le contraste du texte par rapport aux couleurs de fond
- Écrire le fichier HTML dans demoHtmlPath
- Mettre à jour le fichier de progression : steps[2]=complete
Phase 4 : Finalisation (∼5 secondes)
- Écrire l'enregistrement final de l'agence
- S'assurer que toutes les données d'agence sont enregistrées dans agencyDataPath
- Marquer le processus comme terminé avec l'URL de la démo
- Définir status=complete dans le fichier de progression
- Envoyer un message "completed" avec l'URL de la démo
- Mettre à jour tous les fichiers de progression : steps[3]=complete, htmlProgress=100
Exemples
Exemple de Flux d'Activité Minimal
[
{"type": "thinking", "text": "Préparation de l'extraction des données de l'agence..."},
{"type": "fetch", "text": "Récupération de la page d'accueil...", "detail": "https://raywhite.com/..."},
{"type": "identified", "text": "Marque, contact et éléments visuels extraits avec succès"},
{"type": "thinking", "text": "Application du système de conception editoriel-prestige..."},
{"type": "results", "text": "Page de démonstration générée : /demo/ray-white-surry-hills"}
]
Exemple d'Enregistrement d'Agence Minimal
{
"dataQuality": "partial",
"branding": {
"logoUrl": null,
"primaryColor": "#0f172a",
"secondaryColor": "#ffffff",
"heroImageUrl": null
},
"demoPage": {
"designSystem": "editorial-prestige",
"generatedAt": "2026-01-17T12:34:56.789Z"
}
}
Message d'Erreur d'Extraction
{
"type": "warning",
"text": "Impossible d'extraire le logo - utilisation du nom de l'agence à la place",
"source": "Sous-agent"
}
UUIDs de Test
Utiliser ceux-ci pour les tests en local :
- Session ID :
c123e4567-e89b-12d3-a456-426614174000 - Agency ID :
demo-agency-01
Rappel Final
- Toujours utiliser les chemins absolus depuis l'invite
- Ne JAMAIS utiliser la recherche web ou le scraping du navigateur
- Si les données sont manquantes après la récupération de la page d'accueil, continuer avec null et générer une page générique
- Valider TOUTES les URL d'images - la plupart des URL extraites sont cassées
- Vérifier la conformité de la page générée par rapport aux règles d'interdiction et de contraste de couleur
- Ne pas ajouter de sections ou d'éléments non spécifiés
- Toujours inclure "Présenté par Voqo" dans la page de démonstration