🚀 Système intelligent de veille technologique avec dispatch personnalisé d'articles basé sur embeddings.
EarlyTech scrape automatiquement des articles depuis différentes sources (arXiv, GitHub, HuggingFace, Medium, Le Monde), calcule leurs embeddings vectoriels, et dispatche intelligemment les articles aux utilisateurs en fonction de leurs mots-clés via similarité sémantique.
- 🔍 Multi-Source Scraping: arXiv, GitHub, HuggingFace, Medium, Le Monde
- 🧠 Embeddings Vectoriels: OpenAI text-embedding-3-small (1536 dimensions)
- 🎯 Matching Intelligent: Similarité cosinus via pgvector (PostgreSQL)
- 📨 Dispatch Automatique: Articles envoyés automatiquement aux utilisateurs (≥70% similarité)
- 🔑 Flexibilité des Keywords: "GPT 3", "GPT-3", "GPT3" matchent tous (embeddings vs strings)
- 🦀 API REST: Serveur Rust Axum avec 13 routes
- 📊 Statistiques: Tracking complet des deliveries et performances
EarlyTech/
├── scrapper/ # Python - Scraping & Embeddings & Dispatch
│ ├── scrapers/ # Scrapers multi-sources
│ ├── clustering/ # Clustering & scoring
│ ├── database.py # PostgreSQL + pgvector
│ ├── embeddings.py # OpenAI embeddings
│ ├── keyword_matcher.py # Moteur de matching
│ └── main.py # Orchestrateur principal
│
└── server/ # Rust - API REST
└── src/
├── routes.rs # 13 routes API
├── handlers.rs # Business logic
└── models.rs # Data models
┌─────────────────┐
│ Article Scrapé │ (arXiv, GitHub, etc.)
└────────┬────────┘
│
▼
┌─────────────────┐
│ Embedding Calculé│ OpenAI text-embedding-3-small
│ [1536 dimensions]│
└────────┬────────┘
│
▼
┌──────────────────────────────────┐
│ Comparé avec TOUS les mots-clés │ Cosine Similarity (pgvector)
│ │
│ "GPT" → 92% ✅ │
│ "transformers" → 85% ✅ │
│ "React" → 15% ❌ │
└────────┬─────────────────────────┘
│
▼
┌──────────────────┐
│ Dispatch aux Users│ Si similarité ≥ 70%
│ │
│ Article enregistré│
│ dans leurs feeds │
└──────────────────┘
Technologies:
- Scraper: Python 3.11+, SQLAlchemy, BeautifulSoup, OpenAI API
- Base de données: PostgreSQL 16+ avec pgvector
- API Server: Rust, Axum, SQLx, JWT
- Embeddings: OpenAI text-embedding-3-small
- Matching: Cosine similarity (threshold: 0.7)
- Python 3.11+
- PostgreSQL 16+ avec extension pgvector
- Rust 1.75+
- OpenAI API Key
git clone https://github.com/your-org/Earlytech.git
cd Earlytech# Installer PostgreSQL et pgvector
sudo apt install postgresql-16 postgresql-16-pgvector
# Créer la database
createdb earlytech
# Activer pgvector
psql earlytech -c "CREATE EXTENSION vector;"cd scrapper
# Installer les dépendances
pip install -r requirements.txt
# Configurer l'environnement
cp config.py.example config.py
# Éditer config.py avec vos credentials:
# - DATABASE_URL
# - OPENAI_API_KEYcd ../server
# Configurer l'environnement
cp .env.example .env
# Éditer .env:
# - DATABASE_URL
# - JWT_SECRET
# Compiler
cargo build --releasecd scrapper
python main.py watchLe scraper va :
- ✅ Scraper les articles toutes les X minutes
- ✅ Calculer les embeddings automatiquement
- ✅ Dispatcher les articles aux utilisateurs
- ✅ Logger tous les matchs:
📨 Article matched to 2 user(s)
cd server
cargo run --release
# Serveur sur http://localhost:3000cd scrapper
# Demo complète interactive (~2 min)
python demo_dispatch.py
# OU script automatique
./run_demo.sh
# Vérification rapide (~10 sec)
python quick_test_dispatch.py# Via CLI Python
cd scrapper
python examples_user_keywords.py setup
# OU via API REST
curl -X POST http://localhost:3000/auth/register \
-H "Content-Type: application/json" \
-d '{"name":"Alice","email":"alice@example.com","password":"secure123"}'
curl -X POST http://localhost:3000/users/<USER_ID>/keywords \
-H "Content-Type: application/json" \
-d '{"keyword":"GPT"}'# Via CLI
python examples_user_keywords.py feed <USER_ID>
# Via API
curl http://localhost:3000/users/<USER_ID>/feed# Stats utilisateur
curl http://localhost:3000/users/<USER_ID>/stats
# Stats globales
curl http://localhost:3000/delivery/stats
# Monitoring en temps réel
python monitor_dispatch.py monitorcd scrapper
# Tests unitaires (8 tests)
python tests_keyword_matcher.py
# Vérification rapide
python quick_test_dispatch.py
# Demo complète
python demo_dispatch.pycd server
# Vérification compilation
cargo check
# Compilation
cargo build
# Tests (à venir)
cargo test| Méthode | Route | Description |
|---|---|---|
| Articles | ||
| GET | /articles |
Liste des articles |
| GET | /articles/:id |
Détails d'un article |
| GET | /articles/count |
Nombre d'articles |
| Auth | ||
| POST | /auth/register |
Créer un compte |
| POST | /auth/login |
Se connecter (JWT) |
| Keywords | ||
| GET | /users/:id/keywords |
Liste des keywords |
| POST | /users/:id/keywords |
Ajouter un keyword |
| DELETE | /users/:user_id/keywords/:keyword_id |
Supprimer un keyword |
| Feed | ||
| GET | /users/:id/feed |
Feed personnalisé |
| Stats | ||
| GET | /users/:id/stats |
Stats utilisateur |
| GET | /delivery/stats |
Stats globales |
| GET | /delivery/recent |
Deliveries récentes |
Voir server/API.md pour la documentation complète avec exemples.
-- Utilisateurs & Keywords
users -- Comptes utilisateurs
user_keywords -- Mots-clés centralisés
user_keyword_embeddings -- Embeddings des keywords
-- Articles
articles -- Articles scrapés
article_embeddings -- Embeddings des articles
-- Dispatch
user_article_delivery -- Historique des dispatches
-- Clustering (optionnel)
article_clusters -- Clusters d'articles
entity_extractions -- Entités extraites# Setup users et keywords de démo
python examples_user_keywords.py setup
# Voir le feed d'un user
python examples_user_keywords.py feed <user_id>
# Tester le matching d'un article
python examples_user_keywords.py match <article_id>
# Stats d'un user
python examples_user_keywords.py stats <user_id>
# Monitoring temps réel
python monitor_dispatch.py monitor
# Stats globales
python monitor_dispatch.py stats
# 20 dernières deliveries
python monitor_dispatch.py recent# 1. Démarrer le scraper en mode watch
python main.py watch &
# 2. Créer des users avec keywords
python examples_user_keywords.py setup
# 3. Observer les dispatches dans les logs
# Output: 📨 Article matched to 2 user(s)
# 4. Voir le feed d'un user
python examples_user_keywords.py feed 1
# Output:
# ✉️ arxiv_2403.12345 - "GPT-5 Released" (92% match via 'gpt')
# ✉️ arxiv_2403.45678 - "Transformers Evolution" (88% match via 'transformers')- Scraping: ~100 articles/minute (multi-sources)
- Embeddings: ~50 articles/seconde (batch OpenAI)
- Matching: <100ms pour 1000 keywords (pgvector index)
- API: <10ms latence moyenne
- ✅ Mots de passe hashés avec Argon2
- ✅ JWT tokens (expiration 60 min)
- ✅ Protection SQL injection (paramètres liés)
- ✅ Validation des inputs
- ✅ HTTPS recommandé en production
psql earlytech -c "CREATE EXTENSION vector;"# Vérifier config.py
OPENAI_API_KEY = "sk-..."# Vérifier PostgreSQL
sudo systemctl status postgresql- Environment Variables: Ne jamais commit les API keys
- HTTPS: Utiliser un reverse proxy (nginx/traefik)
- Monitoring: Logs centralisés (ELK, Datadog)
- Backups: PostgreSQL automatiques quotidiens
- Rate Limiting: Protéger l'API
- Scaling: Connection pooling, caching Redis
You're invited to join this project ! Check out the contributing guide.
If you're interested in how the project is organized at a higher level, please contact the current project manager.
Developers
![]() [Developer's name] |
![]() [Developer's name] |
![]() [Developer's name] |
|---|
Manager
![]() [Manager's name] |
|---|
🚀 Don't hesitate to follow us on our different networks, and put a star 🌟 on
PoC'srepositories
Made with ❤️ by PoC

