tlr-codexia â bundle cĆur Telaria
tlr-codexia est le bundle applicatif central de l'écosystÚme Telaria. Il regroupe quatre domaines :
| Domaine | Responsabilité |
|---|---|
| Veille | Pipeline automatisĂ© RSS â rĂ©sumĂ© Claude â proposition humaine |
| Chat | Chatbot RAG (configuration singleton) |
| Métriques | Suivi de consommation et coûts API Anthropic |
| Paramétrage | Store clé/valeur générique (AppSetting) |
Code : domaine veille in-app
src/Veille/detelaria-app(pas encore extrait en bundle autonome). Extraction (telaria/veille-bundle) si un second projet en a besoin â pas avant. Spec fonctionnelle :specs/ia-veille.mdSchĂ©ma BDD complet :../bdd/schema.md
Flux d'exĂ©cution â Veille
[VeilleSchedule] ââ cadence 15 min âââ¶ dispatch [RunVeilleCycleMessage]
â
worker scheduler_veille
â
[RunVeilleCycleHandler]
Pour chaque VeilleSource active :
ââ SourceFetcher fetch flux RSS/Atom
ââ Deduplicator filtre url OU content_hash
ââ dispatch [ProcessVeilleItemMessage] ĂN
â
worker async
â
[ProcessVeilleItemHandler]
ââ ArticleFetcher fetch DOM article
ââ ClassifierInterface score mots-clĂ©s
ââ Summarizer Claude Haiku (rĂ©sumĂ© + source + lien)
ââ VeilleWriter var/veille/proposals/*.md
ââ VeilleAttempt journal fetch+LLM persistĂ©
ââ VeilleItem.status â proposed
Workers Ă maintenir actifs :
php bin/console messenger:consume scheduler_veille # déclencheur Scheduler php bin/console messenger:consume async # traitement items # ou via systemd : sudo systemctl status telaria-veille-scheduler sudo systemctl status telaria-messenger-async
â ïž PiĂšge dĂ©ploiement. Les workers ne rechargent pas le code PHP au
git pull. Un dĂ©ploiement sans redĂ©marrage des workers laisse la veille tourner sur l'ancien code â vĂ©cu : 12 jours sans token, 5 500 items en backlog (incident 2026-06-02). Toujours redĂ©marrer aprĂšs un dĂ©ploiement. Voir runbook.md.
Entités
veille_source â Sources RSS/Atom
Administrée via /admin/veille/sources. Pilote la liste des flux collectés.
| Colonne | Type | Notes |
|---|---|---|
id |
INT AUTO_INCREMENT | PK |
slug |
VARCHAR(64) UNIQUE | clé stable |
name |
VARCHAR(128) | libellé affiché |
url |
VARCHAR(512) | URL du flux |
type |
VARCHAR(16) | rss | atom | html |
schedule |
VARCHAR(32) | interval ISO 8601 (informatif V1, cadence globale 15 min) |
default_theme |
VARCHAR(64) | thÚme par défaut (ia) |
is_active |
BOOL | interrupteur humain |
standby |
BOOL | pause automatique aprÚs N échecs (distinct de is_active) |
standby_since |
DATETIME_IMMUTABLE | nullable |
standby_reason |
VARCHAR(255) | nullable |
consecutive_failures |
INT | remis Ă 0 au succĂšs ou au lever de standby |
editorial_description |
TEXT | nullable |
created_at / updated_at |
DATETIME_IMMUTABLE |
Standby automatique : seuil VEILLE_SOURCE_STANDBY_THRESHOLD (dĂ©faut 3 Ă©checs consĂ©cutifs). Lever via le back-office â rĂ©initialise le compteur. standby â is_active : ne pas confondre.
veille_item â Items collectĂ©s
Journal de déduplication + cycle de vie de chaque article.
| Colonne | Type | Notes |
|---|---|---|
id |
INT AUTO_INCREMENT | PK |
source_id |
INT FK | â veille_source.id CASCADE DELETE |
url |
VARCHAR(768) | INDEX |
content_hash |
VARCHAR(64) | SHA-256 canonisĂ© â INDEX (dĂ©dup si URL change) |
title |
VARCHAR(512) | nullable |
published_at |
DATETIME_IMMUTABLE | nullable (pubDate flux) |
created_at |
DATETIME_IMMUTABLE | moment d'ingestion â INDEX |
processed_at |
DATETIME_IMMUTABLE | nullable â moment traitement LLM |
theme |
VARCHAR(64) | thÚme classifié |
status |
VARCHAR(16) | pending | proposed | accepted | rejected | failed |
raw_content |
TEXT | nullable â contenu brut extrait |
summary |
TEXT | nullable â rĂ©sumĂ© Claude |
title_fr |
VARCHAR(512) | nullable â titre FR extrait du rĂ©sumĂ© |
relevance |
FLOAT | nullable â score 0..1 |
model_used |
VARCHAR(64) | nullable â ex. claude-haiku-4-5 |
proposal_path |
VARCHAR(512) | nullable â chemin fichier proposition |
error_message |
TEXT | nullable â diagnostic si status=failed |
Cycle de vie : pending (collectĂ©) â proposed (rĂ©sumĂ© Claude OK) â accepted | rejected (humain) | failed (erreur pipeline).
veille_attempt â Journal tentatives
Trace chaque passage du pipeline sur un item (fetch + LLM). Permet le diagnostic sans logs.
| Colonne | Type | Notes |
|---|---|---|
id |
INT AUTO_INCREMENT | PK |
item_id |
INT FK | â veille_item.id CASCADE DELETE â INDEX |
attempted_at |
DATETIME_IMMUTABLE | INDEX |
outcome |
VARCHAR(16) | success | failed |
stage_reached |
VARCHAR(16) | fetch | classify | summarize | write | done |
duration_ms |
INT | nullable |
fetch_attempted |
BOOL | |
fetch_outcome |
VARCHAR(32) | nullable |
fetch_http_status |
INT | nullable |
fetch_bytes / fetch_extracted_chars |
INT | nullable |
fetch_error |
TEXT | nullable |
llm_model |
VARCHAR(64) | nullable |
llm_request |
TEXT | nullable â prompt envoyĂ© |
llm_response_raw |
TEXT | nullable â rĂ©ponse brute |
llm_http_status |
INT | nullable |
tokens_input / tokens_output |
INT | nullable |
error_class |
VARCHAR(255) | nullable â classe PHP exception |
error_message |
TEXT | nullable |
Usage diagnostic :
-- Tokens consommés par jour (vérifie que la veille tourne) SELECT DATE(attempted_at) as day, COUNT(*) as attempts, SUM(CASE WHEN outcome='success' THEN 1 ELSE 0 END) as success, SUM(tokens_input) as tok_in, SUM(tokens_output) as tok_out FROM veille_attempt WHERE attempted_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY day ORDER BY day DESC;
veille_read â Ătat de lecture
Absence de ligne = non lu. Contrainte UNIQUE(user_id, item_id).
app_setting â ParamĂ©trage clĂ©/valeur
Singleton par clé. PK naturelle (name VARCHAR 128, pas d'auto-increment).
chat_config â Configuration chat public
Singleton (une seule ligne). Paramétrage administré en BO.
| Colonne | Usage |
|---|---|
model |
modĂšle Claude (ex. claude-haiku-4-5) |
top_k |
nb documents RAG (1â20) |
score_threshold |
seuil cosinus (0â1) |
temperature |
tempĂ©rature LLM (0â1) |
max_tokens |
limite tokens sortants (256â4096) |
history_turns |
tours de conversation mĂ©morisĂ©s (0â20) |
metrics_usage â Usage tokens dimensionnel
Alimenté depuis l'Admin API Anthropic. Granularité : (jour, modÚle, clé API, service tier).
Contrainte : UNIQUE(day, model, api_key_id, service_tier).
metrics_daily â Snapshot quotidien
Agrégé org-wide (tokens + coûts). Contrainte : UNIQUE(day, label).
metrics_alert â Alertes de coĂ»t
Seuil en USD, période daily | monthly, anti-spam (1 mail/franchissement/période).
metrics_api_key â Cache clĂ©s API Anthropic
PK naturelle = id Anthropic (VARCHAR 64). Stocke id â nom lisible.
Commandes CLI
# Indexation RAG (source-of-truth : telaria-doc) php bin/console app:rag:ingest # Statistiques RAG (nb documents, chunks, état index) php bin/console app:rag:stats # Synchronisation métriques depuis Admin API Anthropic php bin/console app:sync:metrics # Consommation workers (lancer manuellement en dev) php bin/console messenger:consume scheduler_veille --time-limit=300 php bin/console messenger:consume async --time-limit=300
Dépannage
Veille silencieuse â 0 token, 0 rĂ©sumĂ©
SymptĂŽme : API Anthropic â 0$ depuis N jours, items restent en pending.
Diagnostic :
# 1. Ătat des workers systemctl is-active telaria-veille-scheduler systemctl is-active telaria-messenger-async journalctl -u telaria-messenger-async -n 30 # 2. Tokens en base (si workers OK mais 0 rĂ©sumĂ©) # â requĂȘte SQL veille_attempt ci-dessus # 3. Items pending en attente SELECT COUNT(*) FROM veille_item WHERE status='pending';
Causes et remĂšdes :
| Cause | RemĂšde |
|---|---|
| Workers arrĂȘtĂ©s (crash silencieux) | sudo systemctl restart telaria-messenger-async telaria-veille-scheduler |
| Workers sur ancien code aprĂšs dĂ©ploiement | Idem â redĂ©marrer aprĂšs chaque git pull |
| Toutes les sources en standby | Lever le standby dans /admin/veille/sources |
| Erreur Claude (quota, clé invalide) | Vérifier llm_http_status dans veille_attempt + metrics_api_key |
| Backlog Ă©levĂ© | Normal si workers viennent de reprendre â attendre la rĂ©sorption (5 500 items â quelques heures) |
503 aprĂšs upgrade PHP
Vhosts manuels ont php8.X-fpm.sock hardcodé. Voir runbook.md §Incidents.
RAG vide â 0 document
Vérifier que telaria-embeddings tourne (systemctl is-active telaria-embeddings) puis relancer php bin/console app:rag:ingest. Si le service crashe, reconstruire le venv Python (voir vps/09-ia-embeddings.md).
Patterns Doctrine notables
- resolve_target_entities :
VeilleReaderInterfaceâApp\Entity\User(rĂ©solu dansdoctrine.yamlde l'app). Le bundle ne dĂ©pend pas de l'entitĂ©Userdirectement. - Lifecycle callbacks :
created_at/updated_atvia#[PrePersist]/#[PreUpdate]. - Auto-mapping : zéro fichier XML/YAML de mapping, zéro migration au bootstrap.
Voir aussi
specs/ia-veille.mdâ spĂ©cification fonctionnelle complĂštespecs/ia-veille-sources.mdâ catalogue des flux V1../bdd/schema.mdâ schĂ©ma BDD complet (types exacts)../guides/runbook.mdâ dĂ©ploiement et incidents../tutos/ia/veille-automatisee-symfony.mdâ tuto Scheduler + Messenger../tutos/ia/rag-bout-en-bout.mdâ pipeline RAG complet