Claude 1c763143ca feat: Improve price extraction with priority selectors and smart multi-price handling
**Problem:**
Stokomani Lutin product detected 14.99 EUR instead of 19.99 EUR.
Website shows both old price (14.99) and current price (19.99).
Generic extraction was returning whichever price was found first.

**Root Causes:**
1. No prioritization of price selectors (all treated equally)
2. First-found-first-returned approach missed semantic selectors
3. When multiple prices found, no logic to select the correct one

**Solution: Priority-Based Extraction + Smart Selection**

1. **Reordered Selectors by Priority** (browserless_service.py:151-170)
   ```
   HIGHEST PRIORITY (return immediately):
   - [itemprop='price']    (Schema.org semantic)
   - .current-price        (explicit current)
   - .sale-price           (sale/promo price)
   - .final-price          (final calculated)
   - .product-price        (product-specific)

   MEDIUM PRIORITY:
   - [class*='price']:not([class*='old']):not([class*='was'])...
   - Excludes: old, was, original, before, regular, ancien, barre

   LOW PRIORITY:
   - .price (generic, might catch anything)
   ```

2. **Immediate Return for High-Priority Selectors** (lines 202-204)
   - If found with semantic selector → return immediately
   - Avoids checking lower-priority selectors
   - Most reliable prices checked first

3. **Multi-Price Smart Selection** (lines 210-218)
   - If multiple prices found (e.g., old + current)
   - Takes LAST price in DOM order (not highest/lowest value)
   - Rationale: HTML structure typically shows old price first, current price last:
     ```html
     <span class="old-price">14,99 €</span>  ← First in DOM
     <span class="price">19,99 €</span>      ← Last in DOM (CURRENT)
     ```
   - Logs all found prices for debugging

**Why Not "Highest Price"?**
Taking highest value fails in promotions:
```
Old: 29,99 € (highest)
Current: 19,99 € (promotion) ← Should select this
```
Taking last in DOM works for both cases:
```
Case 1 (Stokomani):
  Old: 14,99 € (first)
  Current: 19,99 € (last) ← Selected ✓

Case 2 (Promotion):
  Old: 29,99 € (first)
  Current: 19,99 € (last) ← Selected ✓
```

**Flow:**
```
Search for [itemprop='price']
  → Found? Return immediately ✓
  → Not found? Continue...
Search for .current-price
  → Found? Return immediately ✓
  → Not found? Continue...
...
Search with low-priority selectors
  → Found: ["14,99 €", "19,99 €"]
  → Select last: "19,99 €" ✓
```

**Expected Results:**
- Before: "14.99 EUR" (first found, wrong)
- After: "19.99 EUR" (last in DOM, correct)
- Logs: "Multiple prices found: ['14,99 €', '19,99 €'], selecting last: 19,99 €"

Tested with: https://www.stokomani.fr/products/lutin-filou-telescopique-95-cm_208400
2025-11-29 23:55:05 +00:00
2025-11-22 10:01:25 +01:00
2025-11-22 10:01:25 +01:00
2025-11-22 10:01:25 +01:00

PriceFlow logo

PriceFlow

Suivi de prix intelligent propulse par l'IA

Fonctionnalités • Installation • Configuration • Utilisation


Description

PriceFlow est une application auto-hébergée de suivi de prix utilisant l'intelligence artificielle. Elle analyse visuellement les pages produits grâce aux modèles de vision IA (OpenAI, Anthropic, Ollama, OpenRouter) pour détecter les prix et surveiller l'état des stocks.

Fonctionnalités

  • Analyse par IA : Utilise les modèles de vision GenAI pour "voir" le prix et l'état du stock sur n'importe quelle page web
  • Multi-fournisseurs IA : Support de Ollama, OpenAI, Anthropic et OpenRouter avec filtres par catégorie (chat, vision, code, raisonnement)
  • Scores de confiance : L'IA fournit un score de confiance (0-1) pour chaque extraction
  • Historique visuel : Conserve l'historique des captures d'écran avec les métadonnées IA
  • Défilement intelligent : Scroll automatique pour charger le contenu différé
  • Notifications : Support multi-canaux (Discord, Telegram, Email, etc.) via Apprise
  • Catalogues promotionnels : Consultation des catalogues et prospectus discount (Gifi, Action, Centrakor, etc.) scrapés depuis Bonial.fr
  • Interface en français : Application entièrement traduite en français
  • Mode sombre : Interface moderne avec support du thème clair/foncé
  • Dockerisé : Déploiement facile avec Docker Compose

Prérequis

  • Docker et Docker Compose
  • Réseau Docker : nginx_default (external)
  • Fournisseur IA : Clé API OpenAI, Anthropic, OpenRouter, OU une instance Ollama locale

