# Corrections Interface Web et Sauvegarde Base de Données

## Date: 2026-02-12

## Problèmes Corrigés

### 1. ❌ Erreur de sauvegarde en base de données (NOT NULL constraint)

**Symptôme**: Les codes n'étaient pas sauvegardés en base car les champs `model_name`, `model_digest`, et `prompt_version` étaient NULL.

**Cause**: La méthode `_save_code()` ne recevait pas les informations de version du modèle.

**Solution**: 
- Modifié `_save_codes_to_database()` pour extraire les informations de version depuis `coding_proposal.model_version`
- Ajouté les paramètres `model_name`, `model_digest`, `prompt_version` à la méthode `_save_code()`
- Passé ces valeurs lors de la création de l'objet `CodeDB`

**Fichier**: `src/pipeline_mco_pmsi/pipeline.py`

```python
# Avant
def _save_code(self, stay_db_id: int, code, code_type: str) -> None:
    code_db = CodeDB(
        stay_id=stay_db_id,
        code=code.code,
        label=code.label,
        type=code_type,
        confidence=code.confidence,
        reasoning=code.reasoning,
        referentiel_version=code.referentiel_version,
        status="proposed"
    )

# Après
def _save_code(self, stay_db_id: int, code, code_type: str, 
               model_name: str, model_digest: str, prompt_version: str) -> None:
    code_db = CodeDB(
        stay_id=stay_db_id,
        code=code.code,
        label=code.label,
        type=code_type,
        confidence=code.confidence,
        reasoning=code.reasoning,
        referentiel_version=code.referentiel_version,
        status="proposed",
        model_name=model_name,
        model_digest=model_digest,
        prompt_version=prompt_version
    )
```

### 2. ❌ Extraction CCAM retournait "UNKNOWN"

**Symptôme**: Les codes CCAM n'étaient pas correctement extraits des chunks, retournant "UNKNOWN" au lieu du code réel.

**Cause**: Le regex ne gérait pas le format markdown utilisé dans les chunks CCAM (`### YYYY001` suivi de `**Description**: ...`).

**Solution**: 
- Amélioré la méthode `_extract_code_and_label()` dans `rag_engine.py`
- Ajouté plusieurs patterns de détection:
  - Titres markdown (`### YYYY001`)
  - Format classique (`YYYY001 Libellé`)
  - Extensions ATIH (`YYYY001+ABC`)
  - Recherche flexible dans tout le texte

**Fichier**: `src/pipeline_mco_pmsi/rag/rag_engine.py`

```python
# Nouveau pattern pour titres markdown
pattern_title = re.compile(r"^###\s+([A-Z]{4}[0-9]{3}(?:\+[A-Z0-9]{3})?)(?:\s|$)")

# Pattern flexible pour recherche dans tout le texte
pattern_anywhere = re.compile(r"([A-Z]{4}[0-9]{3}(?:\+[A-Z0-9]{3})?)")
```

## Résultats

### ✅ Codes sauvegardés en base

```bash
✅ Codes sauvegardés: 56
  - dp: F05.0 - Délirium non surajouté à une démence, ainsi décrit
  - dr: K80 - Cholélithiase
  - das: S00 - Lésion traumatique superficielle de la tête
  - das: K73.8 - Autres hépatites chroniques, non classées ailleurs
  - ccam: HMCC003 - Cholécystogastrostomie ou cholécystoduodénostomie, par cœlioscopie
```

### ✅ Interface web fonctionnelle

L'endpoint API `/stays/15_23096332/coding-proposal` retourne maintenant correctement:
- Le DP avec preuves et justification
- Le DR avec preuves et justification
- Les DAS (25 codes)
- Les CCAM (29 actes)
- Les scores de confiance
- Les raisonnements du codeur

**URL**: http://localhost:8001/stays/15_23096332/coding-proposal

## Problèmes Restants

### ⚠️ Qualité du codage

Le codage proposé n'est pas optimal:
- **DP proposé**: F05.0 (Délirium) au lieu de K80/K81 (Cholécystite)
- **DAS absurdes**: S00 (Lésion tête), K73.8 (Hépatite), codes non pertinents
- **Cause probable**: 
  - Extraction de faits cliniques incorrecte
  - Recherche RAG retournant des codes non pertinents
  - Logique de sélection du DP à améliorer

### ⚠️ Mémoire GPU saturée

Le cross-encoder pour le reranking échoue avec "CUDA out of memory":
- GPU saturé par d'autres processus (6.72 GiB utilisés par process 3600706)
- Le fallback CPU fonctionne mais est plus lent
- **Solution temporaire**: Le code gère l'erreur et continue sans reranking
- **Solution permanente**: Libérer la mémoire GPU ou forcer l'utilisation du CPU

## Prochaines Étapes

1. **Améliorer la qualité du codage**:
   - Revoir l'extraction des faits cliniques
   - Améliorer la recherche RAG (meilleurs prompts, meilleurs embeddings)
   - Affiner la logique de sélection du DP

2. **Optimiser l'utilisation GPU**:
   - Identifier et arrêter les processus GPU inutiles
   - Forcer le cross-encoder sur CPU de manière plus robuste
   - Considérer un modèle cross-encoder plus léger

3. **Tester l'interface web complète**:
   - Vérifier l'affichage dans le navigateur
   - Tester les fonctionnalités de correction
   - Tester la validation des dossiers

## Commandes de Test

```bash
# Traiter le séjour complet
python process_sejour_15_complet.py

# Vérifier les codes en base
python -c "
from pipeline_mco_pmsi.database.base import get_engine, get_session
from pipeline_mco_pmsi.database.models import StayDB, CodeDB

engine = get_engine('sqlite:///pipeline_mco_pmsi.db')
with get_session(engine) as session:
    stay = session.query(StayDB).filter(StayDB.stay_id == '15_23096332').first()
    codes = session.query(CodeDB).filter(CodeDB.stay_id == stay.id, CodeDB.status == 'proposed').all()
    print(f'Codes: {len(codes)}')
"

# Tester l'API
curl http://localhost:8001/stays/15_23096332/coding-proposal | python -m json.tool

# Démarrer l'interface web
python -m uvicorn pipeline_mco_pmsi.api.tim_api:app --host 0.0.0.0 --port 8001
```
