{ "version": "1.0.0", "deliverable": "Chat OTOIA embarqué par portail", "sprint": "Sprint 6 · ERPNext Backend", "roadmap_ref": "04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md · Sprint 6 l.63 « ERPNext Backend : Chat OTOIA embedded dans chaque portail »", "description": "Spec machine-lisible du montage de l'assistant conversationnel OTOIA (persona Amélie QC) dans CHAQUE portail rôle. Le carrier natif (#1 ERPNext natif) est le DocType Frappe v15 `Custom Block`, inséré dans le `content` du `Workspace` du portail. Ce fichier ne fait QUE la présentation + la persona : la source de vérité des PORTAILS et de la PORTÉE de connaissance reste le contrat RBAC (rbac_50_roles.json) et le hand-off des Workspaces (frontend/portails). Aucune URL de backend, aucun chiffre, aucune capacité n'est fabriqué ici (anti-invention #6).", "generated_from": "rbac_50_roles.json (rôles + permissions_cibles par portail) + frontend/portails/portails_spec.json (portails) + frontend/portails/out/workspace.json (Has Role réels) + seo/seo_spec.json (langues trilingues)", "persona": { "nom": "Amélie", "voix": "multilingual_v2", "note": "Persona vocale québécoise multilingue. Repris verbatim de CLAUDE.md, jamais fabriqué.", "source": "CLAUDE.md §Architecture cible « Voix Amélie QC (multilingual_v2) »" }, "capabilities": [ {"module": "aec.py", "role": "pilotage AEC (Blender/Bonsai/IFC/Speckle/Flux)", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"}, {"module": "knowledge.py", "role": "base de connaissance / RAG", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"}, {"module": "prompt_engine.py", "role": "moteur de prompt", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"}, {"module": "chat.py", "role": "orchestration conversationnelle", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"} ], "langues": { "source_ref": "05_deliverables_mvp/seo/seo_spec.json · site.langs", "note": "Les codes de langue (FR/EN/ES) et la langue par défaut ne sont PAS dupliqués ici : ils sont DÉRIVÉS du seo_spec (source unique · vente.otov7.com trilingue · #5 zéro duplication)." }, "ui_label": { "fr": "Assistant OTOIA", "en": "OTOIA Assistant", "es": "Asistente OTOIA" }, "endpoint": { "valeur": null, "statut": "a_confirmer", "note": "URL du backend conversationnel OTOIA (desk / bim-cloud VPS) — JAMAIS fabriquée par le worker (#6/#8). L'agent ERPNext Backend la renseigne à l'intégration, avec source." }, "brand": { "note": "Tokens de marque luxury dark+doré (CLAUDE.md #4). Appliqués par la couche thème desk sur le VPS (agent Frontend · #8). Repris ici pour le hand-off, jamais fabriqués.", "fond": {"valeur": "#0a0a12", "source": "CLAUDE.md #4"}, "accent": {"valeur": "#f0b429", "source": "CLAUDE.md #4"}, "polices": [ {"valeur": "Fraunces", "source": "CLAUDE.md #4"}, {"valeur": "Cormorant Garamond", "source": "CLAUDE.md #4"} ] }, "mount": { "html_id_prefix": "otoia-chat-", "container_class": "otoia-chat-mount", "block_name_prefix": "OTOIA Chat · ", "note": "Le `Custom Block` porte un `
` de montage vide et déterministe (id dérivé de la clé du portail). Le web-component OTOIA réel + la config runtime (rôles autorisés, portée de connaissance, endpoint) sont branchés côté VPS ; la config par portail est livrée structurée dans chat_mount.json." } }