Installation

1. Cloner le dépôt

git clone https://github.com/R0m1k3/Priceflow.git
cd Priceflow

2. Créer le réseau Docker (si non existant)

docker network create nginx_default

3. Configurer les variables d'environnement

cp .env.example .env
# Modifier .env selon vos besoins

4. Lancer l'application

docker compose up -d

5. Accéder à l'interface

Ouvrez votre navigateur sur : http://localhost:8555

Architecture Docker

Service Port Description
PriceFlow App 8555:8555 Application principale
PostgreSQL 5488:5432 Base de données
Browserless 3012:3000 Navigateur headless pour le scraping

Réseau : nginx_default (external)

Configuration

Variables d'environnement

Variable Description Défaut
DATABASE_URL Chaîne de connexion PostgreSQL postgresql://priceflow:priceflow@db:5432/priceflow
BROWSERLESS_URL URL WebSocket de Browserless ws://browserless:3000
LOG_LEVEL Niveau de log (DEBUG, INFO, WARNING, ERROR) INFO
CORS_ORIGINS Origines CORS autorisées *

Configuration IA

Toute la configuration IA se fait via la page Paramètres de l'interface :

Fournisseurs supportés :

  • Ollama : Modèles locaux (gemma3, llava, etc.)
  • OpenAI : GPT-4o, GPT-4-vision, etc.
  • Anthropic : Claude 3.5 Sonnet, etc.
  • OpenRouter : Accès à +200 modèles avec filtres par catégorie

Paramètres avancés :

  • Température (0.0 - 1.0)
  • Tokens maximum
  • Seuils de confiance (prix/stock)
  • Réparation JSON automatique

Configuration OpenRouter

  1. Sélectionnez OpenRouter comme fournisseur
  2. Entrez votre clé API (sk-or-...)
  3. Filtrez les modèles par catégorie :
    • Chat : Conversation générale
    • Vision : Analyse d'images
    • Code : Programmation
    • Raisonnement : Raisonnement avancé
    • Gratuit : Modèles gratuits
  4. Sélectionnez un modèle avec affichage des coûts

Notifications

Créez des Profils de notification dans les Paramètres avec des URLs Apprise :

# Discord
discord://webhook_id/webhook_token

# Telegram
tgram://bot_token/chat_id

# Email
mailto://user:password@gmail.com

Utilisation

Ajouter un article à suivre

  1. Cliquez sur Ajouter un article
  2. Entrez l'URL de la page produit
  3. (Optionnel) Définissez un prix cible
  4. (Optionnel) Associez un profil de notification
  5. Enregistrez

Fonctionnement

  1. PriceFlow capture une image de la page produit
  2. L'IA analyse l'image pour extraire le prix et l'état du stock
  3. Les données sont enregistrées avec un score de confiance
  4. Si le prix atteint votre cible, vous êtes notifié

Structure du projet

Priceflow/
├── app/                    # Backend FastAPI
│   ├── routers/           # Endpoints API
│   ├── services/          # Services métier
│   └── models.py          # Modèles SQLAlchemy
├── frontend/              # Frontend React
│   ├── src/
│   │   ├── components/    # Composants React
│   │   ├── pages/         # Pages (Dashboard, Settings)
│   │   └── i18n/          # Traductions
│   └── public/            # Assets statiques
├── docker-compose.yml     # Configuration Docker
├── Dockerfile            # Image Docker
├── init.sql              # Script d'initialisation DB
└── .env.example          # Variables d'environnement

Personnalisation

Changer le favicon

Remplacez les fichiers dans /frontend/public/ :

  • favicon.ico (32x32 ou 64x64)
  • apple-touch-icon.png (180x180)
  • logo.png (logo principal)

Ajouter une langue

  1. Créez un fichier dans frontend/src/i18n/locales/
  2. Copiez la structure de fr.json
  3. Modifiez frontend/src/i18n/index.js

Développement

Lancer en mode développement

# Backend
cd app
uvicorn app.main:app --reload --port 8555

# Frontend
cd frontend
npm install
npm run dev

Migrations de base de données

# Créer une migration
alembic revision --autogenerate -m "description"

# Appliquer les migrations
alembic upgrade head

Licence

Ce projet est sous licence GNU General Public License v3.0 - voir le fichier LICENSE pour plus de détails.


Développé avec ❤️ pour le suivi de prix intelligent

S
Description
No description provided
Readme GPL-3.0
18 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 68%
JavaScript 30.8%
PowerShell 0.6%
CSS 0.2%
Dockerfile 0.2%