t4transaction/agent
0
Application de Valorisation M&A
Ceci est l'application déployée via Docker sur Hugging Face Spaces.
URL Scraper V2 - M&A Headless App
Application M&A headless :
- Frontend : Next.js + Tailwind + UI custom (style Shadcn)
- Backend : FastAPI (scraping, matching Supabase, valorisation)
- Deploiement : Docker (compatible Hugging Face Spaces)
1) Prerequis
- Node.js 20+
- Python 3.11+ (ou Docker)
- Compte Supabase avec :
- table
db_transactionsalimentee (embeddings inclus) - fonction RPC
match_transactions - Cles API :
- Mistral
- Jina
2) Variables d'environnement
Creer un fichier .env a la racine du projet (ou utiliser les Secrets HF en production).
Variables requises :
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=sb_secret_xxx
MISTRAL_API_KEY=your_mistral_key
JINA_API_KEY=your_jina_keyImportant :
SUPABASE_KEYdoit etre une secret key (sb_secret_...), passb_publishable_....- Le backend charge automatiquement
.enva la racine.
3) Lancer en local (2 terminaux)
Terminal A - Backend
uvicorn backend.main:app --host 127.0.0.1 --port 7860 --reloadHealth check :
- Ouvrir
http://127.0.0.1:7860/api/health
Terminal B - Frontend
cd frontend
npm install
npm run devApplication :
- Ouvrir
http://localhost:3000
4) Test fonctionnel rapide
- Aller sur la page
Analyse cible - Renseigner :
- URL :
https://t4transaction.com/ - CA / EBITDA
- Cliquer
Lancer l'analyse - Verifier :
- extraction societe (nom, naf, etc.)
- transactions comparables
- valorisation
- points cles
4bis) Workflow de l'application
Cette version headless reprend le parcours metier de l'ancienne app Streamlit, en separant clairement UI (Next.js) et logique (FastAPI).
Parcours utilisateur (frontend)
- Landing (`/`)
- L'utilisateur saisit l'URL de la societe et choisit la langue.
- Redirection vers
analyse-cibleavec URL/langue en query params.
- Etape 1 - Analyse cible (`/analyse-cible`)
- Saisie des donnees financieres : CA, EBITDA/REX, geographie.
- Appel
POST /api/analyze. - Affichage d'une progression d'analyse, puis previsualisation des infos cible.
- Le payload complet est persiste en local (
localStorage) pour les etapes suivantes.
- Etape 2 - Transactions comparables (`/transactions-comparables`)
- Rechargement du payload local.
- Appel
POST /api/comparables(alias dePOST /api/match) avec mots-cles, CA, NAF, geo. - Affichage des comparables anonymises + lien vers les references.
- Etape 3 - Valorisation preliminaire (`/valorisation-preliminaire`)
- Appel
POST /api/valuationavec EBITDA + multiples. - Affichage des football fields (CA/EBITDA), mediane/moyenne et caveat.
- Etape 4 - Points cles (`/points-cles`)
- Appel
GET /api/key-points. - 3 messages visibles + 2 messages floutes (teaser analyse sur-mesure).
- Etape 5 - Rendez-vous M&A (`/rendez-vous`)
- Calendly inline + contexte cible (nom, URL, description, tags, metrics).
- Objectif: conversion vers un echange expert.
Pipeline backend (etape 1)
POST /api/analyze orchestre les operations suivantes:
- Validation metier
- Verifie la coherence des entrees (ex: EBITDA > CA si les deux > 0).
- Controle de quota
- Verification minute/jour via Supabase (
usage_logs_m_a_transaction_app).
- Scraping & enrichissement
- Scraping principal via Jina Reader (avec fallback).
- Extraction SIREN (mentions legales / homepage).
- Enrichissement API entreprise (NAF, date de creation, CA eventuel).
- Blocage explicite si URL/secteur hors perimetre.
- Matching transactions
- Embedding des mots-cles cible (Mistral).
- Retrieval candidats (
match_transactionspgvector, fallback Python). - Scoring pondere (CA, semantique, NAF) + relaxation progressive.
- Calcul des multiples mediane/moyenne.
- Valorisation
- Valorisation CA (si CA disponible).
- Valorisation EBITDA (si EBITDA > 0 et multiples disponibles).
- Journalisation
- Mise a jour de la consommation tokens / metadonnees meme en cas d'erreur.
Endpoints utilises par le frontend
GET /api/healthPOST /api/analyzePOST /api/matchPOST /api/comparablesPOST /api/valuationGET /api/key-points
5) Build Docker local
docker build -t leadhook-hf .
docker run --rm -p 7860:7860 leadhook-hfPuis ouvrir :
http://localhost:7860
5bis) Lancer avec Docker Compose (recommande)
Le projet inclut docker-compose.yml pour eviter de retaper build + run.
Demarrage :
docker compose up --buildArret :
docker compose downLogs :
docker compose logs -fApplication :
http://localhost:7860
6) Deploiement Hugging Face Spaces (Docker)
- Creer un Space :
- SDK :
Docker - Push du repo vers le Space :
git init
git add .
git commit -m "Initial deploy HF"
git remote add origin https://huggingface.co/spaces/<HF_USER>/<SPACE_NAME>
git push -u origin main- Dans
Settings > Variables and secretsdu Space, ajouter : SUPABASE_URLSUPABASE_KEYMISTRAL_API_KEYJINA_API_KEY
- Verifier :
Build logs(image construite)Container logs(uvicorn up sur port 7860)
7) Troubleshooting
- Erreur quota / policy au demarrage de l'analyse :
- verifier
SUPABASE_KEY(secret key) - verifier les policies RLS sur
usage_logs_m_a_transaction_app Aucune transaction trouvee:- verifier que
db_transactionscontient bien des donnees - verifier que
match_transactionsretourne des lignes - Erreur bind port local :
- port 7860 deja utilise -> stopper l'ancien process
8) Arborescence principale
frontend/: UI Next.jsbackend/main.py: routes FastAPIbackend/scraper.py: scraping + LLM + enrichissementbackend/database.py: Supabase + matching + valorisation + quotasDockerfile: build frontend + runtime backend
