Chapitre 1: Présentation, Vision & Stratégie

Introduction complète à la plateforme Waka Voice et ses fondations techniques

Waka Voice est le centre d'appel IA développé par Waka Company, conçu pour répondre aux besoins de sous-traitance d'opérations d'appels de ses clients entreprises. Cette plateforme permet de déployer des agents vocaux IA personnalisés pour divers types d'opérations (recouvrement, télévente, support client, enquêtes, prise de RDV) avec une promesse forte : moins de 30 minutes pour configurer et lancer un agent entièrement personnalisé.
La Promesse Waka Voice : 30 Minutes

De la demande client au premier appel : personnalisation complète de la voix, adaptation au type d'opération, intégration des données client, et déploiement opérationnel en moins de 30 minutes.

1.1 Waka Company : L'Offre de Sous-Traitance IA

Waka Company se positionne comme un partenaire de sous-traitance pour les entreprises souhaitant externaliser leurs opérations d'appels. Waka Voice est l'outil technologique qui permet de répondre à cette demande avec une agilité et une personnalisation inégalées.

Modèle de Service

flowchart LR subgraph Clients["🏢 Clients Entreprises"] C1[Banque / Assurance] C2[E-commerce / Retail] C3[Télécoms / Énergie] C4[Santé / Services] end subgraph WakaCompany["🎯 Waka Company"] direction TB INTAKE[Réception Demande] CONFIG[Configuration
< 30 min] DEPLOY[Déploiement] OPS[Opérations 24/7] end subgraph WakaVoice["🎙️ Waka Voice Platform"] direction TB AGENTS[Agents IA Personnalisés] VOICES[Voix Sur Mesure] TOOLS[Intégrations Client] ANALYTICS[Reporting Temps Réel] end C1 & C2 & C3 & C4 -->|Demande de sous-traitance| INTAKE INTAKE --> CONFIG CONFIG --> DEPLOY DEPLOY --> OPS OPS --> AGENTS AGENTS --> VOICES AGENTS --> TOOLS OPS --> ANALYTICS style WakaCompany fill:#4A148C,color:#fff style WakaVoice fill:#1565C0,color:#fff

Types d'Opérations Sous-Traitées

Recouvrement de Créances

Relances amiables, négociation de plans de paiement, prise de promesses (PTP). Personnalisation du ton selon le profil débiteur et l'ancienneté de la créance.

Télévente & Prospection

Campagnes d'appels sortants, qualification de leads, prise de rendez-vous commerciaux. Scripts adaptatifs selon les réponses du prospect.

Support Client Niveau 1

Traitement des demandes simples, FAQ, suivi de commande, réinitialisation. Escalade intelligente vers agents humains pour cas complexes.

Enquêtes & Satisfaction

Collecte de feedback post-interaction, NPS, études de marché. Analyse de sentiment en temps réel et verbatims enrichis.

Prise de Rendez-Vous

Qualification, vérification des disponibilités, confirmation automatique. Intégration calendriers (Outlook, Google Calendar, CRM).

Accueil & Orientation

Agents avatar pour accueil premium en agence ou sur site web. Qualification du besoin et routage vers le bon service.

1.2 L'Ambition : Déploiement en 30 Minutes

L'ambition de Waka Voice est de permettre à Waka Company de répondre à une nouvelle demande client en moins de 30 minutes, avec une personnalisation complète. Ce délai record est rendu possible par une architecture modulaire et des outils de configuration avancés.

Parcours de Déploiement Express

flowchart LR subgraph Phase1["⏱️ 0-5 min"] A1[Réception Brief Client] A2[Sélection Type Opération] end subgraph Phase2["⏱️ 5-15 min"] B1[Choix/Création Voix] B2[Configuration Agent] B3[Rédaction Instructions] end subgraph Phase3["⏱️ 15-25 min"] C1[Intégration Tools Client] C2[Import Base Contacts] C3[Tests Conversation] end subgraph Phase4["⏱️ 25-30 min"] D1[Validation Qualité] D2[Déploiement Production] D3[Premier Appel] end A1 --> A2 --> B1 --> B2 --> B3 --> C1 --> C2 --> C3 --> D1 --> D2 --> D3 style Phase1 fill:#E3F2FD,stroke:#1565C0 style Phase2 fill:#E8F5E9,stroke:#2E7D32 style Phase3 fill:#FFF3E0,stroke:#E65100 style Phase4 fill:#F3E5F5,stroke:#6A1B9A

Les Clés du Déploiement Rapide

Élément Personnalisation Disponible Temps Moyen
Voix 600+ voix Azure, 100+ voix HD, voix personnalisées clonées, voix OpenAI natives 2-5 min
Langue & Accent 140+ langues, accents régionaux, adaptation dialectale 1 min
Ton & Personnalité Templates métier (recouvrement, commercial, support), personnalisation fine 3-5 min
Instructions Métier Prompt Builder avec 4 méthodes (templates, phases, import, génération IA) 5-10 min
Intégrations API REST client, base de données, CRM, calendrier, paiement 5-10 min
Base Contacts Import CSV/Excel, connexion CRM, API temps réel 2-5 min
Approche No-Code / Low-Code

Waka Voice a été conçu pour être utilisable par les équipes opérationnelles de Waka Company, sans intervention des développeurs pour les déploiements standards. L'interface visuelle permet de créer un agent fonctionnel en quelques clics, tandis que les APIs permettent des intégrations avancées pour les cas complexes.

1.3 Vision Technique : Les 3 Piliers

Pour atteindre cette promesse de déploiement rapide tout en garantissant une qualité d'interaction indiscernable d'un agent humain, Waka Voice repose sur trois piliers techniques fondamentaux.

Pilier 1 : Naturalité des Conversations

<300ms
Latence bout en bout
Barge-in
Interruption naturelle
VAD
Détection sémantique
600+
Voix naturelles

Pilier 2 : Puissance Agentique (Actions Réelles)

Pilier 3 : Multimodalité Intégrée

Modalité Cas d'usage pour Waka Company Avantages
Voix (Voice Live) Recouvrement, télévente, support téléphonique, campagnes sortantes Naturel, émotionnel, accessible, haute conversion
Avatar (Azure Avatar) Accueil premium en agence, kiosques, sites web haut de gamme Humanisation, engagement visuel, démonstrations
Texte (Chat) Support web 24/7, FAQ, demandes simples, suivi commandes Discret, traçable, multitâche, coût réduit

1.4 Fonctionnalités Détaillées

Waka Voice intègre un ensemble complet de fonctionnalités conçues pour couvrir l'ensemble du cycle de vie des agents conversationnels, de la création au déploiement en passant par l'analyse et l'optimisation.

Création d'agents

Approche No-Code / Low-Code

Waka Voice a été conçu pour être accessible aux équipes métier, pas uniquement aux développeurs. L'interface visuelle permet de créer un agent fonctionnel en moins de 30 minutes, sans écrire une seule ligne de code. Les développeurs peuvent néanmoins aller plus loin avec les APIs et les tools personnalisés.

Gestion des voix

La voix est l'élément le plus critique pour la perception de naturalité. Waka Voice offre trois niveaux de personnalisation :

600+
Voix Azure Standard
100+
Voix HD Neural
Voix Personnalisées
8
Voix OpenAI Natives

Capacités agentiques (Tools)

Le système de Tools est ce qui transforme un simple chatbot en agent véritablement autonome. Chaque type de tool répond à des besoins spécifiques :

Type Description Cas d'usage Complexité
API REST Appels HTTP vers des endpoints externes avec mapping des paramètres Intégration CRM, météo, recherche, paiements Moyenne - configuration JSON
MCP Server Model Context Protocol - standard émergent pour l'intégration LLM Accès bases de données, systèmes legacy, processus complexes Élevée - développement serveur
Code Python Scripts Python exécutés dans un sandbox sécurisé Calculs financiers, logique métier, transformations Moyenne - code Python
Import OpenAPI Import automatique depuis une spécification Swagger/OpenAPI Intégration rapide d'APIs documentées Faible - upload fichier

1.5 Public Cible et Cas d'Usage

Profils utilisateurs

Waka Voice s'adresse à trois profils principaux, chacun avec des besoins et des niveaux d'expertise différents :

Responsables Métier

Directeurs de centres d'appels, responsables expérience client, directeurs marketing. Ils utilisent l'interface no-code pour créer et gérer des agents, suivre les KPIs dans les dashboards, et optimiser les parcours conversationnels.

Développeurs & Intégrateurs

Équipes techniques intégrant Waka Voice dans des applications existantes. Ils utilisent les APIs REST et WebSocket, développent des tools personnalisés, et configurent les intégrations avancées.

Décideurs IT & Architectes

DSI, architectes solutions, responsables sécurité. Ils évaluent la conformité, la scalabilité, les coûts et l'intégration dans l'écosystème existant. Cette documentation répond à leurs questions techniques.

Cas d'usage principaux

Recouvrement de créances

Automatisation des appels de relance avec personnalisation du discours selon le profil débiteur, proposition de plans de paiement, prise de promesses de paiement, et mise à jour automatique du CRM. Taux de contact multiplié par 3, coût par contact divisé par 5.

Support client niveau 1

Traitement automatique des demandes simples (suivi commande, FAQ, réinitialisation mot de passe) avec escalade intelligente vers des agents humains pour les cas complexes. Réduction de 60% du volume traité par les équipes humaines.

Prise de rendez-vous

Qualification des prospects, vérification des disponibilités, création de rendez-vous dans l'agenda, envoi de confirmations. Utilisé par les cabinets médicaux, concessions auto, agences immobilières. Disponibilité 24/7 vs horaires de bureau limités.

Accueil et orientation

Agents avatar en kiosque ou sur site web pour accueillir, qualifier le besoin et orienter vers le bon service ou interlocuteur. Expérience premium avec personnage animé, réduction des temps d'attente en agence.

Enquêtes satisfaction

Collecte de feedback post-interaction par appel ou chat, avec questionnaires adaptatifs et analyse de sentiment en temps réel. Taux de réponse supérieur aux emails (40% vs 5-10%), insights plus riches grâce au verbatim.

1.6 Stratégie Technique : Fondations

Cette section explique les décisions architecturales et technologiques qui sous-tendent Waka Voice. Comprendre ces choix permet d'appréhender les forces de la plateforme, ses compromis, et comment en tirer le meilleur parti.

1.6.1 Pourquoi Azure comme Fondation ?

Le choix d'Azure comme plateforme cloud principale n'est pas anodin. Il résulte d'une analyse approfondie des alternatives (AWS, GCP, solutions on-premise) et de critères précis.

Critères de sélection

Avantages Azure
  • Suite Speech la plus complète : STT, TTS, Custom Voice, Speaker Recognition dans un écosystème unifié
  • Voice Live API : Seul provider offrant des conversations temps réel avec latence <300ms
  • Avatar Service : Technologie unique de personnages 3D animés avec synchronisation labiale
  • OpenAI intégré : Accès natif à GPT-4, GPT-5, Realtime sans passer par un tiers
  • Conformité européenne : Datacenters EU, conformité RGPD, certifications bancaires
  • Cosmos DB : Base NoSQL globalement distribuée avec latence garantie <10ms
Limitations acceptées
  • Vendor lock-in partiel : Dépendance aux APIs propriétaires Azure, mitigation via abstraction
  • Courbe d'apprentissage : Écosystème complexe, documentation parfois fragmentée
  • Disponibilité régionale : Certains services (Voice Live) limités à quelques régions

Comparaison avec les alternatives

Critère Azure AWS GCP
Voix temps réel Voice Live API - natif Amazon Connect - téléphonie Dialogflow CX - chat first
Nombre de voix TTS 600+ ~200 ~380
Avatars 3D Natif (Azure Avatar) Non disponible Non disponible
LLM intégrés OpenAI + Anthropic + xAI Bedrock (Claude, Titan) Gemini uniquement
Latence voix <300ms 500-800ms 400-600ms
Décision finale

Azure s'impose comme le choix optimal pour une plateforme d'agents conversationnels multimodaux grâce à son écosystème Speech inégalé, son intégration native avec OpenAI, et ses services uniques comme Azure Avatar. Les limitations identifiées sont gérables via une architecture d'abstraction et un monitoring proactif.

1.6.2 Pourquoi Flask et Python ?

Le choix de Flask comme framework backend, associé à Python 3.13+, répond à des critères de productivité, de flexibilité et d'écosystème.

Arguments en faveur de Flask

Alternatives considérées et rejetées

Alternative Raison du rejet
FastAPI Excellente option, mais écosystème moins mature pour WebSocket temps réel. La gestion async native est un avantage, mais flask-sock + gevent offre des performances suffisantes avec une courbe d'apprentissage moindre.
Django Trop opinionated pour notre architecture. L'ORM intégré est inutile avec Cosmos DB, et le système de templates est superflu pour une API-first approach.
Node.js (Express) Callback hell, typage faible (même avec TypeScript), écosystème IA moins riche. Les SDKs Azure Python sont plus complets et mieux maintenus.
Go (Gin/Echo) Performances excellentes, mais productivité moindre, écosystème IA quasi inexistant, et recrutement de développeurs Go plus difficile.

1.6.3 Pourquoi Cosmos DB ?

Le choix de Cosmos DB comme base de données principale est motivé par les exigences spécifiques des agents conversationnels : données semi-structurées, latence faible, scalabilité globale.

Caractéristiques décisives

Latence garantie <10ms

SLA de latence au 99ème percentile. Critique pour ne pas ajouter de délai dans les conversations temps réel où chaque milliseconde compte.

Distribution globale

Réplication automatique multi-région. Les données suivent les utilisateurs, réduisant la latence pour les déploiements internationaux.

Schéma flexible (JSON)

Les configurations d'agents évoluent fréquemment. Un schéma rigide SQL nécessiterait des migrations constantes. JSON permet l'évolution sans friction.

Scalabilité automatique

Provisioned ou Serverless, Cosmos DB scale automatiquement avec la charge. Pas de DBA nécessaire pour gérer les pics de trafic.

Modélisation des données

Notre modélisation suit le pattern "one-to-few" recommandé pour Cosmos DB : les documents sont auto-suffisants et contiennent toutes les données nécessaires pour éviter les jointures coûteuses.

// Exemple : Document Agent complet (pas de références externes)
{
  "id": "agent-uuid-12345",
  "partitionKey": "agent-uuid-12345",  // Partition = ID pour distribution optimale
  "type": "VoiceAgent",
  "metadata": {
    "name": "Agent Recouvrement Premium",
    "reference": "Agent-000042",
    "status": "active",
    "createdAt": "2025-12-29T10:00:00Z",
    "updatedAt": "2025-12-29T15:30:00Z",
    "createdBy": "user-uuid-xxx"
  },
  "configuration": {
    "model": {
      "id": "gpt-realtime",
      "family": "F1",
      "temperature": 0.7,
      "maxTokens": 2000
    },
    "voice": {
      "type": "azure_tts",
      "id": "fr-FR-DeniseNeural",
      "locale": "fr-FR"
    },
    "vad": {
      "type": "azure_semantic_vad",
      "threshold": 0.3,
      "silenceDurationMs": 300
    }
  },
  "instructions": "Tu es un agent de recouvrement professionnel...",
  "tools": [
    // Tools embarqués, pas de référence
    {
      "name": "check_client_status",
      "type": "api",
      "endpoint": "https://crm.example.com/api/clients/{id}/status"
    }
  ],
  "analytics": {
    "totalCalls": 1523,
    "avgDuration": 187,
    "successRate": 0.72
  }
}
Compromis de la dénormalisation

Cette approche dénormalisée implique une duplication potentielle des données (ex: définition d'un tool copiée dans chaque agent qui l'utilise). C'est un compromis acceptable car : (1) les lectures sont bien plus fréquentes que les écritures, (2) la consistance éventuelle est acceptable pour les configs, (3) la simplicité de requêtage compense la duplication.

1.6.4 Architecture Temps Réel : WebSocket Bidirectionnel

La conversation vocale en temps réel est le défi technique central de Waka Voice. Notre architecture de proxy WebSocket bidirectionnel est le résultat de nombreuses itérations pour atteindre les objectifs de latence et de fiabilité.

Pourquoi un proxy et pas une connexion directe ?

Une approche naïve connecterait directement le navigateur à Azure Voice Live API. Nous avons opté pour un proxy intermédiaire pour plusieurs raisons critiques :

Flux de données détaillé

sequenceDiagram participant U as Utilisateur participant B as Browser participant P as Proxy Flask participant A as Azure Voice Live participant T as Tools Executor participant C as Cosmos DB Note over U,C: Initialisation de session U->>B: Clic "Démarrer conversation" B->>P: WS Connect /voice-proxy/ws/{agent_id} P->>C: Lire config agent C-->>P: Config JSON P->>A: WS Connect Azure Voice Live A-->>P: session.created P->>A: session.update (config agent) P-->>B: session.ready P->>C: Créer document session Note over U,C: Boucle de conversation U->>B: Parle au microphone B->>P: input_audio_buffer.append (base64 PCM16) P->>A: input_audio_buffer.append A-->>P: input_audio_buffer.speech_started P-->>B: speech_started (UI feedback) A-->>P: input_audio_buffer.speech_stopped A-->>P: conversation.item.created (transcription user) P->>P: Log transcription + Sentiment analysis A-->>P: response.created loop Streaming audio A-->>P: response.audio.delta (chunks) P-->>B: response.audio.delta B->>U: Lecture audio end A-->>P: response.audio_transcript.done P->>P: Log transcription agent A-->>P: response.done Note over U,C: Tool call (optionnel) A-->>P: response.function_call_arguments.done P->>T: Exécuter tool (API/Python/MCP) T-->>P: Résultat tool P->>A: conversation.item.create (tool_result) A->>A: Continuer réponse avec résultat Note over U,C: Fin de session U->>B: Clic "Terminer" B->>P: session.end P->>A: Fermer connexion Azure P->>C: Update session (historique complet, coûts, outcome) P-->>B: session.closed

Optimisations de latence

Chaque milliseconde compte dans une conversation vocale. Voici les optimisations implémentées pour minimiser la latence :

Optimisation Impact Implémentation
Cache config agent -50ms par message La config agent est lue une seule fois au démarrage et cachée en mémoire
Écriture Cosmos différée -20ms par message Les transcriptions s'accumulent en mémoire, un seul write en fin de session
Thread dédié Azure -30ms Un thread séparé écoute Azure, évitant le blocage du thread principal
Connection pooling -100ms (premier message) Connexion Azure établie dès le connect client, pas au premier message
Binary frames -10% bande passante L'audio est envoyé en frames binaires, pas en base64 JSON quand possible

Module RAG

Retrieval Augmented Generation - Base de Connaissances Intelligente

Le module RAG (Retrieval Augmented Generation) de Waka Voice permet d'enrichir les réponses des agents avec des connaissances issues de vos documents d'entreprise. Grâce à la recherche vectorielle sémantique, les agents peuvent accéder à vos procédures, politiques, documentation technique et bases de connaissances en temps réel, garantissant des réponses contextuellement pertinentes et toujours à jour.
3
Sources d'ingestion
6
Étapes de pipeline
1536
Dimensions embedding
500+
Pages/min (crawl)

Stack Technique RAG

Flask Blueprint Microsoft Graph API Azure Document Intelligence Azure AI Search Cosmos DB Azure Blob Storage text-embedding-3-small GPT-5-mini

Pourquoi le RAG est-il essentiel ?

Le défi des LLMs génériques

Les modèles de langage (LLM) sont entraînés sur des données publiques jusqu'à une date de coupure. Ils ne connaissent pas vos documents internes, vos procédures spécifiques, ni vos dernières mises à jour. Le RAG résout ce problème en injectant dynamiquement le contexte pertinent issu de vos propres sources dans chaque réponse.

Avec RAG
  • Réponses basées sur vos documents internes
  • Mise à jour instantanée des connaissances
  • Sources citables et traçables
  • Réponses contextuellement pertinentes
  • Réduction des hallucinations du modèle
Sans RAG
  • Réponses génériques basées sur données publiques
  • Connaissances limitées à la date de training
  • Impossible de citer des sources internes
  • Risque de réponses incorrectes ou obsolètes
  • Hallucinations sur les sujets spécifiques

Architecture Globale du Module RAG

Le module RAG de Waka Voice s'appuie sur une architecture robuste intégrant plusieurs services Azure pour offrir une recherche sémantique performante et scalable :

flowchart TB subgraph Sources["Sources de Données"] SP["SharePoint
Microsoft Graph API"] WEB["Web Crawler
aiohttp + Playwright"] UPLOAD["Upload Direct
Interface Web"] end subgraph Ingestion["Pipeline d'Indexation (6 étapes)"] DI["1. Extraction
Azure Document Intelligence"] CHUNK["2. Chunking
800 chars + overlap 100"] SUMMARY["3. Résumé
GPT-5-mini"] ENTITIES["4. Entités
Azure Text Analytics"] EMBED["5. Embeddings
text-embedding-3-small"] INDEX["6. Indexation
Azure AI Search"] end subgraph Storage["Stockage Multi-Bases"] BLOB[("Azure Blob Storage
Documents originaux")] COSMOS[("Cosmos DB RAG_base
Chunks + métadonnées")] SEARCH[("Azure AI Search
Index vectoriel HNSW")] end subgraph Query["Recherche & Retrieval"] INTENT["Génération Intent
GPT-4"] VECTOR["Recherche Vectorielle
Cosine similarity"] FILTER["Filtrage Projet
OData filter"] RANK["Scoring & Ranking
Top-K results"] end subgraph Agent["Intégration Agent"] TOOL["search_knowledge_base
Tool"] CONTEXT["Injection Contexte
dans prompt"] RESPONSE["Réponse Enrichie
avec sources"] end SP --> DI WEB --> DI UPLOAD --> DI DI --> CHUNK CHUNK --> SUMMARY CHUNK --> ENTITIES SUMMARY --> EMBED ENTITIES --> EMBED EMBED --> INDEX DI --> BLOB INDEX --> COSMOS INDEX --> SEARCH TOOL --> INTENT INTENT --> VECTOR VECTOR --> SEARCH SEARCH --> FILTER FILTER --> RANK RANK --> CONTEXT CONTEXT --> RESPONSE style Sources fill:#E3F2FD,stroke:#1976D2 style Ingestion fill:#FFF3E0,stroke:#FF9800 style Storage fill:#E8F5E9,stroke:#4CAF50 style Query fill:#FCE4EC,stroke:#E91E63 style Agent fill:#F3E5F5,stroke:#9C27B0

Les 3 Sources d'Ingestion

Le module RAG supporte trois méthodes d'ingestion de données, chacune optimisée pour différents cas d'usage. Sélectionnez la source adaptée à vos besoins :

Sélectionnez une source de données

Choisissez le mode d'ingestion pour votre base de connaissances

SharePoint

Bibliothèques Microsoft 365

MSAL Auth
Web Crawler

Sites web et documentation

Sitemap + JS
Upload Direct

Fichiers locaux

Drag & Drop

Source 1 : Intégration SharePoint

Connexion directe à vos bibliothèques SharePoint via Microsoft Graph API. L'indexation parcourt récursivement tous les dossiers et sous-dossiers.

sequenceDiagram participant U as Utilisateur participant UI as Interface RAG participant API as Flask API participant MSAL as MSAL Client participant GRAPH as Microsoft Graph participant BLOB as Azure Blob participant DI as Document Intelligence participant COSMOS as Cosmos DB participant SEARCH as Azure AI Search U->>UI: Sélectionner bibliothèque SharePoint UI->>API: POST /api/fetch_sharepoint_libraries API->>MSAL: Obtenir access_token MSAL-->>API: Bearer token API->>GRAPH: GET /sites/{site_id}/drives GRAPH-->>API: Liste des bibliothèques API-->>UI: Afficher bibliothèques U->>UI: Lancer l'indexation UI->>API: POST /api/kickoff_indexation Note over API: Thread async démarré API-->>UI: operation_id pour suivi loop Pour chaque fichier (récursif) API->>GRAPH: GET /drives/{id}/items (récursif) GRAPH-->>API: Liste fichiers + dossiers API->>GRAPH: GET /@content (téléchargement) GRAPH-->>API: Contenu fichier API->>BLOB: Upload avec métadonnées BLOB-->>API: blob_url API->>DI: Analyser document DI-->>API: Texte extrait API->>API: Chunking + Embedding API->>COSMOS: Sauvegarder chunks API->>SEARCH: Indexer vecteurs end API-->>UI: SSE progress updates
Authentification MSAL

L'authentification utilise MSAL (Microsoft Authentication Library) avec un flux client_credentials. Les credentials Azure AD (tenant_id, client_id, client_secret) sont stockés dans les variables d'environnement.

ParamètreTypeDescription
libraryIdstringID du drive SharePoint (obligatoire)
libraryNamestringNom de la bibliothèque
folderIdstringID d'un sous-dossier spécifique (optionnel)
folderNamestringNom du dossier
project_namestringProjet pour filtrage RAG
# Exemple appel API SharePoint Indexation
POST /api/kickoff_indexation
Content-Type: application/json

{
    "libraryId": "b!abc123def456...",
    "libraryName": "Documentation RH",
    "folderId": null,
    "folderName": "",
    "project_name": "ressources_humaines"
}

# Réponse
{
    "status": "started",
    "operation_id": "op_xyz789",
    "status_endpoint": "/api/indexation_status/op_xyz789"
}

Source 2 : Web Crawler

Crawler web asynchrone haute performance pour indexer des sites entiers. Supporte deux modes : Fast (aiohttp) et JavaScript (Playwright).

flowchart TB subgraph Input["Configuration Crawl"] URL[URL de depart] CONFIG[max_pages, max_depth
use_javascript, use_sitemap] end subgraph Discovery["Decouverte URLs"] SITEMAP[Parser sitemap.xml
+ sitemap_index.xml] LINKS[Extraction liens HTML] QUEUE[Queue BFS
avec visited set] end subgraph Fetch["Recuperation Pages"] FAST["Mode Fast
aiohttp async
10 concurrent
500 pages/min"] JS["Mode JavaScript
Playwright Chromium
Rendu SPA/React
30s timeout"] end subgraph Process["Traitement"] BS4[BeautifulSoup
Extraction texte] FILTER[Filtrage domaine
is_same_domain] DEDUP[Deduplication
URLs visitees] end subgraph Output["Sortie"] RESULTS[Liste URLs crawlees] FAILED[URLs en echec] INDEXATION[Pipeline indexation] end URL --> CONFIG CONFIG --> SITEMAP SITEMAP --> QUEUE QUEUE --> FAST QUEUE --> JS FAST --> BS4 JS --> BS4 BS4 --> FILTER FILTER --> LINKS LINKS --> QUEUE FILTER --> DEDUP DEDUP --> RESULTS DEDUP --> FAILED RESULTS --> INDEXATION style FAST fill:#4CAF50,color:#fff style JS fill:#2196F3,color:#fff

Configuration Web Crawler

Crawl en cours... 127/500 pages
ParamètreDéfautDescription
url-URL de départ du crawl (obligatoire)
max_pages500Nombre maximum de pages à crawler
max_depth5Profondeur maximale de navigation
max_concurrent10Requêtes simultanées (mode Fast)
use_javascriptfalseActiver Playwright pour rendu JS
use_sitemaptrueParser sitemap.xml en priorité
Mode JavaScript vs Mode Fast

Mode Fast (aiohttp) : Très rapide (~500 pages/min), mais ne charge pas le JavaScript. Idéal pour les sites statiques et la documentation.
Mode JavaScript (Playwright) : Plus lent mais rend les pages avec Chromium. Nécessaire pour les SPA (React, Vue, Angular) et les sites avec contenu dynamique.

Source 3 : Upload Direct

Upload manuel de fichiers via l'interface web. Idéal pour des documents spécifiques ou des mises à jour ponctuelles de la base de connaissances.

flowchart LR subgraph Upload["Interface Upload"] DROP[Drag & Drop Zone] SELECT[Sélection fichiers] PREVIEW[Prévisualisation] end subgraph Process["Traitement Backend"] VALID[Validation format
SUPPORTED_EXTENSIONS] SANITIZE[Sanitize blob_name] BLOB_UP[Upload Azure Blob] end subgraph Indexation["Pipeline Indexation"] DI[Document Intelligence] CHUNK[Chunking] EMBED[Embedding] INDEX[Indexation Search] end DROP --> VALID SELECT --> VALID VALID --> PREVIEW PREVIEW --> SANITIZE SANITIZE --> BLOB_UP BLOB_UP --> DI DI --> CHUNK CHUNK --> EMBED EMBED --> INDEX style Upload fill:#E3F2FD,stroke:#1976D2 style Process fill:#FFF3E0,stroke:#FF9800 style Indexation fill:#E8F5E9,stroke:#4CAF50

Upload de Fichiers

Glissez vos fichiers ici ou parcourez

PDF, DOCX, PPTX, XLSX, TXT, MD, HTML (max 50MB)

Guide_RH_2025.pdf
2.4 MB
✓ Indexé
Procedures_IT.docx
856 KB
Indexation...
FormatExtensionMéthode d'extraction
Documents PDF.pdfAzure Document Intelligence (OCR inclus)
Microsoft Word.docx, .docAzure Document Intelligence
PowerPoint.pptx, .pptAzure Document Intelligence
Excel.xlsx, .xlsAzure Document Intelligence (tableaux)
Texte brut.txt, .md, .htmlTéléchargement direct + parsing
Rich Text.rtf, .odtAzure Document Intelligence
Code source.py, .js, .jsonTéléchargement direct

SharePoint Integration

Connexion directe à vos bibliothèques SharePoint via Microsoft Graph API. Synchronisation automatique des documents avec détection des modifications.

  • Formats supportés : PDF, DOCX, PPTX, XLSX, RTF, ODT
  • Navigation récursive des dossiers et sous-dossiers
  • Métadonnées préservées : auteur, date, dossier source
  • Authentification MSAL sécurisée
# Endpoint: POST /api/kickoff_indexation
{
    "libraryId": "b!abc123...",
    "libraryName": "Documentation RH",
    "project_id": "projet_rh",
    "project_name": "Ressources Humaines"
}

Web Crawler

Crawler web asynchrone pour indexer des sites entiers. Supporte le mode JavaScript (Playwright) pour les sites dynamiques.

  • Extraction Sitemap automatique pour découverte rapide
  • Mode Fast : aiohttp asynchrone (500 pages/min)
  • Mode JavaScript : Playwright pour SPA/React
  • Respect robots.txt et rate limiting
  • Profondeur configurable (max_depth, max_pages)
# Endpoint: POST /crawl/start-crawl
{
    "url": "https://docs.example.com",
    "max_pages": 500,
    "max_depth": 5,
    "use_javascript": false,
    "use_sitemap": true
}

Upload Direct

Upload manuel de fichiers via l'interface web. Idéal pour des documents spécifiques ou des mises à jour ponctuelles.

  • Drag & Drop dans l'interface moderne
  • Multi-fichiers simultanés
  • Preview avant indexation
  • Statut temps réel de l'indexation
  • Formats : PDF, DOCX, TXT, HTML, MD, code source
# Endpoint: POST /api/upload-to-blob
# Content-Type: multipart/form-data
- files: [fichier1.pdf, fichier2.docx]
- library_id: "uploads"
- project_name: "Mon Projet"

Pipeline d'Indexation

Chaque document passe par un pipeline d'indexation sophistiqué en 6 étapes :

Étape 1 : Extraction de texte

Azure Document Intelligence

L'extraction intelligente détecte automatiquement le type de fichier et utilise la méthode appropriée :

Type de fichier Méthode d'extraction Capacités
PDF, DOCX, PPTX, XLSX Azure Document Intelligence (prebuilt-layout) OCR, tableaux, mise en page préservée
TXT, MD, HTML, code source Téléchargement direct + parsing Détection encoding, syntaxe préservée
Images dans documents OCR intégré Document Intelligence Extraction texte des images embarquées

Étape 2 : Chunking intelligent

Le texte extrait est découpé en chunks de taille optimale pour la recherche vectorielle. L'algorithme respecte les frontières de phrases :

# Paramètres de chunking (utils/indexation.py)
def split_text(summary=None, text="", max_chars=800, overlap=100):
    """
    Découpe le texte en chunks respectant les frontières de phrases.

    Args:
        max_chars: Taille cible par chunk (800 caractères)
        overlap: Chevauchement entre chunks (100 caractères)

    Algorithme:
    1. Split par regex sur terminateurs de phrase (. ! ?)
    2. Accumulation jusqu'à max_chars
    3. Overlap des dernières phrases pour continuité
    4. Chaque chunk commence ET finit sur une phrase complète
    """
    sentences = re.split(r'(?<=[.!?])\s+', text)
    # ... algorithme de chunking avec overlap
    return pages  # [{page_number, chunk, summary}]
Pourquoi 800 caractères ?

Cette taille est optimale pour les embeddings text-embedding-3-small : assez grande pour capturer le contexte, assez petite pour une recherche précise. Les chunks > 5000 caractères sont automatiquement tronqués.

Étape 3 : Résumé par GPT-5-mini

Chaque document reçoit un résumé généré par Azure OpenAI GPT-5-mini, attaché à tous ses chunks pour enrichir la recherche :

# Génération de résumé (utils/indexation.py)
def summarize_text(text):
    """
    Génère un résumé concis via Azure OpenAI GPT-5-mini.

    Prompt:
    - Capturer les points clés
    - 2-5 phrases maximum
    - Style professionnel
    """
    prompt = """Tu es un expert en synthèse de documents.
Génère un résumé concis et informatif en français.
- Points clés essentiels
- 2 à 5 phrases
- Style professionnel"""

    # Appel Azure OpenAI avec max_completion_tokens: 5000
    return summary.strip()

Étape 4 : Extraction d'entités

Azure Text Analytics

Azure Text Analytics extrait automatiquement les entités nommées de chaque chunk :

Étape 5 : Génération d'embeddings

text-embedding-3-small

Chaque chunk est converti en vecteur de 1536 dimensions via Azure OpenAI :

# Génération d'embeddings (utils/indexation.py)
def generate_embeddings_for_chunks(json_data, batch_size=50):
    """
    Génère les embeddings pour un batch de chunks.

    Modèle: text-embedding-3-small (1536 dimensions)
    Batch: 50 chunks par requête (optimisation coûts)
    Rate limit: 2 secondes entre batches
    """
    for batch in batches:
        response = requests.post(
            f"{endpoint}/openai/deployments/{deployment}/embeddings",
            json={"input": [chunk['chunk'] for chunk in batch]}
        )
        for chunk, embedding in zip(batch, response['data']):
            chunk['embedding'] = embedding['embedding']  # 1536 floats

Étape 6 : Stockage multi-bases

Les données sont stockées de manière optimale dans trois systèmes :

Système Données stockées Usage
Azure Blob Storage Documents originaux + métadonnées (StatusIndexation, LibraryId...) Archivage, ré-indexation, audit
Cosmos DB (RAG_base/database) Chunks + résumé + entités + embeddings Requêtes complexes, filtrage par projet
Azure AI Search Index vectoriel optimisé pour recherche Recherche sémantique temps réel

Recherche Vectorielle

La recherche RAG utilise une approche en deux étapes pour garantir pertinence et précision :

Étape 1 : Génération de l'intent de recherche

# api_rag_search.py - generate_search_intent()
def generate_search_intent(last_message: str, history: List[Dict]) -> Dict:
    """
    Transforme le message utilisateur + historique en intent optimisé.

    1. Formate l'historique de conversation
    2. Prompt GPT-4 pour extraire l'intent précis
    3. Génère l'embedding de l'intent

    Exemple:
    User: "Quels sont les délais pour les congés ?"
    History: [{"role": "user", "content": "Je travaille aux RH"}]

    → Intent: "vacation leave request deadlines HR department policy"
    """
    prompt = f"""Based on this conversation context:
History: {history_text}
Last message: {last_message}

Formulate a precise search intent for Azure AI Search.
Return only the search intent string in English."""

    # Génération intent via GPT-4
    search_intent = client.chat.completions.create(...).choices[0].message.content

    # Génération embedding
    embedding = embedding_client.embeddings.create(
        model="text-embedding-3-small",
        input=search_intent
    ).data[0].embedding

    return {"search_intent": search_intent, "embedding": embedding}

Étape 2 : Recherche vectorielle avec filtres

# Recherche dans Azure AI Search
def vector_search_with_filter(embedding: List[float], project_name: str, top_k: int = 10):
    """
    Recherche vectorielle avec filtrage par projet.

    Utilise la similarité cosinus pour trouver les chunks
    les plus proches sémantiquement de la requête.
    """
    search_results = search_client.search(
        search_text="",  # Pas de recherche textuelle
        vector_queries=[{
            "vector": embedding,
            "fields": "embedding",
            "k": top_k,
            "kind": "vector",
            "exhaustive": True  # Recherche exhaustive pour précision
        }],
        filter=f"project_name eq '{project_name}'",  # Filtrage par projet
        select=["chunk", "url_document_source", "key_phrases"]
    )
    return results

Intégration avec les Agents

Le module RAG s'intègre nativement avec les agents Waka Voice via un Tool dédié :

# utils/tools/rag_vector_search.py
RAG_VECTOR_SEARCH_TOOL = {
    "type": "function",
    "function": {
        "name": "search_knowledge_base",
        "description": """Recherche dans la base de connaissances interne.

Utilise ce tool pour:
- Trouver des informations sur les procédures internes
- Rechercher des documents de l'entreprise
- Obtenir des réponses sur les politiques et règles
- Consulter la documentation technique ou RH

Retourne les passages les plus pertinents avec leur source.""",
        "parameters": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "La requête de recherche en langage naturel"
                },
                "max_results": {
                    "type": "integer",
                    "description": "Nombre max de résultats (défaut: 5, max: 10)",
                    "default": 5
                },
                "min_score": {
                    "type": "number",
                    "description": "Score minimum de pertinence (0-1)",
                    "default": 0.5
                }
            },
            "required": ["query"]
        }
    }
}
Fonctionnement automatique

