メインコンテンツへ移動
ドキュメントはじめる実戦:最初のワークフロー
実戦・15分

実践的な戦闘: 毎日の概要ワークフローをゼロから作成する

特定のビジネス シナリオに従って、すべての核となる概念 (データの取得 → 分類 → 要約 → 配信) をつなぎ合わせます。

この記事では、特定のビジネス シナリオを最初から最後まで説明し、これまでに学習したすべての概念 (ワークフロー/ステップ/エージェント/変数/分類子/サブワークフロー/認証情報) を実際のプロセスに適合できるようにします。 15分も経つと「独立してワークフローができるようになった」という感覚が得られるでしょう。

始める前に
  • すでにBraidrunアカウントを登録し、ログインしています。分からない場合は、まず見てください。 登録とログイン
  • OpenAI / Anthropic / DeepSeek のいずれかの API Key があります。最初のいくつかのステップはまったく使用しなくても実行できますが、実際に実行するときは LLM ステップをスキップします。
  • (オプション) Slack 受信 Webhook URL - 配信プロセスを体験したい場合は必須です。

ビジネスシナリオ: 日々のテクノロジーニュースサマリー

要件:

  • 毎朝 8:00 に自動的に実行されます。
  • Hacker News / 36Kr / The Verge RSS から 10 件の最新テクノロジー ニュースをキャッチします。
  • 各項目を「AI/ハードウェア/その他」の3つのカテゴリに分類します。
  • AI として分類された項目についてのみ 60 ワードの中国語要約を生成します。
  • それを Markdown に要約し、Telegram チャネルに配信します。
  • 汚いデータの配信を避けるため、送信する前に「確認」をクリックするよう依頼してください。

Braidrun に分解する手順

  1. fetchcode 手順: Node を使用して RSS をキャプチャし、それを JSON に解析します。
  2. classifyclassifier 手順: 各ニュース項目にカテゴリ ラベルを付けます。
  3. summarizesingle 手順: AI クラスのみの中国語の要約を生成します。
  4. compilecode 手順: Markdown 全体をまとめます。
  5. reviewmanual_approval: 送信する前にちょっと見てみましょう。
  6. deliversub_workflow:組み込みの Slack 配信モジュールを再利用します。

ステップ 1 · 新しいワークフローを作成する

  1. 左側のメインナビゲーションポイントは、右上隅の「ワークフロー」→「新しいワークフロー」です。
  2. 名前: daily-tech-digest、説明: 每天早 8 点的科技新闻摘要
  3. 「作成」をクリックします。すぐにエディターにジャンプします。

エディターが開き、左側にキャンバス (DAG 視覚化)、右側に YAML という 2 つの列が表示されます。どちらかの側での変更は、もう一方の側にリアルタイムで同期されます。

ステップ 2 · エージェントを宣言する

YAML 列に切り替えて、エージェントのセクションを上部 (変数の後) に追加します。

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

説明: ライター プリセットは、中国語の筆記用に特別に最適化されています。オーバーライドにより max_iterations が 3 に制限されるため、エージェントは概要についてあまり考えなくなります (概要自体は非常に単純です)。

プリセットの詳しい説明はこちらをご覧ください。 エージェント構成の詳細説明

ステップ 3 · RSS を取得するための fetch:code ステップ

YAML で続けて、ステップの下に fetch を追加します。

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

いくつかの重要なポイント:

  • language: node — ノード 20 は、サポートが組み込まれたランタイムの 1 つです。
  • extract — スクリプトの標準出力 JSON から記事フィールドを選択し、steps.fetch.data.articles を使用してダウンストリームで参照します。
  • idempotent: true — 「同じ日にニュースを公開すると、同じ結果になる可能性が高くなります」 - サービスが再起動されて再開される場合、これはスキップできます。
コードステップ用のサンドボックス

スクリプトは、デフォルトの 512MB のメモリ、0.5 CPU コア、および 300 秒のタイムアウトを備えた使い捨ての分離サンドボックスで実行されます。ネットワークでは送信リクエストのみが許可されます。外部データを安全にフェッチすることはできますが、ポートをリッスンすることはできません。ディスクへの書き込みには /tmp のみが使用可能です。

ステップ 4 · 分類: 各ニュース項目にラベルを付けます

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

分類子の出力を渡すことができます {{classifier.category}} 引用 - 前回のニュースの分類結果です。次のステップで条件分岐を行うためにこれを使用します。

変数参照の完全な構文については、を参照してください。 変数と式

ステップ 5 · 要約: AI クラスのみの要約を作成します。

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

説明:

  • condition このステップは、分類結果が ai の場合にのみ実行され、他のカテゴリはスキップされます (ステータス SKIPPED、失敗としてカウントされません)。
  • idempotent: true —— 純粋な要約はべき等であり、同じ入力→同じ出力になります。

ステップ 6 · コンパイル: 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

このステップでは、アップストリームのすべての要約結果をマークダウンに集約し、直接送信できます。 extract はそれをsteps.compile.data.markdownとして公開します。これにより、ダウンストリーム参照がよりクリーンになります。

ステップ 7 · 確認: 送信前の手動確認

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

