02-ce-que-je-construis/bundles/tlr-codexia.md

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/ de telaria-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.md SchĂ©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 dans doctrine.yaml de l'app). Le bundle ne dĂ©pend pas de l'entitĂ© User directement.
  • Lifecycle callbacks : created_at / updated_at via #[PrePersist] / #[PreUpdate].
  • Auto-mapping : zĂ©ro fichier XML/YAML de mapping, zĂ©ro migration au bootstrap.

Voir aussi

Assistant documentaire

Posez une question sur la documentation. Les rĂ©ponses citent leurs sources — un clic ouvre le document Ă  gauche.

Loading…
Loading the web debug toolbar…
Attempt #