Workflows
Créer des définitions de workflows exécutables et les distribuer dans un Scrydon Pack aux côtés d'un Process Flow
Il existe trois surfaces « workflow » : la construction interactive de workflows dans l'éditeur (Blocks, Triggers, Execution), la Référence YAML pour le format d'import/export de l'éditeur, et cette page — la création de définitions de workflow distribuées dans un Pack. Pour le cycle de vie build/upload du Pack, voir Packs & SDK d'authoring.
Un Workflow est un graphe de blocs exécutable qui s'exécute aux côtés des Process Flows — une porte human-in-the-loop, un routage d'approbation, une automatisation multi-étapes. Le SDK d'authoring de Workflows vous permet de distribuer des workflows dans la même archive .scrydon-pack.tar.gz que votre Process Flow, de sorte qu'un seul téléversement installe l'ontologie, tous les workflows dont le flow a besoin, et le flow lui-même en une seule transaction atomique.
Les workflows distribués dans un Pack sont du JSON pur — l'archive porte le graphe de blocs / arêtes / sous-blocs, jamais du code. Le runtime de workflow (blocs, exécuteurs, l'orchestrateur) réside dans la plateforme et est invoqué par workflowId quand une action workflow s'exécute.
Quand utiliser ce SDK
Utilisez le SDK d'authoring de Workflows quand :
- Un Process Flow que vous distribuez a une action de
actionType: "workflow"et vous voulez que le workflow réside dans le même Pack (de sorte que ré-importer le pack actualise également le workflow). - Vous créez un Pack de démo / de démarrage et ne voulez pas demander aux opérateurs de configurer manuellement les workflows après l'installation.
- Vous voulez l'idempotence au niveau du pack — ré-uploader le même
.scrydon-pack.tar.gzmet à jour les lignes de workflow sur place.
Si le workflow existe déjà dans votre tenant (workflow système ou créé manuellement), continuez d'utiliser actionType: "workflow" + workflowId sur le modèle d'action — aucune modification du Pack n'est nécessaire.
Installation
bun add -d @scrydon/sdk-authoring zodnpm install --save-dev @scrydon/sdk-authoring zodimport {
defineWorkflow,
defineBlock,
defineEdge,
} from '@scrydon/sdk-authoring/workflows'Anatomie d'un workflow
| Élément | Rôle |
|---|---|
| Package | Identité du manifeste du workflow : id, name, version |
| Workflow Entry | Un workflow nommé avec slug, name, version, definition — un pack peut en contenir plusieurs |
| Block | Un nœud dans le graphe exécutable (starter, human_in_the_loop, un bloc d'intégration, …). Porte des subBlocks de configuration créée |
| Sub-block | Un seul champ créé sur un bloc (reviewerRole, resolutionMode, …). Le type est ouvert pour que l'éditeur puisse évoluer indépendamment |
| Edge | Une connexion orientée entre des blocs. Peut porter un sourceHandle / targetHandle et des data optionnels |
| Loop / Parallel | Descripteurs de sous-flow optionnels qui regroupent des nœuds pour l'itération ou le fan-out |
| Variable | Une variable de portée workflow affichée dans la modale des variables au runtime |
| Metadata | name, description, exportedAt — champs non fonctionnels conservés par le runtime |
Un exemple complet — porte HITL
Cet exemple reflète la porte HITL démontrée par la PR #1208 : un seul bloc human-in-the-loop qui bloque la transition de Realize → Deploy. Le Process Flow (section suivante) y fait référence par slug.
import { defineWorkflow } from '@scrydon/sdk-authoring/workflows'
export const realizeGate = defineWorkflow({
slug: 'hitl-realize-gate',
name: 'HITL — Realize → Deploy Gate',
description: 'Approval gate before transitioning from Realize to Deploy.',
version: '1.0.0',
definition: {
blocks: {
'block-start': {
id: 'block-start',
type: 'starter',
name: 'Start',
position: { x: 0, y: 0 },
subBlocks: {},
outputs: {},
enabled: true,
},
'block-hitl': {
id: 'block-hitl',
type: 'human_in_the_loop',
name: 'Realize → Deploy Gate',
position: { x: 240, y: 0 },
subBlocks: {
reviewerRole: {
id: 'reviewerRole',
type: 'short-input',
value: 'admin',
},
resolutionMode: {
id: 'resolutionMode',
type: 'dropdown',
value: 'first_claim',
},
},
outputs: {
approved: 'boolean',
notes: 'string',
},
enabled: true,
},
},
edges: [
{ id: 'edge-start-hitl', source: 'block-start', target: 'block-hitl' },
],
loops: {},
parallels: {},
},
})defineWorkflow, defineBlock et defineEdge sont des fonctions d'identité à l'exécution — ils affinent les types pour que votre IDE détecte un champ manquant ou une faute de frappe avant que le build ne s'exécute.
Le contrat de rebind de slug
Au sein d'un Pack, les workflows et les Process Flows sont découplés par un slug local au pack. Le Process Flow référence un workflow par workflowSlug ; l'importateur du pack matérialise le workflow dans le tenant, récupère un vrai identifiant de workflow et rebind le modèle d'action :
// In the Process Flow:
defineAction({
name: 'Realize → Deploy gate',
actionType: 'workflow',
isRequired: true,
workflowSlug: 'hitl-realize-gate', // ← references the workflow by pack-local slug
})L'importateur parcourt le manifeste, cherche hitl-realize-gate dans la correspondance slug → id résolue produite par la phase d'installation du workflow, et mute le modèle d'action sur place : workflowId est défini à l'identifiant matérialisé et workflowSlug est effacé. À partir de ce moment, l'action se comporte comme toute autre action workflow.
workflowId et workflowSlug sont mutuellement exclusifs sur un modèle d'action — le schéma rejette les manifestes qui déclarent les deux. Utilisez workflowId quand vous pointez vers un workflow pré-existant dans le tenant ; utilisez workflowSlug quand le workflow est distribué dans le même Pack.
Si le slug ne se résout pas (le pack n'a pas distribué un sous-répertoire workflow-<slug>/ pour lui, ou le manifeste à l'intérieur l'a nommé différemment), l'installation échoue immédiatement avec UNKNOWN_WORKFLOW_SLUG. De même, deux sous-répertoires de workflow revendiquant le même slug échouent avec DUPLICATE_WORKFLOW_SLUG.
Packaging dans un Pack
Un Pack peut contenir une ontologie, un Process Flow, et zéro ou plusieurs workflows. Chaque workflow réside dans son propre sous-répertoire workflow-<slug>/ avec un manifest.json produit depuis defineWorkflow. Le pack.json de niveau supérieur liste chaque workflow comme une entrée contents[] séparée :
import { defineScrydonPack } from '@scrydon/sdk-authoring/packs'
export default defineScrydonPack({
manifestVersion: 1,
package: {
id: 'sap-activate-brabant',
name: 'SAP Activate (Brabant)',
version: '1.0.0',
},
contents: [
{ kind: 'ontology', path: 'ontology', version: '1.0.0', required: true },
{ kind: 'workflow', path: 'workflow-hitl-gate', version: '1.0.0', required: true },
{ kind: 'process-flow', path: 'process-flow', version: '1.0.0', required: true },
],
installOrder: ['ontology', 'workflow', 'process-flow'],
metadata: { isSystemPack: false, isDemoPack: true, tags: ['sap-activate'] },
})Quelques règles appliquées par le bundler :
ontologyetprocess-flowsont des singletons — chacun ne peut apparaître qu'une fois au maximum.workflowpeut se répéter.contents[].pathdoit être unique pour toutes les entrées.installOrderest une permutation des types distincts danscontents[]— une seule entrée"workflow"couvre tous les sous-répertoires de workflow ; ils s'exécutent tous dans la phase workflow, avantprocess-flowpour que la correspondance de slugs soit peuplée quand le rebind du process-flow s'exécute.
Structure du bundle
<bundle>.scrydon-pack.tar.gz
├── pack.json # PackBundleManifestSchema (lists every subdir)
├── ontology/
│ └── manifest.json # OntologyManifestSchema — may be empty
├── workflow-hitl-gate/
│ └── manifest.json # WorkflowManifestSchema (one per workflow)
├── workflow-cutover-gate/
│ └── manifest.json # (optional — packs may ship many workflows)
└── process-flow/
├── manifest.json # ProcessFlowManifestSchema
└── assets/ # optional — JSON / image assetsL'inspecteur du pack valide le manifeste de chaque sous-répertoire contre son propre schéma Zod. Les manifestes de workflow font l'aller-retour comme du JSON autonome — vous pouvez en valider un de façon isolée avec bunx @scrydon/sdk-authoring pack validate contre un manifest.json de workflow.
Règles de validation des blocs
WorkflowDefinitionSchema applique deux invariants structurels au-delà des types par champ :
| Règle | Ce qu'elle détecte |
|---|---|
blocks[key].id doit être égal à la clé de l'enregistrement | Un identifiant mal orthographié qui briserait silencieusement les références d'arête |
Chaque source / target d'arête doit référencer un identifiant de bloc existant | Une arête pendante provenant d'un bloc supprimé |
Le type de bloc est intentionnellement une chaîne ouverte — le catalogue de blocs runtime (starter, human_in_the_loop, chaque bloc d'intégration, …) évolue indépendamment du SDK et le schéma ne se verrouille pas sur un instantané. Pareil pour le type de sous-bloc : la valeur est préservée verbatim et exposée à l'éditeur.
Version du manifeste
Les manifestes de workflow portent manifestVersion: 1. L'extracteur au moment du build l'injecte de sorte que les auteurs n'ont pas à le faire.
Le schéma rejette :
| Erreur | Cause |
|---|---|
Slug must be lowercase alphanumeric with hyphens | Un slug de workflow a échoué /^[a-z0-9-]+$/ |
Must be a valid semver string | La version du workflow n'est pas semver |
workflows[] must not contain duplicate slugs | Deux entrées dans un manifeste partagent un slug |
blocks[key].id must equal the record key | L'id d'un bloc n'est pas d'accord avec la clé de l'enregistrement |
edges[].source / edges[].target must reference an existing block id | Une arête pendante après la suppression d'un bloc |
Construire, inspecter, téléverser
Créez chaque workflow avec defineWorkflow. Composez le Pack avec defineScrydonPack et ajoutez une entrée contents[] par workflow.
bunx @scrydon/sdk-authoring pack build src/pack.ts --outDir dist
# → dist/<package.id>-<package.version>.scrydon-pack.tar.gzbunx @scrydon/sdk-authoring pack inspect dist/sap-activate-brabant-1.0.0.scrydon-pack.tar.gzL'inspecteur liste chaque sous-répertoire, valide chaque manifeste, et expose la correspondance de slugs que l'importateur va résoudre.
Connectez-vous en tant qu'administrateur de l'organisation → ouvrez Settings → Packs dans l'application plateforme → cliquez sur Téléverser un pack → déposez votre .scrydon-pack.tar.gz. Comme le pack contient du contenu workflow, la boîte de dialogue affiche un sélecteur d'environnement d'espace de travail — choisissez l'environnement où les définitions de workflow doivent s'installer. Le contenu ontologie et process-flow s'installe au niveau organisation quel que soit le sélecteur.
Voir l'ADR 2026-05-21 Unified pack upload surface pour le raisonnement de conception.
La route agentic sous-jacente accepte également les téléversements directement. Un pack qui contient des workflows nécessite workspaceEnvironmentId sur l'appel — les workflows sont délimités à un environnement d'espace de travail, pas à l'organisation. Passez-le comme paramètre de requête :
curl -X POST "$AGENTIC_URL/api/packs/import?organizationId=$ORG_ID&workspaceEnvironmentId=$ENV_ID" \
-H "Cookie: $SESSION_COOKIE" \
-F "file=@dist/sap-activate-brabant-1.0.0.scrydon-pack.tar.gz"La route retourne { ontology, workflows: { idsBySlug }, processFlow }. La correspondance idsBySlug montre chaque slug local au pack rebindé à son identifiant de workflow matérialisé, utile pour l'audit / la vérification après coup.
Idempotence
L'identifiant de ligne du workflow matérialisé est dérivé comme pack:<packageId>:<slug>:<workspaceEnvironmentId>. Re-uploader le même Pack dans le même environnement d'espace de travail trouve la ligne existante et (quand replacePublished: true est passé) la supprime + la réinsère — workflow_blocks, workflow_edges et workflow_subflows en cascade. Des identifiants d'environnement différents produisent des lignes différentes, de sorte que le même pack peut être installé côte à côte dans des environnements dev / staging / prod.
workflow.variables est stocké comme Record<string, Variable> indexé par identifiant de variable. Le matérialiseur attache le workflowId résolu à chaque variable à l'insertion ; les entrées créées l'omettent.
Où aller ensuite
Process Flows
Référencez les workflows depuis les appels defineAction de votre Process Flow via workflowSlug (local au pack) ou workflowId (pré-existant).
Ontologies
Distribuez l'ontologie avec les workflows dans le même Pack — l'importateur exécute d'abord l'ontologie, puis les workflows, puis le process-flow.
Vue d'ensemble du SDK d'authoring
Pack vs Intégration, la boucle build / upload, et les quatre surfaces de sous-chemins.