feat(ai): ConversationSummarizer + TtsEngine + ScheduledReply (SF-M5-02, #61, #66, #67) #150

Closed
charles wants to merge 4 commits from feat/61-66-67-m5-ai into main
Owner

Résumé

Trois features M5 dans fractal-ai :

#61 — Résumé de conversation IA

  • SummarizeRequest : collecte jusqu'à 200 messages, construit le prompt
  • ConversationSummarizerVm : état UI (IdleCollectingGeneratingDone)
  • Prompt configurable en TOML

#66 — Mode Voice-to-Voice

  • TtsEngine trait async : synthesize(), health_check()
  • PiperEngine : subprocess piper (modèles locaux ~50 MB)
  • EspeakEngine : subprocess espeak-ng (fallback léger)
  • VoiceToVoiceState : machine d'état Idle → Listening → Transcribing → WaitingAgent → Synthesizing → Playing → Ended

#67 — Réponses programmées

  • ScheduledReply + ScheduleStatus : Pending/Sent/Cancelled/Failed
  • ScheduledReplyStore : schedule(), cancel(), due_replies(), mark_sent()
  • Persistance SQLite planifiée (stub in-memory)
  • 11 tests unitaires au total

Closes #61, #66, #67

Plan de test

  • cargo test -p fractal-ai passe
  • SummarizeRequest::truncate() garde les 200 messages les plus récents
  • PiperEngine::health_check()Unavailable si modèle absent
  • ScheduledReplyStore::due_replies() retourne les messages dont send_at ≤ now
## Résumé Trois features M5 dans `fractal-ai` : **#61 — Résumé de conversation IA** - `SummarizeRequest` : collecte jusqu'à 200 messages, construit le prompt - `ConversationSummarizerVm` : état UI (`Idle` → `Collecting` → `Generating` → `Done`) - Prompt configurable en TOML **#66 — Mode Voice-to-Voice** - `TtsEngine` trait async : `synthesize()`, `health_check()` - `PiperEngine` : subprocess `piper` (modèles locaux ~50 MB) - `EspeakEngine` : subprocess `espeak-ng` (fallback léger) - `VoiceToVoiceState` : machine d'état `Idle → Listening → Transcribing → WaitingAgent → Synthesizing → Playing → Ended` **#67 — Réponses programmées** - `ScheduledReply` + `ScheduleStatus` : `Pending`/`Sent`/`Cancelled`/`Failed` - `ScheduledReplyStore` : `schedule()`, `cancel()`, `due_replies()`, `mark_sent()` - Persistance SQLite planifiée (stub in-memory) - 11 tests unitaires au total Closes #61, #66, #67 ## Plan de test - [ ] `cargo test -p fractal-ai` passe - [ ] `SummarizeRequest::truncate()` garde les 200 messages les plus récents - [ ] `PiperEngine::health_check()` → `Unavailable` si modèle absent - [ ] `ScheduledReplyStore::due_replies()` retourne les messages dont `send_at ≤ now`
charles closed this pull request 2026-04-06 02:27:08 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.