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>
274 lines
11 KiB
Markdown
274 lines
11 KiB
Markdown
# 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.
|
|
|
|
```typescript
|
|
// 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énement
|
|
- `list_calendar_events` — Lister les événements sur une période
|
|
- `update_calendar_event` — Modifier un événement existant
|
|
- `delete_calendar_event` — Supprimer un événement
|
|
- `find_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 email
|
|
- `list_emails` — Lister les emails récents / non lus
|
|
- `read_email` — Lire le contenu d'un email spécifique
|
|
- `reply_email` — Répondre à un email
|
|
- `send_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 actifs
|
|
- `cancel_timer` — Annuler un timer ou une alarme
|
|
- `get_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 recherche
|
|
- `read_webpage` — Extraire le contenu d'une URL spécifique
|
|
- `get_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 photo
|
|
- `analyze_image` — Analyser une image avec un modèle de vision
|
|
- `recognize_face` — Identifier une personne connue
|
|
- `read_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 robot
|
|
- `stop_robot` — Arrêter tout mouvement
|
|
- `go_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](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.
|