Combat pratique : rédigez un flux de travail récapitulatif quotidien à partir de zéro
Suivez un scénario commercial spécifique pour regrouper tous les concepts de base : extraire des données → classer → résumer → livrer.
Cet article parcourt un scénario métier spécifique du début à la fin, permettant à tous les concepts appris précédemment (workflow/étape/agent/variables/classifier/sub_workflow/credentials) de s'intégrer dans un processus réel. Après 15 minutes, vous aurez le sentiment de « je peux effectuer un workflow de manière indépendante ».
- Vous avez déjà enregistré un compte Braidrun et êtes connecté. Si vous ne le savez pas, regardez d'abord Inscription et connexion.
- Il existe une clé API pour OpenAI / Anthropic / DeepSeek. Vous pouvez toujours faire les premiers pas sans cela, mais vous sauterez l'étape LLM lorsque vous exécuterez réellement.
- (Facultatif) Une URL de Webhook entrant Slack - requise si vous souhaitez expérimenter le processus de livraison.
Scénario commercial : résumé quotidien des actualités technologiques
Exigences :
- Exécuté automatiquement à 8h00 tous les matins ;
- Découvrez les 10 dernières nouvelles technologiques de Hacker News / 36Kr / The Verge RSS ;
- Classez chaque élément en trois catégories : « IA/Matériel/Autres » ;
- Générez des résumés chinois de 60 mots uniquement pour les éléments classés comme IA ;
- Résumez-le dans Markdown et envoyez-le sur la chaîne Telegram ;
- Demandez-moi de cliquer sur "Confirmer" avant d'envoyer - pour éviter de livrer des données sales.
Étapes pour démonter dans Braidrun
fetch— code Étapes : utilisez Node pour capturer le RSS et l'analyser en JSON.classify— classifier Étapes : Étiquetez chaque actualité avec une étiquette de catégorie.summarize— single Étapes : Générez des résumés en chinois uniquement pour les cours d'IA.compile— code Étapes : Préparez un Markdown complet.review— manual_approval: Pause pour me laisser jeter un oeil avant d'envoyer.deliver— sub_workflow : réutilise le module intégré de livraison Slack.
Étape 1 · Créer un nouveau flux de travail
- Le point de navigation principal sur la gauche est « Workflow » → « Nouveau Workflow » dans le coin supérieur droit.
- Nom :
daily-tech-digest, descriptif :每天早 8 点的科技新闻摘要. - Cliquez sur "Créer". Accédez immédiatement à l’éditeur.
L'éditeur s'ouvre sur deux colonnes : canvas (visualisation DAG) à gauche et YAML à droite. Les modifications de chaque côté seront synchronisées avec l’autre côté en temps réel.
Étape 2 · Déclarer l'agent
Basculez vers la colonne YAML et ajoutez une section d'agents en haut (après les variables) :
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key # 引用凭据中心里的 KeyDescription : Le préréglage de l'écrivain est spécialement optimisé pour l'écriture chinoise. Les remplacements limitent max_iterations à 3 afin que l'agent ne réfléchisse pas trop à un résumé (le résumé lui-même est très simple).
Pour une explication détaillée du préréglage, voir Explication détaillée de la configuration de l'agent.
Étape 3 · récupérer : étape de code pour récupérer RSS
En continuant dans le YAML, ajoutez fetch sous les étapes :
steps:
- id: fetch
type: code
language: node
idempotent: true
code: |
const parser = new (await import('rss-parser')).default();
const feeds = [
'https://hnrss.org/frontpage',
'https://36kr.com/feed'
];
const articles = [];
for (const url of feeds) {
const feed = await parser.parseURL(url);
feed.items.slice(0, 5).forEach(item => {
articles.push({ title: item.title, url: item.link });
});
}
return { articles };
extract:
articles: $.articlesQuelques points clés :
language: node— Node 20 est l’un des environnements d’exécution avec prise en charge intégrée.extract— Sélectionnez le champ articles dans la sortie standard JSON du script et référencez-le en aval à l'aide de steps.fetch.data.articles.idempotent: true— "La publication d'actualités le même jour entraînera très probablement le même résultat" - cela peut être ignoré lors du redémarrage et de la reprise du service.
Votre script s'exécutera dans un bac à sable d'isolation jetable avec par défaut 512 Mo de mémoire, un cœur de processeur 0.5 et un délai d'attente de 300 secondes. Le réseau autorise uniquement les demandes sortantes. Vous pouvez récupérer des données externes en toute sécurité, mais vous ne pouvez pas écouter le port ; seul /tmp est disponible pour l'écriture sur le disque.
Étape 4 · classer : étiqueter chaque actualité
- id: classify
type: classifier
agent: writer
task: |
给下面这条新闻标题分一个类别:
标题: {{steps.fetch.data.articles[0].title}}
categories:
- name: ai
description: AI / LLM / 机器学习相关
- name: hardware
description: 硬件 / 芯片 / 设备
- name: other
description: 其它科技话题
output_variable: categoryLa sortie du classificateur peut être transmise {{classifier.category}} Citation - C'est le résultat du classement de l'actualité précédente. Nous l'utiliserons pour effectuer un branchement conditionnel à l'étape suivante.
Pour la syntaxe complète des références de variables, voir Variables et expressions.
Étape 5 · résumer : rédiger un résumé uniquement pour le cours d'IA
- id: summarize
type: single
agent: writer
idempotent: true
condition: "{{classifier.category}} == 'ai'"
task: |
用一段中文(不超过 60 字)概括下面这条 AI 新闻:
{{steps.fetch.data.articles[0].title}}Descriptif :
conditionQue cette étape ne soit exécutée que lorsque le résultat de la classification est ai, les autres catégories sont ignorées (statut SKIPPED, non compté comme un échec).idempotent: true—— Les résumés purs sont idempotents, même entrée → même sortie.
Étape 6 · compiler : épeler l'intégralité du Markdown
- id: compile
type: code
language: node
depends_on: [summarize]
code: |
const summaries = JSON.parse(process.env.STEP_OUTPUT_SUMMARIZE || '[]');
const md = [
'# 📰 今日科技 AI 摘要',
'',
...summaries.map((s, i) => `${i + 1}. ${s}`)
].join('\n');
return { markdown: md };
extract:
markdown: $.markdownCette étape regroupe tous les résultats de synthèse en amont dans un Markdown qui peut être envoyé directement. extract l'expose sous le nom steps.compile.data.markdown, ce qui rend les références en aval plus propres.
Étape 7 · vérification : confirmation manuelle avant l'envoi
- id: review
type: manual_approval
title: "请审阅今日 AI 摘要"
body: "{{steps.compile.data.markdown}}"
approvers: [] # 空 = 团队所有 Admin 都可审批
notify: [in_app] # 也可以 slack / email / feishuIl s'agit de la forme la plus simple de manual_approval : le processus sera interrompu ici et une approbation en attente apparaîtra sur la page Gestion des approbations. Vous cliquez sur « Approuver » pour poursuivre le flux de travail ; cliquez sur "Rejeter" et l'état d'exécution passe à FAILED, et toutes les étapes suivantes sont annulées.
Pour une configuration d'approbation plus flexible (désignation des approbateurs, canaux de notification, expiration), voir Approbation manuelle.
Étape 8 · livrer : sub_workflow appelle le module intégré de la plateforme
- id: deliver
type: sub_workflow
module: dingyue-module-slack-deliver
depends_on: [review]
inputs:
slack_webhook_url: "{{var:slack_webhook_url}}"
message_text: "{{steps.compile.data.markdown}}"Descriptif :
dingyue-module-slack-deliverIl s'agit de l'un des modules de livraison intégrés fournis avec la plate-forme, encapsulant l'intégralité de la routine « charge utile de l'assemblage → envoyer un message → réessayer → statut de réécriture ».slack_webhook_urlRéférencez l'URL du Webhook entrant Slack configurée dans la variable - nous la configurerons à l'étape 10.
Étape 9 · Aperçu du canevas
Revenez à la barre de canevas de gauche et vous verrez 6 nœuds connectés dans une ligne par récupération → classer → résumer → compiler → réviser → livrer. Double-cliquez sur n'importe quel nœud pour développer son fragment YAML ; faites glisser le nœud pour ajuster sa position : les modifications de mise en page sont uniquement visuelles et n'affectent pas le YAML.
Étape 10 · Compléter les informations d'identification
Avant d'exécuter ce workflow, vous devez disposer :
openai_api_key(Clé LLM utilisée par l'agent)- Sélectionnez api_key comme type et collez le sk-... que vous avez obtenu d'OpenAI comme valeur.
slack_webhook_url(URL du Webhook entrant Slack pour la livraison)- Sélectionnez api_key ou secret_text comme type et collez l’URL du Webhook entrant Slack comme valeur.
Après l'enregistrement, les noms d'informations d'identification référencés dans le flux de travail correspondent à ceux-ci et peuvent être analysés au moment de l'exécution.
Étape 11 · Validation et essai à sec
11.1 Vérification
Cliquez sur "Vérifier" en haut. La plateforme utilise l'analyseur d'agent complet pour effectuer un aller-retour ; s'il y a une erreur de syntaxe/référence, le numéro de ligne spécifique + la raison seront indiqués. Obtenez toutes les lignes rouges avant de passer à l’étape suivante.
11.2 essai à sec
Cliquez sur "Exécuter", cochez l'exécution à sec dans la boîte de dialogue, puis cliquez sur "Démarrer l'exécution". Cette fois :
- fetch s'exécutera réellement - il est difficile de juger des effets secondaires de l'étape de code, nous la laissons donc s'exécuter par défaut (mais le bac à sable du réseau est limité) ;
- classifier / résumer / compiler - comme il s'agit de LLM, les valeurs simulées sont renvoyées lors de l'exécution à sec ;
- examen - approbation automatique sous essai (pas d'approbation réelle des munitions) ;
- livrer - le module connaît le mode d'exécution à sec et n'enverra pas réellement de messages Telegram.
En cas de succès, toutes les étapes seront vertes TERMINÉES ou grises SAUTÉES. Accédez à la zone inférieure droite pour afficher l'« instantané d'entrée/sortie/variable » de chaque étape et confirmez que les variables sont toutes correctement connectées.
Étape 12 · Faites une vraie course
- Cliquez sur "Exécuter", Annuler Vérifiez l’exécution à sec pour démarrer l’exécution.
- Le flux d'événements en temps réel sur la droite commence à clignoter. Vérifiez si 10 éléments ont été récupérés après avoir exécuté la récupération ; étiquetez chaque élément exécuté par classify ; Le résumé n'est exécuté que sur les éléments AI.
- Lors de l'exécution en révision, l'intégralité de l'exécution sera suspendue et le statut passera à PENDING_APPROVAL. Passez à « Gestion des approbations » et vous verrez un élément en attente d'approbation. Cliquez sur « Afficher » pour lire le brouillon Markdown.
- Cliquez sur « Approuver » lorsque vous êtes satisfait. Le flux de travail continue automatiquement à être livré et le message Slack est envoyé.
- Après l'exécution, revenez à la page de détails du workflow pour voir les statistiques de jetons/coûts de cette exécution.
Cela prend environ 1 à 3 minutes (selon le réseau) et coûte environ 5 000 à 15 000 jetons (environ 0,01 à 0,03 $ selon openai gpt-4.1-mini). En dessous de cette fourchette, il peut s'agir d'un échec dans l'extraction des informations, et au-dessus de cette fourchette, d'une réflexion sur la synthèse.
Étape 13 : Installez cron pour qu'il s'exécute automatiquement tous les jours
- "Gestion des plannings" à gauche → "Nouveau planning".
- Flux de travail cible : résumé technologique quotidien ; Type : cron ; Expression :
0 0 8 * * ?; Fuseau horaire : Asie/Shanghai. - "Parameter Defaults" peut être vide - nos variables ont toutes des valeurs par défaut raisonnables.
- Enregistrez. La « prochaine heure de déclenchement » indiquera 8h00 demain.
Version complète du flux de travail YAML
Développez pour voir le YAML complet
name: daily-tech-digest
version: "1.0.0"
description: 每天早 8 点的科技新闻摘要
recovery:
autoResumeOnRestart: true
policy: RESUME_FROM_LAST_INCOMPLETE
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key
steps:
- id: fetch
type: code
language: node
idempotent: true
code: |
const parser = new (await import('rss-parser')).default();
const feeds = [
'https://hnrss.org/frontpage',
'https://36kr.com/feed'
];
const articles = [];
for (const url of feeds) {
const feed = await parser.parseURL(url);
feed.items.slice(0, 5).forEach(item => {
articles.push({ title: item.title, url: item.link });
});
}
return { articles };
extract:
articles: $.articles
- id: classify
type: classifier
agent: writer
task: |
给下面这条新闻标题分一个类别:
标题: {{steps.fetch.data.articles[0].title}}
categories:
- name: ai
- name: hardware
- name: other
output_variable: category
- id: summarize
type: single
agent: writer
idempotent: true
condition: "{{classifier.category}} == 'ai'"
task: |
用一段中文(不超过 60 字)概括下面这条 AI 新闻:
{{steps.fetch.data.articles[0].title}}
- id: compile
type: code
language: node
depends_on: [summarize]
code: |
const summaries = JSON.parse(process.env.STEP_OUTPUT_SUMMARIZE || '[]');
const md = [
'# 📰 今日科技 AI 摘要',
'',
...summaries.map((s, i) => `${i + 1}. ${s}`)
].join('\n');
return { markdown: md };
extract:
markdown: $.markdown
- id: review
type: manual_approval
title: "请审阅今日 AI 摘要"
body: "{{steps.compile.data.markdown}}"
notify: [in_app]
- id: deliver
type: sub_workflow
module: dingyue-module-slack-deliver
depends_on: [review]
inputs:
slack_webhook_url: "{{var:slack_webhook_url}}"
message_text: "{{steps.compile.data.markdown}}"Vous saurez déjà comment le faire après l'avoir fait
- Modifiez un flux de travail complet avec les doubles colonnes YAML + Canvas
- Les méthodes d'écriture réelles des cinq modes principaux d'étapes de code, classificateur, single, manual_approval et sub_workflow
- Différentes utilisations des références de variables (var/steps/classifier/credentials)
- valider / essai à sec / exécution réelle / cycle cron en ligne complet
- Comment coopérer entre Credential Center et Workflow YAML
Suivant
- Lisez 8 types d'étapes — Contraintes d'utilisation, de champs et de combinaison de chacun
- Apprenez à déboguer avec des points d'arrêt — Gagnez 80 % de temps de dépannage lorsque le flux de travail devient complexe
- Modularisation et réutilisation — Lorsque vous disposez des deuxième et troisième workflows, extrayez la logique commune dans sub_workflow