Bỏ qua nội dung chính
DocsBắt đầuThực hành: workflow đầu tiên
Giơ tay lên. 15 phút

Xây dựng một công việc tóm tắt hàng ngày từ Scratch

Theo một kịch bản kinh doanh cụ thể để chuỗi tất cả các khái niệm cốt lõi: kéo dữ liệu phân loại tóm tắt phân loại.

Bài này đi trọn một kịch bản nghiệp vụ cụ thể từ đầu đến cuối, để mọi khái niệm đã học (workflow / step / agent / variables / classifier / sub_workflow / credentials) vào đúng chỗ trong một quy trình thật. Sau 15 phút, bạn sẽ có cảm giác "mình tự làm được một workflow".

trước khi bắt đầu
  • Đã đăng ký tài khoản Braidrun và đăng nhập. Nếu chưa biết hãy xem trước Đăng ký và đăng nhập.
  • Có Khóa API cho bất kỳ OpenAI / Anthropic / DeepSeek nào. Bạn vẫn có thể thực hiện một số bước đầu tiên mà không cần đến nó, nhưng bạn sẽ bỏ qua bước LLM khi thực sự chạy.
  • Một địa chỉ Mạng Slack đang đến yêu cầu nếu bạn muốn trải nghiệm quá trình giao hàng.

Kịch bản kinh doanh: Tóm tắt tin tức công nghệ hàng ngày

Yêu cầu:

  • Tự động chạy lúc 8h00 mỗi sáng;
  • Cập nhật 10 tin công nghệ mới nhất từ Hacker News/36Kr/The Verge RSS;
  • Phân mỗi mục vào ba loại "AI / phần cứng / khác";
  • Chỉ tạo bản tóm tắt tiếng Trung 60 từ cho những mục được phân loại là AI;
  • Tóm tắt nó vào Markdown và gửi nó đến kênh Slack;
  • Trước khi gửi yêu cầu tôi bấm "Xác nhận" — tránh đẩy dữ liệu bẩn.

Các bước tháo rời thành Braidrun

  1. fetchcode Các bước: Sử dụng Node để thu thập RSS và phân tích nó thành JSON.
  2. classifyclassifier Các bước: Dán nhãn cho mỗi mục tin tức bằng nhãn danh mục.
  3. summarizesingle Các bước: Chỉ tạo bản tóm tắt tiếng Trung cho các lớp AI.
  4. compilecode Các bước: Tập hợp toàn bộ Markdown.
  5. reviewmanual_approval: Tạm dừng để tôi xem trước khi gửi.
  6. deliversub_workflow:Tái sử dụng mô-đun phân phối Slack tích hợp sẵn.

Bước 1 · Tạo workflow mới

  1. Điểm điều hướng chính ở bên trái là "Workflow" → "Workflow mới" ở góc trên bên phải.
  2. Tên: daily-tech-digest, Sự miêu tả: 每天早 8 点的科技新闻摘要.
  3. Nhấp vào "Tạo". Nhảy vào trình soạn thảo ngay lập tức.

Trình chỉnh sửa mở ra bằng hai cột: canvas (trực quan hóa DAG) ở bên trái và YAML ở bên phải. Những thay đổi ở hai bên sẽ được đồng bộ sang bên kia theo thời gian thực.

Bước 2 · Khai báo đại lý

Chuyển sang cột YAML và thêm phần Agent ở trên cùng (sau các biến):

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

Mô tả: Cài đặt sẵn của người viết được tối ưu hóa đặc biệt cho văn bản tiếng Trung. Ghi đè giới hạn max_iterations ở mức 3 để Agent không nghĩ quá nhiều về một bản tóm tắt (bản thân bản tóm tắt rất đơn giản).

Để biết giải thích chi tiết về cài đặt trước, hãy xem Hướng dẫn cấu hình Agent.

Bước 3 · tìm nạp: bước mã để lấy RSS

Tiếp tục trong YAML, thêm tìm nạp theo các bước:

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

Một vài điểm chính:

  • language: node — Nút 20 là một trong những thời gian chạy có hỗ trợ tích hợp.
  • extract — Chọn trường bài viết từ JSON xuất chuẩn của tập lệnh và tham chiếu nó xuống phía dưới bằng cách sử dụng step.fetch.data.articles.
  • idempotent: true — "Cùng một ngày kéo tin thì kết quả gần như giống nhau" — có thể bỏ qua khi dịch vụ khởi động lại chạy tiếp.
