Génération automatique de fiches de réunion, de résumés et de plans d’action directement dans Odoo.
Voici une implémentation clé en main pour la connexion Odoo Knowledge ↔ GPT (plugin interne) afin de générer automatiquement fiches de réunion, résumés et plans d’action directement dans Odoo.
🎯 Objectif
À chaque réunion (calendrier/visio) :
- récupérer l’audio/texte,
- générer une fiche Knowledge normalisée (résumé + décisions + actions),
- créer automatiquement tâches/OKR et liens docs dans Odoo,
- versionner et notifier les participants.
🧱 Architecture (vue rapide)
Sources (Calendar/Meet/Teams/Zoom + Plaud/Whisper) ↓ Webhook iCal / Drive / Email [ Ingestion n8n ] ↓ (fichiers + métadonnées) [ GPT Plugin Interne ] — prompts normalisés + garde-fous ↓ (JSON structuré) [ Odoo Connector ] - Knowledge: article + versioning - Project: tâches + sous-tâches - HR: participants, minutes sign-off - Documents: pièces jointes ↓ [ Notifications ] (Discuss/Email/Teams) + KPIs (Odoo BI)
🔌 Intégrations & briques
| Domaine | Outil | Rôle | Notes d’implémentation |
|---|---|---|---|
| Ingestion | n8n | Récup. fichier/audio + méta | Triggers: Calendar, Drive/Sharepoint, Email alias “minutes@company.com” |
| Transcription | Whisper v3 / Plaud Cloud | .wav → .txt/.srt | Stéréo + diarization si possible |
| LLM | GPT (plugin interne) | Résumés structurés + actions | Few-shot + schémas JSON stricts |
| ERP | Odoo (Knowledge, Project, HR, Documents, Discuss) | Stockage, tâches, workflows | API RPC/JSON ou module Python |
| Sécurité | JWT + IP allowlist | Auth inter-services | Tokens rotatifs n8n→Odoo/LLM |
| Traçabilité | Odoo Documents + Logs | Preuve, RGPD | Conserver audio + version IA |
🗂️ Modèles de données (Odoo Studio/tech)
Knowledge (model knowledge.article)
Champs proposés (ajout via Studio) :
- x_meeting_date (Datetime)
- x_meeting_participants (Many2many res.partner)
- x_summary (Html/Text)
- x_decisions (Html/Text)
- x_action_items_json (Text, JSON validé)
- x_confidence_score (Float)
- x_source_doc (Many2one documents.document)
- x_llm_prompt_ver (Char)
- x_llm_model (Char)
Project / Tasks
- Tâche par action item (model project.task)
- Champs personnalisés : x_due_risk (Selection: low/med/high), x_meeting_ref (Many2one knowledge.article)
Documents
- Dossier “Meetings/YYYY/MM”
- Rattachement du .wav/.mp3, transcript .txt/.srt, et PDF final.
🧭 Flux opérationnel (n8n)
-
Trigger :
- Google Calendar webhook (évènement terminé) ou réception fichier audio dans Drive/SharePoint ou email vers minutes@....
- Transcription : Whisper → .txt + diarization (si disponible).
-
Appel GPT (plugin interne) : prompt structuré (voir plus bas) → JSON :
{ "title": "Réunion Kickoff Projet X (12/11)", "summary_md": "…", "decisions_md": "- Décision 1 …", "actions": [ {"title":"Configurer Odoo Project","assignee_email":"a@ex.com","due_date":"2025-11-20","priority":"high","tags":["Odoo","Setup"]}, {"title":"Former l’équipe support","assignee_email":"b@ex.com","due_date":"2025-11-22","priority":"medium","tags":["HR","Training"]} ], "risks": ["Dépendance API…"], "confidence": 0.88 }
-
Odoo Connector :
- Créer article Knowledge (titre, résumé, décisions, JSON actions, pièces jointes).
- Créer tasks dans le projet mappé (détecté par tags / nom).
- Assigner via assignee_email → res.users/res.partner.
- Lier les tâches à l’article (backlink).
-
Notifications :
- mail.message (Discuss) aux participants ; résumé + 1-clic “J’acquitte”.
- Optionnel : push Teams/Slack.
-
Versioning :
- Sauvegarder le prompt, model, hash transcript dans x_… pour audit.
🧩 Prompt “plugin interne GPT” (extrait)
SYSTEM: Tu es l’assistant “MinutesGen”. Tu convertis une transcription brute en: - Titre - Résumé (Markdown, 10 lignes max) - Décisions (Markdown) - Liste d’actions (tableau JSON strict) - Risques (liste) - Confidence (0..1) Contraintes: - Pas de données personnelles non présentes dans la transcription. - Dates ISO (YYYY-MM-DD). - Assignee par email si trouvé, sinon null. - Ne crée pas d’action sans verbe d’action. USER: Contexte Odoo: - Société: ACME - Projet par défaut: “ACME – Général” - Mapping participants: { "alice@acme.com":"Alice Martin", ... } Transcription (horodatée, FR): [00:00] Chef de projet: ... ...
Validation JSON côté n8n (node “IF + JSON Schema”) avant Odoo.
🧪 Module Odoo (extraits de code)
1) Contrôleur d’ingestion (si vous poussez directement dans Odoo)
# controllers/gpt_minutes.py from odoo import http from odoo.http import request import json class GptMinutesController(http.Controller): @http.route('/gpt/minutes/create', type='json', auth='api_key', methods=['POST']) def create_minutes(self, **payload): data = payload # JSON déjà validé côté n8n Article = request.env['knowledge.article'].sudo() article = Article.create({ 'name': data['title'], 'x_summary': data['summary_md'], 'x_decisions': data.get('decisions_md',''), 'x_action_items_json': json.dumps(data['actions']), 'x_confidence_score': data.get('confidence', 0.0), }) # créer tâches Task = request.env['project.task'].sudo() for a in data.get('actions', []): assignee = request.env['res.partner'].sudo().search([('email','=',a.get('assignee_email'))], limit=1) vals = { 'name': a['title'], 'partner_id': assignee.id or False, 'date_deadline': a.get('due_date'), 'x_due_risk': {'low':'low','medium':'med','high':'high'}.get(a.get('priority','low')), 'x_meeting_ref': article.id } Task.create(vals) # notifier article.message_post(body="Fiche générée automatiquement (IA).") return {'article_id': article.id}
2) Bouton “Re-générer (IA)” sur l’article
# models/knowledge_article.py from odoo import models, api, fields import requests, json class KnowledgeArticle(models.Model): _inherit = 'knowledge.article' def action_regenerate_ai(self): for rec in self: payload = { 'title_hint': rec.name, 'content': rec.body or rec.x_summary or '', 'language': self.env.user.lang } r = requests.post('https://llm.internal/api/minutes/regenerate', json=payload, timeout=60) r.raise_for_status() out = r.json() rec.write({ 'x_summary': out['summary_md'], 'x_decisions': out['decisions_md'], 'x_action_items_json': json.dumps(out['actions']), 'x_llm_model': out.get('model'), 'x_llm_prompt_ver': out.get('prompt_ver') })
Variante sans custom module : tout faire via RPC JSON depuis n8n (pas de déploiement Odoo nécessaire).
🔐 Sécurité & conformité (RGPD)
| Sujet | Reco pratique |
|---|---|
| Base légale | Intérêt légitime (notes de réunion). Informer les participants. |
| Minimisation | Pseudonymiser si partagé hors équipe ; pas de données sensibles. |
| Rétention | Audio 90 jours, transcript 1 an, synthèse Knowledge illimitée (selon politique). |
| Traçabilité | Stocker hash SHA-256 des fichiers source dans l’article. |
| Chiffrement | TLS 1.2/1.3 en transit ; stockage chiffré côté Documents/DB. |
| DPO | Registre des traitements + DPIA si enregistrement systématique. |
🔁 Gouvernance & versioning
- Champs de version (x_llm_model, x_llm_prompt_ver, x_confidence_score).
- Journal : chaque régénération poste un message Discuss (diff + liens).
- Rôle “Minute Owner” : valide la fiche (checkbox) → verrouille l’article.
📊 KPI & tableaux de bord (Odoo BI)
- Délai moyenne “Fin réunion → fiche publiée”.
- % fiches validées<24h.
- Nb d’actions créées / complétées par réunion.
- Taux de lecture de la fiche (Discuss).
- Cartographie des décisions/risques par projet.
🌍 Multilingue & formats
- lang du user → génération dans la langue de l’article.
- Export PDF (report) automatique vers “Documents/Meetings”.
- Option “Bilingue FR/EN” (deux sections).
🧪 Tests & QA (checklist rapide)
- Jeux de transcriptions propres vs bruitées.
- Cas sans actions → fiche minimale.
- Cas d’emails inconnus → assignation par rôle par défaut.
- Échecs LLM → fallback modèle + message clair à l’auteur.
🗺️ n8n — schéma de flow (nœuds essentiels)
- Trigger Calendar/Drive/Email
- Get File (audio)
- Whisper Transcribe
- Clean + Chunk (Function)
- HTTP Request → GPT Plugin (MinutesGen)
- IF + JSON Schema Validate
- HTTP Request → Odoo (create article)
- Loop create tasks
- Attach files (Documents API)
- Send Discuss Message + Notify Teams/Slack
✅ Résultat attendu
- En 1–2 minutes post-réunion : fiche Knowledge prête, propre, versionnée.
- Actions projet créées et assignées automatiquement.
- Participants notifiés, validations tracées.
- Gains : -70% de temps de rédaction, +30% de suivi d’actions, homogénéité des comptes-rendus.