Créer une plateforme nodale universelle capable d’orchestrer :

- IA / LLM
- pipelines de datasets
- conception CAD
- électronique (PCB)
- firmware
- hardware temps réel (PIO)
- fabrication
- automation
This commit is contained in:
Clément SAILLANT
2026-03-15 13:32:11 +01:00
committed by GitHub
parent 225f2f856e
commit 174d620bab
13 changed files with 544 additions and 0 deletions
@@ -0,0 +1,44 @@
# Graph Schema Specification
## Structure
{
"nodes": [],
"connections": []
}
---
## Node
{
"id": "node_id",
"type": "node_type",
"params": {},
"runtime": "local_cpu"
}
---
## Connection
{
"from": ["node_id","output"],
"to": ["node_id","input"]
}
---
## Example
{
"nodes": [
{"id":"dataset","type":"dataset_file"},
{"id":"clean","type":"clean_text"},
{"id":"train","type":"lora_training"}
],
"connections":[
{"from":["dataset","out"],"to":["clean","dataset"]},
{"from":["clean","dataset"],"to":["train","dataset"]}
]
}
@@ -0,0 +1,86 @@
# Node Types Catalog
## AI Nodes
dataset_file
dataset_folder
dataset_huggingface
dataset_web_scraper
clean_text
remove_duplicates
tokenize
split_dataset
sft_training
lora_training
qlora_training
benchmark
prompt_test
reasoning_eval
deploy_api
deploy_local
deploy_cluster
---
## CAD Nodes
dimension_parameter
material_parameter
openscad_cube
openscad_cylinder
openscad_union
freecad_create_document
freecad_create_sketch
freecad_extrude
generate_stl
generate_step
---
## Electronics Nodes
kicad_create_project
kicad_add_component
kicad_connect_net
kicad_route_board
generate_gerber
generate_drill
spice_simulation
---
## Hardware Nodes
pio_program_load
pio_stream_write
pio_stream_read
hardware_trigger
dma_transfer
---
## Automation Nodes
timer
loop
condition
event_listener
---
## Data Nodes
json_parse
json_merge
csv_load
file_write
@@ -0,0 +1,46 @@
# Plugin API
## Plugin Structure
plugin_name/
nodes/
runtime/
ui/
plugin.json
---
## plugin.json
{
"name": "example_plugin",
"version": "1.0",
"nodes": ["example_node"]
}
---
## Node Definition
registry.register({
type: "example_node",
inputs: ["in"],
outputs: ["out"],
run(node, inputs) {
return { out: inputs.in }
}
})
---
## Async Node
async run(node, inputs) {
const result = await fetch("/api")
return { output: result }
}
---
Plugins peuvent ajouter nodes, UI widgets et logique runtime.
@@ -0,0 +1,68 @@
# Runtime Engine
## Execution Flow
load_graph
validate_graph
build_execution_plan
schedule_nodes
execute_nodes
store_artifacts
---
## Execution Plan
Topological sort du DAG.
---
## Worker Types
dataset_worker
training_worker
cad_worker
electronics_worker
hardware_worker
---
## Execution Example
for node in execution_order:
inputs = read_inputs(node)
outputs = node.run(node, inputs)
propagate(outputs)
---
## Distributed Execution
Le runtime peut déléguer à :
local workers
containers
clusters
---
## Artifact Storage
artifacts/
metadata
version
source node
---
## Monitoring
logs
metrics
progress
@@ -0,0 +1,207 @@
# Universal Node Engine — System Architecture
## Vision
Créer une plateforme nodale universelle capable dorchestrer :
- IA / LLM
- pipelines de datasets
- conception CAD
- électronique (PCB)
- firmware
- hardware temps réel (PIO)
- fabrication
- automation
Le système agit comme un **orchestrateur de systèmes complexes**.
Inspirations :
- Node-RED
- ComfyUI
- Kubeflow
- FreeCAD automation
- KiCad scripting
Objectif : **une interface visuelle unique pour concevoir des systèmes intelligents physiques et numériques**.
---
# Architecture globale
Le moteur est basé sur un **graph nodal exécuté par un orchestrateur**.
Node Editor
Graph Store
Pipeline Orchestrator
Scheduler
Execution Workers
Artifacts / Hardware
---
# Les quatre domaines du moteur
AI Pipeline
CAD Pipeline
Electronics Pipeline
Hardware Runtime
---
# AI / LLM Pipeline
Dataset Source
Data Processing
Dataset Builder
Training
Evaluation
Model Registry
Deployment
Nodes typiques:
dataset_file
clean_text
tokenize
instruction_dataset
lora_training
benchmark
deploy_model
Artifacts :
datasets
models
metrics
experiments
---
# CAD Pipeline
Parameters
Geometry Generation
CAD Modeling
Simulation
Manufacturing
Outils:
OpenSCAD
FreeCAD
Nodes:
dimension_parameter
openscad_geometry
freecad_sketch
freecad_extrude
generate_stl
generate_step
Artifacts:
3D models
STL
STEP
---
# Electronics Pipeline
Schematic
Netlist
PCB Layout
Fabrication Files
Outils:
KiCad
ngspice
Nodes:
kicad_create_project
kicad_add_component
kicad_connect_net
kicad_route_board
kicad_export_gerber
---
# Hardware Runtime
pio_program_load
pio_stream_write
pio_stream_read
hardware_trigger
dma_transfer
Pipeline typique:
model_inference
command_generation
pio_stream_write
hardware_execution
---
# Scheduler
local_cpu
local_gpu
gpu_cluster
cloud_api
hardware_device
---
# Execution Workers
dataset_worker
training_worker
cad_worker
electronics_worker
hardware_worker
inference_worker
---
# Artifacts System
artifacts/
datasets/
models/
cad_models/
pcb/
firmware/
experiments/
---
# Objectif final
Créer une plateforme capable de concevoir, entraîner, générer, fabriquer et piloter des systèmes intelligents dans une seule interface nodale.
@@ -0,0 +1,14 @@
# Universal Node Engine — Starter Repo
Minimal starter for the Universal Node Engine architecture.
Includes:
- Node registry
- Runtime engine
- Simple scheduler
- Example nodes
- Basic web editor placeholder
This is a lightweight scaffold to start building a nodal orchestration engine
for AI, CAD, electronics and hardware pipelines.
@@ -0,0 +1 @@
console.log("Node editor placeholder loaded")
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Node Engine Editor</title>
<style>
body{font-family:system-ui;margin:40px}
#canvas{border:1px solid #ccc;padding:20px}
</style>
</head>
<body>
<h1>Universal Node Engine Editor</h1>
<div id="canvas">
Basic placeholder for a node editor (Drawflow / Rete can be integrated here).
</div>
<script src="editor.js"></script>
</body>
</html>
@@ -0,0 +1,5 @@
export const registry = {}
export function register(node){
registry[node.type] = node
}
@@ -0,0 +1,30 @@
import { registry } from "./registry.js"
import "../plugins/example/random.js"
export async function runGraph(graph){
for(const node of graph.nodes){
const nodeDef = registry[node.type]
if(!nodeDef){
console.error("Unknown node:", node.type)
continue
}
const inputs = {}
const outputs = await nodeDef.run(node, inputs)
console.log("Node output:", outputs)
}
}
const demoGraph = {
nodes:[
{ id:"rand1", type:"random" }
]
}
runGraph(demoGraph)
@@ -0,0 +1,3 @@
export function schedule(nodes){
return nodes
}
@@ -0,0 +1,8 @@
{
"name": "universal-node-engine",
"version": "0.1.0",
"type": "module",
"scripts": {
"start": "node engine/runtime.js"
}
}
@@ -0,0 +1,9 @@
import { register } from "../../engine/registry.js"
register({
type:"random",
outputs:["value"],
run(){
return { value: Math.random() }
}
})