Lorsque le tool search_knowledge_base est attaché à un agent, celui-ci décide automatiquement quand l'utiliser. Si l'utilisateur pose une question sur un sujet interne, l'agent invoque le tool, récupère les chunks pertinents, et formule sa réponse en citant les sources.

Interfaces RAG

Le module RAG dispose de plusieurs interfaces accessibles via le préfixe /rag :

Route Description Fonctionnalités
/rag/upload Upload de fichiers Drag & drop, multi-fichiers, preview
/rag/crawl Configuration du crawler web URL, profondeur, mode JS, sitemap
/rag/sharepoint Intégration SharePoint Sélection bibliothèques, indexation
/rag/knowledge Base de connaissances Visualisation documents indexés
/rag/conversations Historique conversations RAG Filtres, satisfaction, export
/rag/deletion Suppression des données Par URL, par projet, nettoyage
/rag/chat Chat avec la base Interface de test RAG standalone
/rag/chat-enhanced Chat amélioré Sidebar fichiers, étapes analyse, tools

Gestion des Sessions RAG

Les conversations RAG sont persistées dans Cosmos DB avec un schéma riche permettant l'analyse et le suivi de la satisfaction :

# configuration/sessions/rag/manager.py
class RagSessionManager:
    """
    Gestionnaire des sessions RAG Chat.
    Container: ConversationHistory (ConversationsDB)

    Schéma du document:
    {
        "id": "conv_abc123",
        "user_email": "user@domain.com",
        "display_name": "John Doe",
        "history": [
            {"role": "user", "content": "...", "timestamp": "..."},
            {"role": "assistant", "content": "...", "timestamp": "..."}
        ],
        "start_datetime": "2025-12-22T12:00:00Z",
        "end_datetime": "",
        "duration": "0:00:00",
        "summary": "",
        "satisfaction_measure": {
            "response_confidence": {"positive": 0.85, "negative": 0.15},
            "user_messages_average": {"positive": 0.78, "negative": 0.22}
        },
        "status": "active"
    }
    """

    def create(self, session_id, user_email, display_name, initial_message=None):
        """Crée une nouvelle session RAG."""

    def add_message(self, session_id, role, content):
        """Ajoute un message à l'historique."""

    def close(self, session_id, summary, satisfaction):
        """Clôture la session avec métriques."""

Métriques et Monitoring

Le module RAG expose plusieurs métriques pour le suivi et l'optimisation :

Métriques d'indexation

  • Documents traités : Total / Succès / Échecs / Ignorés
  • Chunks créés : Par document et total
  • Temps d'indexation : Par étape du pipeline
  • Erreurs : Types et fréquences

Métriques de recherche

  • Latence recherche : P50, P95, P99
  • Score moyen : Pertinence des résultats
  • Taux de résultats vides : Requêtes sans match
  • Volume requêtes : Par heure/jour

Métriques satisfaction

  • Confiance réponse : Score positif/négatif
  • Sentiment utilisateur : Analyse messages
  • Durée sessions : Moyenne et distribution
  • Taux résolution : Sessions avec succès

Bonnes Pratiques RAG

Recommandations pour un RAG performant
  • Qualité des sources : Privilégiez des documents bien structurés avec titres et sections
  • Mise à jour régulière : Réindexez périodiquement pour refléter les changements
  • Segmentation par projet : Utilisez project_name pour isoler les domaines métier
  • Min score adapté : Ajustez le seuil selon la taille de votre base (0.5-0.7 recommandé)
  • Monitoring actif : Surveillez les requêtes sans résultats pour identifier les lacunes
  • Feedback loop : Utilisez les métriques de satisfaction pour améliorer le contenu

API Reference RAG

Endpoint Méthode Description
/api/rag_search/{project_name} POST Recherche vectorielle avec filtrage projet
/api/kickoff_indexation POST Démarre indexation SharePoint
/api/indexation_status/{operation_id} GET Statut d'une opération d'indexation
/crawl/start-crawl POST Démarre un crawl web
/crawl/crawl-status GET Statut du crawl en cours
/crawl/stop-crawl POST Arrête le crawl en cours
/api/upload-to-blob POST Upload fichiers vers Blob Storage
/rag/api/conversations GET Liste conversations avec pagination

Chapitre 3: Architecture Système

Structure modulaire et flux de données

L'architecture de Waka Voice suit le principe de séparation des préoccupations via un système de Blueprints Flask modulaires. Chaque composant a une responsabilité unique et peut évoluer indépendamment, facilitant la maintenance et l'extension du système.

3.1 Vue d'ensemble architecturale

L'architecture se décompose en quatre couches principales, chacune avec des responsabilités bien définies et des interfaces claires :

flowchart TB subgraph Presentation["Couche Présentation"] WEB[Templates Jinja2] API[REST API] WS[WebSocket Endpoints] end subgraph Business["Couche Métier (Blueprints)"] VOICE[voice_live_proxy] AVATAR[avatar_live_proxy] TEXT[text_agents] UNIFIED[unified_agent] TOOLS[tools] PERSONAL[personal_voice] PROMPT[prompt_builder] end subgraph Data["Couche Données"] MANAGERS[Cosmos Managers] SESSIONS[Session Managers] STORAGE[Blob Storage Client] end subgraph External["Services Externes"] AZURE_VOICE[Azure Voice Live] AZURE_SPEECH[Azure Speech] AZURE_OPENAI[Azure OpenAI] AZURE_AVATAR[Azure Avatar] COSMOS[(Cosmos DB)] BLOB[(Blob Storage)] end WEB --> Business API --> Business WS --> VOICE WS --> AVATAR VOICE --> MANAGERS VOICE --> AZURE_VOICE AVATAR --> MANAGERS AVATAR --> AZURE_AVATAR TEXT --> MANAGERS TEXT --> AZURE_OPENAI UNIFIED --> MANAGERS TOOLS --> MANAGERS PERSONAL --> AZURE_SPEECH PERSONAL --> STORAGE MANAGERS --> COSMOS SESSIONS --> COSMOS STORAGE --> BLOB

3.2 Structure des Blueprints

Les Blueprints Flask permettent d'organiser le code en modules indépendants avec leurs propres routes, templates et logique métier. Voici le détail de chaque Blueprint :

Blueprint Préfixe Responsabilité Fichiers clés
voice_proxy /voice-proxy Proxy WebSocket bidirectionnel pour conversations voix temps réel voice_live_proxy.py (800+ lignes)
avatar_proxy /avatar-proxy Proxy WebSocket pour conversations avatar avec synchronisation vidéo avatar_live_proxy.py
text_agents /text-agents Gestion complète des agents textuels : CRUD, chat, streaming SSE text_agents_routes.py
unified_agent /agents/unified Interface de création unifiée pour tous types d'agents unified_agent_routes.py
tools /tools CRUD tools, test, import OpenAPI avec analyse IA tools/__init__.py, add.py, list.py
personal_voice /creer-une-voix Création voix personnalisées : consentement, entraînement, galerie personal_voice_routes.py
prompt_builder /agents/prompt-builder Générateur visuel de prompts avec 4 méthodes prompt_builder_routes.py
azure_voices /api/azure-voices API REST pour récupération dynamique des voix Azure azure_voices_api.py

Principe de responsabilité unique

Chaque Blueprint suit le principe SRP (Single Responsibility Principle). Par exemple, voice_live_proxy ne gère que la communication WebSocket temps réel, tandis que la persistance est déléguée aux Cosmos Managers. Cette séparation permet :

3.3 Configuration et Managers

La couche configuration/ contient les gestionnaires de données (Managers) qui abstraient l'accès à Cosmos DB. Cette abstraction offre plusieurs avantages :

# Exemple : cosmos_agent_manager.py

class CosmosAgentManager:
    """
    Gestionnaire CRUD pour les agents voix.

    Responsabilités:
    - Abstraction des opérations Cosmos DB
    - Validation des données entrantes
    - Génération des références uniques
    - Gestion des timestamps
    """

    def __init__(self):
        self.container = get_agents_container()

    def create(self, config: dict) -> str:
        """
        Crée un nouvel agent avec validation et enrichissement.

        Args:
            config: Configuration de l'agent (nom, modèle, voix, tools, instructions)

        Returns:
            agent_id: UUID du nouvel agent

        Raises:
            ValidationError: Si la configuration est invalide
        """
        # Validation
        self._validate_config(config)

        # Enrichissement
        agent_id = str(uuid.uuid4())
        now = datetime.now(timezone.utc).isoformat()

        document = {
            "id": agent_id,
            "agent_id": agent_id,
            "agent_reference": self._generate_reference(),
            "created_at": now,
            "updated_at": now,
            "status": "active",
            **config
        }

        # Persistance
        self.container.create_item(body=document)

        return agent_id

    def get(self, agent_id: str) -> Optional[dict]:
        """Récupère un agent par son ID."""
        try:
            return self.container.read_item(
                item=agent_id,
                partition_key=agent_id
            )
        except exceptions.CosmosResourceNotFoundError:
            return None

    def update(self, agent_id: str, updates: dict) -> bool:
        """Met à jour partiellement un agent."""
        agent = self.get(agent_id)
        if not agent:
            return False

        agent.update(updates)
        agent["updated_at"] = datetime.now(timezone.utc).isoformat()

        self.container.replace_item(item=agent_id, body=agent)
        return True

    def delete(self, agent_id: str) -> bool:
        """Supprime un agent (soft delete recommandé en production)."""
        try:
            self.container.delete_item(item=agent_id, partition_key=agent_id)
            return True
        except exceptions.CosmosResourceNotFoundError:
            return False

    def list_all(self, status: str = None) -> List[dict]:
        """Liste tous les agents avec filtre optionnel."""
        query = "SELECT * FROM c"
        if status:
            query += f" WHERE c.status = '{status}'"
        query += " ORDER BY c.created_at DESC"

        return list(self.container.query_items(
            query=query,
            enable_cross_partition_query=True
        ))
Pattern Singleton pour les Managers

Les Managers sont instanciés une seule fois au démarrage de l'application via la fonction get_*_manager(). Cela évite de recréer la connexion Cosmos DB à chaque requête, améliorant les performances et réduisant les coûts.

3.4 Stack Technique Détaillée

Voici l'ensemble des technologies utilisées avec leur justification :

Backend

Python 3.13+
Flask 3.0
flask-sock
Gevent
Requests
Jinja2

Azure Services

Cosmos DB
Speech Services
OpenAI Service
Avatar Service
Blob Storage
AI Search

Frontend

HTML5
CSS3 / Bootstrap 5
Vanilla JavaScript
Chart.js
WebSocket API

Chapitre 4: Base de Données

Architecture Hybride Cosmos DB + Azure Blob Storage

Waka Voice adopte une architecture de stockage hybride combinant Azure Cosmos DB pour les données structurées et transactionnelles, et Azure Blob Storage pour les fichiers binaires volumineux. Cette approche permet d'optimiser les coûts, les performances et la scalabilité en utilisant chaque service pour ses forces respectives.
2
Databases Cosmos DB
21
Containers Cosmos DB
6
Containers Blob Storage
<10ms
Latence P99 garantie

4.1 Approche Hybride : Cosmos DB + Blob Storage

4.1.1 Philosophie de l'Architecture

