Aller au contenu principal
DocumentCommencerCombat pratique : le premier workflow
Combat pratique · 15 minutes

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

avant de commencer
  • 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

  1. fetchcode Étapes : utilisez Node pour capturer le RSS et l'analyser en JSON.
  2. classifyclassifier Étapes : Étiquetez chaque actualité avec une étiquette de catégorie.
  3. summarizesingle Étapes : Générez des résumés en chinois uniquement pour les cours d'IA.
  4. compilecode Étapes : Préparez un Markdown complet.
  5. reviewmanual_approval: Pause pour me laisser jeter un oeil avant d'envoyer.
  6. deliversub_workflow : réutilise le module intégré de livraison Slack.

Étape 1 · Créer un nouveau flux de travail

  1. Le point de navigation principal sur la gauche est « Workflow » → « Nouveau Workflow » dans le coin supérieur droit.
  2. Nom : daily-tech-digest, descriptif : 每天早 8 点的科技新闻摘要.
  3. 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) :

yaml
agents:
  writer:
    preset: writer
    overrides:
      max_iterations: 3
      provider: openai_api_key    # 引用凭据中心里的 Key

Description : 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 :

yaml
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

Quelques 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.
Sandbox pour les étapes de code

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é

yaml
  - 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: category

La 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

yaml
  - id: summarize
    type: single
    agent: writer
    idempotent: true
    condition: "{{classifier.category}} == 'ai'"
    task: |
      用一段中文(不超过 60 字)概括下面这条 AI 新闻:
      {{steps.fetch.data.articles[0].title}}

Descriptif :

  • condition Que 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

yaml
  - 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

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

yaml
  - id: review
    type: manual_approval
    title: "请审阅今日 AI 摘要"
    body: "{{steps.compile.data.markdown}}"
    approvers: []           # 空 = 团队所有 Admin 都可审批
    notify: [in_app]        # 也可以 slack / email / feishu

Il 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

yaml
  - 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-deliver Il 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_url Ré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 :

  1. 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.
  2. 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

  1. Cliquez sur "Exécuter", Annuler Vérifiez l’exécution à sec pour démarrer l’exécution.
  2. 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.
  3. 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.
  4. Cliquez sur « Approuver » lorsque vous êtes satisfait. Le flux de travail continue automatiquement à être livré et le message Slack est envoyé.
  5. 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.
Mes attentes pour ma première vraie course

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

  1. "Gestion des plannings" à gauche → "Nouveau planning".
  2. Flux de travail cible : résumé technologique quotidien ; Type : cron ; Expression : 0 0 8 * * ?; Fuseau horaire : Asie/Shanghai.
  3. "Parameter Defaults" peut être vide - nos variables ont toutes des valeurs par défaut raisonnables.
  4. 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
yaml
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