Hộp cát cho các bước mã

Văn lệnh của bạn sẽ chạy trong một hộp cát cách ly sử dụng một lần với mặc định 512MB bộ nhớ, 0,5 CPU và 300 giây thời gian. Mạng chỉ cho phép yêu cầu bị hạn chế. Bạn có thể lấy dữ liệu bên ngoài một cách an toàn, nhưng bạn không thể lắng nghe cổng; chỉ / tmp sẵn sàng để ghi vào đĩa.

Bước 4 · phân loại: dán nhãn cho từng tin tức

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

Đầu ra của bộ phân loại có thể được chuyển {{classifier.category}} Trích dẫn - Đó là kết quả phân loại của tin tức trước đó. Chúng ta sẽ sử dụng nó để thực hiện phân nhánh có điều kiện trong bước tiếp theo.

Để biết cú pháp đầy đủ của các tham chiếu biến, hãy xem Biến.

Bước 5 · tóm tắt: Viết tóm tắt chỉ dành cho lớp AI

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

Sự miêu tả:

  • condition Để bước này chỉ được thực hiện khi kết quả phân loại là ai, các hạng mục khác bị bỏ qua (trạng thái BỎ QUA, không tính là thất bại).
  • idempotent: true —— Tóm tắt thuần túy là bình thường, cùng một đầu vào → cùng một đầu ra.

Bước 6 · biên dịch: đánh vần toàn bộ 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

Bước này tổng hợp tất cả các kết quả tóm tắt ngược dòng thành Markdown có thể được gửi trực tiếp. trích xuất hiển thị nó dưới dạng step.compile.data.markdown, điều này làm cho các tham chiếu xuôi dòng sạch hơn.

Bước 7 · xem xét: xác nhận thủ công trước khi gửi

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

Đây là dạng tối giản của manual_approval — quy trình tạm dừng tại đây, trang "Quản lý phê duyệt" xuất hiện một mục chờ duyệt. Bạn bấm "Phê duyệt" workflow mới đi tiếp; bấm "Từ chối" thì trạng thái execution thành FAILED, mọi step sau bị hủy.

Để biết cấu hình phê duyệt linh hoạt hơn (chỉ định người phê duyệt, kênh thông báo, hết hạn), hãy xem Chấp thuận thủ công.

Bước 8 · phân phối: sub_workflow gọi mô-đun tích hợp của nền tảng

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

Sự miêu tả:

  • dingyue-module-slack-deliver Nó là một trong những mô-đun giao hàng được xây dựng sẵn có với các nền tảng, tóm tắt toàn bộ hoạt động của "hàng loạt tải mạnh mẽ gửi thông điệp thử lại trạng thái".
  • slack_webhook_url Tham khảo địa chỉ Mạng bổ sung được cấu hình trong biến - chúng tôi sẽ cấu hình điều này trong bước 10.

Bước 9 · Xem trước canvas

Chuyển về thanh canvas bên trái và bạn sẽ thấy 6 nút được kết nối thành một dòng bằng cách tìm nạp → phân loại → tóm tắt → biên dịch → đánh giá → phân phối. Bấm đúp vào bất kỳ nút nào để mở rộng đoạn YAML của nó; kéo nút để điều chỉnh vị trí của nó—các thay đổi về bố cục chỉ hiển thị trực quan và không ảnh hưởng đến YAML.

Bước 10 · Hoàn thành thông tin xác thực

Trước khi chạy workflow này, bạn cần có:

  1. openai_api_key (Khóa LLM được Đại lý sử dụng)
    • Chọn api_key làm loại và dán sk-... bạn nhận được từ OpenAI làm giá trị.
  2. slack_webhook_url (Slack gửi URL Webok cho giao hàng)
    • Chọn api key hoặc bí mật văn bản dạng kiểu và dán địa chỉ Mạng gửi tới là giá trị.

Sau khi lưu, tên thông tin xác thực được tham chiếu trong quy trình làm việc tương ứng với tên riêng này và có thể được phân tích cú pháp trong thời gian chạy.

Bước 11 · Xác nhận và chạy thử

11.1 Xác minh