L'architecture hybride sépare intelligemment les responsabilités de stockage : Cosmos DB gère les métadonnées, configurations et données transactionnelles, tandis que Blob Storage stocke les fichiers binaires volumineux (audio, documents, images). Cette séparation permet d'optimiser chaque type de données selon ses caractéristiques.
flowchart TB subgraph Application["🖥️ Application Waka Voice"] API[Flask API] WS[WebSocket Handler] end subgraph CosmosLayer["💾 Azure Cosmos DB"] direction TB DB1[("ConversationsDB
17 containers")] DB2[("RAG_base
3 containers")] end subgraph BlobLayer["📦 Azure Blob Storage"] direction TB B1[documents] B2[consent-audio] B3[voice-samples] B4[synthesized-audio] B5[enregistrements] B6[background] end subgraph DataTypes["Types de Données"] META["📋 Métadonnées
Configurations
Historiques
Sessions"] FILES["📁 Fichiers Binaires
Audio WAV/MP3
Documents PDF
Images PNG/JPG"] end API --> CosmosLayer WS --> CosmosLayer API --> BlobLayer META -.->|Stocké dans| CosmosLayer FILES -.->|Stocké dans| BlobLayer CosmosLayer <-->|"Références URL"| BlobLayer style CosmosLayer fill:#4A148C,color:#fff style BlobLayer fill:#0D47A1,color:#fff style Application fill:#1B5E20,color:#fff

4.1.2 Comparaison et Avantages

💾 Cosmos DB
  • Latence < 10ms garantie au P99
  • Requêtes SQL sur documents JSON
  • Transactions ACID par partition
  • Indexation automatique de tous les champs
  • Distribution géographique multi-régions
  • Change Feed pour événements temps réel
  • SLA 99.999% disponibilité
Idéal pour : Configurations agents, sessions, historiques, métadonnées, tools
Blob Storage
  • Fichiers illimités jusqu'à 190.7 TB chacun
  • Streaming natif pour audio/vidéo
  • CDN intégré pour distribution globale
  • Tiers de stockage : Hot, Cool, Archive
  • Accès SAS sécurisé avec expiration
  • Versioning et soft delete
Idéal pour : Audio, documents PDF, images, fichiers volumineux
Avantage de l'Approche Hybride

En stockant les références URL dans Cosmos DB plutôt que les fichiers binaires, nous optimisons les performances de stockage. Les fichiers volumineux (audio, documents) sont stockés dans Blob Storage avec accès rapide via CDN.

4.1.3 Vue d'Ensemble des Bases

Azure Cosmos DB
NoSQL Document Database
📁 ConversationsDB
17 containers • Données applicatives
AgentConfigurations VoiceSessions Tools +14 autres
📁 RAG_base
3 containers • Données RAG
database (chunks) Libraries_Tracking Logs_RAG
Azure Blob Storage
Object Storage Service
📄 documents
PDF, DOCX, XLSX
🎤 consent-audio
WAV consentements
🔊 voice-samples
Échantillons vocaux
🎵 synthesized-audio
Audio généré
🎙️ enregistrements
Enregistrements
🖼️ background
Images avatars

4.2 Database 1 : ConversationsDB (Principal)

ConversationsDB est la base de données principale contenant 17 containers pour toutes les données applicatives : configurations agents, sessions, tools, campagnes, etc.

4.2.1 Container : AgentConfigurations

AgentConfigurations
DescriptionConfigurations des agents vocaux (Voice Live)
Partition Key/agent_id
Justification PKAccès direct par ID agent, isolation par agent
Liens versVoiceSessions, Tools, campagnes-appels
{
  "id": "uuid",
  "agent_id": "uuid",
  "agent_reference": "Agent-XXXXXX",
  "agent_type": "voice_agent",
  "config_type": "azure_speech",
  "model_id": "gpt-4o-realtime",
  "model_name": "GPT-4o Realtime",
  "model_family": "F1_Realtime",
  "speech_endpoint": "https://eastus2.api.cognitive.microsoft.com/",
  "speech_region": "eastus2",
  "agent_name": "Assistant Commercial",
  "role": "commercial",
  "voice_config": {
    "voice": "fr-FR-DeniseNeural",
    "style": "friendly"
  },
  "azure_config": {
    "modalities": ["text", "audio"],
    "temperature": 0.8,
    "max_response_output_tokens": 4096,
    "turn_detection": {
      "type": "server_vad",
      "threshold": 0.5,
      "silence_duration_ms": 500
    },
    "input_audio_transcription": { "model": "whisper-1" },
    "tools": ["search_web", "send_email"],
    "instructions": "Tu es un assistant commercial..."
  },
  "tools": ["tool_id_1", "tool_id_2"],
  "current_step": 4,
  "status": "active",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-20T14:45:00Z"
}

4.2.2 Container : AvatarConfigurations

AvatarConfigurations
DescriptionConfigurations des agents avatar (Azure Avatar)
Partition Key/agent_id
Justification PKMême pattern que AgentConfigurations
Liens versVoiceSessions, Tools, AvatarGallery
{
  "id": "uuid",
  "agent_id": "uuid",
  "agent_reference": "Avatar-XXXXXX",
  "agent_type": "azure_avatar",
  "avatar_type": "photo",
  "azure_config": {
    "avatar": {
      "character": "lisa",
      "style": "casual-sitting",
      "photoAvatarBaseModel": "vasa-1",
      "video": {
        "bitrate": 2000000,
        "codec": "h264",
        "resolution": { "width": 1920, "height": 1080 }
      }
    },
    "modalities": ["text", "audio"],
    "temperature": 0.7
  },
  "background_url": "https://...blob.../background/office.jpg",
  "status": "active"
}

4.2.3 Container : TextAgentConfigurations

TextAgentConfigurations
DescriptionConfigurations des agents texte (GPT-5.2, Claude Opus 4.5)
Partition Key/agent_id
Justification PKAccès direct par ID agent
Liens versVoiceSessions, Tools
{
  "id": "uuid",
  "agent_id": "uuid",
  "agent_reference": "TextAgent-XXXXXX",
  "agent_type": "text_agent",
  "config_type": "azure_inference",
  "model_id": "gpt-5.2-chat",
  "model_name": "GPT-5.2",
  "model_provider": "OpenAI",
  "language": "fr-FR",
  "tools": ["end_text_conversation", "search_knowledge"],
  "tools_definitions": [
    {
      "type": "function",
      "function": {
        "name": "search_knowledge",
        "description": "Recherche dans la base de connaissances",
        "parameters": { ... }
      }
    }
  ],
  "instructions": "Tu es un assistant expert...",
  "temperature": 0.7,
  "max_response_tokens": 4096,
  "status": "active",
  "created_at": "2024-02-01T09:00:00Z"
}

4.2.4 Container : VoiceSessions

VoiceSessions
DescriptionSessions de conversation (Voice, Avatar, Text)
Partition Key/call_id
Justification PKIsolation parfaite par session, requêtes rapides
Liens versAgentConfigurations, CallHistory
{
  "id": "session_uuid",
  "call_id": "call_uuid",
  "session_id": "session_uuid",
  "session_type": "voice_live",
  "agent_id": "agent_uuid",
  "agent_type": "Agent Voice",
  "model_id": "gpt-4o-realtime",
  "family": "F1_Realtime",
  "tarif_base": "pro",
  "azure_config": { ... },
  "history": [
    { "role": "user", "content": "Bonjour", "timestamp": "..." },
    { "role": "assistant", "content": "Bonjour ! Comment puis-je vous aider ?", "timestamp": "..." }
  ],
  "usage": {
    "input_token_details": { "text_tokens": 150, "audio_tokens": 2400 },
    "output_token_details": { "text_tokens": 200, "audio_tokens": 3200 }
  },
  "cost": {
    "total_cost": 0.045,
    "cost_per_minute": 0.015
  },
  "duration_minutes": 3.5,
  "status": "completed",
  "summary": "Discussion sur les tarifs et disponibilités",
  "sentiment": "positive",
  "created_at": "2024-01-20T14:30:00Z",
  "end_datetime": "2024-01-20T14:33:30Z"
}

4.2.5 Container : Tools

Tools
DescriptionDéfinitions des outils dynamiques pour les agents
Partition Key/category
Justification PKRequêtes fréquentes par catégorie (galerie, filtrage)
Liens versAgentConfigurations (via tools[])
{
  "id": "uuid",
  "tool_id": "uuid",
  "name": "search_web",
  "display_name": "Recherche Web",
  "category": "general",
  "tool_type": "api_rest",
  "definition": {
    "type": "function",
    "function": {
      "name": "search_web",
      "description": "Effectue une recherche sur le web",
      "parameters": {
        "type": "object",
        "properties": {
          "query": { "type": "string", "description": "Requête de recherche" }
        },
        "required": ["query"]
      }
    }
  },
  "execution": {
    "type": "http",
    "method": "GET",
    "endpoint": "https://api.bing.microsoft.com/v7.0/search",
    "headers": { "Ocp-Apim-Subscription-Key": "{{BING_API_KEY}}" }
  },
  "status": "active",
  "is_system": false,
  "version": 1,
  "created_at": "2024-01-10T08:00:00Z"
}

4.2.6 Container : CallHistory

CallHistory
DescriptionHistorique détaillé des appels (campagnes)
Partition Key/call_id
Justification PKIsolation par appel, corrélation avec VoiceSessions
Liens verscampagnes-appels, CampaignClients
{
  "id": "call_uuid",
  "call_id": "call_uuid",
  "session_id": "call_uuid",
  "session_type": "voice_live",
  "agent_id": "agent_uuid",
  "campaign_id": "campaign_uuid",
  "customer_data": {
    "name": "Jean Dupont",
    "phone": "+33612345678",
    "company": "Acme Inc"
  },
  "current_step": "closing",
  "conversation_history": [ ... ],
  "brain_history": [ ... ],
  "tools_executed": [
    { "name": "check_availability", "result": "success", "timestamp": "..." }
  ],
  "tokens": {
    "input_text": 450,
    "input_audio": 5600,
    "output_text": 380,
    "output_audio": 7200
  },
  "status": "completed",
  "outcome": "ptp",
  "created_at": "2024-01-22T10:15:00Z"
}

4.2.7 Container : campagnes-appels

campagnes-appels
DescriptionConfigurations des campagnes d'appels sortants
Partition Key/id
Justification PKAccès direct par ID campagne
Liens versAgentConfigurations, CampaignClients, CallHistory
{
  "id": "campaign_uuid",
  "campaign_id": "campaign_uuid",
  "campaign_reference": "campagne_XXXXX",
  "campaign_name": "Recouvrement Q1 2024",
  "campaign_type": "recouvrement",
  "agent_id": "agent_uuid",
  "agent_reference": "Agent-XXXXXX",
  "start_date": "2024-01-15",
  "end_date": "2024-03-31",
  "selected_tools": ["check_payment_status", "schedule_callback"],
  "selected_statuses": ["impayé", "relance"],
  "clients": ["client_id_1", "client_id_2"],
  "total_clients": 250,
  "stats": {
    "total_calls": 180,
    "successful_calls": 145,
    "ptp_count": 89,
    "callback_scheduled": 32
  },
  "status": "active",
  "created_at": "2024-01-10T09:00:00Z"
}

4.2.8 Container : ConversationHistory

ConversationHistory
DescriptionHistorique des conversations RAG Chat
Partition Key/id
Justification PKAccès direct par ID conversation
Liens versRAGProjects
{
  "id": "conv_abc123",
  "user_email": "user@domain.com",
  "display_name": "Jean Dupont",
  "history": [
    { "role": "user", "content": "Quelle est la politique de remboursement ?" },
    { "role": "assistant", "content": "Selon notre documentation, les remboursements sont possibles..." }
  ],
  "start_datetime": "2024-01-25T14:00:00Z",
  "end_datetime": "2024-01-25T14:15:00Z",
  "duration": "0:15:00",
  "summary": "Questions sur la politique de remboursement",
  "satisfaction_measure": {
    "rating": 4,
    "feedback": "Réponse claire et rapide"
  },
  "status": "completed"
}

4.2.9 Containers Personal Voice

Container Partition Key Description Lien Blob Storage
PersonalVoiceProjects /project_id Projets de création de voix personnalisées -
PersonalVoiceConsents /consent_id Enregistrements de consentement consent-audio (audio_url)
PersonalVoices /voice_id Voix créées et entraînées voice-samples (training_audio_url)

4.2.10 Autres Containers ConversationsDB

Container Partition Key Description
CampaignClients /campagne_id Clients associés aux campagnes d'appels
Callbacks /client_id Rappels planifiés pour les campagnes
AvatarGallery /id Galerie d'avatars prédéfinis (Studio Avatar)
AvatarPreferences /user_id Préférences utilisateur (favoris, récents)
RAGProjects /id Projets RAG (organisation des documents)
TokenConsumption /user_id Suivi de consommation de tokens par utilisateur
ModelInstructions /id Templates d'instructions pour les modèles

4.3 Database 2 : RAG_base (Fonctionnalité RAG)

RAG_base est une base de données dédiée au système RAG (Retrieval-Augmented Generation), contenant 3 containers pour les chunks indexés, le tracking et les logs.

4.3.1 Container : database (Chunks)

database (Chunks RAG)
DescriptionChunks de documents indexés avec embeddings
Partition Key/project_name
Justification PKFiltrage rapide par projet lors des recherches
Liens versBlob Storage (documents), RAGProjects
{
  "id": "chunk_uuid",
  "document_id": "doc_uuid",
  "project_id": "project_uuid",
  "project_name": "Base Connaissances RH",
  "content": "Le processus d'intégration des nouveaux employés comprend...",
  "chunk_index": 5,
  "total_chunks": 24,
  "blob_url": "https://wakastorage.blob.../documents/politique_rh.pdf",
  "source_filename": "politique_rh.pdf",
  "source_type": "upload",
  "embedding": [0.0234, -0.0156, 0.0891, ...],
  "metadata": {
    "page_number": 3,
    "section": "Intégration",
    "language": "fr"
  },
  "summary": "Résumé du processus d'intégration...",
  "entities": ["RH", "intégration", "onboarding"],
  "created_at": "2024-01-18T11:30:00Z"
}

4.3.2 Container : Libraries_Tracking

Libraries_Tracking
DescriptionSuivi des bibliothèques SharePoint synchronisées
Partition Key/site_id
Justification PKGroupement par site SharePoint
{
  "id": "tracking_uuid",
  "site_id": "sharepoint_site_id",
  "library_id": "library_id",
  "library_name": "Documents RH",
  "last_sync": "2024-01-25T02:00:00Z",
  "documents_indexed": 156,
  "chunks_created": 2340,
  "sync_status": "completed",
  "errors": []
}

4.3.3 Container : Logs_RAG

Logs_RAG
DescriptionLogs des opérations RAG (indexation, recherche)
Partition Key/operation_type
Justification PKAnalyse par type d'opération

4.4 Azure Blob Storage : Containers

Azure Blob Storage stocke tous les fichiers binaires volumineux, avec des références URL conservées dans Cosmos DB pour maintenir la liaison.
flowchart LR subgraph BlobContainers["📦 Azure Blob Storage Containers"] direction TB DOC["📄 documents
PDF, DOCX, XLSX
RAG indexation"] CONS["🎤 consent-audio
WAV consentements
Personal Voice"] SAMP["🔊 voice-samples
Échantillons vocaux
Training CNV"] SYNTH["🎵 synthesized-audio
Audio généré
TTS output"] ENR["🎙️ enregistrements
Enregistrements divers
Audio général"] BG["🖼️ background
Images fond
Avatar Studio"] end subgraph CosmosRefs["💾 Références Cosmos DB"] R1["RAG_base.database
blob_url"] R2["PersonalVoiceConsents
audio_url"] R3["PersonalVoices
training_audio_url"] R4["VoiceSessions
audio_url"] R5["AgentConfigurations
sample_audio_url"] R6["AvatarConfigurations
background_url"] end DOC --> R1 CONS --> R2 SAMP --> R3 SYNTH --> R4 ENR --> R5 BG --> R6 style BlobContainers fill:#0D47A1,color:#fff style CosmosRefs fill:#4A148C,color:#fff
Container Contenu Formats Tier Référencé par
documents Documents pour indexation RAG PDF, DOCX, XLSX, TXT, PPTX Hot RAG_base.database
consent-audio Enregistrements de consentement vocal WAV (16kHz, mono) Hot PersonalVoiceConsents
voice-samples Échantillons pour entraînement voix WAV (24kHz, mono) Hot PersonalVoices
synthesized-audio Audio généré par TTS WAV, MP3 Cool VoiceSessions
enregistrements Enregistrements audio généraux WAV, MP3 Hot AgentConfigurations
background Images de fond pour avatars PNG, JPG, WEBP Hot AvatarConfigurations

4.5 Diagramme d'Interrelations

Ce diagramme montre les relations entre tous les containers Cosmos DB et Blob Storage, illustrant comment les données circulent dans l'application.
erDiagram AgentConfigurations ||--o{ VoiceSessions : "lance" AgentConfigurations ||--o{ campagnes-appels : "utilisé par" AgentConfigurations }o--o{ Tools : "référence" AvatarConfigurations ||--o{ VoiceSessions : "lance" AvatarConfigurations }o--|| AvatarGallery : "sélectionne" AvatarConfigurations }o--|| background-blob : "image de" TextAgentConfigurations ||--o{ VoiceSessions : "lance" TextAgentConfigurations }o--o{ Tools : "référence" VoiceSessions ||--|| CallHistory : "détails dans" VoiceSessions }o--|| synthesized-audio-blob : "audio dans" campagnes-appels ||--o{ CampaignClients : "contient" campagnes-appels ||--o{ CallHistory : "génère" campagnes-appels ||--o{ Callbacks : "planifie" CampaignClients ||--o{ Callbacks : "rappels pour" PersonalVoiceProjects ||--o{ PersonalVoiceConsents : "contient" PersonalVoiceProjects ||--o{ PersonalVoices : "produit" PersonalVoiceConsents }o--|| consent-audio-blob : "audio dans" PersonalVoices }o--|| voice-samples-blob : "samples dans" RAGProjects ||--o{ database-chunks : "organise" database-chunks }o--|| documents-blob : "source dans" ConversationHistory }o--|| RAGProjects : "utilise" AgentConfigurations { string agent_id PK string agent_reference array tools FK string status } VoiceSessions { string call_id PK string agent_id FK array history object usage } Tools { string tool_id PK string category string name object definition } campagnes-appels { string campaign_id PK string agent_id FK array clients FK } PersonalVoiceProjects { string project_id PK array consents FK array voices FK } RAGProjects { string project_id PK string name int document_count }

4.6 Flux de Données Principaux

4.6.1 Flux 1 : Session Voice/Avatar

sequenceDiagram participant U as Utilisateur participant API as Flask API participant Cosmos as Cosmos DB participant Blob as Blob Storage participant Azure as Azure OpenAI U->>API: Démarrer session API->>Cosmos: Read AgentConfigurations Cosmos-->>API: Config agent + tools API->>Cosmos: Create VoiceSessions loop Conversation U->>API: Message audio API->>Azure: Realtime API Azure-->>API: Réponse audio API->>API: Accumule en mémoire end U->>API: Fin session API->>Blob: Upload audio (optionnel) Blob-->>API: URL audio API->>Cosmos: Update VoiceSessions (final) API->>Cosmos: Create/Update CallHistory

4.6.2 Flux 2 : Indexation RAG

sequenceDiagram participant U as Utilisateur participant API as Flask API participant Blob as Blob Storage participant DocInt as Document Intelligence participant OpenAI as Azure OpenAI participant Cosmos as Cosmos DB RAG_base participant Search as AI Search U->>API: Upload document API->>Blob: Store fichier Blob-->>API: blob_url API->>DocInt: Extraction texte DocInt-->>API: Contenu structuré API->>API: Chunking (500 tokens) loop Pour chaque chunk API->>OpenAI: Embedding OpenAI-->>API: Vector 1536d API->>Cosmos: Insert chunk + embedding end API->>Search: Index mise à jour API->>Cosmos: Update RAGProjects stats

4.6.3 Flux 3 : Personal Voice

sequenceDiagram participant U as Utilisateur participant API as Flask API participant Blob as Blob Storage participant Speech as Azure Speech participant Cosmos as Cosmos DB U->>API: Créer projet API->>Cosmos: Create PersonalVoiceProjects U->>API: Enregistrer consentement API->>Blob: Upload consent-audio Blob-->>API: audio_url API->>Cosmos: Create PersonalVoiceConsents API->>Speech: Submit consent Speech-->>API: azure_consent_id API->>Cosmos: Update consent status U->>API: Upload échantillons API->>Blob: Upload voice-samples API->>Speech: Create Personal Voice Speech-->>API: voice_id API->>Cosmos: Create PersonalVoices

4.7 Pattern de Persistance Optimisé

Optimisation : 2 appels Cosmos par session

Au lieu de persister chaque message (50+ writes par conversation), ce pattern réduit à exactement 2 opérations : 1 create au lancement, 1 update à la clôture. Économie : ~95% des RU/s.

# Pattern de persistance (voice_live_proxy.py)
class VoiceLiveSession:
    def __init__(self, ...):
        # Phase 1: Lancement - 1 read config, 1 create session
        self.cached_azure_config = agent_config.get('azure_config')
        self._create_conversation_document()  # 1 write

    def _accumulate_transcript(self, role, content):
        # Phase 2: Pendant - 0 appels Cosmos
        self.transcripts.append({
            "role": role,
            "content": content,
            "timestamp": datetime.utcnow().isoformat()
        })  # Mémoire uniquement

    def close(self):
        # Phase 3: Fin - 1 update final
        manager.update(self.session_id, {
            "history": self.transcripts,
            "usage": self.accumulated_tokens,
            "outcome": self.end_outcome,
            "end_datetime": datetime.utcnow().isoformat()
        })  # 1 write

4.8 Bonnes Pratiques de Partition Key

Pattern Partition Key Cas d'usage Avantages
Accès direct /id ou /entity_id AgentConfigurations, VoiceSessions Point reads ultra-rapides (1 RU)
Groupement logique /category, /project_name Tools, RAG chunks Requêtes filtrées efficaces
Isolation tenant /user_id, /campaign_id TokenConsumption, CampaignClients Données isolées par entité
Time-series /operation_type Logs_RAG Analyse par type d'opération
⚠️ Éviter les hot partitions

Ne jamais utiliser une partition key avec faible cardinalité (ex: /status avec 3 valeurs). Cela crée des "hot partitions" qui limitent le throughput. Préférer des clés avec haute cardinalité comme les IDs ou les catégories multiples.

Chapitre 5: Voix Personnelles

Personal Voice - Création de voix sur mesure avec Azure Custom Neural Voice

Le module Personal Voice permet de créer des voix personnalisées uniques, reproduisant fidèlement le timbre et le style d'une voix humaine réelle via Azure Custom Neural Voice. Ce processus guidé en 4 étapes garantit la conformité légale (consentement explicite), la qualité audio optimale et l'intégration automatique dans votre galerie de voix.
4
Étapes de création
80%
Score validation minimum
3
Échantillons vocaux requis
~5min
Temps total de création

5.1 Architecture du Module

5.1.1 Stack Technique

Flask Blueprint Azure Speech Services Cosmos DB Azure Blob Storage Web Audio API JavaScript ES6+

5.1.2 Flux de Données Global

flowchart TB subgraph Frontend["Frontend (personal_voice.js)"] UI[Interface Utilisateur] REC[Web Audio Recorder] VAL[Validateur Local] end subgraph Backend["Backend Flask (personal_voice_routes.py)"] API[API REST Routes] PROC[Audio Processor] LEV[Levenshtein Validator] end subgraph Azure["Services Azure"] SPEECH[Azure Speech Services] BLOB[Azure Blob Storage] CNV[Custom Neural Voice API] end subgraph Storage["Stockage"] COSMOS[(Cosmos DB)] FILES[(Fichiers Audio)] end UI -->|Enregistrement| REC REC -->|WAV Base64| API API -->|Transcription| SPEECH SPEECH -->|Texte| LEV LEV -->|Score| PROC PROC -->|Upload| BLOB PROC -->|Métadonnées| COSMOS API -->|Création Voix| CNV CNV -->|Speaker Profile ID| COSMOS style Frontend fill:#E3F2FD,stroke:#1976D2 style Backend fill:#FFF3E0,stroke:#FF9800 style Azure fill:#E8F5E9,stroke:#4CAF50 style Storage fill:#FCE4EC,stroke:#E91E63

5.2 Le Workflow en 4 Étapes

flowchart LR A["Étape 1
Sélection Projet"] --> B["Étape 2
Consentement Vocal"] B --> C["Étape 3
3 Échantillons Audio"] C --> D["Étape 4
Synthèse & Galerie"] A -->|Projet existant
ou nouveau| A1[Project ID] B -->|8-15 secondes
Score ≥ 80%| B1[Consent validé] C -->|5-90 sec chacun
Score ≥ 80%| C1[3 samples OK] D -->|Azure CNV API
Speaker Profile| D1[Voix créée] style A fill:#4A148C,color:#fff style B fill:#7B1FA2,color:#fff style C fill:#9C27B0,color:#fff style D fill:#BA68C8,color:#fff

5.2.1 Étape 1 : Sélection du Projet

L'utilisateur choisit un projet Azure existant ou en crée un nouveau. Chaque projet peut contenir plusieurs voix personnalisées.

1

Sélectionner un Projet

Choisissez le projet Azure pour votre nouvelle voix

Projet Marketing
3 voix existantes
Nouveau Projet
Créer un projet
Gestion des Projets Azure

Les projets sont récupérés via l'API Azure Custom Neural Voice. Si aucun projet n'existe, un nouveau sera créé automatiquement avec un nom par défaut. Endpoint: GET /personal-voice/api/projects

5.2.2 Étape 2 : Enregistrement du Consentement

Cette étape est obligatoire légalement. L'utilisateur doit lire à haute voix un texte de consentement officiel qui autorise Azure à créer une voix synthétique.

Conformité Légale Obligatoire

Azure exige un enregistrement de consentement explicite de la personne dont la voix sera clonée. Le texte doit être lu exactement tel qu'affiché. Un score de validation ≥ 80% est requis.

2

Enregistrement du Consentement

Lisez ce texte à haute voix :

"I [state your name] am aware that recordings of my voice will be used by [state the company name] to create and use a synthetic version of my voice."

Cliquez pour commencer l'enregistrement
Durée requise : 8 à 15 secondes
Score: 85% ✓
Consentement validé (seuil minimum : 80%)

Algorithme de Validation

La validation utilise l'algorithme de distance de Levenshtein pour comparer le texte transcrit avec le texte attendu :

flowchart TD A[Audio Enregistré] --> B[Azure Speech-to-Text] B --> C[Transcription obtenue] C --> D[Normalisation texte] D --> E[Calcul Distance Levenshtein] E --> F{Score ≥ 80% ?} F -->|Oui| G[✓ Validation OK] F -->|Non| H[✗ Réessayer] G --> I[Upload vers Azure Blob] I --> J[Enregistrement Cosmos DB] style A fill:#E3F2FD,stroke:#1976D2 style G fill:#C8E6C9,stroke:#4CAF50 style H fill:#FFCDD2,stroke:#F44336
# Extrait de personal_voice_routes.py - Validation Levenshtein
def calculate_similarity_score(text1: str, text2: str) -> float:
    """Calcule le score de similarité entre deux textes (0-100%)"""
    # Normalisation
    t1 = text1.lower().strip()
    t2 = text2.lower().strip()

    # Distance de Levenshtein
    distance = levenshtein_distance(t1, t2)
    max_len = max(len(t1), len(t2))

    if max_len == 0:
        return 100.0

    # Score = 100 - (distance/max_len * 100)
    return max(0, 100 - (distance / max_len * 100))

5.2.3 Étape 3 : Enregistrement des 3 Échantillons Vocaux

L'utilisateur enregistre 3 échantillons audio en lisant des phrases prédéfinies. Chaque échantillon doit durer entre 5 et 90 secondes et atteindre un score de validation ≥ 80%.

3

Échantillons Vocaux (3 requis)

Lisez chaque phrase clairement et distinctement

Échantillon 1 ✓ 87%

"The quick brown fox jumps over the lazy dog. This sentence contains every letter of the alphabet."

Échantillon 2 ✓ 92%

"Technology continues to evolve at an unprecedented pace, transforming how we work and communicate."

Échantillon 3 - En cours Recording...

"Please speak naturally and at a comfortable pace. Clear pronunciation helps create a better voice model."

3
2/3 échantillons validés

Configuration des Échantillons

Paramètre Valeur Description
MIN_DURATION 5 secondes Durée minimale par échantillon
MAX_DURATION 90 secondes Durée maximale par échantillon
MIN_VALIDATION_SCORE 80% Score Levenshtein minimum requis
REQUIRED_SAMPLES 3 Nombre d'échantillons requis
AUDIO_FORMAT WAV 16-bit Format d'enregistrement
SAMPLE_RATE 24000 Hz Fréquence d'échantillonnage

5.2.4 Étape 4 : Synthèse et Galerie

Une fois les 3 échantillons validés, le système appelle l'Azure Custom Neural Voice API pour créer la voix personnalisée. Un Speaker Profile ID unique est généré.

sequenceDiagram participant U as Utilisateur participant F as Frontend participant B as Backend Flask participant A as Azure CNV API participant C as Cosmos DB U->>F: Clique "Créer la voix" F->>B: POST /personal-voice/api/create-voice B->>A: POST /customvoice/personalvoices Note over A: Traitement Azure
(~30 secondes) A-->>B: speaker_profile_id B->>C: Sauvegarde voice_metadata B-->>F: {success: true, voice_id: "xxx"} F->>U: Redirection vers Galerie

Galerie de Voix Personnelles

Vos voix créées sont prêtes à l'emploi

Marie - Marketing
Créée le 15/12/2025
Active fr-FR
Thomas - Support
Créée le 20/12/2025
Active fr-FR

5.3 API REST - Endpoints

Le module Personal Voice expose les endpoints suivants via le Blueprint Flask personal_voice_bp :

Méthode Endpoint Description
GET /personal-voice/ Page d'accueil - Étape 1 (sélection projet)
GET /personal-voice/step2/<project_id> Étape 2 - Enregistrement consentement
GET /personal-voice/step3/<project_id>/<consent_id> Étape 3 - Enregistrement échantillons
GET /personal-voice/gallery Galerie des voix créées
GET /personal-voice/api/projects Liste des projets Azure CNV
POST /personal-voice/api/validate-audio Validation audio via Levenshtein
POST /personal-voice/api/upload-consent Upload et validation du consentement
POST /personal-voice/api/upload-sample Upload d'un échantillon vocal
POST /personal-voice/api/create-voice Création finale de la voix (appel Azure)
GET /personal-voice/api/voices Liste des voix personnelles créées
DELETE /personal-voice/api/voice/<voice_id> Suppression d'une voix

5.3.1 Exemple d'Appel API - Validation Audio

// Requête POST /personal-voice/api/validate-audio
{
    "audio_data": "data:audio/wav;base64,UklGRiQAAABXQV...",
    "expected_text": "I John Doe am aware that recordings...",
    "audio_type": "consent"  // ou "sample"
}

// Réponse
{
    "success": true,
    "transcription": "I John Doe am aware that recordings...",
    "validation_score": 87.5,
    "is_valid": true,
    "message": "Audio validé avec un score de 87.5%"
}

5.4 Structure de Données Cosmos DB

5.4.1 Collection : personal_voices

{
    "id": "pv_abc123def456",
    "type": "personal_voice",
    "project_id": "proj_xyz789",
    "user_id": "user_12345",
    "voice_name": "Marie - Marketing",
    "speaker_profile_id": "spk_azure_profile_id",
    "locale": "fr-FR",
    "status": "active",  // draft, processing, active, failed
    "consent": {
        "blob_url": "https://blob.azure/.../consent_abc123.wav",
        "validation_score": 85.2,
        "recorded_at": "2025-12-15T10:30:00Z"
    },
    "samples": [
        {
            "sample_id": "smp_001",
            "blob_url": "https://blob.azure/.../sample1_abc123.wav",
            "validation_score": 87.5,
            "duration_seconds": 12.4,
            "recorded_at": "2025-12-15T10:32:00Z"
        },
        {
            "sample_id": "smp_002",
            "blob_url": "https://blob.azure/.../sample2_abc123.wav",
            "validation_score": 92.1,
            "duration_seconds": 15.2,
            "recorded_at": "2025-12-15T10:34:00Z"
        },
        {
            "sample_id": "smp_003",
            "blob_url": "https://blob.azure/.../sample3_abc123.wav",
            "validation_score": 88.9,
            "duration_seconds": 14.1,
            "recorded_at": "2025-12-15T10:36:00Z"
        }
    ],
    "azure_metadata": {
        "custom_voice_endpoint": "https://westeurope.api.cognitive.microsoft.com/...",
        "deployment_id": "dep_xxx",
        "model_version": "2024-01"
    },
    "created_at": "2025-12-15T10:30:00Z",
    "updated_at": "2025-12-15T10:40:00Z"
}

5.5 Intégration avec les Agents

Une fois créée, la voix personnelle peut être assignée à n'importe quel agent Voice ou agent Avatar dans Waka Voice.

flowchart LR subgraph Personal["Module Personal Voice"] PV[Voix Créée] SPK[speaker_profile_id] end subgraph Agents["Agents Waka Voice"] VA[Agent Voice] AV[Agent Avatar] end subgraph Azure["Azure TTS"] TTS[Text-to-Speech] SSML[SSML avec speaker] end PV --> SPK SPK -->|Configuration| VA SPK -->|Configuration| AV VA -->|Génération| SSML AV -->|Génération| SSML SSML --> TTS style Personal fill:#E8F5E9,stroke:#4CAF50 style Agents fill:#E3F2FD,stroke:#1976D2 style Azure fill:#FFF3E0,stroke:#FF9800

5.5.1 Configuration Agent avec Personal Voice

// Configuration de l'agent dans Cosmos DB
{
    "agent_id": "agent_voice_001",
    "type": "voice",
    "azure_config": {
        "voice_type": "personal",  // au lieu de "standard"
        "speaker_profile_id": "spk_azure_profile_id",
        "locale": "fr-FR",
        "style": "neutral",
        "rate": "1.0",
        "pitch": "0%"
    }
}

// SSML généré automatiquement
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis">
    <voice name="PersonalVoiceModel">
        <mstts:ttsembedding speakerProfileId="spk_azure_profile_id"/>
        Bonjour, comment puis-je vous aider aujourd'hui ?
    </voice>
</speak>

5.6 Bonnes Pratiques

Qualité d'Enregistrement

Utilisez un micro de qualité dans un environnement silencieux. Évitez les échos et bruits de fond pour une voix synthétique optimale.

Articulation Claire

Parlez distinctement à un rythme naturel. Évitez de parler trop vite ou trop lentement pour de meilleurs résultats.

Consentement Explicite

Assurez-vous que le consentement est donné par la personne elle-même. C'est une exigence légale d'Azure.

Réessayer si Nécessaire

Si le score de validation est inférieur à 80%, réenregistrez l'échantillon. La qualité finale dépend de la qualité des inputs.

Conseil Pro

Pour des résultats optimaux, enregistrez plus que les 3 échantillons minimum si possible. Azure utilise l'ensemble des données pour créer un modèle vocal plus précis et naturel. La durée totale recommandée est de 10-15 minutes de parole.

Chapitre 6: Système de Tools

Capacités agentiques et exécution de fonctions dynamiques

Le système de Tools transforme les agents en véritables agents autonomes capables d'exécuter des actions en temps réel : appeler des API REST, exécuter du code Python sandboxé, se connecter à des serveurs MCP, ou importer automatiquement des spécifications OpenAPI. Tous les tools sont stockés dans Cosmos DB et peuvent être créés/modifiés sans redéploiement.
4
Types de Tools
30+
Tools prédéfinis
23
Catégories
100%
Dynamique (No redeploy)

6.1 Architecture du Système de Tools

6.1.1 Stack Technique

Flask Blueprint Cosmos DB OpenAI Function Calling OpenAPI Parser GPT-5.2 pour génération MCP Protocol

6.1.2 Flux de Données Global

flowchart TB subgraph Creation["Création de Tools"] UI[Interface Web] OPENAPI[Import OpenAPI] AI_GEN[Génération IA] end subgraph Storage["Stockage Cosmos DB"] TOOLS_DB[(Container Tools)] JOBS_DB[(Container ImportJobs)] end subgraph Execution["Exécution"] AGENT[Agent Voice/Text/Avatar] EXECUTOR[Tool Executor] HTTP_CALL[HTTP Client] PYTHON_EXEC[Python Sandbox] MCP_CLIENT[MCP Client] end subgraph External["Services Externes"] EXT_API[APIs REST] MCP_SERVER[Serveurs MCP] end UI -->|POST /tools/api/create| TOOLS_DB OPENAPI -->|Parsing + GPT-5.2| AI_GEN AI_GEN -->|Batch upsert| TOOLS_DB AGENT -->|tool_call| EXECUTOR EXECUTOR -->|Fetch config| TOOLS_DB EXECUTOR -->|HTTP| HTTP_CALL --> EXT_API EXECUTOR -->|Python| PYTHON_EXEC EXECUTOR -->|MCP| MCP_CLIENT --> MCP_SERVER style Creation fill:#E3F2FD,stroke:#1976D2 style Storage fill:#FFF3E0,stroke:#FF9800 style Execution fill:#E8F5E9,stroke:#4CAF50 style External fill:#FCE4EC,stroke:#E91E63

6.2 Les 4 Types de Tools

flowchart LR subgraph Types["Types de Tools"] API["API REST
HTTP calls"] CODE["Code Python
Sandbox exec"] MCP["MCP Server
Protocol connect"] OPENAPI["Import OpenAPI
Auto-generate"] end API -->|GET/POST/PUT/DELETE| EXT[Services Externes] CODE -->|RestrictedPython| RESULT[Résultat] MCP -->|STDIO/SSE/HTTP| TOOLS[Outils MCP] OPENAPI -->|Parser + GPT-5.2| BATCH[Tools en batch] style API fill:#4A148C,color:#fff style CODE fill:#7B1FA2,color:#fff style MCP fill:#9C27B0,color:#fff style OPENAPI fill:#BA68C8,color:#fff

Sélection du Type de Tool

Choisissez le type d'outil à créer

API REST

GET, POST, PUT, DELETE avec authentification

MCP SERVER

STDIO, SSE, HTTP Streamable

CODE PYTHON

Exécution sandboxée, timeout 30s

IMPORT OPENAPI

YAML/JSON, génération IA batch

6.2.1 Type API REST

Appels HTTP vers des services externes avec configuration complète de l'authentification et du mapping des paramètres.

ChampTypeDescription
endpointstringURL complète de l'API (ex: https://api.example.com/users)
methodenumGET, POST, PUT, PATCH, DELETE
headersobjectHeaders HTTP personnalisés
auth_typeenumnone, api_key, bearer, basic
auth_configobjectConfiguration auth (header_name, value, in: header/query)
params_mappingobjectMapping param → path/query/body/header
body_templatestringTemplate JSON pour le body (avec placeholders {{param}})
// Exemple de configuration API REST
{
    "name": "create_client",
    "type": "api",
    "execution": {
        "type": "http",
        "endpoint": "https://api.waka.com/v1/clients",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json",
            "Accept": "application/json"
        },
        "auth_type": "bearer",
        "auth_config": {
            "value": "${env.WAKA_API_TOKEN}"
        },
        "params_mapping": {
            "first_name": {"in": "body", "name": "firstName"},
            "last_name": {"in": "body", "name": "lastName"},
            "phone": {"in": "body", "name": "phoneNumber"}
        }
    }
}

6.2.2 Type MCP Server

Connexion au Model Context Protocol pour intégrer des serveurs d'outils externes. Trois transports supportés :

flowchart LR subgraph Transports["Transports MCP"] STDIO["STDIO
Local subprocess"] SSE["SSE
Server-Sent Events"] HTTP["HTTP
Azure AI Foundry"] end STDIO -->|npx, node, python| LOCAL[Processus Local] SSE -->|Streaming| REMOTE[Serveur Distant] HTTP -->|REST + Auth| FOUNDRY[Azure AI Foundry] style STDIO fill:#4CAF50,color:#fff style SSE fill:#2196F3,color:#fff style HTTP fill:#FF9800,color:#fff
TransportUse CaseConfiguration Clé
stdio Serveurs MCP locaux (npx, node, python) command, args[], env{}
sse Serveurs MCP distants avec streaming url, auth_type, timeout, verify_ssl
http Azure AI Foundry MCP Gateways server_url, server_label, allowed_tools[]
// Exemple MCP STDIO (serveur local)
{
    "name": "filesystem_tools",
    "type": "mcp_server",
    "execution": {
        "type": "mcp",
        "transport": "stdio",
        "command": "npx",
        "args": ["-y", "@anthropic/mcp-server-filesystem", "/home/user/documents"],
        "env": {
            "NODE_OPTIONS": "--max-old-space-size=4096"
        }
    }
}

// Exemple MCP HTTP (Azure AI Foundry)
{
    "name": "azure_ai_tools",
    "type": "mcp_server",
    "execution": {
        "type": "mcp",
        "transport": "http",
        "server_url": "https://my-foundry.azure.com/mcp",
        "server_label": "Azure AI Foundry",
        "allowed_tools": ["search_documents", "analyze_image"],
        "auth_type": "bearer",
        "auth_config": {"value": "${env.AZURE_AI_KEY}"},
        "require_approval": "never"
    }
}

6.2.3 Type Code Python

Exécution de code Python dans un environnement sandboxé avec RestrictedPython. Timeout de 30 secondes.

Sécurité du Sandbox

Le code Python est exécuté dans un environnement restreint. Seules les fonctions built-in sûres sont autorisées : print, len, str, int, float, list, dict, bool, range, abs, min, max, sum, round.

// Exemple Tool Python
{
    "name": "calculate_interest",
    "type": "code",
    "execution_python": {
        "type": "python",
        "code": "def execute(params):\n    principal = params.get('principal', 0)\n    rate = params.get('rate', 0.05)\n    years = params.get('years', 1)\n    interest = principal * rate * years\n    return {\n        'principal': principal,\n        'rate': rate,\n        'years': years,\n        'interest': round(interest, 2),\n        'total': round(principal + interest, 2)\n    }",
        "inputs": [
            {"name": "principal", "type": "number", "required": true, "description": "Montant principal"},
            {"name": "rate", "type": "number", "required": false, "description": "Taux d'intérêt (défaut: 5%)"},
            {"name": "years", "type": "integer", "required": false, "description": "Nombre d'années"}
        ],
        "outputs": ["principal", "rate", "years", "interest", "total"]
    }
}

6.2.4 Import OpenAPI / YAML

Import automatique de spécifications OpenAPI 3.x / Swagger 2.x avec Pipeline V2 en 3 étapes et validation intelligente via Claude Opus 4.5.

Pipeline V2 - Vue d'ensemble

flowchart TD subgraph UPLOAD["📤 UPLOAD"] A[Fichier YAML/JSON] --> B[Lecture côté client] B --> C[Validation extension] end subgraph PARSE["🔍 PARSING INITIAL"] C --> D[POST /tools/api/openapi/parse] D --> E[OpenAPIParser natif Python] E --> F[Extraction endpoints, tags, security] F --> G[Affichage Preview] end subgraph PIPELINE["⚙️ PIPELINE V2 - 3 ÉTAPES"] G -->|Clic Générer| H[POST /tools/api/openapi/import-v2] H --> I["🔍 ÉTAPE 1: Validation YAML"] I --> I1[Claude analyse structure OpenAPI] I1 --> I2[Vérifie cohérence $ref, schemas] I2 --> I3[Corrige automatiquement] I3 --> I4[Tronque descriptions longues] I4 --> J["⚙️ ÉTAPE 2: Conversion & Upload"] J --> J1[Conversion endpoints → Tools] J1 --> J2[Génération JSON Schema params] J2 --> J3[Configuration HTTP execution] J3 --> J4[Upload Cosmos DB] J4 --> K["✅ ÉTAPE 3: Validation Tools"] K --> K1[Validation locale format] K1 --> K2[Validation IA enrichissement] K2 --> K3[Correction auto si nécessaire] K3 --> K4[Mise à jour Cosmos DB] end subgraph RESULT["📊 RÉSULTAT"] K4 --> L[SSE Feedback temps réel] L --> M[Résumé: créés/mis à jour/erreurs] end style UPLOAD fill:#E3F2FD,stroke:#1976D2 style PARSE fill:#E8F5E9,stroke:#388E3C style PIPELINE fill:#FFF3E0,stroke:#F57C00 style RESULT fill:#F3E5F5,stroke:#7B1FA2

Détail du flux SSE (Server-Sent Events)

sequenceDiagram participant U as Utilisateur participant UI as Interface Web participant API as Flask API participant CLAUDE as Claude Opus 4.5 participant IMPORTER as OpenAPIImporter participant COSMOS as Cosmos DB U->>UI: Upload fichier YAML/JSON UI->>API: POST /tools/api/openapi/parse API->>API: Parser natif Python API-->>UI: Preview (titre, endpoints, base_url) U->>UI: Clic "Générer les Tools" UI->>API: POST /tools/api/openapi/import-v2 (SSE) rect rgb(227, 242, 253) Note over API,CLAUDE: ÉTAPE 1 - Validation YAML API->>CLAUDE: Analyse structure + cohérence CLAUDE-->>API: YAML corrigé + rapport API-->>UI: SSE step=1 status=valid/corrected end rect rgb(232, 245, 233) Note over API,COSMOS: ÉTAPE 2 - Conversion & Upload API->>IMPORTER: convert_to_tools(yaml) IMPORTER-->>API: Liste tools générés API->>COSMOS: Batch upsert tools COSMOS-->>API: Résultat (created/updated/skipped) API-->>UI: SSE step=2 data={created, updated} end rect rgb(255, 243, 224) Note over API,CLAUDE: ÉTAPE 3 - Validation Tools loop Pour chaque tool API->>API: Validation locale JSON Schema API->>CLAUDE: Validation + enrichissement CLAUDE-->>API: Tool validé/corrigé API->>COSMOS: Update si corrigé API-->>UI: SSE tool_progress end API-->>UI: SSE step=3 status=complete end API-->>UI: SSE type=complete summary={...} UI-->>U: Résumé final avec statistiques

Les 3 Étapes en détail

ÉtapeActionTechnologieCorrections automatiques
1. Validation YAML Analyse globale de la structure OpenAPI Claude Opus 4.5
  • $ref cassées → corrigées
  • Descriptions > 900 chars → reformulées par IA (limite Azure = 1024)
  • Champs JSON Schema interdits (minLength, pattern, format) → supprimés
  • Schemas orphelins → signalés
2. Conversion & Upload Transformation endpoints → Tools + sauvegarde OpenAPIImporter Python
  • operationId → tool_name (snake_case)
  • summary → display_name
  • requestBody + parameters → JSON Schema
  • Gestion auth (API Key, Bearer)
3. Validation Tools Vérification individuelle de chaque tool Claude Opus 4.5 + Validation locale
  • Format JSON Schema strict
  • Descriptions enrichies par IA
  • Paramètres manquants → ajoutés
  • Types incohérents → corrigés
Pipeline V2 - Avantages

Le Pipeline V2 combine un parser natif Python (100% fiable, instantané) avec Claude Opus 4.5 pour la validation et l'enrichissement intelligent. Chaque étape envoie des événements SSE pour un feedback temps réel dans l'interface.

Fichiers clés du Pipeline

FichierRôle
static/js/tools/add.jsGestion upload, appel API, affichage progress bar SSE
Blueprints/tools/add.pyEndpoints /api/openapi/parse et /api/openapi/import-v2
Blueprints/tools/openapi_parser.pyParser natif Python pour extraction endpoints
utils/tools/openapi_importer.pyClasse OpenAPIImporter - pipeline 3 étapes
utils/tools/tool_validator.pyValidation JSON Schema + enrichissement IA

6.3 Catégories de Tools

Les tools sont organisés en 23 catégories dont 13 catégories WAKA spécifiques à la microfinance :

mindmap root((Catégories)) Standard general communication travel local_services finance campaign system rag_search custom WAKA Microfinance waka_clients waka_credits waka_payments waka_guarantors waka_committee waka_campaigns waka_reports waka_audit waka_promises waka_jobs waka_bots waka_system waka_tests
CatégorieDescriptionExemples de Tools
generalOutils génériquessearch_web, get_weather, calculate
communicationEmail, SMS, notificationssend_email, send_sms, push_notification
travelVoyage et transportsearch_flights, book_hotel, estimate_taxi
financeFinance et paiementsconvert_currency, calculate_tax, process_payment
waka_clientsGestion clients WAKAget_client, update_client, search_clients
waka_creditsGestion des créditsget_credit_status, calculate_remaining, list_credits
waka_paymentsEnregistrement paiementsrecord_payment, verify_payment, list_payments
systemOutils systèmeend_conversation, conversation_brain

6.4 API REST - Endpoints

Le module Tools expose les endpoints suivants via le Blueprint Flask tools_bp :

MéthodeEndpointDescription
GET/tools/Page galerie des tools
GET/tools/addPage création de tool
GET/tools/api/listListe paginée des tools
GET/tools/api/categoriesListe des catégories
GET/tools/api/get/<tool_id>Détails d'un tool
POST/tools/api/createCréer un nouveau tool
PUT/tools/api/update/<tool_id>Mettre à jour un tool
POST/tools/api/toggle-status/<tool_id>Activer/désactiver un tool
DELETE/tools/api/delete/<tool_id>Supprimer un tool
POST/tools/api/testTester un tool
POST/tools/api/check-nameVérifier si un nom existe
POST/tools/api/generateGénérer description/body avec IA
POST/tools/api/generate-codeGénérer code Python avec IA
POST/tools/api/openapi/parseParser une spec OpenAPI/YAML (natif Python)
POST/tools/api/openapi/import-v2Import OpenAPI Pipeline V2 (SSE 3 étapes)
POST/tools/api/validate-toolValider et enrichir un tool via Claude
POST/tools/api/validate-tools-batchValider plusieurs tools en batch
GET/tools/api/import-job/<job_id>Status d'un job d'import

6.5 Structure de Données Cosmos DB

6.5.1 Container : Tools

{
    "id": "tool_abc123def456",
    "tool_id": "tool_abc123def456",
    "name": "create_client",
    "display_name": "Créer un Client",
    "category": "waka_clients",  // Partition Key
    "tags": ["waka", "clients", "api"],
    "status": "active",  // active | inactive
    "is_system": false,
    "version": 2,
    "definition": {
        "type": "function",
        "function": {
            "name": "create_client",
            "description": "Crée un nouveau client dans le système WAKA",
            "parameters": {
                "type": "object",
                "properties": {
                    "first_name": {"type": "string", "description": "Prénom du client"},
                    "last_name": {"type": "string", "description": "Nom de famille"},
                    "phone": {"type": "string", "description": "Numéro de téléphone"}
                },
                "required": ["first_name", "last_name", "phone"]
            }
        }
    },
    "execution": {
        "type": "http",
        "endpoint": "https://api.waka.com/v1/clients",
        "method": "POST",
        "headers": {"Content-Type": "application/json"},
        "auth_type": "bearer",
        "auth_config": {"value": "${env.WAKA_API_TOKEN}"},
        "params_mapping": {
            "first_name": {"in": "body", "name": "firstName"},
            "last_name": {"in": "body", "name": "lastName"},
            "phone": {"in": "body", "name": "phoneNumber"}
        }
    },
    "openapi_source": {
        "path": "/clients",
        "method": "POST",
        "operation_id": "createClient"
    },
    "created_at": "2025-12-15T10:30:00Z",
    "updated_at": "2025-12-20T14:45:00Z",
    "created_by": "admin"
}

6.5.2 Container : ImportJobs

{
    "id": "job_xyz789",
    "status": "processing",  // pending | processing | completed | failed
    "total": 42,
    "processed": 25,
    "success": 23,
    "errors": 2,
    "created_at": "2025-12-20T14:00:00Z",
    "updated_at": "2025-12-20T14:02:30Z",
    "config": {
        "category": "custom",
        "prefix": "myapi_",
        "base_url": "https://api.example.com"
    },
    "results": [
        {"name": "get_users", "status": "created"},
        {"name": "create_user", "status": "created"}
    ],
    "error_details": [
        {"endpoint": "/admin/dangerous", "error": "Endpoint filtered"}
    ]
}

6.6 Exécution des Tools

L'exécution des tools est orchestrée par le module tools/__init__.py qui fournit les fonctions centrales :

flowchart TD A[Agent reçoit tool_call] --> B{Type de Tool?} B -->|http| C[HTTP Client] B -->|python| D[Python Sandbox] B -->|mcp| E[MCP Client] C --> F[Construire requête] F --> G[Appliquer auth] G --> H[Mapper paramètres] H --> I[Exécuter request] I --> J[Parser réponse] D --> K[Valider code] K --> L[Sandbox RestrictedPython] L --> M[Execute avec timeout] M --> N[Retourner résultat] E --> O{Transport?} O -->|stdio| P[Subprocess] O -->|sse| Q[SSE Stream] O -->|http| R[HTTP Call] J --> S[Retour à l'Agent] N --> S P --> S Q --> S R --> S style B fill:#4A148C,color:#fff style S fill:#4CAF50,color:#fff
# Fonction principale d'exécution (tools/__init__.py)
def execute_tool(tool_name, arguments):
    """
    Exécute un outil spécifique avec les arguments fournis.

    Args:
        tool_name: Nom de l'outil à exécuter
        arguments: Dictionnaire des arguments pour l'outil

    Returns:
        dict: Résultat de l'exécution de l'outil
    """
    # Mapping des noms vers les modules
    tool_map = {
        "search_web": tool_search_web,
        "send_email": tool_email,
        "get_weather_forecast": tool_weather,
        "end_conversation": tool_end_conversation,
        "conversation_brain": tool_conversation_brain,
        # ... 30+ tools prédéfinis
    }

    if tool_name in tool_map:
        return tool_map[tool_name].execute(arguments)

    # Fallback: chercher dans Cosmos DB (tools dynamiques)
    return execute_dynamic_tool(tool_name, arguments)

6.7 Galerie des Tools

Galerie des Tools

ACTIF API REST
search_weather

Recherche météo d'une ville

general weather
ACTIF PYTHON
calculate_interest

Calcul d'intérêts composés

finance
ACTIF MCP
filesystem_tools

Accès au système de fichiers

system mcp

6.8 Tools Prédéfinis (30+)

Waka Voice inclut plus de 30 tools prédéfinis prêts à l'emploi :

ToolCatégorieDescription
search_webgeneralRecherche web via Bing/DuckDuckGo
get_weather_forecastgeneralPrévisions météo
send_emailcommunicationEnvoi d'email via Azure Communication Services
translate_textgeneralTraduction multi-langues
convert_currencyfinanceConversion de devises
search_flightstravelRecherche de vols
book_hoteltravelRéservation d'hôtel
estimate_taxi_faretravelEstimation tarif taxi
find_pharmacylocal_servicesLocaliser une pharmacie
get_prayer_timeslocal_servicesHoraires de prière
end_conversationsystemTerminer la conversation
conversation_brainsystemGestion dynamique du prompt
schedule_callbackcampaignPlanifier un rappel
send_sms_payment_promisecampaignSMS promesse de paiement
Conseil Pro

Pour les projets de microfinance, activez les catégories waka_* qui incluent des tools spécialisés pour la gestion des clients, crédits, paiements et promesses. Ces tools sont optimisés pour l'intégration avec les systèmes WAKA.

6.9 Création d'Outil RAG

Lorsqu'un projet RAG est créé, un outil de recherche RAG est automatiquement généré. Cet outil permet à l'assistant IA d'interroger la base de connaissances du projet via le mécanisme de function calling d'Azure OpenAI.

6.9.1 Vue d'ensemble du processus

flowchart TB subgraph USER["Utilisateur"] CREATE["Crée un projet RAG
'Mon Projet'"] end subgraph API["API Flask"] ENDPOINT["POST /rag/api/projects"] HANDLER["api_create_project()"] end subgraph COSMOS["Cosmos DB"] PROJECTS["Container: RAGProjects"] TOOLS["Container: Tools"] end subgraph CREATED["Éléments créés"] PROJECT["Projet
name: 'Mon Projet'
id: uuid"] TOOL["Tool RAG Search
name: rag_search_mon_projet
endpoint: /api/rag-tool/..."] end CREATE -->|"{ name, description, color }"| ENDPOINT ENDPOINT --> HANDLER HANDLER -->|"1. create_project()"| PROJECTS PROJECTS --> PROJECT HANDLER -->|"2. create_rag_search_tool_for_project()"| TOOLS TOOLS --> TOOL style USER fill:#E3F2FD,stroke:#1976D2 style API fill:#E8F5E9,stroke:#4CAF50 style COSMOS fill:#F3E5F5,stroke:#9C27B0 style CREATED fill:#FFF3E0,stroke:#FF9800

6.9.2 Étapes détaillées

ÉtapeActionFichierRésultat
1 Requête POST avec nom du projet - { "name": "Mon Projet", "description": "...", "color": "#4A148C" }
2 Validation et création du projet cosmos_project_manager.py Document projet dans Cosmos DB
3 Génération du nom technique du tool project_routes.py rag_search_mon_projet (sanitized)
4 Construction de l'URL endpoint project_routes.py /api/rag-tool/Mon%20Projet/fast-search
5 Création de la définition OpenAI project_routes.py Structure function calling conforme
6 Enregistrement du tool cosmos_tools_manager.py Document tool dans Cosmos DB

6.9.3 Structure du Tool créé

Le tool généré suit le format Azure OpenAI Function Calling :

{
    "name": "rag_search_mon_projet",
    "display_name": "Recherche RAG - Mon Projet",
    "category": "rag_search",
    "status": "active",
    "tags": ["rag", "search", "vector", "mon projet"],
    "is_system": false,

    "definition": {
        "type": "function",
        "function": {
            "name": "rag_search_mon_projet",
            "description": "Recherche dans la base de connaissances 'Mon Projet'...",
            "parameters": {
                "type": "object",
                "properties": {
                    "search_query": {
                        "type": "string",
                        "description": "Intention de recherche générée par l'assistant"
                    }
                },
                "required": ["search_query"]
            }
        }
    },

    "execution": {
        "type": "http",
        "method": "POST",
        "endpoint": "https://domain.com/api/rag-tool/Mon%20Projet/fast-search",
        "headers": { "Content-Type": "application/json" },
        "body_template": {
            "search_query": "{{search_query}}",
            "max_results": 5
        }
    },

    "metadata": {
        "project_id": "uuid-du-projet",
        "project_name": "Mon Projet",
        "auto_generated": true
    }
}

6.9.4 Diagramme de flux complet

sequenceDiagram participant U as Utilisateur participant UI as Interface Web participant API as Flask API participant PM as Project Manager participant TM as Tools Manager participant DB as Cosmos DB U->>UI: Crée projet "Mon Projet" UI->>API: POST /rag/api/projects Note right of API: { name: "Mon Projet", description: "...", color: "#4A148C" } API->>PM: create_project(name, description, color) PM->>DB: Insert into RAGProjects DB-->>PM: project { id, name, ... } PM-->>API: { success: true, project: {...} } API->>API: create_rag_search_tool_for_project(project_id, name) Note right of API: Génère tool_name: rag_search_mon_projet Note right of API: Encode URL: Mon%20Projet API->>TM: create_tool(tool_data) TM->>DB: Insert into Tools DB-->>TM: tool { id, name, ... } TM-->>API: { success: true, tool: {...} } API-->>UI: 201 Created Note left of UI: { success: true, project: {...}, tool_created: true, tool: {...} } UI-->>U: Projet créé avec son outil RAG

6.9.5 Utilisation du Tool par l'Assistant

Une fois le projet créé et des documents indexés, l'assistant peut utiliser le tool :

sequenceDiagram participant U as Utilisateur participant A as Assistant IA participant T as Tool RAG participant E as Embedding API participant S as Azure AI Search U->>A: "Quels sont les tarifs ?" A->>A: Génère intention de recherche Note right of A: search_query: "tarifs abonnement prix" A->>T: POST /api/rag-tool/Mon%20Projet/fast-search Note right of T: { search_query: "tarifs abonnement prix" } T->>E: Génère embedding E-->>T: [0.123, -0.456, ...] T->>S: Recherche vectorielle Note right of S: filter: project_name eq 'Mon Projet' S-->>T: Documents pertinents T-->>A: { documents: [...], total_found: 3 } A-->>U: "Voici les tarifs trouvés..."

6.9.6 Points clés

Important : Cohérence du project_name

Le project_name doit être identique partout :

  • Dans le projet Cosmos DB
  • Dans les chunks indexés (documents)
  • Dans le filtre de recherche Azure AI Search

Le nom est utilisé tel que saisi par l'utilisateur (pas de normalisation). L'URL utilise l'encodage URL pour les espaces et caractères spéciaux.

ÉlémentFormatExemple
Nom du projet Original (tel que saisi) Mon Projet
Nom du tool Sanitized (snake_case) rag_search_mon_projet
URL endpoint Encodé URL /api/rag-tool/Mon%20Projet/fast-search
Filtre recherche Original project_name eq 'Mon Projet'

6.9.7 Fichiers sources

FichierRôle
Blueprints/project_routes.py API création projet + génération tool
configuration/cosmos_project_manager.py CRUD projets dans Cosmos DB
configuration/cosmos_tools_manager.py CRUD tools dans Cosmos DB
Blueprints/api_rag_search_tool.py Endpoint Fast Search (exécution du tool)

Chapitre 7: Module Agents Texte

Documentation Technique Complète

Le module Agents Texte permet de créer des agents conversationnels basés sur des modèles de langage avancés (LLM). Contrairement aux agents voix qui utilisent l'API Realtime d'Azure, les agents texte fonctionnent via des requêtes HTTP classiques avec streaming SSE (Server-Sent Events).

7.1 Architecture Globale

flowchart TB subgraph CLIENT["Client Navigateur"] UI["Interface Chat"] SSE["EventSource SSE"] end subgraph FLASK["Flask Backend"] BP["text_agents_bp /text-agents"] CHAT["chat_stream_api()"] TOOLS["execute_dynamic_tool()"] end subgraph AZURE["Azure AI Foundry"] GPT52["GPT-5.2-chat"] CLAUDE["Claude Opus 4.5"] GROK["Grok 3"] end subgraph COSMOS["Cosmos DB"] AGENTS["Container: text_agents"] SESSIONS["Container: text_sessions"] end subgraph EXTERNAL["Services Externes"] HTTP["API REST"] MCP["MCP Servers"] PYTHON["Code Python"] end UI -->|"POST /api/id/chat/stream"| CHAT CHAT -->|"SSE Response"| SSE CHAT --> TOOLS TOOLS --> HTTP TOOLS --> MCP TOOLS --> PYTHON CHAT --> GPT52 CHAT --> CLAUDE CHAT --> GROK BP --> COSMOS style CLIENT fill:#E3F2FD,stroke:#1976D2 style FLASK fill:#E8F5E9,stroke:#4CAF50 style AZURE fill:#FFF3E0,stroke:#FF9800 style COSMOS fill:#F3E5F5,stroke:#9C27B0 style EXTERNAL fill:#FFEBEE,stroke:#E53935

Caractéristiques Principales

CaractéristiqueDescription
Modèles supportésGPT-5.2-chat, Claude Opus 4.5, Grok 3 (via Azure AI Foundry)
StreamingSSE (Server-Sent Events) temps réel
ToolsHTTP REST, Python Module, Python Inline, MCP (STDIO/SSE/HTTP)
SessionsPersistance optionnelle dans Cosmos DB
Intégrationiframe, widget JavaScript, popup
Pièces jointesImages (vision), PDF, documents

7.2 Configuration des Modèles

# configuration/cosmos_text_agent_manager.py

TEXT_MODELS = {
    "gpt-5.2-chat": {
        "display_name": "GPT-5.2 Chat",
        "provider": "azure",
        "endpoint_env": "AZURE_OPENAI_ENDPOINT",
        "api_key_env": "AZURE_OPENAI_API_KEY",
        "api_version": "2025-10-01",
        "supports_vision": True,
        "supports_tools": True,
        "max_tokens": 128000
    },
    "claude-opus-4-5": {
        "display_name": "Claude Opus 4.5",
        "provider": "azure-ai-foundry",
        "endpoint_env": "AZURE_AI_FOUNDRY_ENDPOINT",
        "api_key_env": "AZURE_AI_FOUNDRY_API_KEY",
        "supports_vision": True,
        "supports_tools": True,
        "max_tokens": 200000
    }
}
ModèleProviderVisionToolsMax TokensLatence
GPT-5.2-chatAzure OpenAIOuiOui128K~500ms
Claude Opus 4.5Azure AI FoundryOuiOui200K~800ms

7.3 Architecture du Blueprint

# Blueprints/text_agents_routes.py
text_agents_bp = Blueprint('text_agents', __name__, url_prefix='/text-agents')
RouteMéthodeDescription
/text-agents/GETGalerie des agents texte
/text-agents/createGET/POSTCréation d'un agent
/text-agents/<id>/editGET/POSTModification d'un agent
/text-agents/<id>/chatGETInterface de chat
/text-agents/<id>/embedGETVersion embeddable
/text-agents/api/<id>/chat/streamPOSTAPI de chat streaming
/text-agents/api/<id>/sessionGET/POST/DELETEGestion des sessions

7.4 API de Chat Streaming

POST /text-agents/api/<agent_id>/chat/stream
Content-Type: application/json

{
    "message": "Bonjour, comment puis-je vous aider ?",
    "session_id": "sess-uuid-optional",
    "attachments": [
        {"type": "image", "data": "base64_encoded_data", "mime_type": "image/png"}
    ],
    "metadata": {"user_id": "user-123", "source": "website"}
}

Réponse SSE

event: message
data: {"type": "content", "content": "Bonjour"}

event: message
data: {"type": "tool_call", "tool": "search_database", "arguments": {...}}

event: message
data: {"type": "tool_result", "tool": "search_database", "result": {...}}

event: message
data: {"type": "done", "usage": {"prompt_tokens": 150, "completion_tokens": 45}}

Implémentation Serveur

@text_agents_bp.route('/api/<agent_id>/chat/stream', methods=['POST'])
def chat_stream_api(agent_id):
    data = request.get_json()
    message = data.get('message', '')
    session_id = data.get('session_id')

    agent = cosmos_text_agent_manager.get_agent(agent_id)
    if not agent:
        return jsonify({"error": "Agent not found"}), 404

    session = get_or_create_session(agent_id, session_id)

    def generate():
        messages = build_messages(agent, session, message, data.get('attachments', []))
        for chunk in stream_completion(agent, messages):
            if chunk.get('type') == 'tool_call':
                result = execute_dynamic_tool(chunk['tool'], chunk['arguments'])
                yield f"data: {json.dumps({'type': 'tool_result', 'result': result})}\n\n"
            else:
                yield f"data: {json.dumps(chunk)}\n\n"
        yield f"data: {json.dumps({'type': 'done'})}\n\n"

    return Response(stream_with_context(generate()), mimetype='text/event-stream',
        headers={'Cache-Control': 'no-cache', 'Connection': 'keep-alive'})

7.5 Système de Tools

flowchart TB TOOL["Tool Execution"] subgraph HTTP["HTTP REST"] GET["GET Request"] POST["POST Request"] end subgraph PYTHON["Python"] MODULE["Python Module"] INLINE["Python Inline"] end subgraph MCP["Model Context Protocol"] STDIO["STDIO Transport"] SSE["SSE Transport"] MCPHTTP["HTTP Transport"] end TOOL --> HTTP TOOL --> PYTHON TOOL --> MCP style HTTP fill:#E3F2FD,stroke:#1976D2 style PYTHON fill:#E8F5E9,stroke:#4CAF50 style MCP fill:#FFF3E0,stroke:#FF9800

Configuration Tool HTTP

{
    "id": "tool-uuid-1",
    "name": "search_products",
    "description": "Recherche des produits dans le catalogue",
    "type": "http",
    "http_config": {
        "method": "GET",
        "url": "https://api.example.com/products",
        "headers": {"Authorization": "Bearer ${API_KEY}"},
        "query_params": {"q": "${query}", "limit": "${limit:10}"}
    },
    "parameters": {
        "type": "object",
        "properties": {
            "query": {"type": "string", "description": "Terme de recherche"},
            "limit": {"type": "integer", "default": 10}
        },
        "required": ["query"]
    }
}

Configuration Tool MCP

{
    "id": "tool-uuid-3",
    "name": "mcp_filesystem",
    "description": "Accès au système de fichiers via MCP",
    "type": "mcp",
    "mcp_config": {
        "transport": "stdio",
        "command": "npx",
        "args": ["-y", "@anthropic/mcp-server-filesystem", "/path/to/allowed"],
        "timeout": 30000
    }
}

Exécution Dynamique

def execute_dynamic_tool(tool_config: dict, arguments: dict) -> dict:
    tool_type = tool_config.get('type', 'http')

    if tool_type == 'http':
        return execute_http_tool(tool_config, arguments)
    elif tool_type == 'python_module':
        return execute_python_module_tool(tool_config, arguments)
    elif tool_type == 'mcp':
        return execute_mcp_tool(tool_config, arguments)
    else:
        return {"error": f"Unknown tool type: {tool_type}"}

7.6 Gestion des Sessions

{
    "id": "sess-uuid-123",
    "agent_id": "agent-uuid-456",
    "created_at": "2025-12-30T10:00:00Z",
    "messages": [
        {"role": "system", "content": "Tu es un assistant..."},
        {"role": "user", "content": "Bonjour", "timestamp": "2025-12-30T10:00:00Z"},
        {"role": "assistant", "content": "Bonjour ! Comment puis-je vous aider ?"}
    ],
    "metadata": {"user_id": "user-123", "source": "website"},
    "token_usage": {"prompt_tokens": 1500, "completion_tokens": 450}
}

API de Session

# Récupérer une session
GET /text-agents/api/<agent_id>/session?session_id=<id>

# Créer une nouvelle session
POST /text-agents/api/<agent_id>/session
{"metadata": {"user_id": "user-123"}}

# Supprimer une session
DELETE /text-agents/api/<agent_id>/session/<session_id>

7.7 Schéma de Données Agent

{
    "id": "agent-uuid-789",
    "name": "Assistant Commercial",
    "description": "Agent spécialisé dans les ventes",
    "model": "gpt-5.2-chat",
    "system_prompt": "Tu es un assistant commercial expert...",
    "temperature": 0.7,
    "max_tokens": 4096,
    "tools": [...],
    "default_tools_enabled": true,
    "welcome_message": "Bonjour ! Je suis votre assistant commercial.",
    "suggested_prompts": ["Quels sont vos produits phares ?", "Comment commander ?"],
    "appearance": {
        "primary_color": "#007bff",
        "avatar_url": "/static/avatars/commercial.png"
    },
    "settings": {
        "session_timeout_minutes": 30,
        "max_messages_per_session": 100,
        "save_sessions": true
    }
}

7.8 Intégration et Embedding

Intégration iframe

<iframe
    src="https://wakavoice.example.com/text-agents/agent-uuid/embed"
    width="400" height="600" frameborder="0"
    style="border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.15);">
</iframe>

Widget JavaScript

<script src="https://wakavoice.example.com/static/js/text-agent-widget.js"></script>
<script>
    WakaTextAgent.init({
        agentId: 'agent-uuid-789',
        position: 'bottom-right',
        primaryColor: '#007bff',
        welcomeMessage: 'Bonjour ! Comment puis-je vous aider ?',
        onMessage: function(message) { console.log('Message:', message); }
    });
</script>

API du Widget

WakaTextAgent.open();        // Ouvrir
WakaTextAgent.close();       // Fermer
WakaTextAgent.sendMessage("Je cherche un produit");
WakaTextAgent.resetSession();
WakaTextAgent.on('message', (data) => console.log(data));
WakaTextAgent.on('toolCall', (data) => console.log(data.tool));

7.9 Interface Utilisateur

🤖

Assistant Commercial

● En ligne

Bonjour ! Comment puis-je vous aider ?

Je cherche un produit

7.10 Flux de Conversation

sequenceDiagram participant U as Utilisateur participant C as Client JS participant F as Flask participant DB as Cosmos DB participant LLM as LLM U->>C: Tape un message C->>F: POST /api/id/chat/stream F->>DB: Récupérer agent + session F->>LLM: Envoyer messages + tools loop Streaming LLM-->>F: Token partiel F-->>C: SSE content C-->>U: Affiche le texte end F->>DB: Sauvegarder session F-->>C: SSE done

7.11 Métriques et Monitoring

MétriqueDescriptionType
text_agent.messages.totalNombre total de messagesCounter
text_agent.tokens.promptTokens de prompt utilisésCounter
text_agent.tokens.completionTokens de complétion utilisésCounter
text_agent.latency.first_tokenLatence jusqu'au premier tokenHistogram
text_agent.tools.callsNombre d'appels de toolsCounter
text_agent.sessions.activeSessions activesGauge
# Santé du service
GET /text-agents/health
Response: {"status": "healthy", "model_status": {...}}

# Métriques Prometheus
GET /text-agents/metrics
Documentation Complète

Ce chapitre couvre l'ensemble du module Agents Texte : architecture, API, système de tools (HTTP, Python, MCP), gestion des sessions, intégration (iframe, widget, popup), et monitoring.

Chapitre 8: Module Agents Voix

Documentation Technique Complète - Conversations vocales temps réel

Le module Agents Voix permet de créer des agents conversationnels vocaux basés sur l'API Azure OpenAI Voice Live (Realtime API). Il utilise une architecture WebSocket bidirectionnelle full-duplex pour permettre des conversations naturelles en temps réel entre un utilisateur et un agent IA.

8.1 Vue d'Ensemble et Architecture

flowchart TB subgraph CLIENT["Client (Navigateur)"] MIC["Microphone"] SPK["Speaker"] UI["Interface Voice"] WS_CLIENT["WebSocket Client"] end subgraph FLASK["Flask Backend"] WS_PROXY["voice_live_proxy.py"] SESSION["VoiceLiveSession"] TOOLS["Tool Execution"] end subgraph AZURE["Azure OpenAI Realtime"] RT_API["Realtime API"] STT["Speech-to-Text"] LLM["GPT Realtime"] TTS["Text-to-Speech"] end subgraph COSMOS["Cosmos DB"] AGENTS_DB["Container: agents"] SESSIONS_DB["Container: VoiceSessions"] end MIC -->|Audio PCM16| WS_CLIENT WS_CLIENT -->|WebSocket| WS_PROXY WS_PROXY -->|Bidirectional WS| RT_API RT_API --> STT STT --> LLM LLM --> TTS TTS -->|Audio Response| WS_PROXY WS_PROXY -->|WebSocket| WS_CLIENT WS_CLIENT -->|Audio| SPK SESSION --> TOOLS SESSION --> COSMOS

Caractéristiques Principales

CaractéristiqueDescription
ProtocoleWebSocket bidirectionnel full-duplex
Modèles supportésgpt-realtime, gpt-realtime-mini, phi4-mm-realtime, gpt-5-realtime
Format AudioPCM16, 24kHz, mono
VoixAzure Neural (600+), Personal Voice, OpenAI Native
Turn DetectionVAD sémantique multilingue (azure_semantic_vad)
Barge-inInterruption native de l'agent
ToolsMax 8 outils par agent, exécution temps réel
Session Max15 minutes (limite Azure)

8.2 Les Modèles Voice Live

Modèle Formule Latence Qualité
gpt-realtime Pro ~400ms Excellente
gpt-realtime-mini Basic ~300ms Bonne
gpt-4o-realtime-preview Pro ~450ms Excellente
gpt-5-realtime Pro ~350ms Exceptionnelle
phi4-mm-realtime Lite ~250ms Correcte
gpt-5-nano Lite ~200ms Basique

8.3 Turn Detection (VAD Sémantique)

Semantic VAD (recommandé)
  • Analyse le contenu sémantique
  • Détecte les fins de phrases logiques
  • Tolère les pauses de réflexion
  • Multilingue (semantic_detection_v1_multilingual)
Server VAD (legacy)
  • Détection par silence uniquement
  • Plus rapide mais moins précis
  • Peut couper l'utilisateur
  • Déprécié depuis v3.1
{
    "turn_detection": {
        "type": "azure_semantic_vad",
        "threshold": 0.3,
        "silence_duration_ms": 300,
        "create_response": true,
        "end_of_utterance_detection": {
            "model": "semantic_detection_v1_multilingual"
        }
    }
}

8.4 Barge-in (Interruption)

Le barge-in permet à l'utilisateur d'interrompre l'agent pendant qu'il parle. L'audio de l'agent est immédiatement coupé et la transcription de l'utilisateur est traitée.

{
    "turn_detection": {
        "type": "azure_semantic_vad",
        "interrupt_response": true,
        "threshold": 0.5
    }
}

8.5 Architecture du Blueprint

Fichiers Principaux

FichierTailleRôle
voice_live_proxy.py~26KBWebSocket proxy + VoiceLiveSession
agents_config_routes.py~50KBRoutes de gestion agents (4 étapes)
cosmos_agent_manager.py~20KBManager d'agents (CRUD Cosmos)
voice_live_config.py~10KBConfig Azure + client Voice Live
voice_live_session_builder.py~15KBBuilder strict de sessions
sessions/voice/manager.py~25KBManager de sessions Cosmos
static/js/agent_voice_session.js~29KBClient JS avec objet AudioSession (gestion audio, overlap protection)

Endpoints Principaux

RouteMéthodeDescription
/agents/GETGalerie des agents voix
/agents/config/step1GETÉtape 1: Sélection du modèle
/agents/config/step2/<id>GET/POSTÉtape 2: Configuration voix
/agents/config/step3/<id>GET/POSTÉtape 3: Sélection des outils
/agents/config/step4/<id>GET/POSTÉtape 4: Prompt système
/agents/session/<id>GETPage de session voix
/voice-proxy/ws/<id>WebSocketConnexion WebSocket principale
/agents/voice-historyGETHistorique des sessions
/agents/api/conversation/initPOSTInitialiser conversation
/agents/api/conversation/endPOSTTerminer conversation

8.6 Connexion WebSocket

Flux de Messages

sequenceDiagram participant U as Utilisateur participant C as Client JS participant P as Flask Proxy participant A as Azure Realtime U->>C: Clic Démarrer C->>P: WS Connect /voice-proxy/ws/agent_id P->>A: WS Connect Azure Realtime A-->>P: session.created P-->>C: session.created loop Conversation U->>C: Parle au micro C->>P: input_audio_buffer.append (PCM16) P->>A: input_audio_buffer.append A-->>P: speech_started (VAD) A-->>P: speech_stopped (VAD) A-->>P: conversation.item.created (transcript) P-->>C: transcript A-->>P: response.audio.delta (chunks) P-->>C: audio.delta C-->>U: Joue audio A-->>P: response.done end alt Tool Call A-->>P: function_call_arguments.done P->>P: execute_dynamic_tool() P->>A: conversation.item.create (tool_result) end U->>C: Clic Terminer C->>P: WS Close P->>A: WS Close P->>P: Sauvegarde Cosmos

Types de Messages Azure Realtime

MessageDirectionDescription
session.createdAzure → ClientSession initialisée
input_audio_buffer.appendClient → AzureEnvoi audio PCM16
input_audio_buffer.speech_startedAzure → ClientParole détectée (VAD)
input_audio_buffer.speech_stoppedAzure → ClientFin de parole (VAD)
conversation.item.createdAzure → ClientTranscription complète
response.audio.deltaAzure → ClientChunk audio réponse
response.function_call_arguments.doneAzure → ClientTool call request
response.doneAzure → ClientRéponse complète

8.7 Système de Tools

Outils Disponibles (31 total)

CatégorieToolsDescription
Basiquescalculator, currency, translator, weather, newsOutils utilitaires
Recherchesearch_web, places, dogs, exercisesRecherche d'informations
Communicationemail, sms, payment_promise, extension_confirmEnvoi de messages
Voyageflight_search, flight_booking, hotel_search, hotel_bookingRéservations
Servicesprayer_times, pharmacy_locator, school_info, taxi_estimateServices locaux
Professionnelknowledge_base, cv_builder, tax_calculatorOutils métier
Systèmeend_conversation, schedule_callbackContrôle de session
Important: L'API Azure Voice Live limite le nombre de tools à 8 par session. Au-delà, les performances se dégradent significativement.

Format de Définition d'un Tool

# tools/weather.py

def get_tool_definition() -> dict:
    return {
        'type': 'function',
        'function': {
            'name': 'get_weather_forecast',
            'description': 'Récupère les prévisions météo',
            'parameters': {
                'type': 'object',
                'properties': {
                    'city': {'type': 'string', 'description': 'Nom de la ville'},
                    'days': {'type': 'integer', 'description': 'Jours (1-7)', 'default': 3}
                },
                'required': ['city']
            }
        }
    }

async def execute(args: dict) -> dict:
    city = args.get('city')
    response = await weather_api.get_forecast(city, args.get('days', 3))
    return {'city': city, 'forecast': response.data}

8.8 Gestion des Sessions

Schéma de Session Cosmos DB

{
    "id": "sess-uuid-123",
    "call_id": "call-uuid-456",
    "agent_id": "agent-uuid-789",
    "status": "completed",
    "started_at": "2025-12-30T10:00:00Z",
    "ended_at": "2025-12-30T10:05:30Z",
    "duration_minutes": 5.5,
    "model": "gpt-realtime",
    "voice": "fr-FR-DeniseNeural",
    "tokens": {
        "input_token_details": {"text_tokens": 450, "audio_tokens": 12500},
        "output_token_details": {"text_tokens": 380, "audio_tokens": 8700}
    },
    "cost": {
        "input_text": 0.0025,
        "input_audio": 0.2125,
        "output_text": 0.0084,
        "output_audio": 0.4785,
        "total": 0.7019
    },
    "conversation": [...],
    "message_count": 12,
    "tools_executed": 2,
    "summary": "L'utilisateur a recherché un vol Paris-Lyon...",
    "sentiment": "positive",
    "sentiment_score": 0.85
}

8.9 Types de Voix Supportés

TypeDescriptionExemple
azure-standardVoix Azure Neural standard (600+)fr-FR-DeniseNeural
azure-personalPersonal Voice (clone de voix)voice-XXXX-XXXX
azure-customCustom Neural Voicecustom-voice-id
openaiVoix natives OpenAIalloy, echo, fable, onyx, nova, shimmer

8.10 Flux de Création d'un Agent

flowchart LR S1["ÉTAPE 1
Modèle"] --> S2["ÉTAPE 2
Voix"] S2 --> S3["ÉTAPE 3
Outils"] S3 --> S4["ÉTAPE 4
Prompt"] S4 --> PUB["Agent Publié"] style S1 fill:#4A148C,color:#fff style S2 fill:#7B1FA2,color:#fff style S3 fill:#9C27B0,color:#fff style S4 fill:#AB47BC,color:#fff style PUB fill:#51cf66,color:#fff

Étape 1: Modèle

  • Choisir modèle realtime
  • Créer document Cosmos (draft)
  • Générer agent_reference

Étape 2: Voix

  • Sélectionner langue/locale
  • Choisir la voix
  • Configurer vitesse (rate)

Étape 3: Outils

  • Multi-sélection (31 outils)
  • Maximum 8 par agent
  • Preview de chaque outil

Étape 4: Prompt

  • Écrire instructions (max 2000 car.)
  • Option: Générer avec IA
  • Publier (status=published)

8.11 Timeouts et Métriques

TimeoutValeurDescription
Azure connection20sConnexion initiale (retryable 3x)
Inactivity check10sFréquence de vérification
Inactivity timeout180sFermeture automatique si silence
Max session duration900s (15 min)Limite Azure Realtime
Client ping15sKeep-alive navigateur
Azure ping10sKeep-alive Azure (~60s timeout)

Métriques Collectées par Session

MétriqueDescriptionType
audio_sentBytes audio envoyésCounter
audio_receivedBytes audio reçusCounter
interruptionsNombre de barge-inCounter
tools_executedNombre de tools appelésCounter
messages_countTotal messages (user + assistant)Counter
duration_minutesDurée totaleGauge
tokens.input_textTokens texte en entréeCounter
tokens.input_audioTokens audio en entréeCounter
tokens.output_textTokens texte en sortieCounter
tokens.output_audioTokens audio en sortieCounter

Variables d'Environnement Requises

# Azure Voice Live
VOICE_LIVE_KEY=<api-key>
VOICE_LIVE_NAME=<resource-name>
VOICE_LIVE_ENDPOINT=<endpoint>
VOICE_LIVE_ENDPOINT_TYPE=cognitiveservices

# Fallback (ancien format)
AZURE_SPEECH_KEY=<key>
AZURE_SPEECH_NAME=<name>
AZURE_SPEECH_ENDPOINT=<endpoint>

# Cosmos DB
COSMOS_URI=<uri>
COSMOS_KEY=<key>
COSMOS_DATABASE_NAME=ConversationsDB

Chapitre 9: Agents Avatar

Avatars vidéo synchronisés lip-sync avec Azure Voice Live

Le module Agents Avatar intègre l'API Azure Voice Live avec le rendu 3D d'avatars via WebRTC. Deux technologies : Avatar Vidéo Azure (6 personnages 3D) et Photo Avatar VASA-1 (30 personnages photo-réalistes).

9.1 Vue d'Ensemble et Architecture

flowchart TB subgraph CLIENT["Client (Navigateur)"] MIC["Microphone"] SPK["Speaker"] VIDEO["Video Player WebRTC"] WS_CLIENT["WebSocket Client"] end subgraph FLASK["Flask Backend"] WS_PROXY["avatar_live_proxy.py"] SESSION["AvatarLiveSession"] TOOLS["Tool Execution"] end subgraph AZURE["Azure Services"] RT_API["Voice Live API"] AVATAR_SVC["Avatar Service"] STT["Speech-to-Text"] LLM["GPT Realtime"] TTS["Text-to-Speech"] end subgraph COSMOS["Cosmos DB"] AGENTS_DB["Container: AvatarConfigurations"] SESSIONS_DB["Container: VoiceSessions"] end MIC -->|Audio PCM16| WS_CLIENT WS_CLIENT -->|WebSocket| WS_PROXY WS_PROXY -->|Bidirectional WS| RT_API RT_API --> STT STT --> LLM LLM --> TTS TTS --> AVATAR_SVC AVATAR_SVC -->|WebRTC Video| VIDEO WS_PROXY -->|Audio Response| WS_CLIENT WS_CLIENT -->|Audio| SPK SESSION --> TOOLS SESSION --> COSMOS

Caractéristiques Principales

Caractéristique Description
Protocole WebSocket + WebRTC (SDP/ICE)
Avatars Vidéo 6 personnages : Harry, Jeff, Lisa, Lori, Max, Meg
Avatars Photo 30 personnages VASA-1 (photo-réalistes)
Résolution Vidéo 1920x1080 (vidéo) / 512x512 (photo)
Format Audio PCM16, 24kHz, mono
Lip-Sync Synchronisation temps réel via visèmes
Barge-in Interruption native avec throttling 500ms
Tools Max 8 outils par agent, HTTP + Python

9.2 Types d'Avatars

Avatar Vidéo Azure (6 personnages)

Personnages 3D pré-rendus avec styles variés, rendu via WebRTC en haute résolution.

Personnage Styles Disponibles
Harry business, casual, youthful
Jeff business, formal
Lisa casual-sitting, graceful-standing, technical-sitting, technical-standing
Lori casual, formal, graceful
Max business, casual, formal
Meg business, casual, formal

Configuration Vidéo Avatar

{
    "avatar": {
        "character": "lisa",
        "style": "casual-sitting",
        "customized": false,
        "video": {
            "resolution": {"width": 1920, "height": 1080},
            "bitrate": 2000000,
            "crop": {
                "top_left": [560, 0],
                "bottom_right": [1360, 1080]
            },
            "background": {"color": "#FFFFFF"}
        },
        "ice_servers": [
            {"urls": ["stun:stun.l.google.com:19302"]}
        ]
    }
}

Avatar Photo VASA-1 (30 personnages)

Anime une photo portrait pour créer un avatar parlant réaliste avec micro-expressions.

Personnages Photo Disponibles
adrian, amara, amira, anika, bianca, camila, carlos, clara, darius, diego
elise, farhan, faris, gabrielle, hyejin, imran, isabella, layla, liwei, ling
marcus, matteo, rahul, rana, ren, riya, sakura, simone, zayd, zoe

Configuration Photo Avatar

{
    "avatar": {
        "type": "photo-avatar",
        "model": "vasa-1",
        "character": "isabella",
        "photoAvatarBaseModel": "isabella",
        "video": {
            "resolution": {"width": 512, "height": 512},
            "bitrate": 2000000
        }
    }
}

9.3 Architecture du Blueprint

Fichiers Principaux

Fichier Lignes Rôle
avatar_routes.py ~1650 Routes Azure Avatar (5 étapes + chat)
avatar_live_proxy.py ~1580 WebSocket proxy + AvatarLiveSession
cosmos_azure_avatar_manager_v2.py ~730 Manager CRUD Cosmos DB
cosmos_avatar_preferences_manager.py ~510 Préférences utilisateur

Endpoints Principaux

Route Méthode Description
/azure-avatar/gallery GET Galerie des agents avatar
/azure-avatar/step1 GET/POST Étape 1: Sélection du modèle
/azure-avatar/step2/<id> GET/POST Étape 2: Configuration voix
/azure-avatar/step3/<id> GET/POST Étape 3: Sélection avatar (Photo/Vidéo)
/azure-avatar/step4/<id> GET/POST Étape 4: Configuration outils
/azure-avatar/step5/<id> GET/POST Étape 5: Prompt système
/azure-avatar/session/<id> GET Interface de session intégrée
/azure-avatar/embed/<id> GET Widget intégrable
/ws/avatar/<id> WebSocket Connexion temps réel
/azure-avatar/api/get-ice-token POST Token ICE pour WebRTC

9.4 Flux de Création d'un Agent Avatar

flowchart LR S1["ÉTAPE 1\nModèle"] --> S2["ÉTAPE 2\nVoix"] S2 --> S3["ÉTAPE 3\nAvatar"] S3 --> S4["ÉTAPE 4\nOutils"] S4 --> S5["ÉTAPE 5\nPrompt"] S5 --> PUB["Agent Publié"] style S1 fill:#4A148C,color:#fff style S2 fill:#6A1B9A,color:#fff style S3 fill:#7B1FA2,color:#fff style S4 fill:#9C27B0,color:#fff style S5 fill:#AB47BC,color:#fff style PUB fill:#51cf66,color:#fff

Étape 1: Sélection du Modèle

Étape 2: Configuration Voix

Étape 3: Sélection Avatar

Étape 4: Configuration Outils

Étape 5: Prompt Système

9.5 Connexion WebSocket et WebRTC

Flux de Messages

sequenceDiagram participant U as Utilisateur participant C as Client JS participant P as Flask Proxy participant A as Azure Voice Live U->>C: Clic Démarrer C->>P: WS Connect /ws/avatar/agent_id P->>A: WS Connect Azure A-->>P: session.created P-->>C: session.ready C->>P: session.avatar.connect (SDP Offer) P->>A: Forward SDP A-->>P: SDP Answer + ICE Candidates P-->>C: WebRTC établi (vidéo) loop Conversation U->>C: Parle au micro C->>P: input_audio_buffer.append (PCM16) P->>A: Forward audio A-->>P: speech_started (VAD) P-->>C: user.speaking: true A-->>P: transcription.completed P-->>C: user.transcript A-->>P: response.audio.delta P-->>C: agent.transcript + audio Note over C: Avatar lip-sync via WebRTC end alt Barge-in (Interruption) U->>C: Parle pendant réponse C->>P: interrupt P->>A: response.cancel Note over P: Throttle 500ms end U->>C: Clic Terminer C->>P: stop P->>A: WS Close P->>P: Sauvegarde Cosmos

Types de Messages WebSocket

Message Direction Description
session.ready Server → Client Connexion WebSocket établie
session.configured Server → Client Configuration Azure validée
session.avatar.connect Client → Server SDP Offer WebRTC
session.avatar.connected Server → Client WebRTC vidéo établi
input_audio_buffer.append Client → Server Chunk audio PCM16
user.speaking Server → Client État parole utilisateur
user.transcript Server → Client Transcription utilisateur
agent.speaking Server → Client État parole agent
agent.transcript Server → Client Transcription agent (delta)
interrupt Client → Server Demande d'interruption
ping/pong Bidirectionnel Keep-alive (15s client, 10s Azure)

9.6 Classe AvatarLiveSession

# Blueprints/avatar_live_proxy.py

class AvatarLiveSession:
    """Gère une session avatar bidirectionnelle."""

    def __init__(self, agent_config: dict, client_ws, session_id: str):
        self.agent_config = agent_config
        self.client_ws = client_ws
        self.session_id = session_id
        self.azure_ws = None

        # État de la session
        self.is_speaking = False           # Avatar en train de parler
        self.is_response_active = False    # Réponse en cours
        self.interruptions = 0             # Compteur barge-in
        self.tools_executed = 0            # Compteur tools

        # Transcriptions
        self.transcripts = []
        self.total_tokens = {"input": 0, "output": 0}

    async def connect_to_azure(self) -> bool:
        """Connexion à Azure Voice Live API."""
        url = self._build_websocket_url()
        headers = {"api-key": self.speech_key}
        self.azure_ws = await websockets.connect(url, extra_headers=headers)
        return True

    async def send_session_update(self):
        """Envoie la configuration à Azure."""
        # Normalise la config selon le type d'avatar
        if self._is_photo_avatar():
            self._normalize_photo_avatar_config()
        else:
            self._normalize_video_avatar_config()

        await self.azure_ws.send(json.dumps({
            'type': 'session.update',
            'session': self.cached_azure_config
        }))

    async def handle_azure_message(self, message: dict):
        """Traite les messages Azure."""
        msg_type = message.get('type')

        if msg_type == 'response.function_call_arguments.done':
            # Exécuter le tool
            result = await self._execute_tool(
                message.get('call_id'),
                message.get('name'),
                message.get('arguments')
            )
            # Renvoyer le résultat
            await self._submit_tool_result(message.get('call_id'), result)

        elif msg_type == 'response.done':
            # Capturer les tokens
            usage = message.get('response', {}).get('usage', {})
            self.total_tokens['input'] += usage.get('input_tokens', 0)
            self.total_tokens['output'] += usage.get('output_tokens', 0)

    async def handle_barge_in(self):
        """Gère l'interruption utilisateur."""
        if self.is_speaking and self.is_response_active:
            self.interruptions += 1
            await self.azure_ws.send(json.dumps({'type': 'response.cancel'}))
            self.is_speaking = False
            self.is_response_active = False

9.7 Configuration Azure Complète

{
    "modalities": ["text", "audio"],
    "input_audio_format": "pcm16",
    "output_audio_format": "pcm16",
    "input_audio_sampling_rate": 24000,
    "output_audio_timestamp_types": ["word"],

    "input_audio_echo_cancellation": {
        "type": "server_echo_cancellation"
    },
    "input_audio_noise_reduction": {
        "type": "azure_deep_noise_suppression"
    },

    "voice": {
        "name": "fr-FR-DeniseNeural",
        "type": "azure-standard",
        "temperature": 0.8,
        "rate": "1.0"
    },

    "avatar": {
        "character": "lisa",
        "style": "casual-sitting",
        "video": {
            "resolution": {"width": 1920, "height": 1080},
            "bitrate": 2000000,
            "crop": {"top_left": [560, 0], "bottom_right": [1360, 1080]},
            "background": {"color": "#FFFFFF"}
        },
        "ice_servers": [
            {"urls": ["stun:stun.l.google.com:19302"]}
        ]
    },

    "turn_detection": {
        "type": "azure_semantic_vad_multilingual",
        "threshold": 0.5,
        "silence_duration_ms": 500,
        "speech_duration_ms": 150,
        "create_response": true,
        "interrupt_response": true,
        "end_of_utterance_detection": {
            "model": "semantic_detection_v1_multilingual",
            "threshold_level": "low"
        }
    },

    "input_audio_transcription": {
        "model": "whisper-1",
        "language": "fr-FR"
    },

    "tools": [...],
    "instructions": "Tu es Sophie, assistante virtuelle..."
}

9.8 Gestion des Sessions

Schéma de Session Cosmos DB

{
    "id": "session_uuid",
    "call_id": "call_uuid",
    "agent_id": "agent_uuid",
    "agent_type": "Agent Avatar",
    "model_id": "gpt-realtime-preview",
    "status": "completed",

    "created_at": "2025-12-30T10:00:00Z",
    "updated_at": "2025-12-30T10:05:30Z",

    "history": [
        {"role": "user", "content": "Bonjour", "timestamp": "..."},
        {"role": "assistant", "content": "Bonjour !", "timestamp": "..."}
    ],

    "usage": {
        "input_tokens": 250,
        "output_tokens": 450,
        "total_tokens": 700
    },

    "metrics": {
        "duration_seconds": 330,
        "interruptions": 2,
        "tools_executed": 1,
        "final_transcript_count": 6
    }
}

9.9 Timeouts et Keep-Alive

Paramètre Valeur Description
AZURE_CONNECT_TIMEOUT 12s Timeout connexion initiale Azure
PING_INTERVAL 15s Keep-alive client → server
AZURE_PING_INTERVAL 10s Keep-alive server → Azure
INACTIVITY_TIMEOUT 180s Fermeture auto si silence
INACTIVITY_CHECK_INTERVAL 30s Fréquence vérification inactivité
SAMPLE_RATE 24000 Hz Fréquence audio PCM16

9.10 Variables d'Environnement

# Azure Voice Live (Avatar)
VOICE_LIVE_ENDPOINT=https://westus2.api.cognitive.microsoft.com/
VOICE_LIVE_KEY=<api-key>
VOICE_LIVE_REGION=westus2

# Azure OpenAI
AZURE_OPENAI_ENDPOINT=https://...
AZURE_OPENAI_KEY=<key>

# Cosmos DB
COSMOS_URI=https://...
COSMOS_KEY=<key>
COSMOS_DATABASE_NAME=ConversationsDB

Chapitre 10: Intégration

Embedding sur vos sites

10.1 iframe

<iframe src="https://wakavoice.com/embed/agent/{id}" allow="microphone"></iframe>

10.2 Widget JavaScript

<script src="https://wakavoice.com/widget.js"></script>
<script>WakaVoice.init({agentId: 'xxx', position: 'bottom-right'});</script>

Chapitre 11: Capacité & Scalabilité

Sessions simultanées, projections de volume et configuration Azure

Ce chapitre détaille la capacité de traitement de la plateforme Waka Voice, avec des projections concrètes du nombre de transactions traitables selon différents scénarios d'utilisation (8h/jour ou 24h/jour) et par canal de communication.

11.1 Configuration Azure Web App

Auto-configuration des sessions

L'application Azure Web App est configurée avec un paramètre MAX_SESSION = 30% de la capacité totale, auto-configurable. Par défaut, cette valeur est fixée à 1 session pour les environnements de développement.

Paramètres de configuration

ParamètreValeur par défautDescriptionImpact
MAX_SESSION_PERCENTAGE 30% Pourcentage de la capacité CPU/RAM utilisable pour les sessions Évite la surcharge du serveur
DEFAULT_MAX_SESSIONS 1 Nombre de sessions simultanées par défaut (dev/test) Limite les coûts en environnement de test
AUTO_SCALE_ENABLED true Active l'auto-scaling basé sur la charge Ajuste automatiquement la capacité
SESSION_TIMEOUT 90 sec Timeout d'inactivité avant fermeture automatique Libère les ressources inutilisées
Impact sur les ressources

Chaque session active consomme des ressources Azure (CPU, RAM, bande passante, tokens OpenAI). Le paramètre 30% permet de maintenir une marge de sécurité pour éviter les dépassements de quota et garantir la stabilité du service.

11.2 Sessions Simultanées par Canal

Chaque type de canal a des caractéristiques de consommation différentes :

flowchart LR subgraph VOICE["🎙️ Agents Voix"] V1[Sessions max: 500] V2[RAM/session: 50 MB] V3[Durée moy: 3 min] end subgraph TEXT["💬 Agents Texte"] T1[Sessions max: 1000] T2[RAM/session: 10 MB] T3[Durée moy: 5 min] end subgraph AVATAR["🎭 Agents Avatar"] A1[Sessions max: 200] A2[RAM/session: 150 MB] A3[Durée moy: 2 min] end style VOICE fill:#E3F2FD,stroke:#1565C0 style TEXT fill:#E8F5E9,stroke:#2E7D32 style AVATAR fill:#F3E5F5,stroke:#7B1FA2
Canal Sessions Simultanées Max RAM par Session CPU par Session
Voix 500 50 MB 0.1 vCPU
Texte (Chat) 1 000 10 MB 0.02 vCPU
Avatar Vidéo 200 150 MB 0.3 vCPU
Phone (SIP) 300 40 MB 0.08 vCPU
WhatsApp 800 15 MB 0.03 vCPU
SMS 1 500 5 MB 0.01 vCPU

11.3 Projection 8h/jour (Horaires Bureau)

Scénario : Utilisation en heures ouvrées (9h-17h)

Ce scénario correspond à une utilisation typique en entreprise, avec des agents disponibles pendant les heures de bureau uniquement.

Canal Sessions/heure Durée moy. Transactions/jour (8h) Transactions/mois (22j)
Voix 100 3 min 800 17 600
Texte 200 5 min 1 600 35 200
Avatar 60 2 min 480 10 560
Phone 80 4 min 640 14 080
WhatsApp 150 3 min 1 200 26 400
SMS 300 1 min 2 400 52 800
TOTAL 890/h - 7 120/jour 156 640/mois
pie showData title "Répartition Transactions/Jour (8h)" "SMS" : 2400 "Texte" : 1600 "WhatsApp" : 1200 "Voix" : 800 "Phone" : 640 "Avatar" : 480

11.4 Projection 24h/jour (Simulation Maximale)

Scénario : Utilisation 24/7

Ce scénario simule une utilisation continue, typique pour les services clients internationaux ou les chatbots disponibles en permanence. Les pics de charge sont lissés sur 24 heures.

Canal Sessions/heure (moy.) Durée moy. Transactions/jour (24h) Transactions/mois (30j)
Voix 80 3 min 1 920 57 600
Texte 180 5 min 4 320 129 600
Avatar 40 2 min 960 28 800
Phone 60 4 min 1 440 43 200
WhatsApp 120 3 min 2 880 86 400
SMS 250 1 min 6 000 180 000
TOTAL 730/h - 17 520/jour 525 600/mois
xychart-beta title "Transactions Mensuelles par Canal (24h/7j)" x-axis ["SMS", "Texte", "WhatsApp", "Voix", "Phone", "Avatar"] y-axis "Transactions (milliers)" 0 --> 200 bar [180, 129.6, 86.4, 57.6, 43.2, 28.8]

11.5 Impact du Paramètre MAX_SESSION

Le paramètre MAX_SESSION_PERCENTAGE impacte directement la capacité :

MAX_SESSION % Sessions Voix Max Sessions Texte Max Recommandation
10% 50 100 Dev / Tests
30% (défaut) 150 300 Production standard
50% 250 500 Charge moyenne
70% 350 700 Charge élevée
90% 450 900 Risque de surcharge
Recommandation

Conservez le paramètre à 30% pour garantir une marge de sécurité. Cette configuration permet de gérer les pics de charge imprévus sans dégrader l'expérience utilisateur. Augmentez progressivement si les métriques de monitoring montrent une utilisation stable.

Chapitre 12: Manuel Utilisateur

Guide pratique pas-à-pas pour utiliser Waka Voice

Bienvenue dans le manuel utilisateur de Waka Voice ! Ce guide vous accompagne écran par écran pour maîtriser toutes les fonctionnalités de la plateforme. Pour chaque écran, vous trouverez : une description visuelle de l'interface, la localisation de chaque élément, et des instructions pas-à-pas pour chaque action possible.

12.1 Comment naviguer dans l'application

La barre de navigation

En haut de chaque page, vous voyez une barre violette qui reste toujours visible. C'est votre menu principal pour accéder à toutes les fonctionnalités.

De gauche à droite, vous trouverez :

  • Logo Waka Voice (tout à gauche) : Cliquez dessus pour revenir à l'accueil à tout moment
  • Accueil : Votre tableau de bord avec les statistiques
  • Waka AXIOM : Pour gérer vos documents et votre base de connaissances
  • Création : Pour créer de nouveaux agents, voix ou outils
  • Galeries : Pour voir et gérer tout ce que vous avez créé
  • Dashboards : Pour consulter les rapports et statistiques détaillées
  • FR/EN/ES (à droite) : Pour changer la langue de l'interface
Astuce de navigation

Passez votre souris sur un menu pour voir les sous-menus disponibles. Un petit triangle à côté du nom indique qu'il y a des options à l'intérieur.

12.2 Écran "Accueil" - Le tableau de bord

Pour y accéder : Cliquez sur "Accueil" dans le menu, ou cliquez sur le logo Waka Voice

Description de l'écran

L'écran d'accueil est votre tableau de bord central. Il vous montre en un coup d'œil tout ce qui se passe sur votre plateforme : combien de conversations sont en cours, combien d'argent vous avez généré, et comment se portent vos agents.

Ce que vous voyez sur cet écran :

En haut de la page :

  • Titre "Dashboard" avec la date du jour
  • Bouton "Rafraîchir" (icône de flèche circulaire, en haut à droite) : pour actualiser les chiffres
  • Bouton "Configurer taux" : pour définir votre tarif de facturation par minute

Au centre - Les cartes de statistiques :

Vous voyez plusieurs cartes rectangulaires disposées en grille. Chaque carte affiche une catégorie de données :

Carte "Conversations"

Affiche le nombre total de conversations et celles en cours actuellement

Carte "Business"

Montre les revenus générés, les coûts et votre marge bénéficiaire

Carte "Tokens"

Indique la consommation de ressources IA (entrée/sortie, texte/audio)

Carte "Sentiment"

Analyse l'humeur des conversations : positif, neutre ou négatif

Carte "Durée"

Statistiques sur la durée des appels (moyenne, minimum, maximum)

Les petits graphiques (Sparklines) :

Dans certaines cartes, vous voyez de petites courbes qui montrent l'évolution sur les 15 dernières minutes.

Fonctionnalités pas-à-pas

Consulter vos statistiques

Objectif : Voir rapidement comment se porte votre activité

  1. Ouvrez la page d'accueil (cliquez sur "Accueil" ou le logo)
  2. Regardez les cartes affichées au centre de l'écran
  3. Chaque carte montre une catégorie différente :
    • Les gros chiffres sont les valeurs actuelles
    • Les petites courbes montrent la tendance récente
    • Les flèches vertes/rouges indiquent si ça monte ou descend
  4. Pour avoir les données les plus récentes, cliquez sur le bouton "Rafraîchir" en haut à droite

Configurer votre taux de facturation

Objectif : Définir combien vous facturez par minute de conversation

  1. Sur la page d'accueil, repérez le bouton "Configurer taux" en haut de la page
  2. Cliquez dessus : une petite fenêtre (popup) s'ouvre
  3. Dans le champ de saisie, entrez votre tarif en euros par minute (exemple : 0.50 pour 50 centimes)
  4. Cliquez sur "Enregistrer" pour valider
  5. Les calculs de revenus se mettront à jour automatiquement avec votre nouveau tarif
Attention

Si vous ne configurez pas de taux, les revenus afficheront 0€ même si vous avez des conversations.

En cas de problème

Les chiffres affichent tous 0

Pourquoi ? Aucune conversation n'a encore eu lieu, ou aucun agent n'est actif.

Que faire ? Créez un agent (voir section Création) et testez-le pour générer des données.

Les données ne se mettent pas à jour

Pourquoi ? Le navigateur utilise peut-être d'anciennes données en cache.

Que faire ? Cliquez sur le bouton "Rafraîchir", ou appuyez sur F5 sur votre clavier.

Message d'erreur "Impossible de charger les données"

Pourquoi ? La connexion avec la base de données a échoué.

Que faire ? Attendez quelques secondes et rafraîchissez la page. Si le problème persiste, contactez le support technique.

Les petits graphiques sont vides

Pourquoi ? Il n'y a pas encore 15 minutes de données collectées.

Que faire ? C'est normal au début. Les graphiques se rempliront au fil du temps.

Bonnes pratiques
  • Consultez le dashboard chaque matin pour avoir une vue d'ensemble de votre activité
  • Configurez votre taux de facturation dès le premier jour pour avoir des revenus corrects
  • Si vous voyez des sentiments négatifs augmenter, vérifiez les instructions de vos agents

12.3 Écran "Upload de Documents" (Waka AXIOM)

Pour y accéder : Menu "Waka AXIOM" → "Ajouter Documents"

Description de l'écran

Cet écran vous permet d'ajouter des documents à votre base de connaissances. Ces documents seront ensuite utilisés par vos agents pour répondre aux questions des utilisateurs en s'appuyant sur leur contenu.

Ce que vous voyez sur cet écran :

En haut de la page :

  • Titre "Ajouter des documents" avec une icône de téléchargement
  • Sélecteur de projet (menu déroulant) : permet de choisir dans quel projet stocker les documents

Au centre - La zone de téléchargement :

Vous voyez une grande zone rectangulaire avec une bordure en pointillés. C'est la zone où vous pouvez déposer vos fichiers.

  • Une icône de nuage au centre
  • Le texte "Glissez-déposez vos fichiers ici"
  • Un bouton "Parcourir" pour sélectionner des fichiers manuellement
  • La liste des formats acceptés : PDF, DOCX, TXT, XLSX, PPTX, HTML, MD

En dessous - La liste des fichiers :

Une fois des fichiers ajoutés, ils apparaissent dans une liste avec :

  • Le nom du fichier
  • Sa taille (en Ko ou Mo)
  • Une barre de progression pendant le téléchargement
  • Un bouton "X" pour retirer un fichier de la liste

En bas de la page :

  • Bouton "Télécharger et indexer" : lance le traitement des fichiers

Fonctionnalités pas-à-pas

Ajouter des documents (méthode glisser-déposer)

Objectif : Télécharger rapidement plusieurs fichiers en les faisant glisser

  1. Ouvrez l'écran "Ajouter Documents" depuis le menu Waka AXIOM
  2. Choisissez le projet dans le menu déroulant en haut (si vous n'avez qu'un projet, il sera déjà sélectionné)
  3. Sur votre ordinateur, ouvrez le dossier contenant vos fichiers
  4. Sélectionnez les fichiers que vous voulez ajouter (vous pouvez en sélectionner plusieurs en maintenant Ctrl enfoncé)
  5. Faites-les glisser avec votre souris vers la zone en pointillés sur la page
  6. La zone devient bleue/violette quand vous êtes au-dessus : relâchez les fichiers
  7. Vos fichiers apparaissent dans la liste en dessous
  8. Vérifiez que tous les fichiers souhaités sont dans la liste
  9. Cliquez sur le bouton "Télécharger et indexer"
  10. Attendez que les barres de progression atteignent 100% pour chaque fichier
  11. Un message "Indexation terminée" confirme que tout est prêt

Ajouter des documents (méthode bouton Parcourir)

Objectif : Sélectionner des fichiers via l'explorateur de fichiers classique

  1. Ouvrez l'écran "Ajouter Documents" depuis le menu Waka AXIOM
  2. Choisissez le projet dans le menu déroulant en haut
  3. Cliquez sur le bouton "Parcourir" au centre de la zone en pointillés
  4. Une fenêtre de l'explorateur de fichiers s'ouvre
  5. Naviguez jusqu'au dossier contenant vos fichiers
  6. Sélectionnez les fichiers (Ctrl+clic pour en sélectionner plusieurs)
  7. Cliquez sur "Ouvrir"
  8. Vos fichiers apparaissent dans la liste
  9. Cliquez sur "Télécharger et indexer"
  10. Patientez pendant le traitement

Retirer un fichier avant l'envoi

Objectif : Enlever un fichier que vous avez ajouté par erreur

  1. Repérez le fichier à retirer dans la liste
  2. À droite du nom du fichier, cliquez sur le bouton "X" (ou l'icône poubelle)
  3. Le fichier disparaît de la liste
  4. Vous pouvez maintenant continuer avec les autres fichiers

Note : Cette action est possible uniquement AVANT d'avoir cliqué sur "Télécharger et indexer".

En cas de problème

Le fichier est refusé / "Format non supporté"

Pourquoi ? Le type de fichier n'est pas accepté (exemple : images, vidéos, fichiers .zip).

Que faire ? Convertissez votre document en PDF ou DOCX avant de le télécharger. Pour les tableaux, utilisez le format XLSX.

"Fichier trop volumineux"

Pourquoi ? Le fichier dépasse la limite de 100 Mo.

Que faire ? Découpez votre document en plusieurs parties plus petites, ou compressez les images à l'intérieur du document.

La barre de progression reste bloquée

Pourquoi ? Problème de connexion internet ou surcharge temporaire du serveur.

Que faire ? Attendez quelques minutes. Si rien ne bouge, rafraîchissez la page (F5) et recommencez.

"Aucun texte trouvé dans le document"

Pourquoi ? Votre PDF est probablement une image scannée, pas un document avec du vrai texte.

Que faire ? Utilisez un outil OCR (comme Adobe Acrobat) pour convertir l'image en texte, ou retapez le contenu dans un fichier Word.

À éviter absolument
  • Ne fermez pas la page pendant que les fichiers se téléchargent - le processus serait interrompu
  • Ne téléchargez pas des documents confidentiels contenant des données sensibles (numéros de carte bancaire, mots de passe, etc.)
  • Évitez les fichiers avec beaucoup d'images et peu de texte - l'agent ne pourra pas les exploiter efficacement

12.4 Écran "Crawler Web" (Waka AXIOM)

Pour y accéder : Menu "Waka AXIOM" → "Ajouter Sites Web"

Description de l'écran

Cet écran vous permet d'indexer le contenu d'un site web. Le système va parcourir les pages du site et en extraire le texte pour que vos agents puissent répondre à des questions sur ce contenu.

Ce que vous voyez sur cet écran :

En haut de la page :

  • Titre "Ajouter un site web"
  • Sélecteur de projet (menu déroulant) : choisir où stocker le contenu

Le formulaire principal :

  • Champ "URL de départ" : c'est ici que vous tapez l'adresse du site (exemple : https://www.monsite.fr)
  • Curseur "Profondeur" : de 1 à 5, définit combien de niveaux de liens le système va suivre
    • Profondeur 1 : seulement la page indiquée
    • Profondeur 2 : la page + les pages liées depuis cette page
    • Profondeur 3 et plus : on continue à suivre les liens
  • Champ "Limite de pages" : nombre maximum de pages à récupérer (évite de télécharger un site entier de 10 000 pages)
  • Champs "Inclure" et "Exclure" (optionnels) : pour filtrer certaines parties du site

En bas :

  • Bouton "Lancer le crawl" : démarre le processus
  • Une zone de progression apparaît pendant le crawl, montrant les pages trouvées

Fonctionnalités pas-à-pas

Indexer un site web

Objectif : Récupérer le contenu d'un site pour que votre agent puisse répondre à des questions dessus

  1. Ouvrez l'écran "Ajouter Sites Web" depuis le menu Waka AXIOM
  2. Sélectionnez votre projet dans le menu déroulant
  3. Dans le champ "URL de départ", tapez l'adresse complète du site
    • Exemple correct : https://www.monentreprise.fr/faq
    • Exemple incorrect : monentreprise.fr (il manque le https://)
  4. Choisissez la profondeur de crawl :
    • Pour une seule page ou section : choisissez 1 ou 2
    • Pour un petit site (blog, FAQ) : choisissez 3
    • Pour un site complet : choisissez 4 ou 5
  5. Définissez une limite de pages raisonnable (commencez par 50-100)
  6. Cliquez sur "Lancer le crawl"
  7. Observez la progression : le système affiche les pages qu'il trouve
  8. Attendez le message "Crawl terminé"
  9. Vos agents peuvent maintenant utiliser ce contenu !

En cas de problème

Le crawl ne démarre pas ou s'arrête immédiatement

Pourquoi ? Le site bloque peut-être les robots (fichier robots.txt).

Que faire ? Essayez avec une page spécifique du site. Si ça ne fonctionne toujours pas, téléchargez manuellement le contenu en PDF.

Très peu de contenu récupéré

Pourquoi ? Le site utilise peut-être du JavaScript pour afficher son contenu (sites modernes type React, Vue).

Que faire ? Le crawler ne peut pas exécuter le JavaScript. Utilisez plutôt la méthode "Copier-coller" : copiez le texte du site et collez-le dans un document Word, puis téléchargez ce document.

Timeout / "Le site ne répond pas"

Pourquoi ? Le site est lent ou temporairement inaccessible.

Que faire ? Vérifiez que le site fonctionne dans votre navigateur. Réessayez plus tard.

12.5 Écran "Base de Connaissances" (Waka AXIOM)

Pour y accéder : Menu "Waka AXIOM" → "Base de Connaissances"

Description de l'écran

Cet écran vous montre tout le contenu que vous avez ajouté (documents et sites web). Vous pouvez voir, rechercher et supprimer vos sources d'information.

Ce que vous voyez sur cet écran :

En haut de la page :

  • Titre "Base de Connaissances"
  • Sélecteur de projet : pour voir les documents d'un projet spécifique
  • Barre de recherche : pour trouver un document par son nom
  • Statistiques : nombre total de documents, de chunks (morceaux de texte), et taille totale

La liste des sources :

Un tableau affiche toutes vos sources avec :

  • Icône : indique le type (document, site web, SharePoint)
  • Nom : le nom du fichier ou l'URL du site
  • Date d'ajout : quand vous l'avez téléchargé
  • Taille : le nombre de "chunks" (morceaux de texte indexés)
  • Boutons d'action (à droite de chaque ligne) :
    • Icône œil : voir les détails
    • Icône poubelle : supprimer

Fonctionnalités pas-à-pas

Rechercher un document

  1. Repérez la barre de recherche en haut de la liste
  2. Tapez une partie du nom du document (exemple : "FAQ" ou "tarifs")
  3. La liste se filtre automatiquement pour ne montrer que les documents correspondants
  4. Pour effacer la recherche, supprimez le texte ou cliquez sur le X dans le champ

Supprimer un document

Attention : Cette action est définitive !

  1. Trouvez le document à supprimer dans la liste
  2. Cliquez sur l'icône poubelle à droite de la ligne
  3. Une fenêtre de confirmation apparaît : "Êtes-vous sûr ?"
  4. Lisez bien le message pour vérifier que c'est le bon document
  5. Cliquez sur "Supprimer" pour confirmer, ou "Annuler" pour revenir
  6. Le document disparaît de la liste et de votre base de connaissances
Important

Une fois supprimé, le document ne peut pas être récupéré. Vos agents ne pourront plus répondre aux questions basées sur ce contenu.

12.6 Écran "Chat" (Waka AXIOM)

Pour y accéder : Menu "Waka AXIOM" → "Chat"

Description de l'écran

C'est une interface de conversation textuelle qui répond à vos questions en utilisant votre base de connaissances. Pratique pour tester si vos documents sont bien indexés ou pour trouver rapidement une information.

Ce que vous voyez sur cet écran :

En haut :

  • Sélecteur de projet : choisir quelle base de connaissances interroger
  • Bouton "Nouvelle conversation" : pour recommencer à zéro

Au centre - La zone de conversation :

  • Vos questions apparaissent à droite (bulles colorées)
  • Les réponses de l'assistant apparaissent à gauche (bulles blanches)
  • Sous chaque réponse, vous pouvez voir les sources citées (les documents utilisés pour répondre)

En bas :

  • Un champ de saisie : c'est ici que vous tapez votre question
  • Un bouton "Envoyer" (ou appuyez sur Entrée)
  • Un bouton trombone : pour joindre un fichier à analyser ponctuellement

Fonctionnalités pas-à-pas

Poser une question sur vos documents

  1. Assurez-vous d'avoir sélectionné le bon projet en haut
  2. Cliquez dans le champ de saisie en bas de l'écran
  3. Tapez votre question en langage naturel
    • Exemple : "Quels sont les horaires d'ouverture ?"
    • Exemple : "Comment fonctionne la politique de retour ?"
  4. Appuyez sur Entrée ou cliquez sur le bouton Envoyer
  5. Patientez quelques secondes : la réponse s'affiche mot par mot
  6. Lisez la réponse et vérifiez les sources citées en dessous
  7. Vous pouvez poser des questions de suivi dans la même conversation

En cas de problème

L'assistant répond "Je ne sais pas" ou donne une réponse hors sujet

Pourquoi ? L'information n'est peut-être pas dans vos documents, ou la question est formulée différemment du contenu.

Que faire ? Reformulez votre question avec d'autres mots. Vérifiez aussi que le document contenant l'information est bien indexé dans la Base de Connaissances.

Aucune source n'est citée

Pourquoi ? La réponse est peut-être basée sur les connaissances générales de l'IA, pas sur vos documents.

Que faire ? Posez une question plus spécifique liée directement au contenu de vos documents.

12.7 Écran "Créer un Agent"

Pour y accéder : Menu "Création" → "Créer un Agent"

Description de l'écran

C'est l'écran le plus important ! Il vous guide en 5 étapes pour créer votre agent conversationnel. Un agent est un assistant virtuel qui pourra discuter avec vos utilisateurs par la voix, le texte ou via un avatar vidéo.

Ce que vous voyez sur cet écran :

En haut :

  • Une barre de progression avec 5 cercles numérotés : elle montre où vous en êtes
  • Les étapes sont : 1. Modèle → 2. Voix → 3. Tools → 4. Instructions → 5. Publier
  • L'étape en cours est colorée en violet, les étapes terminées ont une coche verte

Au centre :

Le contenu change selon l'étape. Vous avez toujours des formulaires ou des sélections à faire.

En bas :

  • Bouton "Précédent" : pour revenir à l'étape d'avant
  • Bouton "Suivant" : pour passer à l'étape suivante
  • À la dernière étape : bouton "Publier l'agent"

Création pas-à-pas (les 5 étapes)

Étape 1 : Choisir le modèle d'IA

Ce que vous devez faire : Sélectionner quel "cerveau" utilisera votre agent

Ce que vous voyez :

  • Plusieurs cartes représentant différents modèles d'IA
  • Chaque carte indique le nom du modèle et ses caractéristiques

Comment choisir :

  • gpt-4o-realtime : Le plus performant pour les conversations vocales naturelles
  • gpt-4o : Excellent équilibre qualité/coût
  • gpt-4o-mini : Plus économique, idéal pour les tests
  • gpt-5 : La dernière génération (plus puissant mais plus coûteux)
  1. Cliquez sur la carte du modèle que vous souhaitez utiliser
  2. La carte sélectionnée s'entoure d'une bordure violette
  3. Cliquez sur "Suivant" en bas à droite

Étape 2 : Configurer la voix

Ce que vous devez faire : Choisir comment votre agent va parler (sa voix)

Ce que vous voyez :

  • Une série de menus déroulants en cascade
  • Chaque choix détermine les options du menu suivant
  1. Langue : Sélectionnez la langue principale (Français, English, Español, etc.)
  2. Région : Choisissez l'accent (France, Belgique, Canada pour le français)
  3. Genre : Masculin ou Féminin
  4. Type de voix : Standard ou Neural (Neural = plus naturel)
  5. Voix : Choisissez parmi les voix disponibles
    • Un bouton "Écouter" vous permet de tester chaque voix
  6. Cliquez sur "Suivant" quand vous êtes satisfait
Conseil

Testez plusieurs voix en cliquant sur "Écouter" avant de faire votre choix. La voix représente l'identité de votre marque !

Étape 3 : Sélectionner les outils (Tools)

Ce que vous devez faire : Choisir les "pouvoirs" de votre agent (ce qu'il peut faire pendant une conversation)

Ce que vous voyez :

  • Une grille de cartes représentant tous les outils disponibles
  • Chaque carte a une case à cocher
  • Les outils sont classés par catégorie (Basiques, Communication, Recherche, etc.)

Exemples d'outils :

  • Météo : L'agent peut donner la météo d'une ville
  • Calculatrice : L'agent peut faire des calculs
  • Envoi d'email : L'agent peut envoyer un email récapitulatif
  • Recherche web : L'agent peut chercher des informations sur internet
  • Base de connaissances : L'agent peut consulter vos documents (RAG)
  1. Parcourez les outils disponibles
  2. Cochez ceux que vous voulez activer (maximum 8 recommandé)
  3. Les outils cochés apparaissent avec une bordure colorée
  4. Cliquez sur "Suivant"
Attention

N'ajoutez pas trop d'outils. Plus il y en a, plus l'agent peut se tromper dans son choix. Sélectionnez uniquement ceux vraiment utiles pour votre cas d'usage.

Étape 4 : Écrire les instructions

Ce que vous devez faire : Expliquer à l'agent son rôle, sa personnalité et comment il doit se comporter

Ce que vous voyez :

  • Une grande zone de texte pour écrire vos instructions
  • Un bouton "Générer avec l'IA" pour obtenir une aide à la rédaction
  • Des modèles prédéfinis que vous pouvez utiliser comme base

Que mettre dans les instructions :

  1. Identité : "Tu es Sophie, assistante commerciale de l'entreprise ABC"
  2. Mission : "Tu aides les clients à trouver des produits et à passer commande"
  3. Ton : "Sois amical, professionnel et patient"
  4. Limites : "Ne donne jamais de prix sans vérifier dans la base de données"
  5. Actions : "À la fin de chaque appel, propose d'envoyer un récapitulatif par email"
  1. Option A - Écrire vous-même :
    • Cliquez dans la zone de texte
    • Rédigez vos instructions en langage naturel
  2. Option B - Utiliser l'aide de l'IA :
    • Cliquez sur "Générer avec l'IA"
    • Décrivez brièvement votre besoin
    • L'IA génère un brouillon que vous pouvez modifier
  3. Relisez et ajustez vos instructions
  4. Cliquez sur "Suivant"

Étape 5 : Nommer et publier

Ce que vous devez faire : Donner un nom à votre agent et le mettre en ligne

Ce que vous voyez :

  • Un champ pour le nom de l'agent
  • Un récapitulatif de tous vos choix (modèle, voix, outils)
  • Un bouton "Publier l'agent"
  1. Entrez un nom pour votre agent (exemple : "Assistant Support Client")
  2. Vérifiez le récapitulatif : tout est correct ?
  3. Si besoin, utilisez le bouton "Précédent" pour modifier une étape
  4. Cliquez sur "Publier l'agent"
  5. Attendez le message de confirmation "Agent créé avec succès !"
  6. Vous êtes redirigé vers la galerie des agents
Félicitations !

Votre agent est maintenant créé et prêt à être testé. Rendez-vous dans la Galerie des Agents pour le tester.

En cas de problème

Le bouton "Suivant" reste grisé

Pourquoi ? Vous n'avez pas fait tous les choix obligatoires de l'étape en cours.

Que faire ? Vérifiez que vous avez bien sélectionné un modèle, une voix, etc. Les champs obligatoires sont souvent marqués d'une étoile rouge *.

"Ce nom d'agent existe déjà"

Pourquoi ? Vous avez déjà un agent avec ce nom.

Que faire ? Choisissez un nom différent (ajoutez un numéro ou une description, exemple : "Support Client v2").

Aucune voix disponible dans la liste

Pourquoi ? La combinaison langue/région/genre n'a pas de voix disponible.

Que faire ? Essayez une autre région ou un autre genre. Par exemple, certaines langues n'ont que des voix féminines.

12.8 Écran "Galerie des Agents"

Pour y accéder : Menu "Galeries" → "Agents" → "Voix" (ou "Texte" ou "Avatar")

Description de l'écran

Cet écran affiche tous vos agents sous forme de cartes. C'est votre "tableau de bord des agents" où vous pouvez les voir, les tester, les modifier ou les supprimer.

Ce que vous voyez sur cet écran :

En haut :

  • Compteurs : "X agents au total", "Y actifs", "Z brouillons"
  • Barre de recherche : pour trouver un agent par son nom
  • Filtres : par modèle, statut, date de création
  • Bouton "Créer un agent" : raccourci vers l'écran de création

Au centre - La grille de cartes :

Chaque agent est représenté par une carte rectangulaire contenant :

  • Un badge coloré en haut à gauche : "Actif" (vert) ou "Brouillon" (gris)
  • La référence de l'agent (code unique)
  • Le nom de l'agent (en gros)
  • Le modèle utilisé (gpt-4o, etc.)
  • La voix sélectionnée
  • Le nombre de tools activés
  • 4 boutons d'action en bas de la carte :
    • Tester : lancer une conversation avec l'agent
    • Modifier : changer les paramètres
    • Dupliquer : créer une copie
    • Supprimer : effacer l'agent

Fonctionnalités pas-à-pas

Tester un agent

Objectif : Avoir une conversation avec votre agent pour vérifier qu'il fonctionne bien

  1. Trouvez l'agent que vous voulez tester dans la grille
  2. Vérifiez que son badge indique "Actif" (les brouillons ne peuvent pas être testés)
  3. Cliquez sur le bouton Tester (icône lecture ▶)
  4. Vous êtes redirigé vers l'écran de session (voir section suivante)
  5. Autorisez l'accès à votre microphone si demandé
  6. Commencez à parler pour tester l'agent !

Modifier un agent

Objectif : Changer les paramètres d'un agent existant

  1. Trouvez l'agent à modifier
  2. Cliquez sur le bouton Modifier (icône crayon ✎)
  3. Vous retournez dans l'assistant de création, mais avec les valeurs actuelles pré-remplies
  4. Naviguez entre les étapes avec "Précédent" et "Suivant"
  5. Modifiez ce que vous souhaitez (voix, outils, instructions...)
  6. À la dernière étape, cliquez sur "Enregistrer les modifications"

Supprimer un agent

Attention : Cette action est définitive !

  1. Trouvez l'agent à supprimer
  2. Cliquez sur le bouton Supprimer (icône poubelle 🗑)
  3. Une fenêtre de confirmation apparaît
  4. Lisez le message pour vérifier que c'est le bon agent
  5. Cliquez sur "Confirmer la suppression"
  6. L'agent disparaît de la galerie
Important

Un agent supprimé ne peut pas être récupéré. Si vous n'êtes pas sûr, utilisez plutôt la fonction "Dupliquer" pour garder une copie avant de modifier l'original.

12.9 Écran "Session Voix" (Tester un agent)

Pour y accéder : Galerie des Agents → Bouton "Tester" sur un agent

Description de l'écran

C'est l'écran où vous discutez vocalement avec votre agent. Vous parlez dans votre micro, l'agent répond à l'oral, et vous voyez la transcription de la conversation en temps réel.

Ce que vous voyez sur cet écran :

En haut :

  • Le nom de l'agent avec lequel vous parlez
  • Un indicateur de connexion : point vert = connecté, orange = en connexion, rouge = déconnecté
  • Un bouton "Retour" pour revenir à la galerie

Au centre - La zone de conversation :

  • Les messages s'affichent comme dans une messagerie
  • Vos paroles : à droite, avec une icône de microphone
  • Réponses de l'agent : à gauche, avec une icône de robot
  • Quand un outil s'exécute : un message jaune apparaît (exemple : "Recherche météo en cours...")

En bas :

  • Bouton Micro (grand bouton rond) :
    • Vert avec micro = vous pouvez parler
    • Rouge avec micro barré = micro coupé
  • Visualisation audio : des barres qui bougent quand vous parlez
  • Bouton "Terminer" : pour mettre fin à la session

Fonctionnalités pas-à-pas

Avoir une conversation avec l'agent

  1. Attendez que l'indicateur passe au vert (connexion établie)
  2. Vérifiez que le bouton micro est vert (micro actif)
  3. Parlez normalement dans votre micro, comme si vous parliez à quelqu'un
  4. Attendez que la transcription de vos paroles apparaisse à l'écran
  5. L'agent réfléchit puis répond vocalement - vous l'entendez dans vos haut-parleurs
  6. Sa réponse s'affiche aussi en texte dans la zone de conversation
  7. Continuez la discussion aussi longtemps que nécessaire
  8. Pour terminer, cliquez sur "Terminer la session"

Couper ou réactiver votre micro

  1. Regardez le gros bouton rond en bas de l'écran
  2. S'il est vert : votre micro est actif, l'agent vous entend
  3. Cliquez dessus une fois pour couper le micro : il devient rouge
  4. Cliquez à nouveau pour réactiver : il redevient vert

Utilité : Coupez votre micro si vous devez parler à quelqu'un d'autre ou s'il y a du bruit autour de vous.

En cas de problème

L'indicateur reste orange ou rouge

Pourquoi ? La connexion au serveur n'a pas pu s'établir.

Que faire ? Vérifiez votre connexion internet. Rafraîchissez la page. Si le problème persiste, le serveur peut être temporairement surchargé - réessayez dans quelques minutes.

Le navigateur demande l'accès au microphone

Pourquoi ? C'est normal ! L'agent a besoin de votre micro pour vous entendre.

Que faire ? Cliquez sur "Autoriser". Si vous avez cliqué sur "Bloquer" par erreur, allez dans les paramètres de votre navigateur pour réautoriser l'accès au microphone.

L'agent ne répond pas quand je parle

Pourquoi ? L'agent ne détecte peut-être pas votre voix (micro trop loin, volume trop bas).

Que faire ? Parlez plus fort et plus près du micro. Vérifiez que le bon microphone est sélectionné dans les paramètres de votre ordinateur.

Le son de l'agent est haché ou grésille

Pourquoi ? Votre connexion internet est probablement trop lente ou instable.

Que faire ? Rapprochez-vous de votre box internet, ou passez en connexion filaire (câble Ethernet) si possible. Fermez les autres applications qui utilisent internet.

La session se termine toute seule

Pourquoi ? Après 5 minutes sans parole, la session se ferme automatiquement pour économiser les ressources.

Que faire ? C'est normal. Relancez simplement une nouvelle session si vous souhaitez continuer.

Conseils pour une bonne conversation
  • Parlez clairement et à un rythme normal - pas trop vite
  • Évitez les bruits de fond : fermez la fenêtre, éloignez-vous des collègues qui parlent
  • Attendez que l'agent finisse de parler avant de reprendre la parole
  • Utilisez des phrases complètes plutôt que des mots isolés
  • Si l'agent ne comprend pas, reformulez votre demande différemment

12.10 Écran "Galerie des Tools"

Pour y accéder : Menu "Galeries" → "Tools"

Description de l'écran

Cet écran liste tous les outils disponibles pour vos agents. Vous y trouvez les outils système (pré-intégrés) et vos outils personnalisés.

Ce que vous voyez sur cet écran :

En haut :

  • Barre de recherche : pour trouver un outil par son nom
  • Filtres par catégorie : Basiques, Communication, Recherche, Voyage, etc.
  • Bouton "Créer un Tool" : pour ajouter un nouvel outil personnalisé

La liste des outils :

Chaque outil est affiché dans une carte avec :

  • Une icône représentant sa fonction
  • Le nom de l'outil
  • Une courte description
  • Un badge "Système" (bleu) ou "Custom" (violet)
  • Boutons Voir / Modifier / Supprimer (pour les tools custom uniquement)

Fonctionnalités pas-à-pas

Créer un outil personnalisé

Objectif : Ajouter une nouvelle capacité à vos agents (par exemple, consulter votre CRM)

  1. Cliquez sur le bouton "Créer un Tool" en haut de la page
  2. Choisissez le type de tool :
    • OpenAPI : si vous avez une documentation API (fichier swagger.json)
    • REST Endpoint : pour un appel HTTP simple
    • Code Python : pour une logique métier complexe
  3. Remplissez les champs demandés :
    • Nom : comment s'appelle cet outil (ex: "check_stock")
    • Description : expliquez ce que fait l'outil - c'est ce que l'IA lit pour décider quand l'utiliser
    • Configuration technique : URL, paramètres, etc.
  4. Cliquez sur "Enregistrer"
  5. Votre outil apparaît maintenant dans la galerie avec un badge "Custom"
  6. Vous pouvez désormais le sélectionner lors de la création d'un agent

12.11 Écrans "Dashboards" (Qualité & Production)

Pour y accéder : Menu "Dashboards" → "Qualité" ou "Production"

Description des écrans

Ces tableaux de bord vous donnent des statistiques détaillées sur l'activité de votre plateforme.

Dashboard Qualité

Analyse la qualité des conversations :

  • Répartition des sentiments (positif/neutre/négatif) sous forme de graphiques
  • Évolution dans le temps (courbes jour par jour)
  • Performance par agent (qui génère le plus de satisfaction ?)
  • Durée moyenne des conversations

Dashboard Production

Analyse les aspects business :

  • Volume d'appels par jour/semaine/mois
  • Revenus générés (basé sur votre taux de facturation)
  • Coûts de consommation Azure
  • Marge bénéficiaire (revenus - coûts)

Fonctionnalités pas-à-pas

Changer la période d'analyse

  1. En haut du dashboard, repérez le sélecteur de dates
  2. Cliquez dessus pour ouvrir le calendrier
  3. Sélectionnez la date de début et la date de fin
  4. Ou utilisez les raccourcis : "Aujourd'hui", "Cette semaine", "Ce mois", "30 derniers jours"
  5. Les graphiques se mettent à jour automatiquement

Exporter les données

  1. Configurez d'abord la période que vous souhaitez exporter
  2. Cliquez sur le bouton "Exporter" (icône de téléchargement)
  3. Choisissez le format : CSV (pour Excel) ou PDF (pour rapport)
  4. Le fichier se télécharge automatiquement

12.12 Récapitulatif : Où trouver quoi ?

Tableau de navigation rapide

Je veux...Je vais dans...
Voir les statistiques globalesAccueil
Ajouter des documents pour mes agentsWaka AXIOM → Ajouter Documents
Indexer un site webWaka AXIOM → Ajouter Sites Web
Voir mes documents indexésWaka AXIOM → Base de Connaissances
Poser des questions sur mes documentsWaka AXIOM → Chat
Créer un nouvel agentCréation → Créer un Agent
Cloner ma voixCréation → Voix Personnelle
Lancer une campagne d'appelsCréation → Nouvelle Campagne
Ajouter un nouvel outilCréation → Nouveau Tool
Voir tous mes agentsGaleries → Agents
Consulter l'historique des conversationsGaleries → Historique
Voir les outils disponiblesGaleries → Tools
Analyser la qualité des conversationsDashboards → Qualité
Voir les revenus et coûtsDashboards → Production
Changer la langue de l'interfaceMenu FR/EN/ES (en haut à droite)
Besoin d'aide supplémentaire ?

Si vous rencontrez un problème non couvert par ce manuel, n'hésitez pas à contacter le support technique. Pensez à noter le message d'erreur exact et les étapes que vous avez suivies avant le problème.

12.2 Accueil - Dashboard Principal

Route : / | Accès : Cliquer sur "Accueil" ou le logo Waka

Description

Le dashboard principal est la page d'accueil de Waka Voice. Il affiche les métriques temps réel de toutes les conversations et agents, permettant de visualiser l'activité de la plateforme en un coup d'œil.

Fonctionnalités

SectionMétriquesDescription
ConversationsTotal, En coursNombre de conversations totales et actives
BusinessRevenus, Coûts, MargeRevenus générés vs coûts ressources Azure
TokensInput/Output, Text/AudioConsommation de tokens par type
SentimentPositif, Neutre, NégatifAnalyse sentiment utilisateur et agent
DuréeMoyenne, Min, MaxStatistiques de durée des sessions
SparklinesGraphiques 15 minTendances en temps réel

Troubleshooting

ProblèmeCause probableSolution
Métriques à zéroAucune session activeVérifier que des agents sont publiés et des sessions en cours
Données non actualiséesCache navigateurCliquer sur le bouton "Rafraîchir" ou F5
Erreur de chargementConnexion Cosmos DBVérifier les variables d'environnement COSMOS_*
Sparklines videsMoins de 15 min de donnéesAttendre l'accumulation de données historiques

12.3 Menu Waka AXIOM (RAG)

Module de gestion de la base de connaissances pour le RAG (Retrieval-Augmented Generation).

12.3.1 Upload de Documents

Route : /rag/upload | Accès : Waka AXIOM → Ajouter Documents

Description

Interface pour téléverser des fichiers depuis votre ordinateur vers la base de connaissances. Les documents sont automatiquement découpés en chunks et indexés dans Azure AI Search.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Upload échoueFichier trop volumineux (>100MB)Découper le fichier en plusieurs parties
Format non supportéExtension non reconnueConvertir en PDF ou DOCX
Indexation bloquéeQuota Azure Search atteintSupprimer d'anciens documents ou augmenter le quota
Chunks videsDocument scanné (image)Utiliser un PDF avec texte extractible (OCR)

12.3.2 Crawler Web

Route : /rag/crawl | Accès : Waka AXIOM → Ajouter Sites Web

Description

Outil de crawling pour indexer le contenu de sites web. Le crawler parcourt les pages à partir d'une URL de départ et extrait le texte pour l'indexation.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Crawl bloquérobots.txt restrictifVérifier les règles robots.txt du site
Pages manquantesContenu dynamique (SPA)Augmenter le délai entre requêtes
TimeoutSite lent ou inaccessibleVérifier la connectivité au site
Contenu videJavaScript requisLe crawler ne supporte pas le JS côté client

12.3.3 Intégration SharePoint

Route : /rag/sharepoint | Accès : Waka AXIOM → Connecter SharePoint

Description

Connexion directe à Microsoft SharePoint pour synchroniser les bibliothèques de documents avec la base de connaissances.

Fonctionnalités

  1. Authentification - Se connecter avec compte Microsoft 365
  2. Navigation - Parcourir les bibliothèques SharePoint
  3. Sélection - Cocher les dossiers à indexer
  4. Synchronisation - Lancer l'import automatique
  5. Planification - Configurer la synchro périodique

Troubleshooting

ProblèmeCauseSolution
Échec connexionToken expiréSe déconnecter et reconnecter
Bibliothèques invisiblesPermissions insuffisantesDemander l'accès à l'admin SharePoint
Synchro partielleFichiers verrouillésFermer les fichiers ouverts dans SharePoint
Erreur 403MFA requisUtiliser l'authentification interactive

12.3.4 Base de Connaissances

Route : /rag/knowledge | Accès : Waka AXIOM → Base de Connaissances

Description

Vue d'ensemble de tous les documents et sources indexés dans le projet RAG actif. Permet de gérer, rechercher et supprimer des contenus.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Liste videMauvais projet sélectionnéChanger de projet dans le sélecteur
Recherche lenteIndex volumineuxUtiliser des filtres pour réduire le scope
Suppression échoueDocument en cours d'utilisationAttendre la fin des requêtes RAG

12.3.5 Chat RAG

Route : /rag/chat-enhanced | Accès : Waka AXIOM → Chat

Description

Interface de chat conversationnel pour interroger la base de connaissances. Les réponses sont augmentées par les documents indexés avec citations des sources.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Réponse "Je ne sais pas"Information absente de la baseVérifier que le document est indexé
Pas de citationsSeuil de similarité trop hautReformuler la question
Réponse lenteBase volumineuseNormal pour >10k chunks
Erreur 500Connexion Azure SearchVérifier AZURE_SEARCH_ENDPOINT

12.3.6 Suppression de Données

Route : /rag/deletion | Accès : Waka AXIOM → Supprimer Sources

Description

Interface sécurisée pour supprimer des sources de la base de connaissances. La suppression est définitive et retire les chunks de l'index Azure Search.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Suppression partielleChunks orphelinsRelancer la suppression
Source toujours visibleCache non invalidéRafraîchir la page

12.3.7 Historique des Conversations RAG

Route : /rag/conversations | Accès : Waka AXIOM → Historique

Description

Historique de toutes les conversations effectuées dans le Chat RAG, avec possibilité de reprendre une conversation ou d'exporter les échanges.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Historique videAucune conversation sauvegardéeLes conversations sont auto-sauvegardées
Conversation incomplèteSession interrompueLes messages non envoyés sont perdus

12.4 Menu Création

12.4.1 Créer un Agent (Unifié)

Route : /agents/unified/create | Accès : Création → Créer un Agent

Description

Interface unifiée en 5 étapes pour créer tous types d'agents conversationnels : Voix, Texte ou Avatar. L'assistant guide l'utilisateur à travers la sélection du modèle, de la voix, des outils et des instructions.

flowchart LR S1["1. Modèle"] --> S2["2. Voix"] S2 --> S3["3. Tools"] S3 --> S4["4. Instructions"] S4 --> S5["5. Publier"] style S1 fill:#4A148C,color:#fff style S2 fill:#6A1B9A,color:#fff style S3 fill:#7B1FA2,color:#fff style S4 fill:#9C27B0,color:#fff style S5 fill:#51cf66,color:#fff

Fonctionnalités

Étape 1 - Sélection du Modèle :

FamilleModèlesUsage
F1 Realtimegpt-realtime, gpt-realtime-miniVoix temps réel natif
F2 GPT-4o/4.1gpt-4o, gpt-4.1, gpt-4o-miniSTT + LLM + TTS pipeline
F3 GPT-5gpt-5, gpt-5-mini, gpt-5-nanoNouvelle génération

Étape 2 - Configuration Voix : Sélection en cascade Langue → Locale → Genre → Type → Voix

Étape 3 - Sélection des Tools : Multi-sélection parmi 30+ outils (max 8 par agent)

Étape 4 - Instructions : Prompt système avec génération IA disponible

Étape 5 - Publication : Nom de l'agent et activation

Troubleshooting

ProblèmeCauseSolution
Bouton "Suivant" griséChamp requis non rempliVérifier les sélections de l'étape courante
Voix non listéeLocale non supportéeChanger de locale ou de langue
Erreur publicationNom d'agent déjà existantChoisir un nom unique
Tools non visiblesAucun tool crééCréer d'abord des tools dans Création → Tool
Génération IA échoueQuota OpenAI atteintAttendre ou écrire manuellement

12.4.2 Créer une Voix Personnelle

Route : /creer-une-voix | Accès : Création → Voix Personnelle

Description

Interface pour cloner une voix à partir d'échantillons audio. La voix personnelle peut ensuite être utilisée par les agents pour parler avec votre voix ou celle d'un collaborateur.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Qualité voix médiocreAudio bruité ou courtEnregistrer dans un lieu calme, >60s
Micro non détectéPermissions navigateurAutoriser l'accès au microphone
Génération échoueFormat audio non supportéConvertir en WAV 16kHz mono
Voix non utilisableConsentement manquantCocher la case de consentement

12.4.3 Créer une Campagne

Route : /campaigns/create/step1 | Accès : Création → Nouvelle Campagne

Description

Assistant en 3 étapes pour configurer et lancer des campagnes d'appels sortants automatisés avec un agent voix.

flowchart LR C1["1. Choisir Agent"] --> C2["2. Importer Contacts"] C2 --> C3["3. Configurer & Lancer"] style C1 fill:#4A148C,color:#fff style C2 fill:#7B1FA2,color:#fff style C3 fill:#51cf66,color:#fff

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Import CSV échoueEncodage incorrectSauvegarder en UTF-8
Numéros rejetésFormat invalideUtiliser format E.164 (+33...)
Campagne ne démarre pasHors plage horaireVérifier les heures configurées
Aucun agent disponibleTous en brouillonPublier au moins un agent

12.4.4 Créer un Tool

Route : /tools/add | Accès : Création → Nouveau Tool

Description

Interface pour créer des outils personnalisés que les agents peuvent utiliser pendant les conversations. Trois méthodes de création disponibles.

Fonctionnalités

Type de ToolDescriptionCas d'usage
OpenAPIImporter une spec OpenAPI/SwaggerAPIs tierces documentées
REST EndpointConfigurer un endpoint HTTP manuelAPIs simples sans spec
Code PythonÉcrire du code Python exécutableLogique métier complexe
RAGRecherche dans base de connaissancesQuestions sur documents

Troubleshooting

ProblèmeCauseSolution
Import OpenAPI échoueSpec invalideValider sur editor.swagger.io
Tool non exécutéDescription trop vagueAméliorer la description du tool
Erreur PythonImport non autoriséUtiliser uniquement les modules whitelistés
Timeout 60sAPI externe lenteOptimiser l'appel ou augmenter le timeout

12.5 Menu Galeries

12.5.1 Galerie Agents Voix

Route : /agents/gallery | Accès : Galeries → Agents → Voix

Description

Vue d'ensemble de tous les agents voix créés, avec filtres, recherche et actions rapides. Affiche les agents en grille de cartes avec leurs informations clés.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Galerie videAucun agent crééCréer un agent via Création → Agent
Agent non visibleFiltres actifsRéinitialiser les filtres
Bouton Test griséAgent en brouillonPublier l'agent d'abord
Chargement lentBeaucoup d'agentsUtiliser les filtres pour réduire

12.5.2 Galerie Agents Texte

Route : /text-agents/gallery | Accès : Galeries → Agents → Texte

Description

Galerie des agents conversationnels 100% texte (chatbots). Même structure que la galerie Voix avec des fonctionnalités adaptées au texte.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Chat ne répond pasQuota API atteintVérifier les quotas Azure OpenAI
Embed ne charge pasDomaine non autoriséAjouter le domaine dans CORS

12.5.3 Galerie Agents Avatar

Route : /azure-avatar/gallery | Accès : Galeries → Agents → Avatar

Description

Galerie des agents avec avatar vidéo animé. Utilise Azure Avatar Service pour le rendu vidéo temps réel avec lip-sync.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Vidéo noireWebRTC bloquéAutoriser les connexions WebRTC
Avatar figéSession expiréeRelancer la session
Pas de lip-syncAudio non reçuVérifier la connexion audio

12.5.4 Historique des Sessions Voix

Route : /agents/voice-history | Accès : Galeries → Historique

Description

Journal de toutes les sessions voix effectuées avec les agents. Permet de consulter les transcriptions, analyser les sentiments et exporter les données.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Historique videAucune session effectuéeTester un agent pour créer une session
Transcription manquanteSession interrompueLes sessions <10s ne sont pas sauvées
Export échoueTrop de donnéesRéduire la plage de dates

12.5.5 Galerie des Campagnes

Route : /agents/campaigns/gallery | Accès : Galeries → Campagnes

Description

Vue d'ensemble de toutes les campagnes d'appels sortants créées, avec leur statut et progression.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Campagne bloquéeTous contacts appelésAjouter de nouveaux contacts
Taux succès basNuméros invalidesNettoyer la liste de contacts
Pas de progressionHors plage horaireAttendre l'heure configurée

12.5.6 Galerie des Voix Personnelles

Route : /creer-une-voix/gallery | Accès : Galeries → Voix

Description

Liste de toutes les voix personnelles créées via le clonage vocal. Permet d'écouter, gérer et assigner les voix aux agents.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Voix non listéeGénération en coursAttendre 5-10 minutes
Aperçu silencieuxNavigateur bloque audioCliquer sur la page d'abord
Voix disparueExpiration AzureLes voix expirent après 90 jours d'inactivité

12.5.7 Galerie des Tools

Route : /tools/ | Accès : Galeries → Tools

Description

Catalogue de tous les outils disponibles pour les agents : outils système pré-intégrés et outils personnalisés créés par l'utilisateur.

Fonctionnalités

CatégorieExemples
Basiquescalculator, weather, translator
Communicationemail, sms, end_conversation
Recherchesearch_web, places, knowledge_base
Voyageflight_search, hotel_booking
Servicesprayer_times, pharmacy_locator
CustomVos tools personnalisés

Troubleshooting

ProblèmeCauseSolution
Tool système non modifiableProtégéDupliquer pour créer une version custom
Tool custom disparuSupprimé ou erreurRecréer le tool
Test tool échoueConfiguration invalideVérifier les paramètres et l'endpoint

12.6 Menu Dashboards & Reporting

12.6.1 Dashboard Qualité

Route : /quality | Accès : Dashboards → Qualité

Description

Tableau de bord dédié à l'analyse qualitative des conversations. Affiche les métriques de sentiment, performance et satisfaction client.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Graphiques videsPas de données sur la périodeÉlargir la plage de dates
Sentiment non analyséTranscription trop courteNormal pour sessions <30s
Chargement lentBeaucoup de donnéesRéduire la période d'analyse

12.6.2 Dashboard Production

Route : /production/ | Accès : Dashboards → Production

Description

Tableau de bord business affichant les métriques de volume, revenus, coûts et rentabilité de la plateforme.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Revenus à zéroTaux non configuréConfigurer le taux €/min dans Accueil
Coûts non affichésDonnées Azure manquantesVérifier la connexion aux APIs Azure
Marge négativeCoûts > RevenusAugmenter le taux de facturation

12.7 Interfaces de Session

12.7.1 Session Voix

Route : /agents/<agent_id>/session | Accès : Galerie Agents → Bouton "Tester"

Description

Interface de test en temps réel pour converser vocalement avec un agent. Utilise WebSocket pour la communication bidirectionnelle audio.

Fonctionnalités

Indicateurs de Statut :

IndicateurSignification
ConnectéSession WebSocket active
Connexion...En cours de connexion à Azure
DéconnectéSession terminée ou erreur
Utilisateur parle
Agent parle
Tool en cours d'exécution

Troubleshooting

ProblèmeCauseSolution
Connexion échoueWebSocket bloquéVérifier le pare-feu, utiliser HTTPS
Micro non détectéPermissions refuséesAutoriser l'accès au microphone
Agent ne répond pasPas de VAD détectéParler plus fort, vérifier le micro
Audio cracklingBande passante insuffisanteAméliorer la connexion internet
Tool timeoutAPI externe lenteLe tool a 60s max, vérifier l'endpoint
Session interrompueInactivité 5minRelancer la session

12.7.2 Session Avatar

Route : /azure-avatar/session/<agent_id> | Accès : Galerie Avatar → Bouton "Tester"

Description

Interface de session avec avatar vidéo animé. Combine la voix avec un rendu vidéo temps réel synchronisé sur les lèvres.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Vidéo noireWebRTC bloquéAutoriser les connexions WebRTC/TURN
Avatar figéSession Azure expiréeRelancer la session (max 10min)
DésynchronisationLatence réseauAméliorer la connexion
Vidéo pixeliséeBande passante faibleMinimum 5 Mbps recommandé
Erreur ICEFirewall bloque STUN/TURNOuvrir les ports UDP 3478, 5349

12.7.3 Session Chat Texte

Route : /text-agents/chat/<agent_id> | Accès : Galerie Texte → Bouton "Tester"

Description

Interface de chat textuel avec un agent. Utilise SSE (Server-Sent Events) pour le streaming des réponses.

Fonctionnalités

Troubleshooting

ProblèmeCauseSolution
Réponse bloquéeSSE interrompuRafraîchir la page
Upload échoueFichier trop volumineuxMax 10MB par fichier
Réponse tronquéeLimite tokens atteinteDémarrer une nouvelle conversation

12.8 Raccourcis et Navigation Rapide

flowchart TB HOME["Accueil /"] --> AGENTS["Agents"] HOME --> RAG["Waka AXIOM"] HOME --> DASH["Dashboards"] AGENTS --> VOICE["/agents/gallery"] AGENTS --> TEXT["/text-agents/gallery"] AGENTS --> AVATAR["/azure-avatar/gallery"] RAG --> UPLOAD["/rag/upload"] RAG --> CRAWL["/rag/crawl"] RAG --> KB["/rag/knowledge"] RAG --> CHAT["/rag/chat-enhanced"] DASH --> QUALITY["/quality"] DASH --> PROD["/production/"] style HOME fill:#4A148C,color:#fff style AGENTS fill:#7B1FA2,color:#fff style RAG fill:#7B1FA2,color:#fff style DASH fill:#7B1FA2,color:#fff

Tableau Récapitulatif des Routes

ÉcranRouteMenu
Dashboard Accueil/Accueil
Upload Documents/rag/uploadWaka AXIOM
Crawler Web/rag/crawlWaka AXIOM
SharePoint/rag/sharepointWaka AXIOM
Base de Connaissances/rag/knowledgeWaka AXIOM
Chat RAG/rag/chat-enhancedWaka AXIOM
Créer Agent/agents/unified/createCréation
Créer Voix/creer-une-voixCréation
Créer Campagne/campaigns/create/step1Création
Créer Tool/tools/addCréation
Galerie Voix/agents/galleryGaleries
Galerie Texte/text-agents/galleryGaleries
Galerie Avatar/azure-avatar/galleryGaleries
Historique Voix/agents/voice-historyGaleries
Galerie Campagnes/agents/campaigns/galleryGaleries
Galerie Voix Perso/creer-une-voix/galleryGaleries
Galerie Tools/tools/Galeries
Dashboard Qualité/qualityDashboards
Dashboard Production/production/Dashboards

Chapitre 13: Code et Framework

Architecture technique, arborescence et infrastructure cloud

13.1 Stack Technique

CoucheTechnologieVersionRôle
BackendPython / Flask3.11+ / 3.0API REST, WebSocket, SSE
FrontendJinja2 + Bootstrap 5-Templates HTML, CSS, JS
Temps réelWebSocket / WebRTC-Audio bidirectionnel, Avatar vidéo
Base de donnéesAzure Cosmos DBNoSQLAgents, Sessions, Tools, Projets
RechercheAzure AI Search-Indexation RAG, recherche sémantique
StockageAzure Blob Storage-Documents, audio, avatars
IAAzure OpenAIGPT-4o, GPT-5LLM, Realtime API
VoixAzure Speech Services-STT, TTS, Personal Voice
AvatarAzure Avatar Service-Rendu vidéo temps réel

13.2 Arborescence du Projet

wakavoice/
├── app.py                          # Point d'entrée Flask
├── requirements.txt                # Dépendances Python
├── .env                            # Variables d'environnement
│
├── Blueprints/                     # Routes Flask (Blueprints)
│   ├── __init__.py
│   ├── agents_config_routes.py     # CRUD agents voix (~122k)
│   ├── unified_agent_routes.py     # Création unifiée agents (~106k)
│   ├── text_agents_routes.py       # Agents texte + chat SSE (~178k)
│   ├── avatar_routes.py            # Agents avatar (~69k)
│   ├── avatar_live_proxy.py        # WebSocket proxy avatar (~78k)
│   ├── voice_live_proxy.py         # WebSocket proxy voix (~101k)
│   ├── campaign_routes.py          # Campagnes d'appels (~29k)
│   ├── conversation_history_routes.py  # Historique sessions (~34k)
│   ├── crawl_routes.py             # Crawler web RAG (~22k)
│   ├── personal_voice_routes.py    # Clonage vocal (~87k)
│   ├── prompt_builder_routes.py    # Générateur prompts (~31k)
│   ├── quality_dashboard_routes.py # Dashboard qualité (~50k)
│   ├── production_dashboard_routes.py  # Dashboard business (~28k)
│   ├── project_routes.py           # Projets RAG (~12k)
│   ├── api_document_upload.py      # Upload documents RAG (~75k)
│   ├── api_process_message_stream.py   # Chat RAG SSE (~57k)
│   ├── api_rag_search.py           # Recherche sémantique (~10k)
│   ├── api_kickoff_indexation.py   # Indexation documents (~34k)
│   └── tools/                      # Routes gestion tools
│       └── tools_routes.py         # CRUD tools dynamiques
│
├── configuration/                  # Managers Cosmos DB
│   ├── cosmos_config.py            # Client Cosmos principal (~102k)
│   ├── cosmos_agent_manager.py     # CRUD agents voix (~28k)
│   ├── cosmos_text_agent_manager.py    # CRUD agents texte (~36k)
│   ├── cosmos_unified_manager.py   # Manager unifié (~30k)
│   ├── cosmos_azure_avatar_manager_v2.py   # Agents avatar (~31k)
│   ├── cosmos_tools_manager.py     # CRUD tools (~30k)
│   ├── cosmos_session_manager.py   # Sessions voix (~14k)
│   ├── cosmos_campaign_manager.py  # Campagnes (~13k)
│   ├── cosmos_project_manager.py   # Projets RAG (~8k)
│   ├── unified_session_manager.py  # Gestion sessions (~18k)
│   ├── unified_session_closure.py  # Clôture sessions + résumé AI + sentiment (~23k)
│   ├── voice_live_config.py        # Config Azure Realtime (~18k)
│   ├── voice_live_session_builder.py   # Builder sessions (~19k)
│   ├── cost_calculator.py          # Calcul coûts Azure (~9k)
│   ├── sentiment_analysis.py       # Analyse sentiment (~9k)
│   ├── model_mapping.py            # Mapping modèles (~4k)
│   └── personal_voice_storage.py   # Stockage voix perso (~15k)
│
├── tools/                          # Outils système (built-in)
│   ├── __init__.py                 # Registry des tools (~14k)
│   ├── tool_weather.py             # Météo (~5k)
│   ├── tool_calculator.py          # Calculatrice (~3k)
│   ├── tool_email.py               # Envoi email (~11k)
│   ├── tool_translator.py          # Traduction (~8k)
│   ├── tool_search_web.py          # Recherche web (~6k)
│   ├── tool_places.py              # Google Places (~8k)
│   ├── tool_flight_search.py       # Recherche vols (~16k)
│   ├── tool_hotel_search.py        # Recherche hôtels (~16k)
│   ├── tool_knowledge_base.py      # RAG search (~7k)
│   ├── tool_end_conversation.py    # Fin conversation (~7k)
│   ├── tool_prayer_times.py        # Horaires prières (~8k)
│   ├── tool_pharmacy_locator.py    # Pharmacies (~10k)
│   ├── tool_tax_calculator.py      # Calcul impôts (~13k)
│   ├── tool_news.py                # Actualités (~8k)
│   ├── tool_currency.py            # Conversion devises (~7k)
│   ├── tool_cv.py                  # Analyse CV (~25k)
│   └── ... (30+ tools)
│
├── utils/                          # Utilitaires
│   ├── indexation.py               # Indexation Azure Search (~75k)
│   ├── chat.py                     # Helpers chat (~19k)
│   ├── prompt_generator.py         # Génération prompts IA (~12k)
│   ├── session_watchdog.py         # Monitoring sessions (~13k)
│   ├── lead_capture.py             # Capture leads (~17k)
│   └── tools/                      # Exécuteurs tools
│       └── dynamic_tool_executor.py    # Exécution tools dynamiques
│
├── templates/                      # Templates Jinja2
│   ├── base.html                   # Layout principal
│   ├── agents/                     # Pages agents voix
│   ├── text_agents/                # Pages agents texte
│   ├── azure-avatar/               # Pages avatar
│   ├── unified/                    # Création unifiée
│   ├── campaigns/                  # Pages campagnes
│   ├── RAG/                        # Pages RAG/AXIOM
│   ├── tools/                      # Pages tools
│   ├── personal_voice/             # Clonage vocal
│   ├── prompt_builder/             # Prompt builder
│   └── errors/                     # Pages erreur
│
├── static/                         # Assets statiques
│   ├── css/                        # Feuilles de style
│   ├── js/                         # JavaScript client
│   │   ├── voice_live_session.js   # Client WebSocket voix (~55k)
│   │   ├── voice_session.js        # Session voix legacy (~63k)
│   │   ├── agent_voice_session.js  # Session voix agent avec AudioSession (~29k)
│   │   ├── avatar_immersive.js     # Client avatar WebRTC (~64k)
│   │   ├── personal_voice.js       # Clonage vocal UI (~76k)
│   │   ├── prompt_builder.js       # Prompt builder UI (~37k)
│   │   ├── flow_builder.js         # Flow builder (~34k)
│   │   ├── crawl.js                # Crawler UI (~23k)
│   │   ├── upload_file.js          # Upload documents (~22k)
│   │   └── tools/                  # JS gestion tools
│   ├── images/                     # Images, logos
│   ├── fonts/                      # Polices
│   └── data/                       # Données statiques
│
├── translations/                   # Internationalisation
│   ├── fr/                         # Français
│   ├── en/                         # English
│   └── es/                         # Español
│
├── scripts/                        # Scripts utilitaires
│   └── doc_generator/              # Génération documentation
│
└── docs/                           # Documentation
    └── WAKAVOICE_DOCUMENTATION_COMPLETE.html

13.3 Infrastructure Cloud Azure

flowchart TB subgraph Client["Client (Navigateur)"] UI[Interface Web] WS[WebSocket Client] WebRTC[WebRTC Client] end subgraph Azure["Azure Cloud"] subgraph AppService["Azure App Service"] Flask[Flask Application] Gunicorn[Gunicorn Workers] end subgraph Cognitive["Azure Cognitive Services"] OpenAI[Azure OpenAI
GPT-4o / GPT-5 / Realtime] Speech[Azure Speech
STT / TTS / Personal Voice] Avatar[Azure Avatar Service
Video Rendering] end subgraph Data["Azure Data Services"] Cosmos[(Cosmos DB
NoSQL)] Search[(Azure AI Search
Vector Index)] Blob[(Blob Storage
Documents / Media)] end end UI --> Flask WS --> Flask WebRTC --> Avatar Flask --> OpenAI Flask --> Speech Flask --> Avatar Flask --> Cosmos Flask --> Search Flask --> Blob style Client fill:#E3F2FD,stroke:#1976D2 style Azure fill:#FFF3E0,stroke:#F57C00 style AppService fill:#E8F5E9,stroke:#4CAF50 style Cognitive fill:#FCE4EC,stroke:#E91E63 style Data fill:#F3E5F5,stroke:#9C27B0

13.4 Services Azure Utilisés

ServiceUsageRégionSKU
Azure App Service Hébergement application Flask France Central P1v3 (Production)
Azure Cosmos DB Base de données NoSQL France Central Serverless
Azure OpenAI Modèles LLM (GPT-4o, GPT-5, Realtime) Sweden Central / West US 2 S0
Azure Speech Services STT, TTS, Personal Voice West Europe S0
Azure Avatar Service Rendu avatar vidéo temps réel West US 2 Standard
Azure AI Search Indexation et recherche vectorielle RAG France Central Standard
Azure Blob Storage Documents, audio, avatars France Central Hot
Azure Key Vault Gestion des secrets France Central Standard

13.5 Containers Cosmos DB

ContainerPartition KeyDescription
AgentConfigurations/idAgents voix (modèle, voix, tools, instructions)
TextAgentConfigurations/idAgents texte (chatbots)
AvatarConfigurations/idAgents avatar (vidéo/photo)
UnifiedAgents/idAgents créés via interface unifiée
ToolsConfigurations/idOutils dynamiques (OpenAPI, REST, Python, RAG)
VoiceSessions/agent_idHistorique sessions voix
TextSessions/agent_idHistorique sessions texte
Campaigns/idCampagnes d'appels sortants
RAGProjects/idProjets RAG (configuration indexation)
Documents/project_idMétadonnées documents indexés
PersonalVoices/idVoix personnelles clonées
AvatarPreferences/user_idPréférences avatar utilisateur

13.6 Flux de Données

13.6.1 Session Voix Temps Réel

sequenceDiagram participant Browser participant Flask participant Azure_OpenAI as Azure OpenAI
Realtime API participant Tools Browser->>Flask: WebSocket Connect Flask->>Azure_OpenAI: WebSocket Connect (proxy) Azure_OpenAI-->>Flask: session.created loop Conversation Browser->>Flask: audio.data (PCM16) Flask->>Azure_OpenAI: audio.data Azure_OpenAI-->>Flask: transcript.user Azure_OpenAI-->>Flask: response.audio.delta Flask-->>Browser: audio.delta opt Tool Call Azure_OpenAI-->>Flask: tool.call Flask->>Tools: Execute tool Tools-->>Flask: Result Flask->>Azure_OpenAI: tool.result end end Browser->>Flask: session.end Flask->>Azure_OpenAI: WebSocket Close

13.6.2 Indexation RAG

sequenceDiagram participant User participant Flask participant Blob as Azure Blob participant Search as Azure AI Search participant OpenAI as Azure OpenAI User->>Flask: Upload document Flask->>Blob: Store file Flask->>Flask: Extract text (PDF/DOCX) Flask->>Flask: Chunk text (512 tokens) Flask->>OpenAI: Generate embeddings OpenAI-->>Flask: Vectors Flask->>Search: Index chunks + vectors Search-->>Flask: Indexation complete Flask-->>User: Success

13.7 Variables d'Environnement

# ===== Azure OpenAI =====
AZURE_OPENAI_ENDPOINT=https://<resource>.openai.azure.com/
AZURE_OPENAI_KEY=<api-key>
AZURE_OPENAI_API_VERSION=2025-10-01

# ===== Azure Speech Services =====
AZURE_SPEECH_KEY=<api-key>
AZURE_SPEECH_REGION=westeurope

# ===== Azure Voice Live (Realtime API) =====
VOICE_LIVE_ENDPOINT=https://<resource>.openai.azure.com/
VOICE_LIVE_KEY=<api-key>
VOICE_LIVE_REGION=swedencentral

# ===== Azure Avatar Service =====
AZURE_AVATAR_ENDPOINT=https://westus2.api.cognitive.microsoft.com/
AZURE_AVATAR_KEY=<api-key>
AZURE_AVATAR_REGION=westus2

# ===== Azure Cosmos DB =====
COSMOS_URI=https://<account>.documents.azure.com:443/
COSMOS_KEY=<primary-key>
COSMOS_DATABASE_NAME=ConversationsDB

# ===== Azure AI Search =====
AZURE_SEARCH_ENDPOINT=https://<service>.search.windows.net
AZURE_SEARCH_KEY=<admin-key>
AZURE_SEARCH_INDEX=rag-index

# ===== Azure Blob Storage =====
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;...
AZURE_STORAGE_CONTAINER=documents

# ===== Azure Communication Services (Email) =====
AZURE_COMMUNICATION_EMAIL_CONNECTION_STRING=endpoint=https://<resource>.communication.azure.com/;accesskey=<key>
AZURE_COMMUNICATION_EMAIL_SENDER=DoNotReply@<domain>.azurecomm.net

# ===== Azure OpenAI Summary (Génération résumés) =====
AZURE_OPENAI_SUMMARY_ENDPOINT=https://<resource>.openai.azure.com/
AZURE_OPENAI_SUMMARY_KEY=<api-key>
AZURE_OPENAI_SUMMARY_DEPLOYMENT=gpt-5-mini
AZURE_OPENAI_SUMMARY_API_VERSION=2025-01-01-preview

# ===== Azure Text Analytics (Analyse sentiment) =====
TEXT_ANALYTICS_ENDPOINT=https://<resource>.cognitiveservices.azure.com/
TEXT_ANALYTICS_KEY=<api-key>

# ===== Application =====
FLASK_SECRET_KEY=<random-secret>
FLASK_ENV=production

13.8 Déploiement

13.8.1 Prérequis

13.8.2 Installation Locale

# Cloner le repository
git clone https://github.com/your-org/wakavoice.git
cd wakavoice

# Créer environnement virtuel
python -m venv .venv
source .venv/bin/activate  # Linux/Mac
.venv\Scripts\activate     # Windows

# Installer dépendances
pip install -r requirements.txt

# Configurer variables d'environnement
cp .env.example .env
# Éditer .env avec vos clés Azure

# Lancer l'application
flask run --host=0.0.0.0 --port=5000

13.8.3 Déploiement Azure App Service

# Login Azure
az login

# Créer resource group
az group create --name rg-wakavoice --location francecentral

# Créer App Service Plan
az appservice plan create \
    --name plan-wakavoice \
    --resource-group rg-wakavoice \
    --sku P1V3 \
    --is-linux

# Créer Web App
az webapp create \
    --name wakavoice-app \
    --resource-group rg-wakavoice \
    --plan plan-wakavoice \
    --runtime "PYTHON:3.11"

# Configurer variables d'environnement
az webapp config appsettings set \
    --name wakavoice-app \
    --resource-group rg-wakavoice \
    --settings @appsettings.json

# Déployer le code
az webapp deployment source config-local-git \
    --name wakavoice-app \
    --resource-group rg-wakavoice

git remote add azure <git-url>
git push azure master

13.9 Télécharger le Code Source

Accès au Repository

Le code source complet de Waka Voice est hébergé sur Azure DevOps. Cliquez sur le bouton ci-dessous pour accéder au repository et télécharger le code.

Télécharger le Code depuis Azure DevOps
MéthodeCommande / Action
Git Clone (HTTPS) git clone https://dev.azure.com/your-org/wakavoice/_git/wakavoice
Git Clone (SSH) git clone git@ssh.dev.azure.com:v3/your-org/wakavoice/wakavoice
Download ZIP Azure DevOps → Repository → "..." → Download as ZIP

Chapitre 14: Architecture Avancée

Diagrammes détaillés des flux système

14.1 Flux Complet Session Avatar (WebRTC + ICE)

Ce diagramme illustre le flux complet d'établissement d'une session avatar avec négociation WebRTC, signaling ICE et streaming vidéo/audio.

sequenceDiagram autonumber participant Browser as 🖥️ Navigateur participant Flask as 🐍 Flask Server participant Azure_Avatar as 🎭 Azure Avatar Service participant TURN as 🔄 TURN Server participant OpenAI as 🤖 Azure OpenAI Note over Browser,OpenAI: Phase 1: Initialisation Session Browser->>Flask: POST /azure-avatar/session/start Flask->>Azure_Avatar: Create Avatar Session Azure_Avatar-->>Flask: session_id, ice_servers[] Flask-->>Browser: {session_id, ice_config} Note over Browser,TURN: Phase 2: Négociation WebRTC Browser->>Browser: createPeerConnection(ice_servers) Browser->>Browser: getUserMedia(audio: true) Browser->>Browser: addTrack(audioTrack) Browser->>Browser: createOffer() Browser->>Flask: WS: {type: "offer", sdp: "..."} Flask->>Azure_Avatar: Forward SDP Offer Azure_Avatar-->>Flask: SDP Answer Flask-->>Browser: WS: {type: "answer", sdp: "..."} Browser->>Browser: setRemoteDescription(answer) Note over Browser,TURN: Phase 3: ICE Candidate Exchange loop ICE Gathering Browser->>Flask: WS: {type: "ice", candidate: "..."} Flask->>Azure_Avatar: Forward ICE Candidate Azure_Avatar-->>Flask: Remote ICE Candidate Flask-->>Browser: WS: {type: "ice", candidate: "..."} end Browser->>TURN: STUN Binding Request TURN-->>Browser: STUN Binding Response (srflx candidate) Browser->>TURN: TURN Allocate Request TURN-->>Browser: TURN Allocate Response (relay candidate) Note over Browser,OpenAI: Phase 4: Streaming Actif Browser->>Azure_Avatar: 🎤 Audio Stream (WebRTC) Azure_Avatar->>OpenAI: Transcription + LLM OpenAI-->>Azure_Avatar: Response Text Azure_Avatar->>Azure_Avatar: TTS + Lip Sync Generation Azure_Avatar-->>Browser: 📹 Video Stream (WebRTC) Azure_Avatar-->>Browser: 🔊 Audio Stream (WebRTC) Note over Browser,OpenAI: Phase 5: Fermeture Browser->>Flask: WS: {type: "end_session"} Flask->>Azure_Avatar: Close Session Azure_Avatar-->>Flask: Session Closed Browser->>Browser: peerConnection.close()

Composants ICE/TURN

ComposantRôlePorts
STUN ServerDécouverte IP publique (NAT traversal)UDP 3478
TURN ServerRelais média si connexion directe impossibleUDP/TCP 3478, 5349 (TLS)
ICE Candidateshost, srflx (server reflexive), relayDynamiques

14.2 Pipeline RAG Détaillé (Chunking → Embedding → Search)

Architecture complète du système RAG (Retrieval-Augmented Generation) depuis l'ingestion des documents jusqu'à la génération de réponses.

flowchart TB subgraph Ingestion["📥 Phase 1: Ingestion"] A[📄 Document Upload] --> B{Type?} B -->|PDF| C[PyPDF2 Extract] B -->|DOCX| D[python-docx Extract] B -->|HTML| E[BeautifulSoup Parse] B -->|TXT| F[Direct Read] C --> G[Raw Text] D --> G E --> G F --> G end subgraph Processing["⚙️ Phase 2: Processing"] G --> H[Text Cleaning] H --> I[Sentence Tokenization] I --> J[Chunking Strategy] J --> K["Chunk 1
(512 tokens)"] J --> L["Chunk 2
(512 tokens)"] J --> M["Chunk N
(512 tokens)"] K --> N[Overlap 50 tokens] L --> N M --> N end subgraph Embedding["🧠 Phase 3: Embedding"] N --> O[Azure OpenAI
text-embedding-ada-002] O --> P["Vector 1
[1536 dims]"] O --> Q["Vector 2
[1536 dims]"] O --> R["Vector N
[1536 dims]"] end subgraph Storage["💾 Phase 4: Storage"] P --> S[(Azure AI Search
Vector Index)] Q --> S R --> S K --> T[(Azure Blob
Original Docs)] L --> T M --> T S --> U[(Cosmos DB
Metadata)] end subgraph Query["🔍 Phase 5: Query"] V[User Question] --> W[Query Embedding] W --> X[Azure OpenAI
text-embedding-ada-002] X --> Y["Query Vector
[1536 dims]"] Y --> Z[Vector Similarity Search] Z --> S S --> AA[Top-K Chunks
k=5, threshold=0.7] end subgraph Generation["💬 Phase 6: Generation"] AA --> AB[Context Assembly] V --> AB AB --> AC[Prompt Template] AC --> AD[Azure OpenAI
GPT-4o / GPT-5] AD --> AE[Response + Citations] end style Ingestion fill:#E3F2FD,stroke:#1976D2 style Processing fill:#FFF3E0,stroke:#F57C00 style Embedding fill:#FCE4EC,stroke:#E91E63 style Storage fill:#F3E5F5,stroke:#9C27B0 style Query fill:#E8F5E9,stroke:#4CAF50 style Generation fill:#FFFDE7,stroke:#FBC02D

Paramètres de Chunking

ParamètreValeurDescription
Chunk Size512 tokensTaille optimale pour contexte LLM
Chunk Overlap50 tokensContinuité sémantique entre chunks
Embedding Modeltext-embedding-ada-0021536 dimensions, optimisé recherche
Similarity MetricCosineDistance angulaire entre vecteurs
Top-K5Nombre de chunks retournés
Score Threshold0.7Score minimum de similarité

14.3 Architecture Multi-Tenant

Waka Voice supporte une architecture multi-tenant où chaque organisation dispose de ses propres agents, données et configurations isolées.

flowchart TB subgraph Clients["🌐 Clients"] C1[Tenant A
Entreprise 1] C2[Tenant B
Entreprise 2] C3[Tenant C
Entreprise 3] end subgraph Gateway["🚪 API Gateway"] LB[Load Balancer
Azure Front Door] Auth[Authentication
JWT + Tenant ID] end subgraph App["⚙️ Application Layer"] direction TB F1[Flask Instance 1] F2[Flask Instance 2] F3[Flask Instance N] F1 --> TM[Tenant Middleware
Isolation Context] F2 --> TM F3 --> TM end subgraph Data["💾 Data Layer (Isolated)"] subgraph CosmosDB["Cosmos DB"] DB1[(Tenant A Data
Partition: tenant_a)] DB2[(Tenant B Data
Partition: tenant_b)] DB3[(Tenant C Data
Partition: tenant_c)] end subgraph BlobStorage["Blob Storage"] B1[📁 tenant-a/] B2[📁 tenant-b/] B3[📁 tenant-c/] end subgraph SearchIndex["AI Search"] S1[Index: tenant-a-rag] S2[Index: tenant-b-rag] S3[Index: tenant-c-rag] end end subgraph Azure["☁️ Azure Services (Shared)"] OpenAI[Azure OpenAI
Shared Pool] Speech[Azure Speech
Shared Pool] Avatar[Azure Avatar
Shared Pool] end C1 --> LB C2 --> LB C3 --> LB LB --> Auth Auth --> F1 Auth --> F2 Auth --> F3 TM --> DB1 TM --> DB2 TM --> DB3 TM --> B1 TM --> B2 TM --> B3 TM --> S1 TM --> S2 TM --> S3 F1 --> OpenAI F2 --> Speech F3 --> Avatar style Clients fill:#E3F2FD,stroke:#1976D2 style Gateway fill:#FFF3E0,stroke:#F57C00 style App fill:#E8F5E9,stroke:#4CAF50 style Data fill:#F3E5F5,stroke:#9C27B0 style Azure fill:#FFFDE7,stroke:#FBC02D

Stratégie d'Isolation

RessourceStratégieIsolation
Cosmos DBPartition Key = tenant_idDonnées logiquement isolées
Blob StorageContainer par tenantRépertoires séparés
AI SearchIndex par tenantIndex dédiés
Azure OpenAIPool partagé + quotasRate limiting par tenant
Sessionstenant_id dans sessionContexte isolé
LogsTag tenant_idFiltrage par tenant

Schéma Cosmos DB Multi-Tenant

{
    "id": "agent-uuid-123",
    "tenant_id": "tenant_a",           // Partition Key
    "type": "VoiceAgent",
    "name": "Agent Commercial",
    "created_by": "user@tenant-a.com",
    "config": {
        "model_id": "gpt-4o-realtime",
        "voice": "fr-FR-DeniseNeural",
        "tools": ["weather", "email"]
    },
    "_tenant_isolated": true,          // Flag isolation
    "_ts": 1703980800
}

Chapitre 15: Ressources Azure

Services cloud utilisés et leurs cas d'usage

Waka Voice s'appuie sur un ensemble de services Azure pour offrir une plateforme d'agents conversationnels performante et scalable. Ce chapitre liste toutes les ressources utilisées avec leurs cas d'usage spécifiques.

15.1 Vue d'Ensemble des Ressources

flowchart TB subgraph COMPUTE["Compute"] APP[Azure App Service] FUNC[Azure Functions] end subgraph AI["Intelligence Artificielle"] AOAI[Azure OpenAI] SPEECH[Azure Speech Services] AVATAR[Azure Avatar Service] SEARCH[Azure AI Search] end subgraph DATA["Donnees"] COSMOS[(Cosmos DB)] BLOB[(Blob Storage)] end subgraph NETWORK["Reseau"] CDN[Azure CDN] DNS[Azure DNS] end APP --> AOAI & SPEECH & AVATAR APP --> COSMOS & BLOB FUNC --> SEARCH CDN --> APP style COMPUTE fill:#E3F2FD,stroke:#1565C0 style AI fill:#F3E5F5,stroke:#7B1FA2 style DATA fill:#E8F5E9,stroke:#2E7D32 style NETWORK fill:#FFF3E0,stroke:#E65100

15.2 Ressources de Calcul

Ressource Description Cas d'Usage dans Waka Voice Plan Recommande
Azure App Service Hebergement d'applications web PaaS avec auto-scaling
  • Hebergement de l'application Flask principale
  • Gestion des WebSockets pour sessions temps reel
  • Serveur de l'interface utilisateur
  • API REST pour les operations CRUD
P2v2 / P3v3
Azure Functions Compute serverless evenementiel
  • Traitement asynchrone des documents RAG
  • Chunking et embedding des fichiers uploades
  • Webhooks pour integrations externes
  • Taches planifiees (nettoyage, stats)
Consumption / Premium

15.3 Ressources IA & Cognitive

Ressource Description Cas d'Usage dans Waka Voice Modeles Utilises
Azure OpenAI Acces aux modeles GPT, embeddings et modeles multimodaux
  • Agents Texte : Generation de reponses conversationnelles
  • Agents Voix : Modeles realtime pour voix bidirectionnelle
  • RAG : Embeddings pour vectorisation des documents
  • Tools : Function calling pour execution d'actions
  • Enrichissement : Generation de descriptions d'outils
GPT-4o
GPT-4o-mini
GPT-4o-realtime
text-embedding-3-large
Azure Speech Services Reconnaissance vocale (STT) et synthese vocale (TTS)
  • Speech-to-Text : Transcription temps reel des utilisateurs
  • Text-to-Speech : Voix neurales haute qualite (400+ voix)
  • Personal Voice : Clonage vocal personnalise
  • Voice Live : API conversationnelle temps reel
Neural voices
HD voices
Personal Voice
Azure Avatar Service Avatars video animes avec lip-sync
  • Agents Avatar : Representation visuelle des agents
  • Lip-sync : Synchronisation levres/audio temps reel
  • Visemes : Donnees de position des levres
  • WebRTC : Streaming video basse latence
Lisa
Harry
Custom avatars
Azure AI Search Recherche vectorielle et semantique
  • RAG : Recherche de contexte dans la base documentaire
  • Indexation : Stockage des embeddings vectoriels
  • Recherche hybride : Combinaison keyword + semantique
  • Filtrage : Par projet, date, type de document
Basic / Standard
Vector search

15.4 Ressources de Donnees

Ressource Description Cas d'Usage dans Waka Voice Configuration
Azure Cosmos DB Base NoSQL distribuee globalement
  • Agents : Configuration des agents (voix, texte, avatar)
  • Sessions : Historique des conversations
  • Tools : Definitions et configurations des outils
  • Campagnes : Donnees des campagnes d'appels
  • Personal Voice : Metadonnees des voix clonees
  • Metriques : Statistiques d'utilisation
Serverless
400 RU/s min
Multi-region
Azure Blob Storage Stockage objet pour fichiers volumineux
  • Documents RAG : PDF, DOCX, fichiers uploades
  • Audio Personal Voice : Echantillons vocaux (16kHz)
  • Enregistrements : Audio des sessions (optionnel)
  • Assets statiques : Images, CSS, JS
Hot tier
LRS / GRS
100 GB+

15.5 Ressources Reseau & Securite

Ressource Description Cas d'Usage dans Waka Voice
Azure CDN Reseau de distribution de contenu Cache des assets statiques, reduction de latence globale, protection DDoS
Azure DNS Gestion des noms de domaine Resolution DNS pour domaines personnalises, certificats SSL/TLS
Azure Key Vault Gestion securisee des secrets Stockage des cles API, connexion strings, certificats
Azure Monitor Monitoring et alerting Metriques applicatives, logs, alertes de performance, dashboards

15.6 Recapitulatif des Couts par Ressource

pie showData title "Repartition Couts Azure mensuelle" "Azure OpenAI" : 45 "App Service" : 20 "Cosmos DB" : 15 "Speech Services" : 10 "Blob Storage" : 5 "Autres" : 5
Ressource Unite de Facturation Prix Indicatif Estimation Mensuelle (PME)
Azure OpenAI Tokens (entree/sortie) $0.005-$0.06 / 1K tokens ~600-800 EUR
App Service P2v2 Instance / heure ~0.25 EUR / heure ~180 EUR
Cosmos DB RU/s + stockage ~0.008 EUR / 100 RU/h ~100-150 EUR
Speech Services Caracteres / heures audio $4 / 1M caracteres TTS ~80-120 EUR
AI Search Instance + stockage ~70 EUR / mois (Basic) ~70 EUR
Blob Storage GB stocke + transactions ~0.02 EUR / GB ~20-30 EUR
TOTAL ESTIME (PME - 200 sessions/heure) ~1 100 - 1 400 EUR/mois

Chapitre 16: Modeles & Comparaison

Modeles IA utilises dans Waka Voice

Ce chapitre presente les modeles IA disponibles dans Waka Voice, organises par famille et par cas d'usage. L'application supporte plusieurs generations de modeles pour repondre a differents besoins de performance et de cout.

16.1 Modeles Texte (Chat/LLM)

16.1.1 Famille F3 - GPT-5 (Derniere Generation)

Modeles de Derniere Generation

La famille GPT-5 represente les modeles les plus avances disponibles via Azure AI Foundry, offrant des capacites de raisonnement superieures et un support multimodal etendu.

Modele Description Cas d'Usage Disponibilite
gpt-5.2-chat Derniere version GPT-5.2, modele par defaut pour agents texte Agents conversationnels premium, raisonnement complexe Azure AI Foundry
gpt-5-chat Version stable GPT-5 Production, conversations longues Azure AI Foundry
gpt-5-mini Version allegee GPT-5 Volume eleve, cout optimise Azure OpenAI (defaut)
gpt-5-nano Version ultra-legere Prototypage, tests rapides Azure AI Foundry

16.1.2 Famille F2 - GPT-4.x (Generation Precedente)

Modele Description Cas d'Usage Disponibilite
gpt-4o GPT-4o stable, multimodal (texte, image, audio) Production, analyse multimodale Azure OpenAI
gpt-4o-mini Version allegee GPT-4o Chatbots, volume eleve Azure OpenAI
gpt-4.1 GPT-4.1 ameliore Raisonnement avance Azure OpenAI
gpt-4.1-mini Version allegee GPT-4.1 Equilibre qualite/cout Azure OpenAI
phi4-mini Modele Microsoft Phi-4 compact Edge computing, latence ultra-basse Azure OpenAI

16.1.3 Modeles Alternatifs (Azure AI Foundry)

Modele Fournisseur Description Cas d'Usage
claude-opus-4.5 Anthropic Alternative a GPT-5.2 pour agents texte Raisonnement, analyse longue
DeepSeek-V3.1 DeepSeek Modele open-source haute performance Inference economique

16.2 Azure Voice Live API

Voice Live - API Unifiee pour Agents Voix

L'API Voice Live de Microsoft Azure AI Foundry simplifie la creation d'agents vocaux en unifiant STT, LLM et TTS dans une seule interface WebSocket. Elle supporte trois familles de modeles (F1, F2, F3) avec des modes audio differents.

16.2.1 Famille F1 - Audio Natif (Realtime)

Les modeles F1 traitent l'audio nativement sans pipeline STT/TTS separe :

Modele Tier Mode Audio Voix Supportees Latence E2E
gpt-realtime Pro Natif OpenAI + Azure TTS ~400 ms
gpt-realtime-mini Basic Natif OpenAI + Azure TTS ~300 ms
phi4-mm-realtime Lite Natif OpenAI + Azure TTS ~250 ms

16.2.2 Famille F2 - TTS Real-time (GPT-4.x)

Les modeles F2 utilisent le mode TTS Real-time via Azure Speech Services :

Modele Tier Mode Audio Voix Supportees Latence E2E
gpt-4o Pro TTS Real-time Azure TTS (600+ voix) ~450 ms
gpt-4o-mini Basic TTS Real-time Azure TTS (600+ voix) ~350 ms
gpt-4.1 Pro TTS Real-time Azure TTS (600+ voix) ~450 ms
gpt-4.1-mini Basic TTS Real-time Azure TTS (600+ voix) ~350 ms
phi4-mini Lite TTS Real-time Azure TTS (600+ voix) ~300 ms

16.2.3 Famille F3 - TTS Real-time (GPT-5)

Les modeles F3 (derniere generation) utilisent egalement le mode TTS Real-time :

Modele Tier Mode Audio Voix Supportees Latence E2E
gpt-5 Pro TTS Real-time Azure TTS (600+ voix) ~400 ms
gpt-5-chat Pro TTS Real-time Azure TTS (600+ voix) ~400 ms
gpt-5-mini Basic TTS Real-time Azure TTS (600+ voix) ~300 ms
gpt-5-nano Lite TTS Real-time Azure TTS (600+ voix) ~250 ms

16.2.4 Comparaison des Modes Audio

Caracteristique F1 - Audio Natif F2/F3 - TTS Real-time
Pipeline Audio → LLM → Audio (natif) Audio → STT → LLM → TTS → Audio
Latence Plus faible (~250-400 ms) Legerement plus elevee (~300-450 ms)
Voix OpenAI alloy, ash, ballad, coral, echo, sage, shimmer, verse Non disponibles
Voix Azure TTS Supportees (option) 600+ voix, 150+ langues, Neural HD
Personal Voice Non disponible Supportee (clonage vocal)
Phrase List Non supportee Supportee (amelioration STT)
VAD Avance server_vad, semantic_vad azure_semantic_vad, multilingual_semantic_vad

16.2.5 Voix Natives OpenAI (F1 uniquement)

Les modeles F1 incluent des voix synthetiques natives de haute qualite :

Voix Genre Style Recommandation
alloy Neutre Equilibree, professionnelle Usage general, service client
ash Masculin Chaleureuse, accueillante Support, assistance
ballad Masculin Melodique, apaisante Narration, bien-etre
coral Feminin Claire, articulee Information, tutoriels
echo Masculin Profonde, autoritaire Annonces, IVR
sage Feminin Calme, reflechie Conseils, coaching
shimmer Feminin Brillante, energique Marketing, ventes
verse Masculin Expressive, dynamique Divertissement, gaming

16.2.6 Tiers de Tarification Voice Live

Tier Modeles Inclus Cout Relatif Cas d'Usage
Pro gpt-realtime, gpt-4o, gpt-4.1, gpt-5, gpt-5-chat Eleve Production premium, raisonnement complexe
Basic gpt-realtime-mini, gpt-4o-mini, gpt-4.1-mini, gpt-5-mini Moyen Production standard, volume eleve
Lite gpt-5-nano, phi4-mm-realtime, phi4-mini Faible Prototypage, tests, edge computing

16.2.7 Prix Unitaires par Token (Voice Live)

Tarification Voice Live - Mise à jour Janvier 2026

Les prix sont exprimés en USD par token. Le calcul des coûts est effectué automatiquement par le Session Watchdog dans utils/session_watchdog.py.

Type de Token Pro Standard Lite
Input Text Token 0,00000055 0,000000066 0,000000011
Input Audio Token 0,00000044 0,0000015 0,0000015
Output Text Token 0,0000022 0,00000264 0,00000044
Output Audio Token 0,00000055 0,0000033 0,0000033

Modèles par Tier

16.2.8 Prix Unitaires par Token (Modèles Texte/Chat)

Modèle Prompt Token Cached Token Completion Token
GPT-5.2 0,0000000175 0,0000000175 0,0000014
Claude Opus 4.5 0,00000005 0,00000005 0,0000025

16.2.9 Avantages Tarifaires

Programme Réduction Description
ISV Advantage 33% du coût standard Programme partenaire ISV Microsoft Azure
Provisioned Throughput 50% du coût standard Débit réservé avec engagement

16.3 Modeles TTS/STT (Azure Speech)

16.3.1 Modeles de Transcription (STT)

Modele Service Description Cas d'Usage
whisper-1 Azure OpenAI Transcription haute precision Analyse post-conversation
gpt-4o-transcribe Azure OpenAI Transcription via GPT-4o Transcription enrichie avec contexte
azure-speech Azure Speech Services STT temps reel Azure Pipeline Voice Live

16.3.2 Voix Personal Voice (TTS Custom)

Personal Voice

Waka Voice supporte le clonage vocal via Azure Personal Voice, permettant de creer des voix personnalisees a partir d'echantillons audio.

Voix Type Qualite Description
DragonLatestNeural Neural Standard Excellente Voix Dragon standard pour production
PhoenixLatestNeural Neural Expressif Premium Voix Phoenix avec emotions avancees
DragonHDLatestNeural Neural HD Ultra Premium Dragon haute definition pour experiences premium

16.4 Modeles Embedding (RAG)

Modele Dimensions Description Cas d'Usage
text-embedding-3-small 1536 Modele d'embedding par defaut Vectorisation documents, RAG, recherche semantique

16.5 Configuration par Famille (Voice Live)

Famille Mode Audio Modeles Inclus Types de Voix Max Tokens
F1 (Realtime) Audio Natif gpt-realtime, gpt-realtime-mini, phi4-mm-realtime OpenAI, Azure Standard, Azure Custom 4096
F2 (GPT-4.x) TTS Real-time gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, phi4-mini Azure Standard, Azure Custom 2100
F3 (GPT-5) TTS Real-time gpt-5, gpt-5-chat, gpt-5-mini, gpt-5-nano Azure Standard, Azure Custom 16000

16.5.1 Fonctionnalites par Famille

Fonctionnalite F1 F2 F3
Transcription whisper-1, gpt-4o-transcribe azure-speech, whisper-1, gpt-4o-transcribe azure-speech
Phrase List (STT) Non Oui Partiel (phi4-mini: Oui)
VAD Types server_vad, semantic_vad, azure_semantic_vad server_vad, azure_semantic_vad, multilingual server_vad, azure_semantic_vad, multilingual
End of Utterance Detection Non Oui Oui
Temperature 0.6 - 1.2 (defaut: 0.8) 0.6 - 1.2 (defaut: 0.8) 0.6 - 1.2 (defaut: 0.8)
Personal Voice Non Oui Oui
Recommandations Voice Live

Latence minimale : Utilisez F1 avec gpt-realtime-mini (~300ms).
Voix personnalisee : Utilisez F2/F3 avec Azure Personal Voice.
Multilingue : Preferez F2/F3 avec azure_multilingual_semantic_vad.
Production standard : Utilisez F2 avec gpt-4o-mini pour equilibre qualite/cout.
Raisonnement complexe : Utilisez F3 avec gpt-5-mini ou gpt-5-chat.

Chapitre 17: Changelog et Perspectives

Historique du projet et feuille de route 2026

Cette section retrace l'évolution du projet Waka Voice depuis son lancement en octobre 2025, détaille les jalons techniques majeurs et présente la feuille de route pour 2026.

15.1 Chronologie du Projet

flowchart LR subgraph OCT["🚀 Oct 2025"] O1[POC Initial] O2[Azure OpenAI Realtime] end subgraph NOV["⚡ Nov 2025"] N1[Azure Voice Live] N2[RAG + Multi-Agents] end subgraph DEC["🛠️ Dec 2025"] D1[Tools & Functions] D2[Personal Voice] end subgraph JAN["📦 Jan 2026"] J1[Core Multi-Projet] J2[Multi-Client/Région] end subgraph FEB["🔐 Fev 2026"] F1[Authentification] F2[Multi-Tenant] end subgraph MAR["📞 Mar 2026"] M1[Dialer Multicanal] M2[7 Canaux] end OCT --> NOV --> DEC --> JAN --> FEB --> MAR style OCT fill:#FFCDD2,stroke:#C62828 style NOV fill:#FFE0B2,stroke:#E65100 style DEC fill:#FFF9C4,stroke:#F9A825 style JAN fill:#C8E6C9,stroke:#2E7D32 style FEB fill:#BBDEFB,stroke:#1565C0 style MAR fill:#E1BEE7,stroke:#7B1FA2

15.2 Historique Détaillé

Période Jalons & Réalisations Technologies
Octobre 2025
Démarrage
  • Création du POC initial - Proof of Concept minimaliste
  • Architecture mono-projet sans personnalisation
  • Pas de support Tools ni Function Calls
  • Utilisation de l'API Azure OpenAI Realtime directement
  • Version très légère pour validation du concept
Azure OpenAI Realtime API Flask
Novembre 2025
Migration
  • Migration vers Azure Voice Live - Réduction de coût de 60%
  • Ajout de multiples options de personnalisation
  • Intégration du module RAG - Retrieval-Augmented Generation
  • Introduction du concept Multi-Agents
  • Support de plusieurs langues et voix Azure
Azure Voice Live Azure AI Search Cosmos DB
Décembre 2025
Enrichissement
  • Intégration complète des Tools - 4 types supportés
  • Support des Function Calls dynamiques
  • Module Personal Voice (clonage vocal)
  • Agents Avatar avec WebRTC et lip-sync
  • Documentation technique exhaustive
Azure Functions Azure Avatar WebRTC
Impact Économique - Migration Azure Voice Live

La migration d'Azure OpenAI Realtime API vers Azure Voice Live a permis une réduction des coûts de 60% tout en offrant plus de fonctionnalités : meilleure qualité audio, latence réduite, et personnalisation avancée des voix.

15.3 Feuille de Route 2026

flowchart LR subgraph Q1["Q1 2026"] J[🎯 Janvier
Core Multi-Projet] F[🔐 Février
Auth & Multi-Tenant] M[📞 Mars
Dialer Multicanal] end J --> F --> M style J fill:#E3F2FD,stroke:#1976D2 style F fill:#E8F5E9,stroke:#4CAF50 style M fill:#FFF3E0,stroke:#FF9800

15.3.1 Janvier 2026 : Core Multi-Projet / Client / Région

Objectifs

  • Architecture Core - Création d'un noyau modulaire réutilisable
  • Multi-Projet - Support de plusieurs projets indépendants par instance
  • Multi-Client - Isolation des données par client/organisation
  • Multi-Région - Déploiement géographique pour optimisation latence
  • Configuration centralisée - Gestion unifiée des paramètres

15.3.2 Février 2026 : Authentification & Multi-Tenant

Objectifs

  • Système d'authentification - Login/Register/SSO
  • Gestion des rôles - Admin, Manager, User, Viewer
  • Multi-Tenant complet - Isolation totale des données par tenant
  • Quotas & Billing - Suivi de consommation par tenant
  • Audit Trail - Journalisation des actions utilisateurs

15.3.3 Mars 2026 : Dialer Multicanal

Objectifs

Création d'un outil de type dialer multicanal permettant d'atteindre les prospects/clients via différents canaux de communication avec des options de traitement automatisé.

Canaux Supportés
Facebook Instagram LinkedIn X (Twitter) WhatsApp Phone SMS
Modes de Traitement
ModeDescriptionCas d'usage
Prédictif Appels automatiques basés sur la disponibilité des agents et prédictions de réponse Campagnes outbound massives, prospection commerciale
Progressif Appels séquentiels avec préparation agent avant chaque contact Suivi client personnalisé, relances qualifiées

Watchdog - Surveillance Automatisée

Le Watchdog est un composant critique de Waka Voice qui assure la surveillance automatisée des sessions vocales, la gestion des statuts et le calcul précis des coûts d'utilisation.

14.1 Clôture de Session et Gestion des Statuts

Description

Le Watchdog surveille en permanence les sessions (texte, voix, avatar) pour détecter les sessions inactives et les traiter automatiquement. Cette surveillance s'exécute toutes les 10 secondes.

Cycle de Vie des Sessions

flowchart TD subgraph INIT["INITIALISATION"] START(("Début")) end subgraph ACTIVE["SESSION ACTIVE"] A["active
Session en cours"] LOOP["Activité
utilisateur"] end subgraph CLOTURE["CLÔTURE"] C["completed
Terminée normalement"] B["abandoned
Abandonnée"] end subgraph WATCHDOG["WATCHDOG"] W["Calcul des coûts
+ Mise à jour DB"] end subgraph FIN["FINALISATION"] END(("Fin")) end START -->|"Création session"| A A -->|"Interaction"| LOOP LOOP -->|"Continue"| A A -->|"Clôture manuelle
par utilisateur"| C A -->|"Timeout 90s
+ interactions > 1"| B A -->|"Timeout 90s
+ interactions ≤ 1"| D["🗑️ deleted
Supprimée"] C -->|"Watchdog détecte
status != active"| W B -->|"Watchdog détecte
status != active"| W D -->|"Session vide
supprimée de DB"| END W -->|"Coûts calculés
et sauvegardés"| END style D fill:#f44336,stroke:#d32f2f,color:#fff style START fill:#9C27B0,stroke:#7B1FA2,color:#fff style A fill:#4CAF50,stroke:#388E3C,color:#fff style LOOP fill:#8BC34A,stroke:#689F38,color:#fff style C fill:#2196F3,stroke:#1976D2,color:#fff style B fill:#FF9800,stroke:#F57C00,color:#fff style W fill:#673AB7,stroke:#512DA8,color:#fff style END fill:#9C27B0,stroke:#7B1FA2,color:#fff

Définition des Statuts

Statut Description Conditions de Transition Actions Déclenchées
active Session en cours d'utilisation Création de session ou activité récente (< 2 min) Aucune - Surveillance continue
completed Session terminée normalement L'utilisateur a clôturé la session manuellement Calcul des coûts via Watchdog
abandoned Session abandonnée Inactivité ≥ 90s ET interactions > 1 Clôture automatique + Calcul des coûts
deleted Session supprimée Inactivité ≥ 90s ET interactions ≤ 1 Suppression définitive de la base de données

Paramètres de Surveillance

Intervalle de Vérification

10 secondes

Fréquence de scan des sessions actives

Timeout d'Inactivité

90 secondes

Délai avant traitement automatique

Base de Données

CosmosDB

Stockage des sessions et métriques

utils/session_watchdog.py - Logique de traitement
# Configuration Watchdog
WATCHDOG_INTERVAL = 10      # Vérification toutes les 10 secondes
INACTIVITY_THRESHOLD = 90   # Seuil d'inactivité: 90 secondes

# Logique de traitement des sessions inactives
for session in inactive_sessions:
    interaction_count = session.get('interaction_count', 0) or 0
    
    if interaction_count <= 1:
        # Sessions vides (0-1 interactions) → SUPPRIMER
        delete_empty_session(container, session)
    else:
        # Sessions avec contenu (>1 interactions) → CLÔTURER
        close_inactive_session(session)  # status = "abandoned"

14.2 Calcul des Coûts

Description

Le calcul des coûts est effectué exclusivement par le Watchdog pour les sessions dont le statut n'est pas "active". Cette tâche s'exécute toutes les 30 secondes.

Important : Le calcul n'est jamais effectué pour les sessions actives afin d'éviter les calculs intermédiaires inutiles.

Schéma de Calcul des Coûts

flowchart TD A[Session Terminée
status != 'active'] --> B{Type de Session} B -->|Voice| C[Récupérer Métriques Voice] B -->|Text| D[Récupérer Métriques Text] C --> E[Calculer Tokens Facturables] D --> E E --> F["input_text_billable = input_text - cached_text"] F --> G[Appliquer Tarification] G --> H[Calculer Coût Total] H --> I[Calculer Coût/Minute] I --> J[Calculer Avantage ISV
33% de coût/minute] I --> K[Calculer Avantage Provisioned
50% de coût/minute] J --> L[Sauvegarder en Base] K --> L L --> M[Session Mise à Jour] style A fill:#FF9800,color:#fff style M fill:#4CAF50,color:#fff style F fill:#2196F3,color:#fff style J fill:#9C27B0,color:#fff style K fill:#9C27B0,color:#fff

Définitions et Formules

Terme Définition Formule / Valeur
input_text Nombre total de tokens texte en entrée Compteur brut de tokens
cached_text Tokens texte mis en cache (non refacturés) Tokens réutilisés depuis le cache
input_text_billable Tokens texte réellement facturables max(0, input_text - cached_text)
input_audio Tokens audio en entrée (parole utilisateur) Compteur de tokens audio
output_text Tokens texte générés en sortie Réponse textuelle de l'agent
output_audio Tokens audio générés en sortie Parole synthétisée
total_cost Coût total de la session Σ (tokens × prix_unitaire)
cost_per_minute Coût moyen par minute d'utilisation total_cost / durée_minutes
cost_with_isv_advantage Coût/minute avec réduction partenaire ISV cost_per_minute × 0.33
cost_with_provisioned_advantage Coût/minute avec capacité provisionnée cost_per_minute × 0.50

Grille Tarifaire Voice (par token)

Tier Input Text Input Audio Output Text Output Audio
Pro $0.0000055 $0.000044 $0.000022 $0.000055
Standard $0.00000066 $0.000015 $0.00000264 $0.000033
Lite $0.00000011 $0.000015 $0.00000044 $0.000033

Grille Tarifaire Modèles Texte (par token)

Modèle Prompt (Input) Cached Completion (Output)
GPT-5.2 $0.00000175 $0.000000175 $0.000014
Claude Opus 4.5 $0.000005 $0.00000625 $0.000025
utils/session_watchdog.py - Formules de calcul
# Calcul des tokens facturables (soustraction du cache)
input_text_billable = max(0, input_text_raw - cached_text)

# Calcul des coûts par type de token
input_text_cost = input_text_billable * pricing["input_text"]
input_audio_cost = input_audio * pricing["input_audio"]
output_text_cost = output_text * pricing["output_text"]
output_audio_cost = output_audio * pricing["output_audio"]

# Coût total
total_cost = input_text_cost + input_audio_cost + output_text_cost + output_audio_cost

# Coût par minute
duration_minutes = max(1, session_duration_seconds / 60)
cost_per_minute = total_cost / duration_minutes

# Avantages partenaires (appliqués sur cost_per_minute)
cost_per_minute_isv = cost_per_minute * 0.33        # Réduction ISV 67%
cost_per_minute_provisioned = cost_per_minute * 0.50  # Réduction Provisioned 50%

Exemple de Calcul

Session Voice - Tier Standard (5 minutes)

Métriques de session

  • Input Text: 15,000 tokens
  • Cached Text: 5,000 tokens
  • Input Audio: 8,000 tokens
  • Output Text: 12,000 tokens
  • Output Audio: 10,000 tokens

Calcul détaillé

  • Input Text Billable: 15,000 - 5,000 = 10,000
  • Coût Input Text: 10,000 × $0.00000066 = $0.0066
  • Coût Input Audio: 8,000 × $0.000015 = $0.12
  • Coût Output Text: 12,000 × $0.00000264 = $0.0317
  • Coût Output Audio: 10,000 × $0.000033 = $0.33

Total Cost

$0.4883

Cost/Minute

$0.0977

Avec ISV (33%)

$0.0322

Avec Provisioned (50%)

$0.0488

Architecture du Watchdog

flowchart LR subgraph Watchdog["Watchdog Service"] T1[Task: Session Monitor
Every 10s] T2[Task: Cost Calculator
Every 30s] end subgraph DB["CosmosDB"] S[(Sessions)] end T1 -->|Query active sessions| S T1 -->|Update status| S T2 -->|Query non-active sessions
without costs| S T2 -->|Store calculated costs| S style Watchdog fill:#4A148C,color:#fff style DB fill:#0078D4,color:#fff

Points Clés

  • Le calcul des coûts est centralisé dans le Watchdog uniquement
  • Les sessions actives ne sont jamais calculées (évite les calculs intermédiaires)
  • Les tokens en cache sont soustraits avant le calcul du coût
  • Les avantages ISV et Provisioned s'appliquent sur le coût par minute
  • Le Watchdog s'exécute de manière asynchrone sans impact sur les performances
  • Sessions vides (0-1 interactions) sont supprimées définitivement pour économiser l'espace
  • Sessions avec contenu (>1 interactions) sont clôturées comme "abandoned" et conservées

Tool Validator - Assurance Qualité des Tools

Le Tool Validator est un système d'assurance qualité basé sur Claude Opus 4.5 qui valide et optimise automatiquement les descriptions des tools pour garantir leur compatibilité avec les agents IA et éviter les problèmes d'hallucination.

15.1 Problématique Résolue

Le Problème

Lorsqu'un agent IA utilise de nombreux tools (ex: 115 tools), des descriptions trop longues ou contenant des exemples de données peuvent saturer le contexte du modèle et provoquer des hallucinations (l'agent génère du JSON au lieu de parler naturellement).

  • Descriptions avec exemples JSON verbeux
  • Paramètres avec valeurs d'exemple détaillées
  • Consommation excessive de tokens système

15.2 Solution Implémentée

Validation Automatique

Le Tool Validator utilise Claude Opus 4.5 pour analyser chaque tool et s'assurer que les descriptions respectent les limites strictes de caractères et ne contiennent aucun exemple.

Limites Strictes

Description du Tool

≤ 400 caractères

Concis, fonctionnel, sans exemples

Description Paramètre

≤ 120 caractères

Type et rôle seulement

Exemples

INTERDITS

Pas de JSON, pas de valeurs

15.3 Fichiers du Système

Fichier Description
utils/tools/tool_validator.py Module principal de validation utilisant Claude Opus 4.5. Contient les fonctions validate_and_enrich_tool(), validate_tools_batch(), et enforce_description_limits().
run_full_validation.py Script de validation en masse de tous les tools existants. Traite par lots de 10 et envoie un rapport QA par email.
configuration/cosmos_tools_manager.py Manager Cosmos DB pour la persistance des tools validés.

15.4 Workflow de Validation

flowchart TD A["📥 Tool à valider"] --> B["🤖 Claude Opus 4.5
Analyse"] B --> C{"Conforme ?"} C -->|"Oui"| D["✅ valid
Aucune modification"] C -->|"Non"| E["✏️ Claude corrige
les descriptions"] E --> F["📏 enforce_description_limits()
Post-processing"] F --> G["💾 Sauvegarde
Cosmos DB"] D --> G G --> H["📊 Rapport QA
par email"] style A fill:#E3F2FD,stroke:#1976D2,color:#333 style B fill:#7B1FA2,stroke:#4A148C,color:#fff style D fill:#E8F5E9,stroke:#4CAF50,color:#333 style E fill:#FFF3E0,stroke:#FF9800,color:#333 style F fill:#FCE4EC,stroke:#E91E63,color:#333 style G fill:#E8F5E9,stroke:#4CAF50,color:#333 style H fill:#F3E5F5,stroke:#9C27B0,color:#333

15.5 Exécution du Script

Commande de validation
# Validation complète de tous les tools
python run_full_validation.py

# Sortie typique:
# ============================================================
# VALIDATION COMPLETE DES TOOLS - WakaVoice QA
# ============================================================
# Total de 192 tools à valider
# 
# === Lot 1/20 (10 tools) ===
#   [1/10] get_weather - corrected
#   [2/10] search_documents - valid
#   ...
# 
# RÉSULTATS FINAUX
# Total analysé: 192
# Conformes: 0
# Corrigés: 192
# Échecs: 0
# 
# Envoi du rapport QA...

Règles de Validation (Prompt Système)

utils/tools/tool_validator.py - Extrait du prompt
VALIDATION_SYSTEM_PROMPT = """
Tu es un expert en validation de tools pour agents IA.

## RÈGLES STRICTES
1. Description du tool: maximum 400 caractères
2. Description de chaque paramètre: maximum 120 caractères  
3. INTERDICTION ABSOLUE d'inclure des exemples
4. Chaque description doit être concise et fonctionnelle

## CE QUI EST INTERDIT
- "Example: ..." ou "Ex: ..."
- "For instance: ..."  
- "Like: ..." ou "Such as: ..."
- Valeurs JSON ou structures de données
- Listes de valeurs possibles détaillées

## FORMAT DE SORTIE
Retourner uniquement le JSON du tool corrigé.
"""

Points Clés

  • Validation automatique via Claude Opus 4.5 (Azure AI Foundry)
  • Double sécurité: validation LLM + post-processing Python
  • Traitement par lots de 10 pour éviter les rate limits
  • Sauvegarde automatique dans Cosmos DB
  • Rapport QA envoyé par email après chaque validation
  • Prévient les hallucinations des agents avec beaucoup de tools