Retour à Pulse
    Développeurs · Modèles

    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éveloppeurs

    Emplacement 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.

    json
    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.

    TypeRenduSubstitution
    TEXTChamp texte{{key}} → verbatim
    EMAILChamp email{{key}} → verbatim
    PASSWORDChamp masqué{{key}} → never logged
    NUMBERChamp numérique{{key}} → as number
    TOGGLEInterrupteur{{key}} → "true" / "false"
    SELECTListe déroulante{{key}} → option value
    TAGSChamp à puces{{key}} → CSV string
    UPLOADZone de dépôt{{key}} → file path

    Exemple SELECT

    json
    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

    json
    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

    json
    "systemPrompt": "Hi {{candidateName}}. Match jobs scoring at least {{minScore}}. Required skills: {{keywords}}."

    Après remplissage

    json
    "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.

    json
    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.

    json
    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.

    json
    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.

    json
    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.

    json
    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ômeCorrection
    Modèle introuvableVé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 manquantLe plugin référencé n'est pas installé, corrigez dans Paramètres.
    L'agent ne reçoit aucun événementVérifiez que inputTopic correspond au outputTopic de l'agent amont.
    Validation échouée : schéma incompatibleLes é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.

    Ouvrir les modèles