feat: A2A + RAG library + benchmarks + dataset merge + close items

Mascarade PR #33: A2A protocol + RAG Document Library
Plan 27: P0 100% (MCP registered, commercial docs, docker-compose)
Plan 24: 100 benchmark prompts, dataset merge script, sub-tasks closed
Plan 23: T-MA-030 (A2A) + T-MA-032 (RAG library) marked done

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
L'électron rare
2026-03-25 18:31:16 +01:00
parent 07b74d87e5
commit 808dd34f79
4 changed files with 252 additions and 11 deletions
@@ -36,12 +36,12 @@
- [x] T-MS-001: Créer `mistral_studio_tui.sh` cockpit (Agents, Files, Fine-tune, Batches, OCR, Audio, Codestral)
- [ ] T-MS-002: Préparer dataset KiCad JSONL (format ChatML, >5k exemples) — [ready: Mistral key active]
- [ ] Merger build_kicad_dataset.py outputs
- [ ] Valider format avec `training/scripts/validate_dataset.py`
- [x] Merger build_kicad_dataset.py outputs — DONE via `tools/mistral/merge_datasets.sh` (produces `datasets/kicad_merged.jsonl`)
- [x] Valider format avec `validate_dataset.py` — DONE (merge script calls validate_dataset.py automatically)
- [ ] Upload via `mistral_studio_tui.sh --files-upload`
- [ ] T-MS-003: Préparer dataset SPICE+Embedded JSONL — [ready: Mistral key active]
- [ ] Merger build_spice_dataset.py + build_embedded_dataset.py + build_stm32_dataset.py
- [ ] Valider et upload
- [x] Merger build_spice_dataset.py + build_embedded_dataset.py + build_stm32_dataset.py — DONE via `tools/mistral/merge_datasets.sh` (produces `datasets/spice_embedded_merged.jsonl`)
- [x] Valider et upload — validation DONE (merge script calls validate_dataset.py); upload pending
- [ ] T-MS-004: Upload docs commerciales pour Tower Document Library — [ready: Mistral key active]
- [x] Exporter docs Outline (formations, produits) — done: 4 docs in `docs/commercial/` (factory_4_0_enterprise, pro, slide_deck, starter)
- [ ] Upload via Files API [ready: needs API call]
@@ -61,7 +61,7 @@
- [ ] Configurer et lancer job
- [ ] Valider modèle `ft:spice-embedded-v1`
- [ ] T-MS-012: Batch benchmark 100 prompts métier — [ready: Mistral key active] + depends T-MS-010/011
- [ ] Créer fichier JSONL 100 prompts (20 KiCad, 20 SPICE, 20 embedded, 20 IoT, 20 mixed)
- [x] Créer fichier JSONL 100 prompts (20 KiCad, 20 SPICE, 20 embedded, 20 IoT, 20 mixed) — DONE in `tools/evals/prompts/metier_100_benchmark.jsonl`
- [ ] Exécuter batch sur modèle base
- [ ] Exécuter batch sur modèle fine-tuned
- [ ] Comparer résultats (scoring automatique + review)
@@ -5,7 +5,7 @@
- [x] Créer `tools/industrial/opcua_mcp.py` — MCP server OPC-UA (browse, read, write, subscribe, discover) — asyncua + stub
- [x] Créer `tools/industrial/mqtt_mcp.py` — MCP server MQTT (subscribe, publish, topics, history) — paho-mqtt + stub
- [x] Créer `tools/industrial/run_opcua_mcp.sh` + `run_mqtt_mcp.sh` — scripts de lancement (pattern apify_mcp)
- [ ] Enregistrer les 2 MCP dans Cline + Claude Code settings
- [x] Enregistrer les 2 MCP dans Cline + Claude Code settings — DONE (opcua + mqtt registered in Cline MCP settings)
- [x] Tester OPC-UA avec un simulateur (Prosys, open62541) — `tools/industrial/test_opcua_simulator.py`
- [x] Tester MQTT avec Mosquitto local — `tools/industrial/test_mqtt_local.py`
@@ -18,10 +18,10 @@
## P0 — Documentation commerciale
- [ ] Rédiger fiche offre Starter (Copilote Opérateur)
- [ ] Rédiger fiche offre Pro (Factory Intelligence)
- [ ] Rédiger fiche offre Enterprise (Full Factory 4.0)
- [ ] Créer démo slide deck avec architecture Mermaid
- [x] Rédiger fiche offre Starter (Copilote Opérateur) — DONE in `docs/commercial/factory_4_0_starter.md`
- [x] Rédiger fiche offre Pro (Factory Intelligence) — DONE in `docs/commercial/factory_4_0_pro.md`
- [x] Rédiger fiche offre Enterprise (Full Factory 4.0) — DONE in `docs/commercial/factory_4_0_enterprise.md`
- [x] Créer démo slide deck avec architecture Mermaid — DONE in `docs/commercial/factory_4_0_slide_deck.md`
## P1 — Vision industrielle
@@ -39,7 +39,7 @@
## P1 — Packaging déploiement
- [ ] Docker Compose `factory-stack.yml` (Mascarade + Ollama + Qdrant + Grafana + InfluxDB + Mosquitto)
- [x] Docker Compose `factory-stack.yml` (Mascarade + Ollama + Qdrant + Grafana + InfluxDB + Mosquitto) — DONE in `deploy/factory/docker-compose.yml`
- [x] Script `deploy_factory.sh` one-liner — health check retry, Grafana auto-import, env var customization
- [x] Documentation déploiement on-premise — `docs/FACTORY_4_0_DEPLOY_GUIDE.md`
- [x] Test end-to-end avec données simulées — `deploy/factory/simulate_data.py` (MQTT fake sensors + anomalies)
@@ -0,0 +1,100 @@
{"domain": "kicad", "prompt": "Génère un schéma KiCad (netlist format) pour un circuit de protection ESD avec une TVS bidirectionnelle SMAJ5.0CA sur une ligne USB 2.0.", "expected_keywords": ["TVS", "ESD", "netlist", "USB", "SMAJ5.0CA"]}
{"domain": "kicad", "prompt": "Explique comment créer une empreinte custom pour un connecteur FPC 0.5mm pitch 40 broches dans KiCad 8. Donne le code Python pour le scripting.", "expected_keywords": ["footprint", "FPC", "pitch", "scripting", "pad"]}
{"domain": "kicad", "prompt": "Review ce schéma KiCad : un régulateur LDO AMS1117-3.3 alimenté en 5V USB. Identifie les erreurs potentielles de découplage et propose des corrections.", "expected_keywords": ["LDO", "découplage", "condensateur", "AMS1117", "bypass"]}
{"domain": "kicad", "prompt": "Génère les règles DRC pour un PCB 4 couches avec impédance contrôlée 50 ohms sur les pistes RF 2.4GHz. Format KiCad DRC rules.", "expected_keywords": ["DRC", "impédance", "50 ohms", "RF", "clearance"]}
{"domain": "kicad", "prompt": "Crée un symbole KiCad pour un microcontrôleur STM32H743VIT6 avec tous les pins groupés par fonction (GPIO, ADC, SPI, I2C, USB, etc.).", "expected_keywords": ["symbole", "STM32H743", "pin", "GPIO", "SPI"]}
{"domain": "kicad", "prompt": "Explique le placement optimal des condensateurs de découplage pour un FPGA Xilinx Artix-7 sur un PCB 6 couches. Donne les contraintes DRC associées.", "expected_keywords": ["découplage", "FPGA", "Artix-7", "via", "plan de masse"]}
{"domain": "kicad", "prompt": "Génère un script Python KiCad pour extraire automatiquement la BOM (Bill of Materials) avec regroupement par valeur et empreinte, export CSV.", "expected_keywords": ["BOM", "script", "CSV", "regroupement", "composant"]}
{"domain": "kicad", "prompt": "Conçois le stackup d'un PCB 4 couches pour un design mixte analogique/numérique. Indique l'épaisseur des couches, les matériaux, et les plans de référence.", "expected_keywords": ["stackup", "couche", "FR4", "plan de masse", "diélectrique"]}
{"domain": "kicad", "prompt": "Comment configurer les classes de nets dans KiCad pour un design avec alimentation 48V, signaux analogiques bas niveau et bus SPI haute vitesse ?", "expected_keywords": ["net class", "clearance", "track width", "48V", "SPI"]}
{"domain": "kicad", "prompt": "Crée un script KiCad pour vérifier automatiquement que toutes les résistances de pull-up I2C sont présentes et correctement dimensionnées dans un schéma.", "expected_keywords": ["pull-up", "I2C", "résistance", "script", "vérification"]}
{"domain": "kicad", "prompt": "Explique comment importer un modèle 3D STEP dans KiCad et l'aligner avec l'empreinte d'un connecteur USB-C. Détaille les offsets et rotations.", "expected_keywords": ["STEP", "3D", "USB-C", "offset", "rotation"]}
{"domain": "kicad", "prompt": "Génère les contraintes de routage pour des paires différentielles USB 3.0 SuperSpeed (5 Gbps) dans KiCad : impédance, espacement, longueur.", "expected_keywords": ["différentielle", "USB 3.0", "impédance", "90 ohms", "length matching"]}
{"domain": "kicad", "prompt": "Comment configurer le DRC KiCad pour détecter les thermal reliefs manquants sur les vias connectés aux plans d'alimentation ?", "expected_keywords": ["thermal relief", "via", "DRC", "plan", "cuivre"]}
{"domain": "kicad", "prompt": "Écris un plugin KiCad Python qui génère automatiquement un guard ring autour d'un circuit analogique sensible sur le PCB.", "expected_keywords": ["guard ring", "plugin", "analogique", "blindage", "GND"]}
{"domain": "kicad", "prompt": "Propose un workflow KiCad complet pour la révision de schéma en équipe : annotations, ERC, netliste, gestion des variantes.", "expected_keywords": ["ERC", "netliste", "variante", "annotation", "révision"]}
{"domain": "kicad", "prompt": "Comment créer une zone de cuivre avec des vias de couture (stitching vias) pour le blindage EMI dans KiCad ? Donne les paramètres optimaux.", "expected_keywords": ["stitching", "via", "EMI", "zone", "blindage"]}
{"domain": "kicad", "prompt": "Génère un schéma KiCad pour un circuit de mesure de courant avec un amplificateur INA219 sur bus I2C, incluant le shunt et le filtrage.", "expected_keywords": ["INA219", "shunt", "I2C", "courant", "filtrage"]}
{"domain": "kicad", "prompt": "Explique comment utiliser les bus hiérarchiques dans KiCad pour un design multi-feuille avec un microcontrôleur, des capteurs, et une alimentation.", "expected_keywords": ["hiérarchique", "bus", "feuille", "label", "port"]}
{"domain": "kicad", "prompt": "Crée les règles de placement automatique (autoplace) pour un module RF ESP32-C6 : zone d'exclusion, keepout, antenne.", "expected_keywords": ["keepout", "antenne", "RF", "ESP32", "exclusion"]}
{"domain": "kicad", "prompt": "Comment exporter les fichiers Gerber et drill depuis KiCad pour fabrication chez JLCPCB ? Liste tous les fichiers nécessaires et leurs paramètres.", "expected_keywords": ["Gerber", "drill", "JLCPCB", "fabrication", "couche"]}
{"domain": "spice", "prompt": "Écris une netlist SPICE pour simuler un filtre passe-bas Butterworth 4ème ordre avec une fréquence de coupure de 1kHz utilisant des ampli-ops TL072.", "expected_keywords": ["Butterworth", "passe-bas", "TL072", "fréquence", "netlist"]}
{"domain": "spice", "prompt": "Simule en SPICE le comportement transitoire d'un convertisseur buck DC-DC (LM2596) passant de 12V à 5V/3A. Inclus le modèle de l'inductance et du condensateur de sortie.", "expected_keywords": ["buck", "LM2596", "transitoire", "inductance", "condensateur"]}
{"domain": "spice", "prompt": "Analyse AC d'un amplificateur audio classe AB push-pull avec transistors BD139/BD140. Trace le diagramme de Bode (gain et phase) de 20Hz à 20kHz.", "expected_keywords": ["Bode", "classe AB", "push-pull", "gain", "phase"]}
{"domain": "spice", "prompt": "Modélise en SPICE un circuit de charge de batterie Li-Ion (CC-CV) avec un contrôleur MCP73831. Simule le profil de charge complet.", "expected_keywords": ["CC-CV", "Li-Ion", "MCP73831", "charge", "profil"]}
{"domain": "spice", "prompt": "Crée un modèle SPICE paramétrique pour une LED RGB WS2812B incluant le comportement I-V et le spectre d'émission simplifié.", "expected_keywords": ["LED", "WS2812B", "I-V", "modèle", "paramétrique"]}
{"domain": "spice", "prompt": "Simule un oscillateur Colpitts à 10 MHz en SPICE avec un transistor 2N2222. Analyse la stabilité et le bruit de phase.", "expected_keywords": ["Colpitts", "oscillateur", "2N2222", "bruit de phase", "stabilité"]}
{"domain": "spice", "prompt": "Modélise un transformateur flyback en SPICE pour un convertisseur 230VAC vers 12VDC/2A. Inclus le couplage magnétique et les éléments parasites.", "expected_keywords": ["flyback", "transformateur", "couplage", "parasite", "magnétique"]}
{"domain": "spice", "prompt": "Analyse Monte Carlo en SPICE d'un amplificateur inverseur avec des tolérances de 5% sur les résistances. Évalue la distribution du gain.", "expected_keywords": ["Monte Carlo", "tolérance", "distribution", "gain", "résistance"]}
{"domain": "spice", "prompt": "Simule un PLL (Phase-Locked Loop) simple en SPICE avec un VCO, un diviseur de fréquence et un filtre de boucle. Fréquence cible : 1 MHz.", "expected_keywords": ["PLL", "VCO", "filtre de boucle", "fréquence", "verrouillage"]}
{"domain": "spice", "prompt": "Crée une simulation SPICE thermique d'un MOSFET IRF540N en commutation à 100 kHz. Modélise l'échauffement et le Rth(j-a).", "expected_keywords": ["thermique", "MOSFET", "IRF540N", "Rth", "commutation"]}
{"domain": "spice", "prompt": "Modélise en SPICE un circuit de protection contre les surtensions avec un varistor MOV et un fusible. Simule un pulse de foudre 8/20 us.", "expected_keywords": ["varistor", "surtension", "foudre", "fusible", "protection"]}
{"domain": "spice", "prompt": "Simule un amplificateur à transimpédance pour photodiode PIN avec un OPA380. Analyse la bande passante et le bruit en courant.", "expected_keywords": ["transimpédance", "photodiode", "OPA380", "bande passante", "bruit"]}
{"domain": "spice", "prompt": "Analyse la stabilité d'un régulateur linéaire avec compensation de boucle en SPICE. Trace la marge de phase et la marge de gain.", "expected_keywords": ["stabilité", "marge de phase", "marge de gain", "compensation", "boucle"]}
{"domain": "spice", "prompt": "Simule un convertisseur boost synchrone en SPICE avec contrôle MPPT pour panneau solaire. Optimise le duty cycle pour Vmpp = 18V.", "expected_keywords": ["boost", "MPPT", "panneau solaire", "duty cycle", "rendement"]}
{"domain": "spice", "prompt": "Crée un modèle SPICE de ligne de transmission microstrip de 50 ohms pour analyse de l'intégrité du signal à 1 GHz.", "expected_keywords": ["microstrip", "ligne de transmission", "intégrité", "50 ohms", "réflexion"]}
{"domain": "spice", "prompt": "Modélise un DAC R-2R 8 bits en SPICE et analyse la linéarité (DNL et INL) avec des résistances à 1% de tolérance.", "expected_keywords": ["DAC", "R-2R", "DNL", "INL", "linéarité"]}
{"domain": "spice", "prompt": "Simule un circuit sample-and-hold avec un commutateur analogique CD4066 et un ampli-op LM358. Analyse le droop rate et le feedthrough.", "expected_keywords": ["sample-and-hold", "CD4066", "droop", "feedthrough", "acquisition"]}
{"domain": "spice", "prompt": "Analyse paramétrique en SPICE d'un circuit RC snubber pour IGBT. Optimise R et C pour minimiser les oscillations de commutation.", "expected_keywords": ["snubber", "IGBT", "paramétrique", "oscillation", "commutation"]}
{"domain": "spice", "prompt": "Simule un détecteur de crête (peak detector) en SPICE pour un signal audio. Compare les performances avec et sans correction de diode.", "expected_keywords": ["détecteur de crête", "diode", "audio", "correction", "décharge"]}
{"domain": "spice", "prompt": "Modélise un circuit de bias pour un amplificateur RF à base de transistor BFR92A en SPICE. Optimise le point de polarisation pour un gain maximum à 900 MHz.", "expected_keywords": ["bias", "RF", "BFR92A", "polarisation", "gain"]}
{"domain": "embedded", "prompt": "Écris le driver SPI pour un capteur IMU MPU6050 sur STM32F4 en C. Inclus l'initialisation, la lecture des 6 axes, et le DMA.", "expected_keywords": ["SPI", "MPU6050", "DMA", "registre", "STM32F4"]}
{"domain": "embedded", "prompt": "Implémente un protocole de communication custom sur UART entre un ESP32 et un STM32 avec CRC16, framing, et retransmission automatique.", "expected_keywords": ["UART", "CRC16", "framing", "retransmission", "protocole"]}
{"domain": "embedded", "prompt": "Écris un driver I2S pour un DAC audio PCM5102A sur ESP32-S3 avec double buffering DMA. Supporte 44.1kHz 16bit stéréo.", "expected_keywords": ["I2S", "PCM5102A", "DMA", "buffer", "44.1kHz"]}
{"domain": "embedded", "prompt": "Configure le système de power management d'un ESP32 pour un capteur IoT sur batterie : deep sleep, wake-up timer 5min, RTC memory pour compteur.", "expected_keywords": ["deep sleep", "wake-up", "RTC", "batterie", "power"]}
{"domain": "embedded", "prompt": "Implémente un bootloader OTA sécurisé pour STM32H7 avec signature ECDSA, rollback automatique, et dual bank flash.", "expected_keywords": ["OTA", "bootloader", "ECDSA", "rollback", "dual bank"]}
{"domain": "embedded", "prompt": "Écris un scheduler RTOS coopératif minimal en C pour Cortex-M4 avec support de priorités, timeouts, et file de messages.", "expected_keywords": ["RTOS", "scheduler", "priorité", "timeout", "Cortex-M4"]}
{"domain": "embedded", "prompt": "Implémente la gestion des interrupts imbriqués (nested) sur STM32 avec NVIC. Configure les priorités pour UART, SPI, et Timer.", "expected_keywords": ["NVIC", "interrupt", "priorité", "nested", "preemption"]}
{"domain": "embedded", "prompt": "Écris un driver ADC multi-canal pour STM32F4 en mode scan continu avec DMA circulaire. 8 canaux, 12 bits, 1 MSPS.", "expected_keywords": ["ADC", "DMA", "scan", "multi-canal", "circulaire"]}
{"domain": "embedded", "prompt": "Implémente un système de logging embarqué sur STM32 avec écriture asynchrone en flash SPI (W25Q128) et rotation de logs.", "expected_keywords": ["logging", "flash", "W25Q128", "SPI", "rotation"]}
{"domain": "embedded", "prompt": "Configure FreeRTOS sur ESP32 avec 3 tâches : acquisition capteur (10 Hz), traitement FFT, et envoi réseau. Gère les mutex et semaphores.", "expected_keywords": ["FreeRTOS", "tâche", "mutex", "semaphore", "FFT"]}
{"domain": "embedded", "prompt": "Écris un driver CAN bus pour STM32F4 avec filtrage matériel, gestion d'erreurs bus-off, et support du protocole CANopen basique.", "expected_keywords": ["CAN", "filtrage", "bus-off", "CANopen", "STM32"]}
{"domain": "embedded", "prompt": "Implémente un watchdog intelligent sur Cortex-M7 : window watchdog + indépendant watchdog combinés, avec diagnostic de reset.", "expected_keywords": ["watchdog", "WWDG", "IWDG", "reset", "diagnostic"]}
{"domain": "embedded", "prompt": "Écris le code de calibration pour un accéléromètre ADXL345 sur I2C : offset, gain, cross-axis compensation, et stockage en EEPROM.", "expected_keywords": ["calibration", "ADXL345", "offset", "gain", "EEPROM"]}
{"domain": "embedded", "prompt": "Implémente un système de mise à jour firmware par carte SD sur STM32 avec vérification CRC32 et fallback sur version précédente.", "expected_keywords": ["SD", "firmware", "CRC32", "fallback", "mise à jour"]}
{"domain": "embedded", "prompt": "Configure le MPU (Memory Protection Unit) sur Cortex-M4 pour isoler le code utilisateur du kernel avec des régions mémoire dédiées.", "expected_keywords": ["MPU", "protection", "région", "kernel", "Cortex-M4"]}
{"domain": "embedded", "prompt": "Écris un driver PWM pour contrôler 6 servomoteurs sur STM32 avec timer avancé. Supporte la résolution 0.5 degré et le ramping smooth.", "expected_keywords": ["PWM", "servomoteur", "timer", "résolution", "ramping"]}
{"domain": "embedded", "prompt": "Implémente le protocole Modbus RTU esclave sur STM32 avec UART et DMA. Supporte les fonctions 03 (read), 06 (write single), 16 (write multiple).", "expected_keywords": ["Modbus", "RTU", "UART", "registre", "esclave"]}
{"domain": "embedded", "prompt": "Écris un gestionnaire de mémoire dynamique pour microcontrôleur sans MMU : pool allocator avec blocs de taille fixe et détection de fragmentation.", "expected_keywords": ["allocateur", "pool", "fragmentation", "mémoire", "bloc"]}
{"domain": "embedded", "prompt": "Configure le système de clock STM32H7 pour obtenir 480 MHz core, 240 MHz bus, et 48 MHz USB. Détaille le PLL tree complet.", "expected_keywords": ["clock", "PLL", "480 MHz", "HSE", "prescaler"]}
{"domain": "embedded", "prompt": "Implémente un shell de debug sur UART pour STM32 avec commandes : dump mémoire, read/write registre, GPIO toggle, reset.", "expected_keywords": ["shell", "debug", "UART", "commande", "registre"]}
{"domain": "iot", "prompt": "Configure un broker MQTT Mosquitto avec authentification TLS, ACL par topic, et bridge vers un second broker cloud.", "expected_keywords": ["Mosquitto", "TLS", "ACL", "bridge", "certificat"]}
{"domain": "iot", "prompt": "Implémente un client MQTT sur ESP32 avec reconnexion automatique, QoS 2, last will testament, et file d'attente offline.", "expected_keywords": ["MQTT", "QoS", "last will", "reconnexion", "ESP32"]}
{"domain": "iot", "prompt": "Conçois une architecture IoT pour 500 capteurs de température avec MQTT, InfluxDB, et Grafana. Détaille le dimensionnement et la rétention.", "expected_keywords": ["architecture", "InfluxDB", "Grafana", "dimensionnement", "rétention"]}
{"domain": "iot", "prompt": "Écris un firmware ESP32 WiFi avec provisioning via BLE (Bluetooth Low Energy), stockage des credentials en NVS, et fallback AP mode.", "expected_keywords": ["WiFi", "BLE", "provisioning", "NVS", "AP mode"]}
{"domain": "iot", "prompt": "Implémente un système OTA (Over-The-Air) pour flotte de 100 ESP32 avec serveur de rollout progressif, versioning, et rollback.", "expected_keywords": ["OTA", "rollout", "versioning", "rollback", "flotte"]}
{"domain": "iot", "prompt": "Configure un réseau BLE Mesh avec 20 noeuds ESP32 pour un système de domotique. Implémente le provisioning et le relay.", "expected_keywords": ["BLE Mesh", "noeud", "provisioning", "relay", "domotique"]}
{"domain": "iot", "prompt": "Écris un bridge MQTT-to-WebSocket en Python pour afficher en temps réel les données capteurs dans un dashboard web.", "expected_keywords": ["WebSocket", "MQTT", "bridge", "temps réel", "dashboard"]}
{"domain": "iot", "prompt": "Implémente le protocole CoAP sur ESP32 pour des capteurs basse consommation. Compare avec MQTT en termes de overhead et latence.", "expected_keywords": ["CoAP", "basse consommation", "overhead", "latence", "UDP"]}
{"domain": "iot", "prompt": "Conçois un système de détection de présence WiFi passif (WiFi CSI) avec ESP32. Analyse les variations de Channel State Information.", "expected_keywords": ["CSI", "WiFi", "détection", "présence", "Channel State"]}
{"domain": "iot", "prompt": "Configure un réseau LoRaWAN avec gateway RAK7268 et 10 capteurs de qualité d'air. Détaille le join procedure OTAA et le payload encoding.", "expected_keywords": ["LoRaWAN", "OTAA", "gateway", "payload", "spreading factor"]}
{"domain": "iot", "prompt": "Implémente un système de géolocalisation indoor avec ESP32 BLE beacons et trilatération RSSI. Précision cible : 2 mètres.", "expected_keywords": ["BLE", "beacon", "trilatération", "RSSI", "indoor"]}
{"domain": "iot", "prompt": "Écris un firmware ESP32 qui publie des métriques Prometheus via HTTP et les données capteurs via MQTT simultanément.", "expected_keywords": ["Prometheus", "métriques", "HTTP", "MQTT", "exposition"]}
{"domain": "iot", "prompt": "Configure un VPN WireGuard sur ESP32 pour sécuriser la communication IoT vers le cloud sans broker intermédiaire.", "expected_keywords": ["WireGuard", "VPN", "ESP32", "tunnel", "sécurité"]}
{"domain": "iot", "prompt": "Implémente un edge computing pipeline sur ESP32-S3 avec TensorFlow Lite Micro pour classification de vibrations (predictive maintenance).", "expected_keywords": ["TensorFlow Lite", "edge", "classification", "vibration", "inférence"]}
{"domain": "iot", "prompt": "Conçois un système de mise à jour de configuration à distance pour flotte IoT via MQTT retained messages et JSON schema validation.", "expected_keywords": ["configuration", "retained", "JSON schema", "validation", "flotte"]}
{"domain": "iot", "prompt": "Écris un driver ESP32 pour un module GPS NEO-6M avec parsing NMEA, géofencing, et publication de position via MQTT.", "expected_keywords": ["GPS", "NMEA", "géofencing", "NEO-6M", "position"]}
{"domain": "iot", "prompt": "Implémente un système de time-series compression sur ESP32 pour réduire la bande passante MQTT : delta encoding + run-length.", "expected_keywords": ["compression", "delta encoding", "run-length", "bande passante", "time-series"]}
{"domain": "iot", "prompt": "Configure un cluster EMQX MQTT broker en haute disponibilité avec 3 noeuds, load balancing, et persistent sessions.", "expected_keywords": ["EMQX", "cluster", "haute disponibilité", "load balancing", "session"]}
{"domain": "iot", "prompt": "Écris un firmware ESP32 pour un compteur d'énergie avec mesure de puissance via CT clamp, calcul RMS, et envoi MQTT toutes les secondes.", "expected_keywords": ["CT clamp", "puissance", "RMS", "compteur", "énergie"]}
{"domain": "iot", "prompt": "Implémente un protocole de discovery automatique des devices IoT sur réseau local avec mDNS et enregistrement MQTT auto-topic.", "expected_keywords": ["mDNS", "discovery", "auto-topic", "réseau local", "enregistrement"]}
{"domain": "mixed", "prompt": "Conçois l'architecture complète (schéma + firmware) d'un contrôleur LED DMX512 basé sur ESP32 avec 4 univers DMX, interface web, et artnet.", "expected_keywords": ["DMX512", "artnet", "ESP32", "univers", "web"]}
{"domain": "mixed", "prompt": "Propose un design de PCB pour une carte d'acquisition audio 4 canaux 24bit/96kHz basée sur un codec CS4270 et un STM32H743.", "expected_keywords": ["audio", "CS4270", "24bit", "STM32H743", "acquisition"]}
{"domain": "mixed", "prompt": "Analyse les causes possibles de bruit sur un bus I2C longue distance (2m) entre un ESP32 et 8 capteurs de température. Propose des solutions hardware et software.", "expected_keywords": ["I2C", "bruit", "distance", "pull-up", "buffer"]}
{"domain": "mixed", "prompt": "Conçois un circuit de mesure de courant haute précision (0-30A) avec un shunt + INA226 pour un BMS de batterie Li-Ion 48V. Inclus la protection et le filtrage.", "expected_keywords": ["INA226", "shunt", "BMS", "48V", "précision"]}
{"domain": "mixed", "prompt": "Crée un test bench automatisé en Python pour valider la conformité EMC d'une carte ESP32 : test de rayonnement, immunité, et ESD selon EN 61000.", "expected_keywords": ["EMC", "EN 61000", "rayonnement", "immunité", "ESD"]}
{"domain": "mixed", "prompt": "Conçois un système complet de monitoring de serre connectée : capteurs (temp, humidité, CO2, lumière), PCB custom, firmware ESP32, et dashboard MQTT/Grafana.", "expected_keywords": ["serre", "capteur", "ESP32", "Grafana", "MQTT"]}
{"domain": "mixed", "prompt": "Simule en SPICE puis implémente en firmware un filtre numérique IIR Butterworth passe-bande 100-500 Hz pour un accéléromètre MEMS.", "expected_keywords": ["IIR", "Butterworth", "accéléromètre", "MEMS", "passe-bande"]}
{"domain": "mixed", "prompt": "Conçois le hardware et le firmware d'un analyseur de spectre audio portable : ADC 24bit, FFT temps réel, écran OLED SSD1306, batterie LiPo.", "expected_keywords": ["FFT", "spectre", "OLED", "ADC", "batterie"]}
{"domain": "mixed", "prompt": "Propose une architecture matérielle et logicielle pour un robot autonome avec ESP32 : moteurs DC, encodeurs, IMU, LIDAR 2D, et planification de trajectoire.", "expected_keywords": ["robot", "LIDAR", "IMU", "trajectoire", "moteur"]}
{"domain": "mixed", "prompt": "Conçois un circuit d'alimentation multi-rail pour une carte embarquée complexe : 3.3V, 1.8V, 1.2V, 5V, avec séquençage et protection.", "expected_keywords": ["multi-rail", "séquençage", "protection", "régulateur", "alimentation"]}
{"domain": "mixed", "prompt": "Crée un banc de test automatisé avec Python, PyVISA, et un oscilloscope Rigol pour mesurer automatiquement le temps de montée et l'overshoot d'un signal.", "expected_keywords": ["PyVISA", "oscilloscope", "Rigol", "temps de montée", "overshoot"]}
{"domain": "mixed", "prompt": "Conçois le PCB et le firmware d'un chargeur solaire MPPT pour batterie 18650 avec monitoring BLE et protection contre la surcharge.", "expected_keywords": ["MPPT", "solaire", "18650", "BLE", "protection"]}
{"domain": "mixed", "prompt": "Implémente un système de communication optique (VLC - Visible Light Communication) avec LED et photodiode. Hardware + firmware ESP32.", "expected_keywords": ["VLC", "LED", "photodiode", "optique", "modulation"]}
{"domain": "mixed", "prompt": "Conçois un data logger industriel : 16 entrées analogiques 4-20mA, stockage SD, horodatage RTC, export USB, et communication Modbus RTU.", "expected_keywords": ["4-20mA", "data logger", "Modbus", "RTC", "SD"]}
{"domain": "mixed", "prompt": "Analyse thermique d'un PCB de puissance (convertisseur 48V/12V 20A) : simulation SPICE thermique, choix des composants, et design du dissipateur.", "expected_keywords": ["thermique", "dissipateur", "48V", "puissance", "convertisseur"]}
{"domain": "mixed", "prompt": "Conçois un réseau de capteurs sans fil mesh pour un bâtiment intelligent : protocole, topologie, consommation, autonomie batterie cible 2 ans.", "expected_keywords": ["mesh", "capteur", "batterie", "autonomie", "bâtiment"]}
{"domain": "mixed", "prompt": "Crée un firmware ESP32 + schéma KiCad pour un contrôleur de bande LED WS2812B avec effets audio-réactifs via microphone I2S.", "expected_keywords": ["WS2812B", "audio-réactif", "I2S", "microphone", "LED"]}
{"domain": "mixed", "prompt": "Implémente un système de diagnostic embarqué (type EOBD/OBD-II) sur STM32 avec CAN bus, lecture des PIDs moteur, et interface Bluetooth.", "expected_keywords": ["OBD-II", "CAN", "PID", "diagnostic", "Bluetooth"]}
{"domain": "mixed", "prompt": "Conçois un système de pesage industriel de précision : cellule de charge, amplificateur HX711, calibration multi-points, et communication MQTT pour suivi production.", "expected_keywords": ["HX711", "cellule de charge", "calibration", "pesage", "MQTT"]}
{"domain": "mixed", "prompt": "Crée une plateforme de test automatisé pour valider des PCB en production : bed-of-nails, séquence de test, PASS/FAIL, et logging dans base de données.", "expected_keywords": ["bed-of-nails", "test", "production", "séquence", "PASS/FAIL"]}
+141
View File
@@ -0,0 +1,141 @@
#!/usr/bin/env bash
# merge_datasets.sh — Merge domain JSONL datasets for Mistral fine-tuning
#
# Produces two merged files:
# - datasets/kicad_merged.jsonl (KiCad domain)
# - datasets/spice_embedded_merged.jsonl (SPICE + Embedded + STM32 domains)
#
# Then validates both with validate_dataset.py.
#
# Usage:
# ./merge_datasets.sh
# ./merge_datasets.sh --dry-run
#
# Supports T-MS-002 (KiCad dataset prep) and T-MS-003 (SPICE+Embedded dataset prep)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DATASETS_DIR="${SCRIPT_DIR}/datasets"
VALIDATE="${SCRIPT_DIR}/validate_dataset.py"
DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=true
echo "[dry-run] No files will be written."
fi
# ── Colors ──────────────────────────────────────────────────────────
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
err() { echo -e "${RED}[ERR]${NC} $*"; }
# ── Merge KiCad ─────────────────────────────────────────────────────
KICAD_OUT="${DATASETS_DIR}/kicad_merged.jsonl"
KICAD_SOURCES=()
for f in "${DATASETS_DIR}"/kicad/train.jsonl; do
[[ -f "$f" ]] && KICAD_SOURCES+=("$f")
done
echo ""
echo "=== T-MS-002: KiCad dataset merge ==="
echo "Sources found: ${#KICAD_SOURCES[@]}"
if [[ ${#KICAD_SOURCES[@]} -eq 0 ]]; then
err "No KiCad train.jsonl found in ${DATASETS_DIR}/kicad/"
exit 1
fi
if [[ "$DRY_RUN" == false ]]; then
cat "${KICAD_SOURCES[@]}" | sort -u > "$KICAD_OUT"
KICAD_LINES=$(wc -l < "$KICAD_OUT" | tr -d ' ')
ok "kicad_merged.jsonl created — ${KICAD_LINES} examples"
else
KICAD_LINES=0
for f in "${KICAD_SOURCES[@]}"; do
n=$(wc -l < "$f" | tr -d ' ')
KICAD_LINES=$((KICAD_LINES + n))
echo " would merge: $f ($n lines)"
done
ok "[dry-run] would produce ~${KICAD_LINES} lines (before dedup)"
fi
# ── Merge SPICE + Embedded + STM32 ──────────────────────────────────
SPICE_EMB_OUT="${DATASETS_DIR}/spice_embedded_merged.jsonl"
SPICE_EMB_SOURCES=()
for domain in spice embedded stm32; do
f="${DATASETS_DIR}/${domain}/train.jsonl"
[[ -f "$f" ]] && SPICE_EMB_SOURCES+=("$f")
done
echo ""
echo "=== T-MS-003: SPICE+Embedded dataset merge ==="
echo "Sources found: ${#SPICE_EMB_SOURCES[@]}"
if [[ ${#SPICE_EMB_SOURCES[@]} -eq 0 ]]; then
err "No SPICE/Embedded/STM32 train.jsonl found"
exit 1
fi
if [[ "$DRY_RUN" == false ]]; then
cat "${SPICE_EMB_SOURCES[@]}" | sort -u > "$SPICE_EMB_OUT"
SPICE_LINES=$(wc -l < "$SPICE_EMB_OUT" | tr -d ' ')
ok "spice_embedded_merged.jsonl created — ${SPICE_LINES} examples"
else
SPICE_LINES=0
for f in "${SPICE_EMB_SOURCES[@]}"; do
n=$(wc -l < "$f" | tr -d ' ')
SPICE_LINES=$((SPICE_LINES + n))
echo " would merge: $f ($n lines)"
done
ok "[dry-run] would produce ~${SPICE_LINES} lines (before dedup)"
fi
# ── Validate ─────────────────────────────────────────────────────────
if [[ "$DRY_RUN" == false ]]; then
echo ""
echo "=== Validation ==="
ERRORS=0
if [[ -f "$VALIDATE" ]]; then
echo "Validating kicad_merged.jsonl..."
if python3 "$VALIDATE" "$KICAD_OUT"; then
ok "kicad_merged.jsonl valid"
else
warn "kicad_merged.jsonl has validation warnings (see above)"
ERRORS=$((ERRORS + 1))
fi
echo ""
echo "Validating spice_embedded_merged.jsonl..."
if python3 "$VALIDATE" "$SPICE_EMB_OUT"; then
ok "spice_embedded_merged.jsonl valid"
else
warn "spice_embedded_merged.jsonl has validation warnings (see above)"
ERRORS=$((ERRORS + 1))
fi
else
warn "validate_dataset.py not found at ${VALIDATE} — skipping validation"
fi
echo ""
echo "=== Summary ==="
ok "KiCad merged: ${KICAD_OUT} (${KICAD_LINES} examples)"
ok "SPICE+Embedded merged: ${SPICE_EMB_OUT} (${SPICE_LINES} examples)"
if [[ $ERRORS -gt 0 ]]; then
warn "${ERRORS} validation warning(s) — review output above"
else
ok "All datasets valid — ready for Mistral upload (T-MS-002/003)"
fi
fi
echo ""
echo "Done."