bibliotheque_documentation.py — recherche et nettoyage de notices

Bienvenue sur CFTPfr.fr Forums bibliotheque_documentation.py — recherche et nettoyage de notices

  • Ce sujet est vide.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Messages
  • #287
    Mario Da Conceicao
    Maître des clés

    Nouveau composant du 01/08/2026 — "bibliothèque de documentation". Exemple d’usage : tu mentionnes un variateur avec son modèle précis, MIRA cherche la doc officielle, puis soit propose un lien, soit la télécharge et ne garde que les pages utiles (elle jette les pages de couverture, mentions légales, pubs, index…). S’appuie sur mode_reseau.py (le "2e cerveau") et alimente gestionnaire_specialites.py — toujours en attente de ta validation avant d’être active.

    Principe

    1. Recherche la documentation d’un produit/modèle précis (via le réseau, si disponible)
    2. Décide : proposer un simple lien si le document est trouvé en ligne facilement, ou le télécharger si un accès hors-ligne durable est préférable
    3. Si téléchargement : nettoie le contenu en ne gardant que les passages réellement utiles (filtre les pages de couverture, mentions légales, publicités, sommaires vides…)
    4. Prépare tout ça comme une nouvelle spécialité — jamais active sans ta validation, comme toujours
    import re
    from pathlib import Path
    from datetime import datetime
    
    from gestionnaire_specialites import GestionnaireSpecialites, valider_nom_specialite
    from mode_reseau import ModeReseau
    
    class BibliothequeDocumentation:
        """
        Recherche, télécharge (si besoin) et nettoie la documentation d'un
        produit précis (ex: un variateur, un modèle exact), pour en faire une
        nouvelle spécialité candidate. Ne fait jamais rien d'actif sans
        validation — s'appuie sur le garde-fou déjà en place.
        """
    
        def __init__(self):
            self.reseau = ModeReseau()
            self.specialites = GestionnaireSpecialites()
    
        def rechercher_documentation(self, produit, modele, moteur_recherche=None):
            """
            Cherche la documentation officielle d'un produit/modèle précis.
            moteur_recherche : fonction injectée (requête → liste de résultats),
            à brancher une fois une vraie source de recherche choisie. Permet
            de tester le reste du système sans dépendre d'un service précis.
            """
            if not self.reseau.disponible():
                return {"statut": "hors_ligne", "message": "Pas de connexion — recherche impossible pour le moment."}
    
            if moteur_recherche is None:
                return {"statut": "a_implementer", "message": "Aucune source de recherche branchée pour l'instant."}
    
            requete = f"{produit} {modele} documentation manuel PDF"
            resultats = moteur_recherche(requete)
            return {"statut": "resultats", "resultats": resultats}
    
        def _nettoyer_texte(self, texte_brut, mots_cles):
            """
            Filtre grossièrement le contenu utile : découpe en blocs (par
            double saut de ligne, comme une page/section), écarte les blocs
            trop courts (souvent des pages de garde, sommaires vides,
            mentions légales) ou qui ne contiennent aucun mot-clé du produit
            recherché.
            """
            blocs = [b.strip() for b in texte_brut.split("\n\n") if b.strip()]
            blocs_utiles = []
            for bloc in blocs:
                if len(bloc) < 100:
                    continue  # trop court pour être un vrai contenu utile
                bloc_normalise = bloc.lower()
                if any(mot.lower() in bloc_normalise for mot in mots_cles):
                    blocs_utiles.append(bloc)
            return "\n\n".join(blocs_utiles) if blocs_utiles else texte_brut
    
        def preparer_specialite_produit(self, produit, modele, texte_documentation, lien_source=None):
            """
            Prépare une nouvelle spécialité à partir d'une documentation
            trouvée (nettoyée si c'est un téléchargement). Passe toujours par
            le garde-fou existant : rien n'est actif tant que ce n'est pas
            validé.
            """
            try:
                nom = valider_nom_specialite(f"{produit}-{modele}")
            except ValueError as e:
                return f"Refusé : {e}"
    
            texte_nettoye = self._nettoyer_texte(texte_documentation, [produit, modele])
    
            description = f"Documentation de {produit} (modèle {modele})"
            if lien_source:
                description += f" — source : {lien_source}"
    
            resultat = self.specialites.proposer_nouvelle_specialite(
                nom=nom,
                description=description,
                documents_sources=[lien_source] if lien_source else []
            )
    
            # Écrit le contenu nettoyé dans le dossier de la proposition
            dossier = Path(self.specialites.__class__.__module__).resolve().parent / "telechargements" / nom
            dossier_documents = dossier / "documents"
            dossier_documents.mkdir(parents=True, exist_ok=True)
            (dossier_documents / "notice.txt").write_text(texte_nettoye, encoding="utf-8")
    
            return resultat

    Ce que ça permet concrètement, avec ton exemple

    Tu dis "j’ai un variateur, modèle XYZ-123". MIRA cherche, trouve la doc, la nettoie (garde les pages avec du vrai contenu technique sur ce modèle, jette le reste), et te dit : "J’ai préparé une spécialité ‘variateur-xyz-123’, prête à valider." Rien n’est utilisable tant que tu n’as pas dit oui.

    Ce qui reste à faire

    Choisir la source de recherche réelle (même chantier que pour mode_reseau.py) — les deux se brancheront ensemble une fois décidé.

Affichage de 1 message (sur 1 au total)
  • Vous devez être connecté pour répondre à ce sujet.
Retour en haut