Objectif : développer un agent avec LangGraph qui effectue une veille technologique à l'aide de flux RSS, Reddit et Bluesky
Process déroulé :
- Lit un OPML contenant les flux RSS / Atom ou des subs Reddit / comptes Bluesky
- Lit les flux RSS / Atom ou subs Reddit / flux Bluesky pour obtenir leur contenu
- Indexe le contenu obtenu à l'aide d'une base vectorielle
- Recherche dans le contenu de mots clés (vectorisés) prédéfinis
- Les articles trouvés sur un seuil prédéfini remontent (scoring avec similartié cosinus)
- Résume les articles filtrés
- Envoi l'ensemble par mail
Une page web est également disponible pour lister l'historique des résumés.
Objective: Develop an agent using LangGraph to perform tech watch using RSS feeds, Reddit channels and Blueky profils.
Process
- Reads an OPML file containing RSS/Atom feeds or a Json file pour Reddit / Bluesky
- Fetches and parses the sources feed content
- Indexes the content using a vector database
- Searches for predefined (vectorized) keywords in the content
- Retrieves articles that meet a predefined similarity threshold (cosine similarity scoring)
- Summarizes the filtered articles
- Sends the results by email
A web site is available to display the summaries history.
- init uv & création
$ uv venv
$ source .venv/Scripts/activate
$ uv sync --dev- environnement déjà existant & cloné
$ source .venv/Scripts/activate # ou source .venv/scripts/activate
$ uv sync --dev
/!\ torch avec CUDA 118 est installé pour une utilisation du GPU pour les embeddings, voir selon la config. de la station de travail (Windows / Linux ou Mac) /!\
- Ollama doit être lancé avant le cli, par défaut, il prend le modèle LLM_MODEL défini dans le
.env
$ docker compose -f ollama.yml up -dLe modèle est chargé au moment du lancement du container.
- Fichier OPML de flux RSS
Le fichier my.opml est conseillé, par défaut il prendra une liste en dur de 3 flux RSS
- Copier le .env.example sur .env puis le configurer : RSS, REDDIT, BLUESKY
les 3 clés suivantes permettent de désactiver les fetchers selon le service
RSS_FETCH=true REDDIT_FETCH=true BLUESKY_FETCH=true
# Configuration LLM et limite inférence
LLM_MODEL=mistral
MAX_TOKENS_GENERATE=200
# Configuration indexation et recherche
FILTER_KEYWORDS=ai agent,genai,artificial intelligence,python,django,cybersecurité,cve
THRESHOLD_SEMANTIC_SEARCH=0.3
LIMIT_ARTICLES_TO_RESUME=10
# Configuration fetch RSS
OPML_FILE=my.opml
MAX_DAYS=20
# Configuration SMTP pour l'envoi du mail de la veille techno
SMTP_SERVER=smtp.domain.ntld
SMTP_PORT=587
SMTP_LOGIN=login
SMTP_PASSWORD=your_password
[email protected]
[email protected]
Se résume à un seul script à lancer
$ python -m app [--debug]$ pytest tests
$ pytest tests/test_sources_ponderation.py -v
$ pytest tests/test_send_articles_email.py -v$ uvicorn web:app --loop asyncio [--reload]avec multi workers
$ uvicorn web:app --workers $(nproc) --loop asyncio [--reload]--loop asyncio dépend de l'environnement d'exécution
L'application est accessible sur http://127.0.0.1:8000/
Si Google gmail est utilisé pour envoyé le mail des résumé, un mot de passe application doit être créé
Sinon le login / mot de passe de [email protected] provoquera une erreur du type
smtplib.SMTPAuthenticationError: (534, b'5.7.9 Application-specific password required. For more information, go to\n5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor ffacd0b85a97d-3e8c7375fb7sm2117460f8f.14 - gsmtp')
Configurer un mot de passe application : https://myaccount.google.com/apppasswords
Ce mot de passe application sera mis dans la variable SMTP_PASSWORD du .env
Pris en SVG sur https://fontawesome.com/search?q=reddit&o=r
Les branches doivent suivre le format :
feat/pour une nouvelle fonctionnalité.fix/pour une correction de bug.docs/pour de la documentation.refactor/pour du refactoring.test/pour des tests.chore/pour des tâches de maintenance.
Exemple : feat/implement-source-weights
voir README
