Monorepo pnpm avec NestJS backend en architecture hexagonale. - Structure hexagonale complète (ports, adapters, domain entities) - 9 entities TypeORM (Home, User, Device, Credentials, Session, Message, Memory, Timer) - Migration initiale SQL avec pgvector support - Docker Compose (PostgreSQL 16 + pgvector + Redis 7) - Config partagée (tsconfig, ESLint, Prettier) - Outbound ports définis (STT, TTS, LLM, Cache, Storage, VectorStore) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
11 KiB
Fonctionnalités
Vue d'ensemble
Ce document détaille l'ensemble des fonctionnalités prévues pour Ti-Pote, organisées par domaine. Chaque feature inclut une description, les cas d'usage principaux, et les dépendances techniques.
1. Conversation vocale
Description
Interaction vocale bidirectionnelle fluide avec Ti-Pote. L'utilisateur parle naturellement, Ti-Pote comprend et répond avec une voix synthétique de qualité.
Cas d'usage
- L'utilisateur dit "Hey Ti-Pote, quel temps fait-il demain ?" → Ti-Pote répond vocalement avec la météo.
- Conversation à plusieurs tours : "Rappelle-moi ce rendez-vous" → "Lequel ?" → "Celui avec Marie" → "Ton rendez-vous avec Marie est jeudi à 14h."
- L'utilisateur interrompt Ti-Pote pendant qu'il parle → Ti-Pote s'arrête et écoute (barge-in).
Composants techniques
- Wake word : Détection locale sur le robot via OpenWakeWord ou Porcupine. Mot par défaut : "Hey Ti-Pote". Configurable via l'app.
- VAD (Voice Activity Detection) : Détection de fin de parole pour savoir quand l'utilisateur a fini de parler. Silero VAD ou WebRTC VAD.
- STT : Transcription via Deepgram (streaming, faible latence) ou Whisper (fallback).
- LLM : Modèle configurable (GPT-4, Claude, Mistral…). Le system prompt définit la personnalité de Ti-Pote.
- TTS : Synthèse vocale via ElevenLabs (qualité), Azure TTS, ou Google TTS. Streaming pour réduire la latence perçue.
Latence cible
Moins de 1.5 secondes entre la fin de la phrase de l'utilisateur et le début de la réponse audio de Ti-Pote.
2. Function calling (actions concrètes)
Description
Ti-Pote peut exécuter des actions en réponse aux demandes de l'utilisateur. Le LLM décide quelle function appeler en fonction du contexte de la conversation.
Architecture du function calling
Le core maintient un registre de tools (functions) disponibles. Chaque tool est défini avec un nom, une description, et un schéma de paramètres (JSON Schema). Le LLM reçoit ces définitions dans son contexte et peut décider d'en appeler une.
// Exemple de définition de tool
const calendarTools = [
{
name: 'create_calendar_event',
description: 'Crée un événement dans le calendrier de l\'utilisateur',
parameters: {
type: 'object',
properties: {
title: { type: 'string', description: 'Titre de l\'événement' },
start: { type: 'string', description: 'Date/heure de début (ISO 8601)' },
end: { type: 'string', description: 'Date/heure de fin (ISO 8601)' },
description: { type: 'string', description: 'Description optionnelle' },
},
required: ['title', 'start', 'end'],
},
},
];
Le flux complet : l'utilisateur demande quelque chose → STT transcrit → le LLM analyse et retourne un function call → le core exécute la function → le résultat est renvoyé au LLM → le LLM formule une réponse naturelle → TTS → audio.
3. Agenda / Calendrier
Description
Gestion complète du calendrier via la voix. Ti-Pote peut créer, modifier, supprimer et consulter des événements.
Cas d'usage
- "Mets un rendez-vous demain à 15h avec le dentiste"
- "Qu'est-ce que j'ai de prévu cette semaine ?"
- "Décale mon rendez-vous de jeudi à vendredi"
- "Supprime le rendez-vous avec Pierre"
- "Quand est-ce que je suis libre mardi après-midi ?"
Intégrations
- Google Calendar (MVP) — via OAuth2 et l'API Google Calendar v3
- Apple Calendar (futur) — via CalDAV
- Outlook / O365 (futur) — via Microsoft Graph API
Functions exposées au LLM
create_calendar_event— Créer un événementlist_calendar_events— Lister les événements sur une périodeupdate_calendar_event— Modifier un événement existantdelete_calendar_event— Supprimer un événementfind_free_slots— Trouver des créneaux libres
4. Emails et messagerie
Description
Envoi et consultation d'emails par la voix. À terme, intégration avec WhatsApp et d'autres messageries.
Cas d'usage
- "Envoie un email à Marie pour confirmer le dîner de samedi"
- "Lis-moi mes emails non lus"
- "Réponds à l'email de Pierre en disant que je suis d'accord"
- "Envoie un WhatsApp à Maman pour dire que j'arrive dans 20 minutes"
Intégrations
- SMTP/IMAP (MVP) — Envoi et lecture d'emails
- Gmail API (MVP) — Alternative à IMAP, plus riche
- WhatsApp Business API (futur) — Envoi de messages
- Telegram Bot API (futur) — Alternative plus simple à WhatsApp
Functions exposées au LLM
send_email— Envoyer un emaillist_emails— Lister les emails récents / non lusread_email— Lire le contenu d'un email spécifiquereply_email— Répondre à un emailsend_message— Envoyer un message (WhatsApp, Telegram…)
5. Minuteurs et alarmes
Description
Gestion de minuteurs (countdown) et d'alarmes (heure fixe) par la voix. Le robot peut jouer un son ou annoncer vocalement l'expiration.
Cas d'usage
- "Mets un minuteur de 10 minutes pour les pâtes"
- "Réveille-moi à 7h demain matin"
- "Combien de temps reste sur mon minuteur ?"
- "Annule le minuteur"
- "Mets une alarme tous les jours à 8h"
Implémentation
Les timers utilisent Redis avec des TTL et les keyspace notifications pour détecter l'expiration. Les alarmes récurrentes sont gérées via un scheduler (cron-like) dans le core.
Functions exposées au LLM
set_timer— Créer un minuteur (durée)set_alarm— Créer une alarme (heure fixe, optionnellement récurrente)list_timers— Lister les timers/alarmes actifscancel_timer— Annuler un timer ou une alarmeget_timer_remaining— Temps restant sur un timer
6. Recherche web
Description
Ti-Pote peut chercher des informations sur internet à la demande de l'utilisateur et résumer les résultats.
Cas d'usage
- "Cherche la recette de la tarte tatin"
- "C'est quoi le score du match d'hier ?"
- "Trouve-moi un vol Paris-Lisbonne pour le weekend prochain"
- "Quelle est la capitale du Burkina Faso ?"
Implémentation
Utilisation d'une API de recherche (SearXNG auto-hébergé pour la privacy, ou Brave Search API, ou Google Custom Search). Le core récupère les résultats, peut extraire le contenu d'une page si nécessaire, et envoie un résumé au LLM pour formulation de la réponse.
Functions exposées au LLM
web_search— Effectuer une rechercheread_webpage— Extraire le contenu d'une URL spécifiqueget_weather— Météo (API dédiée, type OpenWeatherMap)get_news— Actualités récentes
7. Reconnaissance visuelle
Description
Ti-Pote peut "voir" via sa caméra et répondre à des questions sur ce qu'il observe. Le traitement est fait côté cloud (le robot streame l'image, le core analyse).
Cas d'usage
- "Qu'est-ce que tu vois devant toi ?"
- "Est-ce que tu reconnais cette personne ?" (reconnaissance faciale optionnelle)
- "Lis ce qui est écrit sur ce papier" (OCR)
- "C'est quoi cette plante ?"
Implémentation
Le robot capture une image (ou un court flux vidéo) et l'envoie au core. Le core utilise un modèle de vision (GPT-4 Vision, Claude Vision, ou un modèle dédié) pour analyser l'image. Pour la reconnaissance faciale, un modèle spécifique type face-api.js ou un service cloud.
Functions exposées au LLM
capture_image— Demander au robot de prendre une photoanalyze_image— Analyser une image avec un modèle de visionrecognize_face— Identifier une personne connueread_text_from_image— OCR sur une image
8. Mobilité (module base mobile)
Description
Si le robot est équipé du module de base mobile, il peut se déplacer dans l'espace. Commandes vocales simples pour le diriger.
Cas d'usage
- "Viens ici"
- "Va dans la cuisine"
- "Tourne-toi vers moi"
- "Suis-moi"
Implémentation
Le core envoie des commandes de mouvement au robot via WebSocket. Le robot exécute localement les commandes moteur. La navigation avancée (cartographie, évitement d'obstacles) nécessiterait du traitement local plus poussé — à voir en phase ultérieure.
Functions exposées au LLM
move_robot— Déplacer le robot (direction, distance)rotate_robot— Tourner le robotstop_robot— Arrêter tout mouvementgo_to_base— Retourner à la station de charge
9. Notifications proactives
Description
Ti-Pote ne se contente pas de répondre — il peut initier des interactions pour alerter l'utilisateur.
Cas d'usage
- Rappel d'un rendez-vous 15 minutes avant
- Alerte météo (pluie prévue, prends ton parapluie)
- Résumé du matin (agenda du jour, météo, emails importants)
- Notification d'un email urgent
- Timer expiré
Implémentation
Un scheduler dans le core vérifie périodiquement les événements à venir, les conditions météo, les emails entrants, etc. Quand une notification est pertinente, il l'envoie au robot via WebSocket. Le robot joue un son d'attention puis annonce vocalement la notification.
L'utilisateur peut configurer dans l'app quelles notifications il veut recevoir et à quels moments (ne pas déranger la nuit, par exemple).
10. Mémoire conversationnelle
Description
Ti-Pote se souvient des conversations passées et des préférences de l'utilisateur. La relation devient plus naturelle avec le temps.
Voir memory-system.md pour l'architecture technique complète.
Cas d'usage
- "Tu te souviens du restaurant dont on avait parlé ?" → Ti-Pote retrouve la conversation.
- "Commande la même pizza que la dernière fois" → Ti-Pote sait que c'était une quatre fromages.
- Ti-Pote sait que l'utilisateur prend son café à 8h et peut proposer de lancer la machine.
11. Interface de configuration (App Web / Mobile)
Description
Une application web (et mobile à terme) pour configurer Ti-Pote et gérer son compte.
Fonctionnalités de l'app
- Gestion du compte : inscription, connexion, profil
- Gestion des robots : ajouter/supprimer un robot, nommer, configurer
- Connexion des services : lier Google Calendar, compte mail, WhatsApp…
- Configuration IA : choix du modèle LLM, de la voix TTS, du provider STT
- Wake word : choisir le mot d'activation (liste prédéfinie pour le MVP, custom plus tard)
- Mémoire : consulter ce que Ti-Pote sait, éditer ou supprimer des souvenirs
- Notifications : configurer les alertes, le mode ne pas déranger
- Historique : consulter les conversations passées
- Modules : activer/désactiver les modules physiques (caméra, base mobile…)
Stack
- React / Next.js pour le web
- React Native (ou équivalent) pour le mobile à terme
- Servi par le core NestJS ou déployé séparément en statique
12. Mode offline dégradé
Description
Si le robot perd la connexion internet ou que le core est injoignable, certaines fonctionnalités de base restent disponibles localement.
Fonctionnalités offline
- Timers et alarmes (gérés localement)
- Heure et date
- Commandes de base pré-enregistrées
- Feedback audio (sons, bips) pour confirmer les actions
Implémentation
Le firmware du robot embarque un petit ensemble de commandes reconnues localement (via un modèle de reconnaissance de commandes léger type TensorFlow Lite). Pas de conversation complète, juste des commandes utilitaires.