これは、manual_approval の最も単純な形式です。プロセスはここで一時停止され、保留中の承認が [承認管理] ページに表示されます。 「承認」をクリックしてワークフローを下に進みます。 [拒否] をクリックすると、実行ステータスが FAILED に変わり、後続のすべての手順がキャンセルされます。

より柔軟な承認構成 (承認者の指定、通知チャネル、有効期限) については、を参照してください。 手動承認

ステップ 8 · 配信: sub_workflow がプラットフォームの組み込みモジュールを呼び出します

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}}"

説明:

  • dingyue-module-slack-deliver これはプラットフォームに付属する組み込み配信モジュールの 1 つで、「アセンブリ ペイロード → メッセージ送信 → 再試行 → ステータスの書き戻し」のルーチン全体をカプセル化します。
  • slack_webhook_url 変数で構成された Slack 受信 Webhook URL を参照します。これはステップ 10 で構成します。

ステップ 9 · キャンバスのプレビュー

左側のキャンバス バーに戻ると、フェッチ → 分類 → 要約 → コンパイル → レビュー → 配信によって 6 つのノードが一列に接続されていることがわかります。任意のノードをダブルクリックして、その YAML フラグメントを展開します。ノードをドラッグして位置を調整します。レイアウトの変更は視覚的にのみ行われ、YAML には影響しません。

ステップ 10 · 資格情報を完了する

このワークフローを実行する前に、以下が必要です。

  1. openai_api_key (エージェントが使用する LLM キー)
    • タイプとして api_key を選択し、OpenAI から取得した sk-... を値として貼り付けます。
  2. slack_webhook_url (配信用の Slack 受信 Webhook URL)
    • タイプとして api_key または Secret_text を選択し、値として Slack 受信 Webhook URL を貼り付けます。

保存後、ワークフローで参照される資格情報名はこの 1 対 1 に対応し、実行時に解析できます。

ステップ 11 · 検証と予行演習

11.1 検証

上部の「確認」をクリックします。プラットフォームは、完全なエージェント パーサーを使用してラウンドトリップを実行します。構文/参照エラーがある場合は、特定の行番号と理由が示されます。次のステップに進む前に、赤い線をすべて取得してください。

11.2 予行演習

「実行」をクリックし、ダイアログボックスでドライランにチェックを入れ、「実行開始」をクリックします。今回は:

  • fetch は実際に実行されます。コード ステップの副作用を判断するのは難しいため、デフォルトで実行させます (ただし、ネットワーク サンドボックスは制限されています)。
  • 分類/要約/コンパイル - LLM であるため、予行演習中にシミュレートされた値が返されます。
  • レビュー - 予行演習での自動承認 (実弾の承認なし)。
  • 配信 - モジュールはドライラン モードを認識しており、実際には Telegram メッセージを送信しません。

成功すると、すべてのステップが緑色で「COMPLETED」または灰色で「SKIPPED」と表示されます。右下のエリアに移動して、各ステップの「入力/出力/変数のスナップショット」を表示し、変数がすべて正しく接続されていることを確認します。

ステップ 12 · 実際に走ってみる

  1. 「実行」をクリックし、 キャンセル 実行を開始するには、ドライランにチェックを入れます。
  2. 右側のリアルタイム イベント ストリームが点滅し始めます。 fetch を実行した後、10 個の項目がフェッチされたかどうかを確認します。分類によって実行される各項目にラベルを付けます。 Summary は AI アイテムに対してのみ実行されます。
  3. レビューのために実行すると、実行全体が一時停止され、ステータスが PENDING_APPROVAL に変わります。 「承認管理」に切り替えると、承認待ちのアイテムが表示されます。 「表示」をクリックして Markdown ドラフトを読みます。
  4. 満足したら「承認」をクリックします。ワークフローは自動的に配信を継続し、Slack メッセージが送信されます。
  5. 実行後、ワークフローの詳細ページに戻って、この実行のトークン/コストの統計を確認します。
初実走への期待

所要時間は約 1 ~ 3 分 (ネットワークによって異なります)、費用は約 5000 ~ 15000 トークン (openai gpt-4.1-mini によると約 0.01 ~ 0.03 ドル) です。この範囲を下回るとニュースの引き出しに失敗する可能性があり、この範囲を上回ると要約の反映が失敗する可能性があります。

ステップ 13: 毎日自動的に実行されるように cron をインストールする

  1. 左側の「スケジュール管理」→「新規スケジュール」。
  2. ターゲットワークフロー: daily-tech-digest;タイプ: cron;式: 0 0 8 * * ?;タイムゾーン: アジア/上海。
  3. 「パラメータのデフォルト」は空にすることができます。変数にはすべて適切なデフォルト値があります。
  4. 保存します。 「次のトリガー時刻」は明日の 8:00 と表示されます。

ワークフロー YAML フルバージョン

展開して完全な YAML を表示します
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}}"

やってみたらやり方はもうわかるよ

  • YAML + Canvas デュアルカラムを使用して完全なワークフローを編集する
  • コードステップの 5 つの主要なモード、classifier、single、manual_approval、および sub_workflow の実際の記述方法
  • 変数参照のさまざまな使用法 (var/steps/classifier/credentials)
  • 検証 / ドライラン / 実際の実行 / cron オンライン サイクルの完了
  • Credential Center とワークフロー YAML を連携する方法

次へ