WAKA VOICE
Documentation Technique Exhaustive
Guide complet de la plateforme d'agents conversationnels IA multimodaux. Cette documentation couvre l'ensemble des fonctionnalités, les choix architecturaux, les justifications techniques et les bonnes pratiques d'implémentation.
Chapitre 1: Présentation, Vision & Stratégie
Introduction complète à la plateforme Waka Voice et ses fondations techniques
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
Modèle de Service
< 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
Parcours de Déploiement Express
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 |
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
- Latence ultra-faible (<300ms) : Architecture WebSocket bidirectionnelle garantissant des temps de réponse imperceptibles
- Barge-in (interruption) : L'utilisateur peut interrompre l'agent à tout moment, comme dans une vraie conversation
- VAD sémantique : Détection intelligente de fin de phrase, même après une pause de réflexion
- Voix expressives : Voix Azure Neural avec émotions, intonations et styles adaptés au contexte
Pilier 2 : Puissance Agentique (Actions Réelles)
- Système de Tools extensible : 4 types (API REST, MCP, Python, OpenAPI) pour intégrer tout système client
- Raisonnement contextuel : GPT-5.2, Claude Opus 4.5, Grok 3 pour décisions intelligentes
- Chaînage d'actions : Vérification éligibilité → Calcul → Prise engagement → Confirmation, en une seule conversation
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
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.
- Interface unifiée de création : Un wizard en 5 étapes guide l'utilisateur à travers le choix du type d'agent (voix/avatar/texte), la sélection du modèle IA, la configuration de la voix, l'assignation des tools et la rédaction des instructions.
- Prompt Builder intelligent : 4 méthodes de génération de prompts (templates métier, construction par phases, import existant, génération IA) garantissent des instructions optimales quelle que soit l'expertise de l'utilisateur.
- Bibliothèque de templates : Des templates pré-configurés pour les cas d'usage courants (recouvrement, support client, prise de RDV, enquêtes satisfaction) accélèrent le déploiement.
- Versioning et rollback : Chaque modification crée une version, permettant de revenir à une configuration précédente en cas de problème.
Gestion des voix
La voix est l'élément le plus critique pour la perception de naturalité. Waka Voice offre trois niveaux de personnalisation :
- Voix Azure Standard : Plus de 600 voix couvrant toutes les langues majeures. Qualité professionnelle suffisante pour la plupart des cas d'usage, avec un excellent rapport qualité/coût.
- Voix HD Neural : Voix premium avec expressions émotionnelles, styles de parole (joyeux, triste, professionnel) et qualité audio supérieure. Recommandées pour les interactions à forte valeur ajoutée.
- Voix Personnalisées : Création de voix uniques à partir d'enregistrements. Permet de reproduire la voix d'un porte-parole, créer une identité sonore de marque, ou offrir une voix familière aux utilisateurs.
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
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.
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.
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.
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.
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
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
- 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
- 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 |
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
- Légèreté et flexibilité : Contrairement à Django qui impose une structure, Flask permet une architecture sur mesure adaptée à nos besoins spécifiques (Blueprints modulaires, WebSocket via flask-sock, pas d'ORM imposé).
- Écosystème Python IA : Python domine l'écosystème IA/ML. Nos intégrations avec Azure Cognitive Services, OpenAI, et les bibliothèques de traitement audio bénéficient d'un support de première classe.
- Productivité de développement : Syntaxe claire, typage optionnel (utilisé via type hints), debugging facilité, hot-reload en développement. Temps de mise sur le marché réduit.
- Support WebSocket natif : flask-sock offre une intégration WebSocket élégante sans nécessiter de serveur séparé (vs Node.js + Socket.io).
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
}
}
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 :
- Sécurité des credentials : Les clés API Azure ne doivent jamais être exposées côté client. Le proxy garde les secrets côté serveur et authentifie chaque connexion.
- Exécution des Tools : Quand l'agent IA décide d'appeler un tool, cette exécution doit se faire côté serveur (appels API, accès BDD, code Python). Le proxy intercepte les tool_calls et les exécute avant de renvoyer le résultat.
- Logging et analytics : Toutes les transcriptions passent par le proxy, permettant un logging centralisé, l'analyse de sentiment en temps réel, et l'alimentation des dashboards sans impact sur la latence client.
- Gestion des sessions : Le proxy maintient l'état de chaque session (transcriptions, résultats de tools, métriques) et persiste dans Cosmos DB en fin de conversation avec une seule écriture optimisée.
- Résilience : Le proxy peut gérer les reconnexions, timeouts, et erreurs Azure de manière transparente pour le client, améliorant l'expérience utilisateur.
Flux de données détaillé
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
Stack Technique RAG
Pourquoi le RAG est-il essentiel ?
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.
- 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
- 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 :
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
Web Crawler
Sites web et documentation
Upload Direct
Fichiers locaux
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.
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ètre | Type | Description |
|---|---|---|
libraryId | string | ID du drive SharePoint (obligatoire) |
libraryName | string | Nom de la bibliothèque |
folderId | string | ID d'un sous-dossier spécifique (optionnel) |
folderName | string | Nom du dossier |
project_name | string | Projet 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).
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
| Paramètre | Défaut | Description |
|---|---|---|
url | - | URL de départ du crawl (obligatoire) |
max_pages | 500 | Nombre maximum de pages à crawler |
max_depth | 5 | Profondeur maximale de navigation |
max_concurrent | 10 | Requêtes simultanées (mode Fast) |
use_javascript | false | Activer Playwright pour rendu JS |
use_sitemap | true | Parser sitemap.xml en priorité |
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.
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)
| Format | Extension | Méthode d'extraction |
|---|---|---|
| Documents PDF | Azure Document Intelligence (OCR inclus) | |
| Microsoft Word | .docx, .doc | Azure Document Intelligence |
| PowerPoint | .pptx, .ppt | Azure Document Intelligence |
| Excel | .xlsx, .xls | Azure Document Intelligence (tableaux) |
| Texte brut | .txt, .md, .html | Téléchargement direct + parsing |
| Rich Text | .rtf, .odt | Azure Document Intelligence |
| Code source | .py, .js, .json | Té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
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}]
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 extrait automatiquement les entités nommées de chaque chunk :
- Person : Noms de personnes mentionnées
- Organization : Entreprises, institutions
- Location : Lieux géographiques
- DateTime : Dates et heures
- Email, PhoneNumber, URL : Coordonnées
- Skill, Product, Event : Concepts métier
- Key Phrases : Termes importants du chunk
Étape 5 : Génération d'embeddings
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"]
}
}
}
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
- 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
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 :
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 :
- Testabilité : Chaque composant peut être testé isolément avec des mocks
- Évolutivité : Modifier le stockage n'impacte pas la logique WebSocket
- Lisibilité : Un développeur trouve rapidement le code pertinent
- Parallélisation : Plusieurs développeurs travaillent sans conflits
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
))
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
Azure Services
Frontend
Chapitre 4: Base de Données
Architecture Hybride Cosmos DB + Azure Blob Storage
4.1 Approche Hybride : Cosmos DB + Blob Storage
4.1.1 Philosophie de l'Architecture
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
- 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é
- 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
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
4.2 Database 1 : ConversationsDB (Principal)
4.2.1 Container : AgentConfigurations
| AgentConfigurations | |
|---|---|
| Description | Configurations des agents vocaux (Voice Live) |
| Partition Key | /agent_id |
| Justification PK | Accès direct par ID agent, isolation par agent |
| Liens vers | VoiceSessions, 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 | |
|---|---|
| Description | Configurations des agents avatar (Azure Avatar) |
| Partition Key | /agent_id |
| Justification PK | Même pattern que AgentConfigurations |
| Liens vers | VoiceSessions, 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 | |
|---|---|
| Description | Configurations des agents texte (GPT-5.2, Claude Opus 4.5) |
| Partition Key | /agent_id |
| Justification PK | Accès direct par ID agent |
| Liens vers | VoiceSessions, 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 | |
|---|---|
| Description | Sessions de conversation (Voice, Avatar, Text) |
| Partition Key | /call_id |
| Justification PK | Isolation parfaite par session, requêtes rapides |
| Liens vers | AgentConfigurations, 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 | |
|---|---|
| Description | Définitions des outils dynamiques pour les agents |
| Partition Key | /category |
| Justification PK | Requêtes fréquentes par catégorie (galerie, filtrage) |
| Liens vers | AgentConfigurations (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 | |
|---|---|
| Description | Historique détaillé des appels (campagnes) |
| Partition Key | /call_id |
| Justification PK | Isolation par appel, corrélation avec VoiceSessions |
| Liens vers | campagnes-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 | |
|---|---|
| Description | Configurations des campagnes d'appels sortants |
| Partition Key | /id |
| Justification PK | Accès direct par ID campagne |
| Liens vers | AgentConfigurations, 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 | |
|---|---|
| Description | Historique des conversations RAG Chat |
| Partition Key | /id |
| Justification PK | Accès direct par ID conversation |
| Liens vers | RAGProjects |
{
"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)
4.3.1 Container : database (Chunks)
| database (Chunks RAG) | |
|---|---|
| Description | Chunks de documents indexés avec embeddings |
| Partition Key | /project_name |
| Justification PK | Filtrage rapide par projet lors des recherches |
| Liens vers | Blob 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 | |
|---|---|
| Description | Suivi des bibliothèques SharePoint synchronisées |
| Partition Key | /site_id |
| Justification PK | Groupement 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 | |
|---|---|
| Description | Logs des opérations RAG (indexation, recherche) |
| Partition Key | /operation_type |
| Justification PK | Analyse par type d'opération |
4.4 Azure Blob Storage : Containers
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
4.6 Flux de Données Principaux
4.6.1 Flux 1 : Session Voice/Avatar
4.6.2 Flux 2 : Indexation RAG
4.6.3 Flux 3 : Personal Voice
4.7 Pattern de Persistance Optimisé
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 |
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
5.1 Architecture du Module
5.1.1 Stack Technique
5.1.2 Flux de Données Global
5.2 Le Workflow en 4 Étapes
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.
Sélectionner un Projet
Choisissez le projet Azure pour votre nouvelle voix
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.
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.
Enregistrement du Consentement
"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."
Algorithme de Validation
La validation utilise l'algorithme de distance de Levenshtein pour comparer le texte transcrit avec le texte attendu :
# 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%.
Échantillons Vocaux (3 requis)
Lisez chaque phrase clairement et distinctement
"The quick brown fox jumps over the lazy dog. This sentence contains every letter of the alphabet."
"Technology continues to evolve at an unprecedented pace, transforming how we work and communicate."
"Please speak naturally and at a comfortable pace. Clear pronunciation helps create a better voice model."
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é.
(~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
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.
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.
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
6.1 Architecture du Système de Tools
6.1.1 Stack Technique
6.1.2 Flux de Données Global
6.2 Les 4 Types de Tools
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.
| Champ | Type | Description |
|---|---|---|
endpoint | string | URL complète de l'API (ex: https://api.example.com/users) |
method | enum | GET, POST, PUT, PATCH, DELETE |
headers | object | Headers HTTP personnalisés |
auth_type | enum | none, api_key, bearer, basic |
auth_config | object | Configuration auth (header_name, value, in: header/query) |
params_mapping | object | Mapping param → path/query/body/header |
body_template | string | Template 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 :
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
| Transport | Use Case | Configuration 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.
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
Détail du flux SSE (Server-Sent Events)
Les 3 Étapes en détail
| Étape | Action | Technologie | Corrections automatiques |
|---|---|---|---|
| 1. Validation YAML | Analyse globale de la structure OpenAPI | Claude Opus 4.5 |
|
| 2. Conversion & Upload | Transformation endpoints → Tools + sauvegarde | OpenAPIImporter Python |
|
| 3. Validation Tools | Vérification individuelle de chaque tool | Claude Opus 4.5 + Validation locale |
|
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
| Fichier | Rôle |
|---|---|
static/js/tools/add.js | Gestion upload, appel API, affichage progress bar SSE |
Blueprints/tools/add.py | Endpoints /api/openapi/parse et /api/openapi/import-v2 |
Blueprints/tools/openapi_parser.py | Parser natif Python pour extraction endpoints |
utils/tools/openapi_importer.py | Classe OpenAPIImporter - pipeline 3 étapes |
utils/tools/tool_validator.py | Validation 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 :
| Catégorie | Description | Exemples de Tools |
|---|---|---|
general | Outils génériques | search_web, get_weather, calculate |
communication | Email, SMS, notifications | send_email, send_sms, push_notification |
travel | Voyage et transport | search_flights, book_hotel, estimate_taxi |
finance | Finance et paiements | convert_currency, calculate_tax, process_payment |
waka_clients | Gestion clients WAKA | get_client, update_client, search_clients |
waka_credits | Gestion des crédits | get_credit_status, calculate_remaining, list_credits |
waka_payments | Enregistrement paiements | record_payment, verify_payment, list_payments |
system | Outils système | end_conversation, conversation_brain |
6.4 API REST - Endpoints
Le module Tools expose les endpoints suivants via le Blueprint Flask tools_bp :
| Méthode | Endpoint | Description |
|---|---|---|
GET | /tools/ | Page galerie des tools |
GET | /tools/add | Page création de tool |
GET | /tools/api/list | Liste paginée des tools |
GET | /tools/api/categories | Liste des catégories |
GET | /tools/api/get/<tool_id> | Détails d'un tool |
POST | /tools/api/create | Cré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/test | Tester un tool |
POST | /tools/api/check-name | Vérifier si un nom existe |
POST | /tools/api/generate | Générer description/body avec IA |
POST | /tools/api/generate-code | Générer code Python avec IA |
POST | /tools/api/openapi/parse | Parser une spec OpenAPI/YAML (natif Python) |
POST | /tools/api/openapi/import-v2 | Import OpenAPI Pipeline V2 (SSE 3 étapes) |
POST | /tools/api/validate-tool | Valider et enrichir un tool via Claude |
POST | /tools/api/validate-tools-batch | Valider 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 :
# 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
search_weather
Recherche météo d'une ville
calculate_interest
Calcul d'intérêts composés
filesystem_tools
Accès au système de fichiers
6.8 Tools Prédéfinis (30+)
Waka Voice inclut plus de 30 tools prédéfinis prêts à l'emploi :
| Tool | Catégorie | Description |
|---|---|---|
search_web | general | Recherche web via Bing/DuckDuckGo |
get_weather_forecast | general | Prévisions météo |
send_email | communication | Envoi d'email via Azure Communication Services |
translate_text | general | Traduction multi-langues |
convert_currency | finance | Conversion de devises |
search_flights | travel | Recherche de vols |
book_hotel | travel | Réservation d'hôtel |
estimate_taxi_fare | travel | Estimation tarif taxi |
find_pharmacy | local_services | Localiser une pharmacie |
get_prayer_times | local_services | Horaires de prière |
end_conversation | system | Terminer la conversation |
conversation_brain | system | Gestion dynamique du prompt |
schedule_callback | campaign | Planifier un rappel |
send_sms_payment_promise | campaign | SMS promesse de paiement |
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
'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
| Étape | Action | Fichier | Ré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
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 :
6.9.6 Points clés
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ément | Format | Exemple |
|---|---|---|
| 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
| Fichier | Rô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
7.1 Architecture Globale
Caractéristiques Principales
| Caractéristique | Description |
|---|---|
| Modèles supportés | GPT-5.2-chat, Claude Opus 4.5, Grok 3 (via Azure AI Foundry) |
| Streaming | SSE (Server-Sent Events) temps réel |
| Tools | HTTP REST, Python Module, Python Inline, MCP (STDIO/SSE/HTTP) |
| Sessions | Persistance optionnelle dans Cosmos DB |
| Intégration | iframe, widget JavaScript, popup |
| Pièces jointes | Images (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èle | Provider | Vision | Tools | Max Tokens | Latence |
|---|---|---|---|---|---|
| GPT-5.2-chat | Azure OpenAI | Oui | Oui | 128K | ~500ms |
| Claude Opus 4.5 | Azure AI Foundry | Oui | Oui | 200K | ~800ms |
7.3 Architecture du Blueprint
# Blueprints/text_agents_routes.py
text_agents_bp = Blueprint('text_agents', __name__, url_prefix='/text-agents')
| Route | Méthode | Description |
|---|---|---|
/text-agents/ | GET | Galerie des agents texte |
/text-agents/create | GET/POST | Création d'un agent |
/text-agents/<id>/edit | GET/POST | Modification d'un agent |
/text-agents/<id>/chat | GET | Interface de chat |
/text-agents/<id>/embed | GET | Version embeddable |
/text-agents/api/<id>/chat/stream | POST | API de chat streaming |
/text-agents/api/<id>/session | GET/POST/DELETE | Gestion 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
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
7.10 Flux de Conversation
7.11 Métriques et Monitoring
| Métrique | Description | Type |
|---|---|---|
text_agent.messages.total | Nombre total de messages | Counter |
text_agent.tokens.prompt | Tokens de prompt utilisés | Counter |
text_agent.tokens.completion | Tokens de complétion utilisés | Counter |
text_agent.latency.first_token | Latence jusqu'au premier token | Histogram |
text_agent.tools.calls | Nombre d'appels de tools | Counter |
text_agent.sessions.active | Sessions actives | Gauge |
# Santé du service
GET /text-agents/health
Response: {"status": "healthy", "model_status": {...}}
# Métriques Prometheus
GET /text-agents/metrics
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
8.1 Vue d'Ensemble et Architecture
Caractéristiques Principales
| Caractéristique | Description |
|---|---|
| Protocole | WebSocket bidirectionnel full-duplex |
| Modèles supportés | gpt-realtime, gpt-realtime-mini, phi4-mm-realtime, gpt-5-realtime |
| Format Audio | PCM16, 24kHz, mono |
| Voix | Azure Neural (600+), Personal Voice, OpenAI Native |
| Turn Detection | VAD sémantique multilingue (azure_semantic_vad) |
| Barge-in | Interruption native de l'agent |
| Tools | Max 8 outils par agent, exécution temps réel |
| Session Max | 15 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)
- Analyse le contenu sémantique
- Détecte les fins de phrases logiques
- Tolère les pauses de réflexion
- Multilingue (semantic_detection_v1_multilingual)
- 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
| Fichier | Taille | Rôle |
|---|---|---|
voice_live_proxy.py | ~26KB | WebSocket proxy + VoiceLiveSession |
agents_config_routes.py | ~50KB | Routes de gestion agents (4 étapes) |
cosmos_agent_manager.py | ~20KB | Manager d'agents (CRUD Cosmos) |
voice_live_config.py | ~10KB | Config Azure + client Voice Live |
voice_live_session_builder.py | ~15KB | Builder strict de sessions |
sessions/voice/manager.py | ~25KB | Manager de sessions Cosmos |
static/js/agent_voice_session.js | ~29KB | Client JS avec objet AudioSession (gestion audio, overlap protection) |
Endpoints Principaux
| Route | Méthode | Description |
|---|---|---|
/agents/ | GET | Galerie des agents voix |
/agents/config/step1 | GET | É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> | GET | Page de session voix |
/voice-proxy/ws/<id> | WebSocket | Connexion WebSocket principale |
/agents/voice-history | GET | Historique des sessions |
/agents/api/conversation/init | POST | Initialiser conversation |
/agents/api/conversation/end | POST | Terminer conversation |
8.6 Connexion WebSocket
Flux de Messages
Types de Messages Azure Realtime
| Message | Direction | Description |
|---|---|---|
session.created | Azure → Client | Session initialisée |
input_audio_buffer.append | Client → Azure | Envoi audio PCM16 |
input_audio_buffer.speech_started | Azure → Client | Parole détectée (VAD) |
input_audio_buffer.speech_stopped | Azure → Client | Fin de parole (VAD) |
conversation.item.created | Azure → Client | Transcription complète |
response.audio.delta | Azure → Client | Chunk audio réponse |
response.function_call_arguments.done | Azure → Client | Tool call request |
response.done | Azure → Client | Réponse complète |
8.7 Système de Tools
Outils Disponibles (31 total)
| Catégorie | Tools | Description |
|---|---|---|
| Basiques | calculator, currency, translator, weather, news | Outils utilitaires |
| Recherche | search_web, places, dogs, exercises | Recherche d'informations |
| Communication | email, sms, payment_promise, extension_confirm | Envoi de messages |
| Voyage | flight_search, flight_booking, hotel_search, hotel_booking | Réservations |
| Services | prayer_times, pharmacy_locator, school_info, taxi_estimate | Services locaux |
| Professionnel | knowledge_base, cv_builder, tax_calculator | Outils métier |
| Système | end_conversation, schedule_callback | Contrôle de session |
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
| Type | Description | Exemple |
|---|---|---|
azure-standard | Voix Azure Neural standard (600+) | fr-FR-DeniseNeural |
azure-personal | Personal Voice (clone de voix) | voice-XXXX-XXXX |
azure-custom | Custom Neural Voice | custom-voice-id |
openai | Voix natives OpenAI | alloy, echo, fable, onyx, nova, shimmer |
8.10 Flux de Création d'un Agent
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
| Timeout | Valeur | Description |
|---|---|---|
| Azure connection | 20s | Connexion initiale (retryable 3x) |
| Inactivity check | 10s | Fréquence de vérification |
| Inactivity timeout | 180s | Fermeture automatique si silence |
| Max session duration | 900s (15 min) | Limite Azure Realtime |
| Client ping | 15s | Keep-alive navigateur |
| Azure ping | 10s | Keep-alive Azure (~60s timeout) |
Métriques Collectées par Session
| Métrique | Description | Type |
|---|---|---|
audio_sent | Bytes audio envoyés | Counter |
audio_received | Bytes audio reçus | Counter |
interruptions | Nombre de barge-in | Counter |
tools_executed | Nombre de tools appelés | Counter |
messages_count | Total messages (user + assistant) | Counter |
duration_minutes | Durée totale | Gauge |
tokens.input_text | Tokens texte en entrée | Counter |
tokens.input_audio | Tokens audio en entrée | Counter |
tokens.output_text | Tokens texte en sortie | Counter |
tokens.output_audio | Tokens audio en sortie | Counter |
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
9.1 Vue d'Ensemble et Architecture
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
Étape 1: Sélection du Modèle
- Choisir parmi: gpt-realtime, gpt-realtime-mini
- Créer document Cosmos avec
status="draft" - Configurer les endpoints Speech Azure
Étape 2: Configuration Voix
- Sélectionner langue et locale (fr-FR, en-US, etc.)
- Choisir la voix Azure Neural
- Configurer température et vitesse
Étape 3: Sélection Avatar
- Vidéo: Choisir personnage + style (1920x1080)
- Photo: Choisir portrait VASA-1 (512x512)
- Configurer fond et crop (vidéo uniquement)
Étape 4: Configuration Outils
- Multi-sélection parmi les outils disponibles
- Maximum 8 outils par agent
- Support HTTP endpoints + Python handlers
Étape 5: Prompt Système
- Écrire instructions personnalisées
- Option: Générer avec IA (GPT)
- Valider et publier (
status="active")
9.5 Connexion WebSocket et WebRTC
Flux de Messages
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
11.1 Configuration Azure Web App
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ètre | Valeur par défaut | Description | Impact |
|---|---|---|---|
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 |
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 :
| 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 |
| 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 |
| 150 | 3 min | 1 200 | 26 400 | |
| SMS | 300 | 1 min | 2 400 | 52 800 |
| TOTAL | 890/h | - | 7 120/jour | 156 640/mois |
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 |
| 120 | 3 min | 2 880 | 86 400 | |
| SMS | 250 | 1 min | 6 000 | 180 000 |
| TOTAL | 730/h | - | 17 520/jour | 525 600/mois |
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 |
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
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
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 :
Affiche le nombre total de conversations et celles en cours actuellement
Montre les revenus générés, les coûts et votre marge bénéficiaire
Indique la consommation de ressources IA (entrée/sortie, texte/audio)
Analyse l'humeur des conversations : positif, neutre ou négatif
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é
- Ouvrez la page d'accueil (cliquez sur "Accueil" ou le logo)
- Regardez les cartes affichées au centre de l'écran
- 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
- 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
- Sur la page d'accueil, repérez le bouton "Configurer taux" en haut de la page
- Cliquez dessus : une petite fenêtre (popup) s'ouvre
- Dans le champ de saisie, entrez votre tarif en euros par minute (exemple : 0.50 pour 50 centimes)
- Cliquez sur "Enregistrer" pour valider
- Les calculs de revenus se mettront à jour automatiquement avec votre nouveau tarif
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.
- 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
- Ouvrez l'écran "Ajouter Documents" depuis le menu Waka AXIOM
- Choisissez le projet dans le menu déroulant en haut (si vous n'avez qu'un projet, il sera déjà sélectionné)
- Sur votre ordinateur, ouvrez le dossier contenant vos fichiers
- Sélectionnez les fichiers que vous voulez ajouter (vous pouvez en sélectionner plusieurs en maintenant Ctrl enfoncé)
- Faites-les glisser avec votre souris vers la zone en pointillés sur la page
- La zone devient bleue/violette quand vous êtes au-dessus : relâchez les fichiers
- Vos fichiers apparaissent dans la liste en dessous
- Vérifiez que tous les fichiers souhaités sont dans la liste
- Cliquez sur le bouton "Télécharger et indexer"
- Attendez que les barres de progression atteignent 100% pour chaque fichier
- 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
- Ouvrez l'écran "Ajouter Documents" depuis le menu Waka AXIOM
- Choisissez le projet dans le menu déroulant en haut
- Cliquez sur le bouton "Parcourir" au centre de la zone en pointillés
- Une fenêtre de l'explorateur de fichiers s'ouvre
- Naviguez jusqu'au dossier contenant vos fichiers
- Sélectionnez les fichiers (Ctrl+clic pour en sélectionner plusieurs)
- Cliquez sur "Ouvrir"
- Vos fichiers apparaissent dans la liste
- Cliquez sur "Télécharger et indexer"
- Patientez pendant le traitement
Retirer un fichier avant l'envoi
Objectif : Enlever un fichier que vous avez ajouté par erreur
- Repérez le fichier à retirer dans la liste
- À droite du nom du fichier, cliquez sur le bouton "X" (ou l'icône poubelle)
- Le fichier disparaît de la liste
- 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.
- 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
- Ouvrez l'écran "Ajouter Sites Web" depuis le menu Waka AXIOM
- Sélectionnez votre projet dans le menu déroulant
- 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://)
- Exemple correct :
- 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
- Définissez une limite de pages raisonnable (commencez par 50-100)
- Cliquez sur "Lancer le crawl"
- Observez la progression : le système affiche les pages qu'il trouve
- Attendez le message "Crawl terminé"
- 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
- Repérez la barre de recherche en haut de la liste
- Tapez une partie du nom du document (exemple : "FAQ" ou "tarifs")
- La liste se filtre automatiquement pour ne montrer que les documents correspondants
- Pour effacer la recherche, supprimez le texte ou cliquez sur le X dans le champ
Supprimer un document
Attention : Cette action est définitive !
- Trouvez le document à supprimer dans la liste
- Cliquez sur l'icône poubelle à droite de la ligne
- Une fenêtre de confirmation apparaît : "Êtes-vous sûr ?"
- Lisez bien le message pour vérifier que c'est le bon document
- Cliquez sur "Supprimer" pour confirmer, ou "Annuler" pour revenir
- Le document disparaît de la liste et de votre base de connaissances
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
- Assurez-vous d'avoir sélectionné le bon projet en haut
- Cliquez dans le champ de saisie en bas de l'écran
- Tapez votre question en langage naturel
- Exemple : "Quels sont les horaires d'ouverture ?"
- Exemple : "Comment fonctionne la politique de retour ?"
- Appuyez sur Entrée ou cliquez sur le bouton Envoyer
- Patientez quelques secondes : la réponse s'affiche mot par mot
- Lisez la réponse et vérifiez les sources citées en dessous
- 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)
- Cliquez sur la carte du modèle que vous souhaitez utiliser
- La carte sélectionnée s'entoure d'une bordure violette
- 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
- Langue : Sélectionnez la langue principale (Français, English, Español, etc.)
- Région : Choisissez l'accent (France, Belgique, Canada pour le français)
- Genre : Masculin ou Féminin
- Type de voix : Standard ou Neural (Neural = plus naturel)
- Voix : Choisissez parmi les voix disponibles
- Un bouton "Écouter" vous permet de tester chaque voix
- Cliquez sur "Suivant" quand vous êtes satisfait
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)
- Parcourez les outils disponibles
- Cochez ceux que vous voulez activer (maximum 8 recommandé)
- Les outils cochés apparaissent avec une bordure colorée
- Cliquez sur "Suivant"
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 :
- Identité : "Tu es Sophie, assistante commerciale de l'entreprise ABC"
- Mission : "Tu aides les clients à trouver des produits et à passer commande"
- Ton : "Sois amical, professionnel et patient"
- Limites : "Ne donne jamais de prix sans vérifier dans la base de données"
- Actions : "À la fin de chaque appel, propose d'envoyer un récapitulatif par email"
- Option A - Écrire vous-même :
- Cliquez dans la zone de texte
- Rédigez vos instructions en langage naturel
- 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
- Relisez et ajustez vos instructions
- 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"
- Entrez un nom pour votre agent (exemple : "Assistant Support Client")
- Vérifiez le récapitulatif : tout est correct ?
- Si besoin, utilisez le bouton "Précédent" pour modifier une étape
- Cliquez sur "Publier l'agent"
- Attendez le message de confirmation "Agent créé avec succès !"
- Vous êtes redirigé vers la galerie des agents
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
- Trouvez l'agent que vous voulez tester dans la grille
- Vérifiez que son badge indique "Actif" (les brouillons ne peuvent pas être testés)
- Cliquez sur le bouton Tester (icône lecture ▶)
- Vous êtes redirigé vers l'écran de session (voir section suivante)
- Autorisez l'accès à votre microphone si demandé
- Commencez à parler pour tester l'agent !
Modifier un agent
Objectif : Changer les paramètres d'un agent existant
- Trouvez l'agent à modifier
- Cliquez sur le bouton Modifier (icône crayon ✎)
- Vous retournez dans l'assistant de création, mais avec les valeurs actuelles pré-remplies
- Naviguez entre les étapes avec "Précédent" et "Suivant"
- Modifiez ce que vous souhaitez (voix, outils, instructions...)
- À la dernière étape, cliquez sur "Enregistrer les modifications"
Supprimer un agent
Attention : Cette action est définitive !
- Trouvez l'agent à supprimer
- Cliquez sur le bouton Supprimer (icône poubelle 🗑)
- Une fenêtre de confirmation apparaît
- Lisez le message pour vérifier que c'est le bon agent
- Cliquez sur "Confirmer la suppression"
- L'agent disparaît de la galerie
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
- Attendez que l'indicateur passe au vert (connexion établie)
- Vérifiez que le bouton micro est vert (micro actif)
- Parlez normalement dans votre micro, comme si vous parliez à quelqu'un
- Attendez que la transcription de vos paroles apparaisse à l'écran
- L'agent réfléchit puis répond vocalement - vous l'entendez dans vos haut-parleurs
- Sa réponse s'affiche aussi en texte dans la zone de conversation
- Continuez la discussion aussi longtemps que nécessaire
- Pour terminer, cliquez sur "Terminer la session"
Couper ou réactiver votre micro
- Regardez le gros bouton rond en bas de l'écran
- S'il est vert : votre micro est actif, l'agent vous entend
- Cliquez dessus une fois pour couper le micro : il devient rouge
- 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.
- 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)
- Cliquez sur le bouton "Créer un Tool" en haut de la page
- 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
- 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.
- Cliquez sur "Enregistrer"
- Votre outil apparaît maintenant dans la galerie avec un badge "Custom"
- 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
- En haut du dashboard, repérez le sélecteur de dates
- Cliquez dessus pour ouvrir le calendrier
- Sélectionnez la date de début et la date de fin
- Ou utilisez les raccourcis : "Aujourd'hui", "Cette semaine", "Ce mois", "30 derniers jours"
- Les graphiques se mettent à jour automatiquement
Exporter les données
- Configurez d'abord la période que vous souhaitez exporter
- Cliquez sur le bouton "Exporter" (icône de téléchargement)
- Choisissez le format : CSV (pour Excel) ou PDF (pour rapport)
- 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 globales | Accueil |
| Ajouter des documents pour mes agents | Waka AXIOM → Ajouter Documents |
| Indexer un site web | Waka AXIOM → Ajouter Sites Web |
| Voir mes documents indexés | Waka AXIOM → Base de Connaissances |
| Poser des questions sur mes documents | Waka AXIOM → Chat |
| Créer un nouvel agent | Création → Créer un Agent |
| Cloner ma voix | Création → Voix Personnelle |
| Lancer une campagne d'appels | Création → Nouvelle Campagne |
| Ajouter un nouvel outil | Création → Nouveau Tool |
| Voir tous mes agents | Galeries → Agents |
| Consulter l'historique des conversations | Galeries → Historique |
| Voir les outils disponibles | Galeries → Tools |
| Analyser la qualité des conversations | Dashboards → Qualité |
| Voir les revenus et coûts | Dashboards → Production |
| Changer la langue de l'interface | Menu FR/EN/ES (en haut à droite) |
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
| Section | Métriques | Description |
|---|---|---|
| Conversations | Total, En cours | Nombre de conversations totales et actives |
| Business | Revenus, Coûts, Marge | Revenus générés vs coûts ressources Azure |
| Tokens | Input/Output, Text/Audio | Consommation de tokens par type |
| Sentiment | Positif, Neutre, Négatif | Analyse sentiment utilisateur et agent |
| Durée | Moyenne, Min, Max | Statistiques de durée des sessions |
| Sparklines | Graphiques 15 min | Tendances en temps réel |
- Rafraîchir - Bouton pour actualiser les métriques manuellement
- Configurer taux - Modifier le taux de facturation (€/min)
- Auto-refresh - Actualisation automatique toutes les 15 minutes
Troubleshooting
| Problème | Cause probable | Solution |
|---|---|---|
| Métriques à zéro | Aucune session active | Vérifier que des agents sont publiés et des sessions en cours |
| Données non actualisées | Cache navigateur | Cliquer sur le bouton "Rafraîchir" ou F5 |
| Erreur de chargement | Connexion Cosmos DB | Vérifier les variables d'environnement COSMOS_* |
| Sparklines vides | Moins de 15 min de données | Attendre 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
- Zone Drag & Drop - Glisser-déposer des fichiers
- Bouton Parcourir - Sélectionner des fichiers manuellement
- Formats Supportés - PDF, DOCX, TXT, XLSX, PPTX, HTML, MD
- Barre de Progression - Suivi de l'indexation en temps réel
- Sélection Projet - Choisir le projet RAG cible
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Upload échoue | Fichier trop volumineux (>100MB) | Découper le fichier en plusieurs parties |
| Format non supporté | Extension non reconnue | Convertir en PDF ou DOCX |
| Indexation bloquée | Quota Azure Search atteint | Supprimer d'anciens documents ou augmenter le quota |
| Chunks vides | Document 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
- URL de départ - URL du site à indexer
- Profondeur - Nombre de niveaux de liens à suivre (1-5)
- Limite pages - Nombre maximum de pages à crawler
- Filtres - Patterns d'URL à inclure/exclure
- Progression - Suivi en temps réel du crawl
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Crawl bloqué | robots.txt restrictif | Vérifier les règles robots.txt du site |
| Pages manquantes | Contenu dynamique (SPA) | Augmenter le délai entre requêtes |
| Timeout | Site lent ou inaccessible | Vérifier la connectivité au site |
| Contenu vide | JavaScript requis | Le 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
- Authentification - Se connecter avec compte Microsoft 365
- Navigation - Parcourir les bibliothèques SharePoint
- Sélection - Cocher les dossiers à indexer
- Synchronisation - Lancer l'import automatique
- Planification - Configurer la synchro périodique
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Échec connexion | Token expiré | Se déconnecter et reconnecter |
| Bibliothèques invisibles | Permissions insuffisantes | Demander l'accès à l'admin SharePoint |
| Synchro partielle | Fichiers verrouillés | Fermer les fichiers ouverts dans SharePoint |
| Erreur 403 | MFA requis | Utiliser 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
- Liste des sources - Tous les documents/sites indexés avec métadonnées
- Recherche - Rechercher par nom ou contenu
- Statistiques - Nombre de chunks, tokens, taille totale
- Actions - Supprimer, Ré-indexer, Voir détails
- Filtres - Par type (document, web, SharePoint)
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Liste vide | Mauvais projet sélectionné | Changer de projet dans le sélecteur |
| Recherche lente | Index volumineux | Utiliser des filtres pour réduire le scope |
| Suppression échoue | Document en cours d'utilisation | Attendre 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
- Recherche sémantique - Trouve les passages pertinents
- Citations - Sources des réponses avec liens
- Historique - Conversations sauvegardées
- Upload fichiers - Analyse ponctuelle d'un document
- Export - Télécharger la conversation
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Réponse "Je ne sais pas" | Information absente de la base | Vérifier que le document est indexé |
| Pas de citations | Seuil de similarité trop haut | Reformuler la question |
| Réponse lente | Base volumineuse | Normal pour >10k chunks |
| Erreur 500 | Connexion Azure Search | Vé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
- Sélection multiple - Cocher plusieurs sources
- Confirmation - Double validation avant suppression
- Historique - Journal des suppressions
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Suppression partielle | Chunks orphelins | Relancer la suppression |
| Source toujours visible | Cache 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
- Liste chronologique - Conversations par date
- Recherche - Trouver par mots-clés
- Reprendre - Continuer une conversation
- Exporter - Télécharger en JSON/TXT
- Supprimer - Effacer une conversation
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Historique vide | Aucune conversation sauvegardée | Les conversations sont auto-sauvegardées |
| Conversation incomplète | Session interrompue | Les 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.
Fonctionnalités
Étape 1 - Sélection du Modèle :
| Famille | Modèles | Usage |
|---|---|---|
| F1 Realtime | gpt-realtime, gpt-realtime-mini | Voix temps réel natif |
| F2 GPT-4o/4.1 | gpt-4o, gpt-4.1, gpt-4o-mini | STT + LLM + TTS pipeline |
| F3 GPT-5 | gpt-5, gpt-5-mini, gpt-5-nano | Nouvelle 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ème | Cause | Solution |
|---|---|---|
| Bouton "Suivant" grisé | Champ requis non rempli | Vérifier les sélections de l'étape courante |
| Voix non listée | Locale non supportée | Changer de locale ou de langue |
| Erreur publication | Nom d'agent déjà existant | Choisir un nom unique |
| Tools non visibles | Aucun tool créé | Créer d'abord des tools dans Création → Tool |
| Génération IA échoue | Quota OpenAI atteint | Attendre 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
- Enregistrer - Utiliser le microphone pour capturer des échantillons
- Uploader - Importer des fichiers audio existants (WAV, MP3)
- Durée requise - Minimum 30 secondes d'audio clair
- Nom et langue - Identifier la voix
- Génération - Traitement Azure (~5-10 minutes)
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Qualité voix médiocre | Audio bruité ou court | Enregistrer dans un lieu calme, >60s |
| Micro non détecté | Permissions navigateur | Autoriser l'accès au microphone |
| Génération échoue | Format audio non supporté | Convertir en WAV 16kHz mono |
| Voix non utilisable | Consentement manquant | Cocher 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.
Fonctionnalités
- Étape 1 - Sélection de l'agent parmi les agents publiés
- Étape 2 - Import CSV/Excel (Nom, Téléphone, Email...) avec validation
- Étape 3 - Configuration : nom, plage horaire, appels simultanés
- Lancement - Démarrage immédiat ou planifié
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Import CSV échoue | Encodage incorrect | Sauvegarder en UTF-8 |
| Numéros rejetés | Format invalide | Utiliser format E.164 (+33...) |
| Campagne ne démarre pas | Hors plage horaire | Vérifier les heures configurées |
| Aucun agent disponible | Tous en brouillon | Publier 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 Tool | Description | Cas d'usage |
|---|---|---|
| OpenAPI | Importer une spec OpenAPI/Swagger | APIs tierces documentées |
| REST Endpoint | Configurer un endpoint HTTP manuel | APIs simples sans spec |
| Code Python | Écrire du code Python exécutable | Logique métier complexe |
| RAG | Recherche dans base de connaissances | Questions sur documents |
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Import OpenAPI échoue | Spec invalide | Valider sur editor.swagger.io |
| Tool non exécuté | Description trop vague | Améliorer la description du tool |
| Erreur Python | Import non autorisé | Utiliser uniquement les modules whitelistés |
| Timeout 60s | API externe lente | Optimiser 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
- Statistiques - Total, Actifs, Brouillons en haut de page
- Grille de cartes - Une carte par agent avec : Badge statut, Référence, Nom, Modèle, Voix, Tools
- Filtres - Par modèle, statut, date de création
- Recherche - Par nom d'agent
- Actions - Tester, Modifier, Dupliquer, Supprimer
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Galerie vide | Aucun agent créé | Créer un agent via Création → Agent |
| Agent non visible | Filtres actifs | Réinitialiser les filtres |
| Bouton Test grisé | Agent en brouillon | Publier l'agent d'abord |
| Chargement lent | Beaucoup d'agents | Utiliser 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
- Cartes agents - Nom, modèle LLM, nombre de tools
- Test chat - Interface de chat intégrée
- Embed - Code iframe pour intégration web
- Statistiques - Messages, utilisateurs, satisfaction
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Chat ne répond pas | Quota API atteint | Vérifier les quotas Azure OpenAI |
| Embed ne charge pas | Domaine 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
- Avatars vidéo - 6 personnages Azure (Lisa, Harry, etc.)
- Avatars photo - VASA-1/VASA-2 (30 personnages)
- Preview - Aperçu vidéo avant test
- Session vidéo - Test avec WebRTC
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Vidéo noire | WebRTC bloqué | Autoriser les connexions WebRTC |
| Avatar figé | Session expirée | Relancer la session |
| Pas de lip-sync | Audio non reçu | Vé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
- Filtres - Date, Agent, Statut, Durée, Sentiment
- Détails session - Date/Heure, Durée, Agent, Transcription
- Analyse - Sentiment, Tokens consommés, Coût
- Export - CSV, JSON
- Rejouer - Écouter l'audio (si enregistré)
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Historique vide | Aucune session effectuée | Tester un agent pour créer une session |
| Transcription manquante | Session interrompue | Les sessions <10s ne sont pas sauvées |
| Export échoue | Trop de données | Ré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
- Carte campagne - Nom, Agent, Statut (En cours/Terminée/Pausée)
- Progression - Barre X/Y appels effectués
- Taux de succès - Pourcentage de réussite
- Actions - Voir détails, Pause/Reprendre, Exporter
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Campagne bloquée | Tous contacts appelés | Ajouter de nouveaux contacts |
| Taux succès bas | Numéros invalides | Nettoyer la liste de contacts |
| Pas de progression | Hors plage horaire | Attendre 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
- Carte voix - Nom, Langue, Date création
- Écouter - Aperçu audio de la voix
- Utiliser - Assigner à un agent
- Supprimer - Retirer la voix (irréversible)
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Voix non listée | Génération en cours | Attendre 5-10 minutes |
| Aperçu silencieux | Navigateur bloque audio | Cliquer sur la page d'abord |
| Voix disparue | Expiration Azure | Les 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égorie | Exemples |
|---|---|
| Basiques | calculator, weather, translator |
| Communication | email, sms, end_conversation |
| Recherche | search_web, places, knowledge_base |
| Voyage | flight_search, hotel_booking |
| Services | prayer_times, pharmacy_locator |
| Custom | Vos tools personnalisés |
- Filtres - Par catégorie, type (système/custom)
- Recherche - Par nom ou description
- Détails - Voir la configuration complète
- Actions - Modifier, Dupliquer, Supprimer (custom uniquement)
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Tool système non modifiable | Protégé | Dupliquer pour créer une version custom |
| Tool custom disparu | Supprimé ou erreur | Recréer le tool |
| Test tool échoue | Configuration invalide | Vé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
- Analyse Sentiment - Distribution positif/neutre/négatif avec graphiques
- Tendances - Évolution dans le temps (jour/semaine/mois)
- Performance par Agent - Comparaison entre agents
- Durée moyenne - Statistiques des interactions
- Taux d'interruption - Fréquence des barge-in
- Export - Télécharger les rapports
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Graphiques vides | Pas de données sur la période | Élargir la plage de dates |
| Sentiment non analysé | Transcription trop courte | Normal pour sessions <30s |
| Chargement lent | Beaucoup de données | Ré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
- Volume d'appels - Par jour/semaine/mois avec graphiques
- Revenus générés - Facturation client calculée
- Coûts Azure - Consommation ressources (OpenAI, Speech, Search)
- Marge brute - Revenus - Coûts en temps réel
- Coût par minute - Évolution et tendances
- Comparaison - Période actuelle vs précédente
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Revenus à zéro | Taux non configuré | Configurer le taux €/min dans Accueil |
| Coûts non affichés | Données Azure manquantes | Vérifier la connexion aux APIs Azure |
| Marge négative | Coûts > Revenus | Augmenter 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
- Header - Nom agent, statut connexion, bouton retour
- Zone conversation - Transcription utilisateur et agent
- Indicateurs - Qui parle, tools exécutés
- Contrôles - Boutons Start/Stop/Mute
- Waveform - Visualisation audio en temps réel
Indicateurs de Statut :
| Indicateur | Signification |
|---|---|
| ● 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ème | Cause | Solution |
|---|---|---|
| Connexion échoue | WebSocket bloqué | Vérifier le pare-feu, utiliser HTTPS |
| Micro non détecté | Permissions refusées | Autoriser l'accès au microphone |
| Agent ne répond pas | Pas de VAD détecté | Parler plus fort, vérifier le micro |
| Audio crackling | Bande passante insuffisante | Améliorer la connexion internet |
| Tool timeout | API externe lente | Le tool a 60s max, vérifier l'endpoint |
| Session interrompue | Inactivité 5min | Relancer 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
- Zone vidéo - Affichage de l'avatar animé (720p/1080p)
- Lip-sync - Synchronisation des lèvres avec l'audio
- WebRTC - Streaming vidéo temps réel
- Contrôles - Start/Stop, Plein écran
- Transcription - Sous-titres en temps réel
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Vidéo noire | WebRTC bloqué | Autoriser les connexions WebRTC/TURN |
| Avatar figé | Session Azure expirée | Relancer la session (max 10min) |
| Désynchronisation | Latence réseau | Améliorer la connexion |
| Vidéo pixelisée | Bande passante faible | Minimum 5 Mbps recommandé |
| Erreur ICE | Firewall bloque STUN/TURN | Ouvrir 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
- Zone de chat - Messages avec markdown supporté
- Streaming - Réponse affichée mot par mot
- Attachments - Upload de fichiers pour analyse
- Historique - Conversation sauvegardée
- Export - Télécharger la conversation
Troubleshooting
| Problème | Cause | Solution |
|---|---|---|
| Réponse bloquée | SSE interrompu | Rafraîchir la page |
| Upload échoue | Fichier trop volumineux | Max 10MB par fichier |
| Réponse tronquée | Limite tokens atteinte | Démarrer une nouvelle conversation |
12.8 Raccourcis et Navigation Rapide
Tableau Récapitulatif des Routes
| Écran | Route | Menu |
|---|---|---|
| Dashboard Accueil | / | Accueil |
| Upload Documents | /rag/upload | Waka AXIOM |
| Crawler Web | /rag/crawl | Waka AXIOM |
| SharePoint | /rag/sharepoint | Waka AXIOM |
| Base de Connaissances | /rag/knowledge | Waka AXIOM |
| Chat RAG | /rag/chat-enhanced | Waka AXIOM |
| Créer Agent | /agents/unified/create | Création |
| Créer Voix | /creer-une-voix | Création |
| Créer Campagne | /campaigns/create/step1 | Création |
| Créer Tool | /tools/add | Création |
| Galerie Voix | /agents/gallery | Galeries |
| Galerie Texte | /text-agents/gallery | Galeries |
| Galerie Avatar | /azure-avatar/gallery | Galeries |
| Historique Voix | /agents/voice-history | Galeries |
| Galerie Campagnes | /agents/campaigns/gallery | Galeries |
| Galerie Voix Perso | /creer-une-voix/gallery | Galeries |
| Galerie Tools | /tools/ | Galeries |
| Dashboard Qualité | /quality | Dashboards |
| Dashboard Production | /production/ | Dashboards |
Chapitre 13: Code et Framework
Architecture technique, arborescence et infrastructure cloud
13.1 Stack Technique
| Couche | Technologie | Version | Rôle |
|---|---|---|---|
| Backend | Python / Flask | 3.11+ / 3.0 | API REST, WebSocket, SSE |
| Frontend | Jinja2 + Bootstrap 5 | - | Templates HTML, CSS, JS |
| Temps réel | WebSocket / WebRTC | - | Audio bidirectionnel, Avatar vidéo |
| Base de données | Azure Cosmos DB | NoSQL | Agents, Sessions, Tools, Projets |
| Recherche | Azure AI Search | - | Indexation RAG, recherche sémantique |
| Stockage | Azure Blob Storage | - | Documents, audio, avatars |
| IA | Azure OpenAI | GPT-4o, GPT-5 | LLM, Realtime API |
| Voix | Azure Speech Services | - | STT, TTS, Personal Voice |
| Avatar | Azure 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
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
| Service | Usage | Région | SKU |
|---|---|---|---|
| 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
| Container | Partition Key | Description |
|---|---|---|
AgentConfigurations | /id | Agents voix (modèle, voix, tools, instructions) |
TextAgentConfigurations | /id | Agents texte (chatbots) |
AvatarConfigurations | /id | Agents avatar (vidéo/photo) |
UnifiedAgents | /id | Agents créés via interface unifiée |
ToolsConfigurations | /id | Outils dynamiques (OpenAPI, REST, Python, RAG) |
VoiceSessions | /agent_id | Historique sessions voix |
TextSessions | /agent_id | Historique sessions texte |
Campaigns | /id | Campagnes d'appels sortants |
RAGProjects | /id | Projets RAG (configuration indexation) |
Documents | /project_id | Métadonnées documents indexés |
PersonalVoices | /id | Voix personnelles clonées |
AvatarPreferences | /user_id | Préférences avatar utilisateur |
13.6 Flux de Données
13.6.1 Session Voix Temps Réel
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
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
- Python 3.11+
- Compte Azure avec les services activés
- Azure CLI installé
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
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.
| Méthode | Commande / 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.
Composants ICE/TURN
| Composant | Rôle | Ports |
|---|---|---|
| STUN Server | Découverte IP publique (NAT traversal) | UDP 3478 |
| TURN Server | Relais média si connexion directe impossible | UDP/TCP 3478, 5349 (TLS) |
| ICE Candidates | host, srflx (server reflexive), relay | Dynamiques |
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.
(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ètre | Valeur | Description |
|---|---|---|
| Chunk Size | 512 tokens | Taille optimale pour contexte LLM |
| Chunk Overlap | 50 tokens | Continuité sémantique entre chunks |
| Embedding Model | text-embedding-ada-002 | 1536 dimensions, optimisé recherche |
| Similarity Metric | Cosine | Distance angulaire entre vecteurs |
| Top-K | 5 | Nombre de chunks retournés |
| Score Threshold | 0.7 | Score 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.
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
| Ressource | Stratégie | Isolation |
|---|---|---|
| Cosmos DB | Partition Key = tenant_id | Données logiquement isolées |
| Blob Storage | Container par tenant | Répertoires séparés |
| AI Search | Index par tenant | Index dédiés |
| Azure OpenAI | Pool partagé + quotas | Rate limiting par tenant |
| Sessions | tenant_id dans session | Contexte isolé |
| Logs | Tag tenant_id | Filtrage 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
15.1 Vue d'Ensemble des Ressources
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 |
|
P2v2 / P3v3 |
| Azure Functions | Compute serverless evenementiel |
|
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 |
|
GPT-4o GPT-4o-mini GPT-4o-realtime text-embedding-3-large |
| Azure Speech Services | Reconnaissance vocale (STT) et synthese vocale (TTS) |
|
Neural voices HD voices Personal Voice |
| Azure Avatar Service | Avatars video animes avec lip-sync |
|
Lisa Harry Custom avatars |
| Azure AI Search | Recherche vectorielle et semantique |
|
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 |
|
Serverless 400 RU/s min Multi-region |
| Azure Blob Storage | Stockage objet pour fichiers volumineux |
|
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
| 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
16.1 Modeles Texte (Chat/LLM)
16.1.1 Famille F3 - GPT-5 (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
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)
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
- Pro: gpt-4o-realtime, gpt-4.1, gpt-5, gpt-5-realtime, gpt-5-chat
- Standard: gpt-4o-mini, gpt-4o-realtime-mini, gpt-4.1-mini, gpt-5-mini
- Lite: gpt-5-nano, phi4-mm-realtime, phi-4-multimodal-instruct
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)
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 |
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
15.1 Chronologie du Projet
15.2 Historique Détaillé
| Période | Jalons & Réalisations | Technologies |
|---|---|---|
| Octobre 2025 Démarrage |
|
Azure OpenAI Realtime API Flask |
| Novembre 2025 Migration |
|
Azure Voice Live Azure AI Search Cosmos DB |
| Décembre 2025 Enrichissement |
|
Azure Functions Azure Avatar WebRTC |
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
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
Modes de Traitement
| Mode | Description | Cas 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
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
# 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
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 |
# 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
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
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
# 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)
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