Création de modèles
Les modèles sont des pipelines pré-construits empaquetés en JSON. Au déploiement, Pulse vérifie les prérequis, exécute un assistant pour collecter la configuration, remplace les variables et instancie chaque nœud comme un graphe d'agents actifs.
Retour au hub développeursEmplacement des modèles
Intégrés
Livrés avec la version. Curés et revus avant fusion. Disponibles sur chaque installation.
Modèles utilisateur
Par installation, rechargés à la demande. Déposez un JSON dans le dossier user-templates ; il ne se propage à aucune autre installation.
Anatomie d'un modèle
Un modèle est un unique document JSON : métadonnées, liste de prérequis, champs de configuration de l'assistant, graphe de nœuds et manifeste optionnel de topics.
1{
2 "id": "job-matcher-auto-apply",
3 "name": "Job Matcher, Auto Apply",
4 "description": "Polls job sources, scores against the candidate CV, drafts tailored applications, routes through optional human review, and dispatches.",
5 "category": "Human Resources",
6 "industry": "HR",
7 "workflow": "routing",
8 "icon": "Briefcase",
9 "tags": ["job", "candidate", "auto-apply"],
10
11 "prerequisites": [
12 { "title": "LLM Provider", "description": "A configured language-model provider." },
13 { "title": "Job Sources", "description": "At least one job-board connector installed." }
14 ],
15
16 "configFields": [
17 {
18 "key": "candidateName",
19 "label": "Your full name",
20 "type": "TEXT",
21 "required": true,
22 "group": "Identity"
23 },
24 {
25 "key": "minScore",
26 "label": "Minimum match score (0-100)",
27 "type": "NUMBER",
28 "required": false,
29 "defaultValue": 70,
30 "group": "Matching"
31 }
32 ],
33
34 "nodes": [
35 {
36 "id": "fetcher",
37 "type": "agent",
38 "label": "Job Fetcher",
39 "engine": "external-tools",
40 "inputTopic": "schedule.jobs-poll",
41 "outputTopic": "raw-jobs",
42 "externalTools": ["jobs.list_new"]
43 },
44 {
45 "id": "scorer",
46 "type": "agent",
47 "label": "Match Scorer",
48 "engine": "llm",
49 "inputTopic": "raw-jobs",
50 "outputTopic": "scored-jobs",
51 "systemPrompt": "Evaluate jobs for {{candidateName}}. Score 0-100 based on skills match."
52 }
53 ],
54
55 "topics": [
56 { "name": "raw-jobs", "description": "Jobs as received from sources, pre-scoring." }
57 ]
58}Champs de configuration, 8 types
configFields pilote l'assistant de déploiement. Chaque entrée définit le contrôle d'entrée et la façon dont la valeur est injectée dans les nœuds.
| Type | Rendu | Substitution |
|---|---|---|
| TEXT | Champ texte | {{key}} → verbatim |
| Champ email | {{key}} → verbatim | |
| PASSWORD | Champ masqué | {{key}} → never logged |
| NUMBER | Champ numérique | {{key}} → as number |
| TOGGLE | Interrupteur | {{key}} → "true" / "false" |
| SELECT | Liste déroulante | {{key}} → option value |
| TAGS | Champ à puces | {{key}} → CSV string |
| UPLOAD | Zone de dépôt | {{key}} → file path |
Exemple SELECT
1{
2 "key": "llmProvider",
3 "label": "LLM provider",
4 "type": "SELECT",
5 "options": [
6 { "value": "local", "label": "Local model" },
7 { "value": "managed-a", "label": "Managed provider A" },
8 { "value": "managed-b", "label": "Managed provider B" }
9 ],
10 "defaultValue": "local"
11}Visibilité conditionnelle
1{
2 "key": "webhookUrl",
3 "label": "Webhook URL",
4 "type": "TEXT",
5 "visibleWhen": { "field": "dispatcher", "equals": "webhook" }
6}Substitution des variables
- Les chemins pointés fonctionnent : {{candidate.name}}.
- Les listes deviennent des chaînes CSV.
- Les booléens deviennent des chaînes "true" / "false".
- Les clés manquantes échouent immédiatement dans l'assistant.
- La substitution est récursive, résolue de gauche à droite.
Avant
"systemPrompt": "Hi {{candidateName}}. Match jobs scoring at least {{minScore}}. Required skills: {{keywords}}."Après remplissage
"systemPrompt": "Hi Alice. Match jobs scoring at least 75. Required skills: kubernetes,terraform."Prérequis
Deux variantes : des vérifications déclaratives évaluées automatiquement par Pulse (plugin installé, paramètre non vide), et de la prose lisible pour les cas ambigus (choisir-parmi-plusieurs, sensible à la version).
La plupart des modèles combinent les deux : déclaratif pour la base, prose pour les nuances.
Moteurs de nœud
rule-based
Routage déterministe sur des comparaisons de champs. Aucun appel à un modèle.
1{
2 "engine": "rule-based",
3 "rules": [
4 { "condition": "score >= {{minScore}}", "action": "emit", "target": "qualified" },
5 { "condition": "always", "action": "emit", "target": "rejected" }
6 ]
7}llm
Agent de raisonnement adossé à un modèle de langage. Le mode consensus optionnel ajoute de la redondance sur les étapes critiques.
1{
2 "engine": "llm",
3 "systemPrompt": "...",
4 "temperature": 0.3,
5 "maxTokens": 1000,
6 "consensus": { "enabled": true, "quorumSize": 3 }
7}external-tools
Appel d'outils scripté. Exécute les outils dans l'ordre du prompt sans raisonnement intermédiaire. Pour brancher, utilisez llm.
1{
2 "engine": "external-tools",
3 "externalTools": ["jobs.list_new", "jobs.list_recent"],
4 "systemPrompt": "Use the tools to fetch new postings every cycle.",
5 "maxToolCalls": 5
6}Bonnes pratiques
Les IDs sont permanents
Changer un id casse toutes les instances déployées. Utilisez kebab-case minuscule et choisissez avec soin.
Descriptions soignées
La description racine pilote l'adoption. Nommez les workflows explicitement et décrivez la sortie.
Grouper par narration
Identité → Préférences → Identifiants → Avancé. La narration bat l'alphabétique.
Valeurs par défaut défensives
Chaque champ optionnel doit avoir une valeur par défaut raisonnable. Un déploiement sans remplir doit produire un pipeline fonctionnel.
Valider dans l'assistant
Échouer immédiatement dans l'assistant sur identifiants manquants ou plages invalides, pas au troisième événement en production.
Nommer les topics sémantiquement
raw-jobs est meilleur que topic-1. Les opérateurs lisent ces noms dans la vue Flow.
Activer le consensus
N'activez pas le consensus partout, seulement là où une erreur de modèle unique serait coûteuse.
Champs traversants
Utilisez passThroughFields pour préserver l'état d'événement à travers des agents qui n'en modifient qu'une partie.
Cas de test
Intégrez des cas de test dans le modèle ; le endpoint de simulation les rejoue sur le graphe déployé durant le développement.
1"testCases": [
2 {
3 "name": "matches well-fitting job",
4 "input": { "title": "Senior Rust Developer", "salary": 180000 },
5 "expectedOutput": { "score": { "min": 80 } }
6 }
7]Modèles fantômes
Marquez un modèle comme fantôme. Il n'apparaît que sous Pipelines → Shadows. Les opérateurs le lancent sur du trafic réel, comparent à la production, puis le promeuvent quand ils sont confiants.
1{
2 "id": "job-matcher-v2-experimental",
3 "shadow": true,
4 "nodes": [...]
5}Publication
Intégré (PR)
Ajoutez le JSON aux ressources pipeline-templates, lancez la suite de tests lint-audit, soumettez une PR avec une justification brève.
Modèle utilisateur
Déposez le JSON dans le dossier user-templates de votre répertoire de données et rechargez via Templates → Refresh. Apparaît avec un badge Custom ; jamais partagé automatiquement.
Dépannage
| Symptôme | Correction |
|---|---|
| Modèle introuvable | Vérifiez que le fichier est dans le bon dossier avec l'extension .json. |
| Variable inconnue {{foo}} | Ajoutez foo à configFields ou vérifiez l'orthographe. |
| Prérequis manquant | Le plugin référencé n'est pas installé, corrigez dans Paramètres. |
| L'agent ne reçoit aucun événement | Vérifiez que inputTopic correspond au outputTopic de l'agent amont. |
| Validation échouée : schéma incompatible | Les événements ne correspondent pas au schéma du topic, ajustez le schéma ou le producteur. |
Parcourez la galerie de modèles
Découvrez le catalogue publié de pipelines déployables en un clic.