Implements WebModule that allows other modules to make HTTP requests through IIO pub/sub messaging system. Features: - HTTP GET/POST support via existing HttpClient - Request/response via IIO topics (web:request/web:response) - Security: blocks localhost and private IPs - Statistics tracking (total, success, failed) - Hot-reload state preservation - Custom headers and timeout configuration Module architecture: - WebModule.h/cpp: 296 lines total (within 300 line limit) - config/web.json: Configuration file - 10 integration tests (TI_WEB_001 to TI_WEB_010) Tests: 120/120 passing (110 existing + 10 new) Protocol: - Subscribe: web:request - Publish: web:response - Request fields: requestId, url, method, headers, body, timeoutMs - Response fields: requestId, success, statusCode, body, error, durationMs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.9 KiB
Prompt pour Implémenter WebModule
Salut ! Je reprends l'implémentation du WebModule pour AISSIA.
Contexte
AISSIA est un assistant vocal agentique en C++17 basé sur GroveEngine. Le projet utilise une architecture modulaire avec hot-reload et communication pub/sub via IIO.
État actuel :
- ✅ 6 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage)
- ✅ 110/110 tests passent
- ✅ LLM Service avec Claude Sonnet 4
- ✅ HttpClient.hpp déjà implémenté et fonctionnel
Objectif
Implémenter un WebModule qui permet aux autres modules de faire des requêtes HTTP de manière dynamique via IIO pub/sub.
Plan d'Implémentation
Le plan complet est dans plans/webmodule-implementation.md. Lis-le attentivement avant de commencer.
Résumé des étapes :
Phase 1: Core Module (1h)
- Créer
src/modules/WebModule.h(voir plan section 2.1) - Créer
src/modules/WebModule.cpp(voir plan section 2.1) - Créer
config/web.json(voir plan section 2.2) - Ajouter le module au
CMakeLists.txt - Ajouter le module au
src/main.cpp
Phase 2: Tests (1h)
- Créer
tests/modules/WebModuleTests.cpp(10 tests - voir plan section 2.3) - Exécuter et valider tous les tests
Phase 3: Documentation (30min)
- Mettre à jour
README.md - Mettre à jour
CLAUDE.md - Créer un exemple d'utilisation
Contraintes Importantes
Règles GroveEngine (voir CLAUDE.md)
- 200-300 lignes max par module
- Logique métier pure : pas de threading/network dans les modules
- Communication JSON via IIO pub/sub
- Hot-reload ready : sérialiser l'état dans
getState()/setState()
Protocole IIO
Requête (web:request) :
{
"requestId": "unique-id-123",
"url": "https://api.example.com/data",
"method": "GET",
"headers": {},
"body": "",
"timeoutMs": 30000
}
Réponse (web:response) :
{
"requestId": "unique-id-123",
"success": true,
"statusCode": 200,
"body": "{...}",
"durationMs": 234
}
Réutiliser l'existant
IMPORTANT : Utilise src/shared/http/HttpClient.hpp qui est déjà implémenté et fonctionnel. Regarde comment il est utilisé dans src/shared/llm/ClaudeProvider.cpp pour un exemple.
Exemple d'utilisation :
#include "../shared/http/HttpClient.hpp"
HttpClient client;
HttpResponse response = client.get("https://example.com");
// response.statusCode, response.body, response.headers
Fichiers à Créer/Modifier
Nouveaux fichiers :
src/modules/WebModule.hsrc/modules/WebModule.cppconfig/web.jsontests/modules/WebModuleTests.cpp
Fichiers à modifier :
CMakeLists.txt(ajouter WebModule target)src/main.cpp(charger WebModule)README.md(documenter WebModule)
Tests à Implémenter
Liste des 10 tests (voir plan section 2.3) :
TI_WEB_001_SimpleGetRequestTI_WEB_002_PostRequestWithBodyTI_WEB_003_InvalidUrlHandlingTI_WEB_004_TimeoutHandlingTI_WEB_005_MultipleConcurrentRequestsTI_WEB_006_RequestIdTrackingTI_WEB_007_StatisticsTrackingTI_WEB_008_StateSerializationTI_WEB_009_ConfigurationLoadingTI_WEB_010_ErrorResponseFormat
Utilise le pattern des tests existants (voir tests/modules/AIModuleTests.cpp pour exemple).
Validation
Avant de considérer le travail terminé :
Build & Tests
# Build
cmake --build build --target modules -j4
cmake --build build --target aissia_tests -j4
# Tests
./build/tests/aissia_tests "[web]"
# Vérifier que tous les tests passent toujours
./build/tests/aissia_tests --reporter compact
Critère de succès : 120/120 tests passent (110 existants + 10 nouveaux)
Hot-Reload
Teste manuellement le hot-reload :
# 1. Lance AISSIA
./run.sh
# 2. Modifie WebModule.cpp (change un log)
# 3. Rebuild juste le module
cmake --build build --target modules
# 4. Vérifie que le module se recharge automatiquement
# Les stats doivent être préservées
Code Review
- Pas de warnings de compilation
- Code suit le style existant
- Commentaires clairs
- Gestion d'erreurs complète
- Logs informatifs
Commandes Utiles
# Build complet
cmake -B build && cmake --build build -j4
# Build modules seulement
cmake --build build --target modules
# Tests avec filtre
./build/tests/aissia_tests "[web]"
# Tous les tests
./build/tests/aissia_tests --reporter compact
# Git
git add -A
git commit -m "feat: Add WebModule for HTTP requests via IIO"
git push
Ressources
Fichiers de référence
src/modules/AIModule.cpp- Exemple de module bien structurésrc/modules/MonitoringModule.cpp- Exemple de pub/sub IIOsrc/shared/http/HttpClient.hpp- Client HTTP à réutilisersrc/shared/llm/ClaudeProvider.cpp- Utilisation de HttpClienttests/modules/AIModuleTests.cpp- Pattern de tests
Documentation
plans/webmodule-implementation.md- Plan complet détaillédocs/GROVEENGINE_GUIDE.md- Guide GroveEngine completCLAUDE.md- Règles de développement
Notes Importantes
-
Pas de threading : Les requêtes HTTP sont synchrones via HttpClient. C'est OK car le module process() est appelé dans la main loop.
-
State management : Les stats (total, success, failed) doivent être sauvegardées dans
getState()et restaurées danssetState()pour le hot-reload. -
Error handling : Toutes les erreurs doivent être catchées et transformées en message
web:responseavecsuccess: false. -
Request ID : Le
requestIdpermet aux modules clients de matcher les requêtes/réponses. C'est crucial pour le pub/sub asynchrone. -
Testing : Utilise MockIO pour les tests (voir tests existants). Pas besoin de vrai serveur HTTP, les tests peuvent mocker les réponses.
Questions Fréquentes
Q: Comment tester sans vrai serveur HTTP ?
R: Utilise MockIO pour injecter des messages web:request et vérifier les web:response. Tu peux aussi créer un simple echo server en Python pour les tests d'intégration (optionnel).
Q: Le module doit-il gérer le retry ? R: Non, pas dans la v1. Le module client doit gérer le retry s'il en a besoin.
Q: Faut-il supporter websockets ? R: Non, seulement HTTP/HTTPS classique pour la v1.
Q: Cache HTTP ? R: Non pour la v1. C'est une extension future (voir plan section 7).
Bonne chance ! Suis le plan étape par étape et n'hésite pas si tu as des questions. L'objectif est d'avoir un module clean, testé, et qui s'intègre parfaitement avec l'architecture existante.
Timeline suggérée :
- Jour 1 : Phase 1 (Core Module)
- Jour 2 : Phase 2 (Tests)
- Jour 3 : Phase 3 (Documentation) + Validation finale
Auteur du plan : Claude Code (Session précédente) Date : 2025-11-28