# ka2 — explorateur structuré du web québécois ### Édition légère · une plateforme du **Groupe KA** ![Auteur](https://img.shields.io/badge/auteur-Simon--Pierre%20Boucher-111?style=flat-square) ![Contact](https://img.shields.io/badge/contact-contact%40spboucher.ai-d9f26b?style=flat-square) ![by Groupe KA](https://img.shields.io/badge/by-Groupe%20KA-d9f26b?style=flat-square) ![Statut](https://img.shields.io/badge/statut-en%20production-brightgreen?style=flat-square) ![Python](https://img.shields.io/badge/Python-3.9%2B-3776AB?style=flat-square&logo=python&logoColor=white) ![FastAPI](https://img.shields.io/badge/FastAPI-uvicorn-009688?style=flat-square&logo=fastapi&logoColor=white) ![Anthropic](https://img.shields.io/badge/Anthropic-Claude-8A2BE2?style=flat-square&logo=anthropic&logoColor=white) ![Firecrawl](https://img.shields.io/badge/Firecrawl-scrape%20%C2%B7%20search%20%C2%B7%20map-FF7A00?style=flat-square) ![Scrapfly](https://img.shields.io/badge/Scrapfly-repli%20anti--bot-1E90FF?style=flat-square) ![SQLite](https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white) ![ngrok](https://img.shields.io/badge/ngrok-www.ka2.bot-1F1E37?style=flat-square&logo=ngrok&logoColor=white) ![Licence](https://img.shields.io/badge/licence-propri%C3%A9taire-lightgrey?style=flat-square) **ka2** est un bot **scraper + recherche piloté par IA** qui cartographie le web québécois sous forme de **graphe de connaissances** : entités (entreprises, organisations, personnes, créateurs/influenceurs, agences, marques…), leurs **attributs** et leurs **relations typées**. 🌐 **Dashboard en direct : https://www.ka2.bot**
--- ## ✨ Aperçu | | | |---|---| | ![Tableau de bord](assets/ka2_dashboard.png) | ![Répertoire structuré](assets/ka2_explorer.png) | | **Tableau de bord** temps réel (thème vert lime) | **Répertoire structuré** — graphe global interactif | > Les captures ci-dessus utilisent `assets/ka2_dashboard.png` et `assets/ka2_explorer.png`. --- ## 🎯 Positionnement — Édition légère Le Groupe KA opère trois bots jumeaux partageant le **même moteur**, à trois paliers : | Bot | Palier | Contrôleur | Concurrence | Pages/jour | Thème | |-----|--------|-----------|-------------|-----------|-------| | ka2 | léger / économique | Haiku 4.5 | 6 | 800 | 🟢 vert lime | | ka4 | agressif | Sonnet 5 | 10 | 3000 | 🔴 rouge | | ka6 | **flagship** | Sonnet 5 | 16 | 9000 | 🟣 violet | > **Ce dépôt = ka2** (Édition légère, thème vert lime). --- ## 🧠 Comment ça marche ``` ┌──────────────────────────────────────────────┐ Missions ───────▶ │ Agent (Claude) — planifie, cherche, │ (dashboard) │ approfondit (deep_dive), pilote via outils │ └───────────────┬──────────────────────────────┘ │ outils search_web / map_site / scrape_page / deep_dive / crawl_queue │ ┌─────────────────────────▼─────────────────────────┐ │ Firecrawl (principal) → Scrapfly (repli anti-bot) │ │ robots.txt + rate-limit + fail-fast + coupe-circuit│ └─────────────────────────┬─────────────────────────┘ │ markdown ┌────────────▼────────────┐ │ Extracteur (Haiku) │ │ → GRAPHE {entités, │ │ relations typées} │ └────────────┬────────────┘ │ résolution d'entités + provenance ┌────────────▼────────────┐ │ SQLite (WAL) │ │ entités · relations · │ │ liens sociaux · sources │ └────────────┬────────────┘ │ SSE temps réel ┌────────────▼────────────┐ │ Dashboard + Répertoire │ │ (FastAPI, 3 vues) │ └──────────────────────────┘ ``` --- ## 🚀 Fonctionnalités - 🕸️ **Graphe de connaissances** — entités normalisées + **relations typées** (WORKS_AT, FOUNDER_OF, REPRESENTED_BY, COLLABORATES_WITH, SPONSORED_BY, MEMBER_OF, PARTNER_OF…), avec rôle et provenance. - 🧩 **Résolution d'entités / déduplication** (nom normalisé + domaine + région) et **régions QC canoniques**. - 👤 **Modèle créateur/influenceur** — type `creator`/`agency`/`brand`, handle, plateforme, **abonnés** (par plateforme), niche, langues. - ⚡ **Crawling concurrent** (6 pages en parallèle) + **frontière agressive** (auto-découverte de liens). - 🛟 **Robustesse** — timeouts fail-fast, **retries** par URL (dead-letter), **coupe-circuit** par domaine. - 🧭 **Agent rigoureux** (plan → découverte → collecte → vérification) + **auto-compaction** du contexte. - 🎛️ **Contrôles de mission** — arrêter la mission en cours, **lancer maintenant** (prioriser), supprimer. - 🗄️ **Archives** — snapshot des données puis remise à zéro ; historique **restaurable / exportable**. - 🖥️ **Dashboard temps réel (SSE)** — KPIs, flux d'activité, réglages en direct, thème vert lime, responsive. - 🔎 **Répertoire structuré** — 3 vues : **Cartes**, **Tableau** triable, **Graphe global** (force-directed, pan/zoom), facettes (type/secteur/région), recherche, **export CSV/JSON**. - 🇶🇨 **Conforme** — robots.txt respecté, rate-limiting, note **Loi 25 (Québec) / LPRPDE**, données publiques. --- ## ⚙️ Configuration (`.env`) | Variable | Rôle | Valeur (ka2) | |---|---|---| | `ANTHROPIC_API_KEY` | Clé Anthropic | — | | `FIRECRAWL_API_KEY` | Clé Firecrawl | — | | `SCRAPFLY_API_KEY` | Clé Scrapfly (repli) | — | | `KA_BOT_MODEL` | Modèle contrôleur | `claude-haiku-4-5-20251001` | | `KA_BOT_EXTRACT_MODEL` | Modèle extraction | `claude-haiku-4-5-20251001` | | `KA_BOT_DB` | Base SQLite | `ka_bot.db` | | `KA_BOT_CONCURRENCY` | Pages en parallèle | `6` | | `KA_BOT_DELAY` | Délai entre requêtes (s) | `0.6` | | `KA_BOT_MAX_PAGES` | Pages max / exécution | `120` | | `KA_BOT_FRONTIER` | Liens auto-enfilés / page | `12–16` | | `KA_BOT_MAX_ATTEMPTS` | Tentatives / URL | `2` | | `KA_BOT_DOMAIN_FAILS` | Seuil coupe-circuit | `4` | | `KA_BOT_AUTOSEED` | Pré-remplir des missions | `0` (off) | > ⚠️ Le fichier `.env` (clés API) **n'est pas** versionné (`.gitignore`). --- ## 🏗️ Installation & exécution ```bash python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # renseigner les clés # Dashboard (web) uvicorn web.app:app --host 127.0.0.1 --port 8799 # Bot long terme (crawler) python main.py run # Modes ponctuels python main.py pipeline --query "influenceurs beauté Québec" python main.py agent --goal "Cartographier les agences d'influence de Montréal" python main.py stats python main.py export --out exports/entites.json ``` ## ☁️ Déploiement (cluster MacLustr — node M4M36) ```bash bash deploy/deploy.sh M4M36 8799 www.ka2.bot ``` Crée 3 services **launchd** résilients : `com.ka2.web`, `com.ka2.bot`, `com.ka2.ngrok` (tunnel `--url=https://www.ka2.bot`, inspection ngrok sur `:4040` pour cohabiter avec les autres bots). --- ## 🔌 API principale | Méthode | Route | Rôle | |---|---|---| | `GET` | `/health` | état du service | | `GET` | `/api/stats` | compteurs + état session | | `GET` | `/api/stream` | flux SSE (stats + événements) | | `GET` | `/api/entities` | entités (filtres type/région/secteur, tri, pagination) | | `GET` | `/api/entity/{id}` | fiche entité + relations | | `GET` | `/api/graph` | nœuds + arêtes du graphe global | | `GET` | `/api/export.{json,csv}` | export filtré | | `POST` | `/api/missions` | ajouter une mission | | `POST` | `/api/missions/{id}/{prioritize,delete}` | lancer maintenant / supprimer | | `POST` | `/api/control/{pause,resume,skip,extend}` | contrôles bot | | `POST` | `/api/archive` · `GET /api/archives` | archiver & vider · historique | | `POST` | `/api/archive/{id}/{restore,delete}` | restaurer / supprimer archive | --- ## 🗃️ Modèle de données (SQLite) `entities` (type, nom, canonical/norm, domaine, secteur, région, coordonnées, **niche/handle/plateforme/abonnés**, provenance) · `relations` (from, to, type, rôle, source, confiance) · `social_links` (plateforme, url, abonnés) · `sources` · `entity_mentions` · `crawl_queue` · `missions` · `events` · `settings` · `archives`. --- ## ⚖️ Conformité & usage responsable Données **publiques** uniquement · `robots.txt` respecté · rate-limiting · finalités légitimes (annuaire, veille, recherche de marché). Encadré par la **Loi 25 (Québec)** et la **LPRPDE**. Ne pas constituer de profils de personnes privées à des fins de surveillance ou de démarchage non sollicité. ---
**ka2** · une plateforme du **Groupe KA** Auteur **Simon-Pierre Boucher** · ✉️ **contact@spboucher.ai** *Zéro boîte noire — tout est automatisé, rien n'est inventé.*