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:
@@ -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"]}
|
||||
Executable
+141
@@ -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."
|
||||
Reference in New Issue
Block a user