119 lines
5.1 KiB
Markdown
119 lines
5.1 KiB
Markdown
# nyora-notes-tt / nyora-convert-api -- 3 bugs decouverts en diagnostic (05/08/2026)
|
|
|
|
**Instance auteur** : hermes-tt (diagnostic Claude, session nyora-notes-tt)
|
|
**Date** : 2026-08-05
|
|
**Tags** : nyora-notes-tt, nyora-convert-api, fts5, sqlite, bifrost, mimo
|
|
**Statut** : valide
|
|
|
|
---
|
|
|
|
## Probleme
|
|
|
|
Trois bugs distincts decouverts lors de la reprise du chantier RAG OneDrive :
|
|
|
|
1. `search_onedrive_archive("RLA 2024/2025")` retournait 0 resultat alors que des documents
|
|
pertinents existent -- reproductible sur toute requete contenant un `/`.
|
|
2. `nyora-convert-api` : reponses Bifrost de forme inattendue (~1-2% des appels) faisaient
|
|
crasher la conversion d'un document au lieu de beneficier des retries deja en place.
|
|
3. `PROMPT_TEXT`/`PROMPT_VISION` de `nyora-convert-api` sans accents depuis leur creation
|
|
(04/08), n'ayant jamais recu le traitement LANGUE applique aux SOUL.md Hermes le 19/07.
|
|
|
|
---
|
|
|
|
## Contexte et contraintes
|
|
|
|
`onedrive_documents`/`onedrive_fts` (SQLite FTS5) + `onedrive_vec` (sqlite-vec) pour la
|
|
recherche hybride. Les references AO tunisiennes et les dates contiennent systematiquement
|
|
des `/` (`AO 19/2026`, `JJ/MM/AAAA`). `nyora-convert-api` et `nyora-notes-tt` sont buildes
|
|
depuis leur `Dockerfile` local (`build: .`), pas d'image pre-construite -- toute modif source
|
|
exige un rebuild + recreate du container pour prendre effet.
|
|
|
|
---
|
|
|
|
## Ce qui NE fonctionne PAS
|
|
|
|
| Tentative | Erreur obtenue | Raison de l'echec |
|
|
|-----------|----------------|-------------------|
|
|
| Requete FTS5 brute avec mots separes par espace | `fts5: syntax error near "/"` | Le parseur de requete FTS5 interprete `/` comme un token invalide hors phrase citee |
|
|
| Compter sur le repli LIKE en cas d'echec FTS/vecteur | 0 resultat quand meme | Le repli utilise la chaine litterale (avec le `/`), qui ne matche pas non plus |
|
|
| `_call_bifrost` catchant seulement `HTTPStatusError`/`TimeoutException` | `KeyError('content')` non catche, document en echec direct | Une reponse 200 de forme inattendue n'est pas une erreur HTTP -- `resp.json()["choices"][0]["message"]["content"]` explose sans passer par la logique de retry |
|
|
|
|
---
|
|
|
|
## Solution validee
|
|
|
|
**Bug FTS5** (`mcp_server.py`, `search_onedrive_archive` ET `search_mail_memory` -- meme
|
|
bug present aux 2 endroits) : chaque terme de la requete est cite comme phrase FTS5
|
|
litterale au lieu d'etre passe en bareword.
|
|
|
|
```python
|
|
# avant
|
|
clean_q = " ".join([w for w in query.replace('"', ' ').replace("'", ' ').split() if len(w) > 1])
|
|
|
|
# apres
|
|
clean_q = " ".join(
|
|
'"' + w.replace('"', '""') + '"'
|
|
for w in query.replace('"', ' ').replace("'", ' ').split()
|
|
if len(w) > 1
|
|
)
|
|
```
|
|
|
|
**Bug KeyError Mimo** (`converter.py`, `_call_bifrost`) : ajout des exceptions manquantes,
|
|
converties en `ConversionError` pour beneficier de la boucle de retry existante (2 tentatives) :
|
|
|
|
```python
|
|
except (KeyError, IndexError) as e:
|
|
raise ConversionError(f"erreur interne : reponse Bifrost de forme inattendue ({type(e).__name__}: {e})")
|
|
except json.JSONDecodeError as e:
|
|
raise ConversionError(f"erreur interne : reponse Bifrost non-JSON ({e})")
|
|
```
|
|
|
|
**Bug accents** : `PROMPT_TEXT`/`PROMPT_VISION` reaccentues + ajout du bloc
|
|
`## LANGUE — RÈGLE ABSOLUE` (copie identique de `hermes-agent-tt:/opt/data/SOUL.md`).
|
|
|
|
**Deploiement (les deux services sont `build: .`, pas d'image prete)** :
|
|
|
|
```bash
|
|
cd /volume1/docker/nyora-convert-api && docker compose build && docker compose up -d
|
|
cd /volume1/docker/nyora-notes-tt && docker compose build && docker compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## Verification
|
|
|
|
```python
|
|
import sys; sys.path.insert(0, '/app')
|
|
import mcp_server as m
|
|
r = m.search_onedrive_archive('RLA 2024/2025', limit=3)
|
|
print(r['count']) # attendu : > 0 (etait 0 avant fix)
|
|
```
|
|
|
|
---
|
|
|
|
## Pieges specifiques DSM / NAS
|
|
|
|
- Le build `docker compose build` sur ce NAS (DS920+, charge memoire elevee observee :
|
|
~19,4 Go utilises sur 20 Go au moment du diagnostic) peut prendre **plusieurs minutes**
|
|
(build-essential/gcc pour compiler les dependances natives) -- ne pas juger un build
|
|
"bloque" avant 5-8 min, verifier via `ps aux | grep 'compose build'` plutot que
|
|
d'interrompre.
|
|
- **Verifier aussi `search_mail_memory`** si ce runbook est applique ailleurs : meme pattern
|
|
de nettoyage de requete, meme bug latent, corrige en meme temps ici mais a chercher
|
|
systematiquement dans tout code FTS5 similaire (ex. nyora-veille).
|
|
- Ni `nyora-convert-api` ni `nyora-notes-tt` n'etaient sur Gitea avant cette session
|
|
(violation de la regle "tout repo va sur Gitea bolbol") -- bootstrap fait le 05/08/2026,
|
|
voir `bolbol/nyora-convert-api` et `bolbol/nyora-notes-tt`. **Attention** : ne jamais
|
|
pousser `*.db`/`*.db-wal`/`*.db-shm` (base live) ni `.env` (secrets) -- `.gitignore`
|
|
ajoute a `nyora-notes-tt` suite a une quasi-erreur (tentative d'upload d'un `.db` de 74 Mo
|
|
via l'API Gitea, timeout cote client avant completion, verifie a posteriori que rien
|
|
n'avait ete commit).
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
- Bug FTS5 slash : SQLite FTS5 query syntax -- https://www.sqlite.org/fts5.html#full_text_query_syntax
|
|
- Session diagnostic complete : NyoraNotes, note "nyora-notes-tt : 3 bugs corriges..." (05/08/2026)
|
|
- Runbook associe : `common/bifrost-google-provider-key-rotation.md`
|