Studio Flow

Orchestrateur de production branché sur ComfyUI, du brief à l’export

Rôle
Conception et développement
Outils
  • Python (stdlib)
  • SQLite (WAL)
  • ComfyUI API
  • n8n
  • ffmpeg
  • Webhook HMAC
  • JavaScript (sans dépendance)
Statut
Fonctionnel
Le tableau de bord après l’exécution réelle du 20/10/2026 : deux plans rendus par ComfyUI, durées mesurées par étape.
Le tableau de bord après l’exécution réelle du 20/10/2026 : deux plans rendus par ComfyUI, durées mesurées par étape.
double réservation et 0 budget dépassé, jusqu’à 4 workers concurrents
0
jobs en parallèle avec 4 workers et 2 GPU (0,93 avec 1 worker)
3,77
changement de modèle au lieu de 11, grâce à l’affinité de modèle
1
tests au vert (61 avant), sans GPU ni réseau
119
Le problème
Enchaîner des rendus longs sur une machine partagée sans rien perdre ni rendre deux fois, et ne livrer que ce qu’un humain a validé.
Pour qui
Une production image qui pilote ComfyUI et veut une revue humaine et des preuves avant toute livraison.
Le résultat
Une file qui pilote un vrai ComfyUI (2 plans rendus, empreintes vérifiées), reprend un rendu après un kill -9 sans le relancer, et répartit les jobs par ressources : 3,77 jobs en parallèle avec 4 workers et 2 GPU, 0 double réservation, 119 tests.

Contexte

Produire un lot d’images, c’est enchaîner des rendus longs sur une machine partagée : savoir ce qui a réellement tourné, reprendre proprement après une panne, ne jamais rendre deux fois la même chose, et ne livrer que ce qu’un humain a validé, avec des preuves.

Ce que j’ai construit

  • Moteur ComfyUI réel : envoi du graphe, suivi, téléchargement, avec les gabarits du paquet de nœuds (P07) et une injection typée et bornée des paramètres du plan ; sorties image, vidéo, animées et audio prises en charge.
  • Ordonnanceur par ressources : GPU, mémoire, priorités, anti-famine et affinité de modèle. 0 double réservation et 0 budget dépassé jusqu’à 4 workers ; réservation en 0,8 à 6,2 ms, worker de 26 Mo.
  • Reprise après coupure : l’identifiant du rendu est écrit en base avant l’envoi ; au redémarrage, le job se rattache au rendu en cours au lieu de le relancer.
  • Erreurs classées : transitoires relancées avec attente exponentielle, définitives en échec immédiat ; empreinte sha256 des fichiers vérifiée contre le manifeste ComfyUI.
  • Tableau de bord avec comptes (PBKDF2), rôles, CSRF et jetons ; API JSON et webhook signé HMAC (fenêtre de 300 s, rejeu refusé) ; export versionné des seuls médias approuvés.
  • Workflow n8n exécuté dans un vrai n8n 2.44 : requête signée HMAC reçue, job créé, rejeu sans doublon (201 puis 200).

Architecture 7 briques

  1. 01 · EntréeEntréesCLI, plan JSON, webhook signé HMAC
  2. 02 · DonnéesSQLitebriefs, plans, jobs, runs, médias, événements
  3. 03 · OutilOrdonnanceurGPU, mémoire, priorités, anti-famine, affinité de modèle
  4. 04 · OutilWorkerRéservation atomique (0,8–6,2 ms), relances, reprise, battement de cœur
  5. 05 · ModèleComfyUIGabarits P07, paramètres injectés et bornés
  6. 06 · HumainRevueApprouver ou rejeter chaque média
  7. 07 · SortieExportApprouvés seulement, manifeste, CSV, planche

Fabrication 5 étapes

  1. queuedJeton client unique, aucun doublon.
  2. runningGraphe envoyé, identifiant en base.
  3. succeededMédia téléchargé, empreinte vérifiée.
  4. revueApprouvé ou rejeté par un humain.
  5. exportManifeste, CSV, planche contact.