Nhấp vào "Xác minh" ở trên cùng. Nền tảng sử dụng trình phân tích cú pháp Agent hoàn chỉnh để thực hiện một chuyến đi khứ hồi; nếu có lỗi cú pháp/tham chiếu thì số dòng + lý do cụ thể sẽ được cung cấp. Nhận tất cả các dòng màu đỏ trước khi thực hiện bước tiếp theo.

11.2 chạy thử

Bấm "Chạy", tick dry-run trong hộp thoại, bấm "Bắt đầu chạy". Lần này:

  • tìm nạp sẽ thực sự chạy - rất khó để đánh giá tác dụng phụ của bước mã, vì vậy chúng tôi để nó chạy theo mặc định (nhưng hộp cát mạng bị hạn chế);
  • phân loại/tóm tắt/biên dịch - vì là LLM nên các giá trị mô phỏng được trả về trong quá trình chạy thử;
  • xem xét - phê duyệt tự động khi chạy thử (không có phê duyệt đạn thật);
  • cung cấp - mô-đun biết chế độ chạy thử và sẽ không thực sự gửi tin nhắn Telegram.

Nếu thành công, mọi step sẽ là COMPLETED xanh lá hoặc SKIPPED xám. Vào khu dưới phải xem "đầu vào / đầu ra / ảnh chụp biến" của từng bước, xác nhận các biến đã nối đúng.

Bước 12 · Chạy thật sự

  1. Nhấp vào "Thực thi", Thôi Kiểm tra chạy khô để bắt đầu thực hiện.
  2. Luồng sự kiện thời gian thực ở bên phải bắt đầu nhấp nháy. Kiểm tra xem 10 mục đã được tìm nạp chưa sau khi chạy tìm nạp; dán nhãn cho từng mục chạy theo phân loại; tóm tắt chỉ được thực thi trên các mục AI.
  3. Khi chạy để xem lại, toàn bộ quá trình thực thi sẽ bị tạm dừng và trạng thái sẽ thay đổi thành PENDING_APPROVAL. Chuyển sang "Quản lý phê duyệt" và bạn sẽ thấy một mục đang chờ phê duyệt. Nhấp vào "Xem" để đọc bản nháp Markdown.
  4. Nhấn "Approve" khi được thỏa mãn. Workflow tự động tiếp tục truyền tải và thông điệp Slack được gửi đi.
  5. Sau khi chạy, hãy quay lại trang chi tiết workflow để xem số liệu thống kê về mã thông báo/chi phí của quá trình thực thi này.
Kỳ vọng của tôi cho lần chạy thực sự đầu tiên của tôi

Quá trình này mất khoảng 1–3 phút (tùy thuộc vào mạng) và tốn khoảng 5000–15000 mã thông báo (khoảng 0,01–0,03 USD theo openai gpt-4.1-mini). Dưới phạm vi này có thể không thu được tin tức và trên phạm vi này có thể phản ánh việc tóm tắt.

Bước 13: Cài đặt cron để chạy tự động mỗi ngày

  1. "Quản lý lịch trình" ở bên trái → "Lịch trình mới".
  2. Quy trình làm việc mục tiêu: thông tin công nghệ hàng ngày; Loại: cron; Sự biểu lộ: 0 0 8 * * ?; Múi giờ: Châu Á/Thượng Hải.
  3. "Mặc định tham số" có thể trống - tất cả các biến của chúng tôi đều có giá trị mặc định hợp lý.
  4. Cứu. "Thời gian kích hoạt tiếp theo" sẽ hiển thị vào 8 giờ ngày mai.

Quy trình làm việc YAML phiên bản đầy đủ

Mở rộng để xem YAML hoàn chỉnh
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}}"

Bạn sẽ biết cách thực hiện sau khi thực hiện nó

  • Chỉnh sửa quy trình làm việc hoàn chỉnh với cột kép YAML + Canvas
  • Các phương pháp viết thực tế của năm chế độ chính gồm các bước mã, trình phân loại, đơn, phê duyệt thủ công và quy trình làm việc phụ
  • Các cách sử dụng khác nhau của tham chiếu biến (var/steps/classifier/credentials)
  • xác thực/chạy thử/chạy thực/hoàn thành chu trình trực tuyến cron
  • Cách hợp tác giữa Trung tâm thông tin xác thực và Workflow YAML

Kế Tiếp