Décisions le choix, la raison, l’alternative écartée

  1. D1
    Écrire l’identifiant du rendu ComfyUI en base avant de l’envoyer.

    Après une coupure, le job se rattache au rendu en cours : démontré par un kill -9 en plein calcul, un seul prompt ComfyUI au total.

    ÉcartéRelancer d’office les jobs orphelins, au risque de rendre deux fois.

  2. D2
    Classer les erreurs : transitoires relancées, définitives en échec immédiat.

    Un manque de mémoire passager mérite une relance ; un graphe refusé, non. Attente exponentielle bornée avec gigue.

  3. D3
    Vérifier l’empreinte sha256 des octets téléchargés contre le manifeste écrit par ComfyUI.

    Ce qui est exporté est prouvé identique à ce qui a été rendu ; revérifié à l’export.

  4. D4
    Rester en bibliothèque standard, avec un webhook signé et fermé sans secret.

    Exécutable partout ; signature HMAC, fenêtre de 300 s et rejeu refusé couverts par les tests.

    ÉcartéFastAPI et un webhook ouvert.

  5. D5
    Réserver les jobs selon les ressources déclarées (GPU, mémoire) avec priorités, anti-famine et affinité de modèle.

    0 double réservation et 0 budget dépassé jusqu’à 4 workers concurrents ; 3,77 jobs en parallèle avec 4 workers et 2 GPU ; 1 changement de modèle au lieu de 11.

    ÉcartéUn worker unique, un job à la fois.

Résultats

Exécutions réelles du 20/10/2026 (ComfyUI 0.41, M1 Pro 16 Go)

ScénarioRésultat
Exécution : 2 plans soumis à ComfyUI2 réussis au premier essai, 2 empreintes conformes
Durée d’un plan, de bout en bout19,2 et 20,2 s ; soumission 2 ms, téléchargement 4 à 8 ms
Worker tué (kill -9) pendant le renduReprise : rattaché au même rendu, un seul prompt ComfyUI
Revue humaineMédias « à revoir », jamais approuvés d’office

Ordonnanceur par ressources

MesureRésultat
Doubles réservations, budgets dépassés (1 à 4 workers)0 / 0
Jobs en parallèle, 2 GPU0,93 avec 1 worker, 3,77 avec 4
Changements de modèle1 au lieu de 11 (affinité de modèle)
Temps de réservation0,8 à 6,2 ms
Mémoire d’un worker26 Mo
Tests automatisés119 (61 avant)

Livrables 5

  • Paquet Python sans dépendance : CLI, worker, moteurs simulation et ComfyUI, tableau de bord.
  • Exécution réelle sur ComfyUI et preuve de reprise après coupure, journaux à l’appui.
  • 119 tests (61 avant), dont un faux serveur ComfyUI (erreurs, OOM, empreinte falsifiée, prompt perdu).
  • Tableau de bord avec comptes (PBKDF2), rôles, CSRF et jetons ; sorties vidéo, animées et audio de ComfyUI prises en charge.
  • Workflow n8n validé par le code de n8n, webhook signé et idempotent (201 puis 200 au rejeu).

Environnement

Matériel et conditions de mesure

  • Rendus réels mesurés sur MacBook Pro M1 Pro 16 Go avec ComfyUI 0.41 ; l’ordonnanceur répartit les workers selon les GPU et la mémoire déclarés.
  • Python 3.11+ et ffmpeg, sans autre dépendance ; tableau de bord servi en local.

Reproduire commandes du README

Code privé : accès en lecture sous accord de confidentialité, ou démo en direct de 30 minutes. Demander l’accès →

./demo.sh
python3 -m studio_flow templates
python3 -m studio_flow plan-import exemples/plan-vecteur-comfyui.json --submit
python3 -m studio_flow worker
python3 -m studio_flow --config demo/studio-flow.toml serve
python3 -m pytest
  • Python 3.11+ et ffmpeg ; ComfyUI sur 127.0.0.1:8188 pour le moteur réel.
  • Le webhook reste fermé tant que STUDIO_FLOW_WEBHOOK_SECRET n’est pas défini.

Galerie 2

Le détail d’un job : identifiant du rendu ComfyUI, étapes chronométrées, média et empreinte vérifiée.
La revue humaine : rien n’est exporté sans approbation.

Ce que ce projet change pour vous

Le même savoir-faire, sur votre sujet.

01

Orchestrer votre production

Un suivi plan par plan, des reprises propres et une revue obligatoire : rien ne part chez le client sans validation.

02

Votre ComfyUI, piloté

Vos workflows deviennent des gabarits paramétrables, appelés par n8n, un script ou votre outil interne, sans doublon.

03

Une robustesse prouvée

Double livraison, coupure, erreur moteur, sortie absente, annulation : chaque cas est testé avant la mise en service.