실용적인 전투: 처음부터 일일 요약 작업 흐름 작성
특정 비즈니스 시나리오에 따라 데이터 가져오기 → 분류 → 요약 → 전달 등 모든 핵심 개념을 하나로 묶습니다.
이 문서에서는 이전에 배운 모든 개념(워크플로/단계/에이전트/변수/분류자/sub_workflow/credentials)을 실제 프로세스에 적용할 수 있도록 특정 비즈니스 시나리오를 처음부터 끝까지 안내합니다. 15분 후에는 "독립적으로 작업 흐름을 수행할 수 있다"는 느낌을 받게 됩니다.
- 이미 Braidrun 계정을 등록하고 로그인했습니다. 모르신다면 먼저 살펴보세요 등록 및 로그인.
- OpenAI / Anthropic / DeepSeek에 대한 API 키가 있습니다. 처음 몇 단계는 LLM 없이도 진행할 수 있지만 실제로 실행하면 LLM 단계를 건너뛰게 됩니다.
- (선택 사항) Slack 수신 웹훅 URL - 전달 프로세스를 경험하려는 경우 필요합니다.
비즈니스 시나리오: 일일 기술 뉴스 요약
요구사항:
- 매일 아침 8시에 자동으로 실행됩니다.
- Hacker News/36Kr/The Verge RSS에서 10가지 최신 기술 뉴스를 확인하세요.
- 각 항목을 "AI/하드웨어/기타"의 세 가지 범주로 분류합니다.
- AI로 분류된 항목에 대해서만 60단어 중국어 요약을 생성합니다.
- Markdown으로 요약하여 Telegram 채널에 전달합니다.
- 더러운 데이터가 전달되는 것을 방지하려면 전송하기 전에 "확인"을 클릭하도록 요청하세요.
Braidrun로 분해하는 단계
fetch— code 단계: Node를 사용하여 RSS를 캡처하고 이를 JSON으로 구문 분석합니다.classify— classifier 단계: 각 뉴스 항목에 카테고리 라벨을 붙입니다.summarize— single 단계: AI 클래스에 대해서만 중국어 요약을 생성합니다.compile— code 단계: 전체 Markdown을 하나로 합칩니다.review— manual_approval: 보내기 전에 잠깐 살펴보겠습니다.deliver— sub_workflow: 내장 Slack 전송 모듈을 재사용합니다.
1단계 · 새 워크플로 만들기
- 왼쪽의 주요 탐색 지점은 오른쪽 상단의 "Workflow" → "New Workflow"입니다.
- 이름:
daily-tech-digest, 설명:每天早 8 点的科技新闻摘要. - "만들기"를 클릭하세요. 즉시 편집기로 이동하세요.
편집기는 왼쪽에 캔버스(DAG 시각화), 오른쪽에 YAML이라는 두 개의 열이 있는 상태로 열립니다. 양쪽의 변경 사항은 실시간으로 상대방과 동기화됩니다.
2단계 · 대리인 선언
YAML 열로 전환하고 상단(변수 뒤)에 에이전트 섹션을 추가합니다.
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key # 引用凭据中心里的 Key설명: 작가 사전 설정은 중국어 쓰기에 특별히 최적화되어 있습니다. 에이전트가 요약에 대해 너무 많이 생각하지 않도록 max_iterations 제한을 3으로 재정의합니다(요약 자체는 매우 간단합니다).
프리셋에 대한 자세한 설명은 다음을 참고하세요. Agent 구성에 대한 자세한 설명.
3단계 · RSS를 가져오기 위한 가져오기:코드 단계
계속해서 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은 기본적으로 지원되는 런타임 중 하나입니다.extract— 스크립트의 stdout JSON에서 기사 필드를 선택하고 steps.fetch.data.articles를 사용하여 다운스트림을 참조합니다.idempotent: true— "같은 날 뉴스를 게시하면 동일한 결과가 나올 가능성이 높습니다." - 서비스를 다시 시작하고 재개할 때 건너뛸 수 있습니다.
스크립트는 기본 512MB 메모리, 0.5 CPU 코어 및 300초 제한 시간을 갖춘 일회용 격리 샌드박스에서 실행됩니다. 네트워크는 아웃바운드 요청만 허용합니다. 외부 데이터를 안전하게 가져올 수 있지만 포트를 수신할 수는 없습니다. /tmp만 디스크에 쓸 수 있습니다.
4단계 · 분류: 각 뉴스 항목에 라벨을 붙입니다.
- 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 클래스에 대해서만 요약을 작성합니다.
- 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의 철자를 작성합니다.
- 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단계 · 검토: 보내기 전 수동 확인
- 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가 플랫폼의 내장 모듈을 호출합니다.
- 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플랫폼과 함께 제공되는 기본 제공 전달 모듈 중 하나이며 "조립 페이로드 → 메시지 전송 → 재시도 → 상태 다시 쓰기"의 전체 루틴을 캡슐화합니다.slack_webhook_url변수에 구성된 Slack Incoming Webhook URL을 참조하세요. 이를 10단계에서 구성하겠습니다.
9단계 · 캔버스 미리보기
다시 왼쪽 캔버스바로 전환하면 가져오기 → 분류 → 요약 → 컴파일 → 검토 → 전달을 통해 6개의 노드가 일렬로 연결된 것을 볼 수 있습니다. 노드를 두 번 클릭하여 YAML 조각을 확장합니다. 노드를 끌어 위치를 조정합니다. 레이아웃 변경은 시각적으로만 가능하며 YAML에는 영향을 주지 않습니다.
10단계 · 자격 증명 완료
이 워크플로를 실행하기 전에 다음이 필요합니다.
openai_api_key(에이전트가 사용하는 LLM 키)- 유형으로 api_key를 선택하고 값으로 OpenAI에서 얻은 sk-...를 붙여넣습니다.
slack_webhook_url(전달을 위한 Slack 수신 Webhook URL)- 유형으로 api_key 또는 secret_text를 선택하고 Slack Incoming Webhook URL을 값으로 붙여넣습니다.
저장 후 워크플로에서 참조되는 자격 증명 이름은 이 일대일에 해당하며 런타임에 구문 분석될 수 있습니다.
11단계 · 검증 및 테스트 실행
11.1 검증
상단의 "확인"을 클릭하세요. 플랫폼은 완전한 에이전트 파서를 사용하여 왕복을 수행합니다. 구문/참조 오류가 있는 경우 특정 줄 번호 + 이유가 제공됩니다. 다음 단계를 진행하기 전에 빨간색 선을 모두 얻으세요.
11.2 테스트 실행
"Execute"를 클릭하고 대화 상자에서 테스트 실행을 선택한 후 "Start Execute"를 클릭합니다. 이번에는:
- fetch가 실제로 실행됩니다. 코드 단계의 부작용을 판단하기가 어렵기 때문에 기본적으로 실행하도록 둡니다(그러나 네트워크 샌드박스는 제한되어 있습니다).
- 분류/요약/컴파일 - LLM이므로 테스트 실행 중에 시뮬레이션된 값이 반환됩니다.
- 검토 - 시험 실행(실제 탄약 승인 없음) 하에서 자동 승인;
- 전달 - 모듈은 테스트 실행 모드를 알고 있으며 실제로 텔레그램 메시지를 보내지 않습니다.
성공하면 모든 단계가 녹색 COMPLETED 또는 회색 SKIPPED로 표시됩니다. 오른쪽 하단 영역으로 이동하여 각 단계의 "입력/출력/변수 스냅샷"을 확인하고 변수가 모두 올바르게 연결되었는지 확인하세요.
12단계 · 실제 달리기를 해보세요
- "실행"을 클릭하고, 취소 실행을 시작하려면 테스트 실행을 확인하세요.
- 오른쪽의 실시간 이벤트 스트림이 깜박이기 시작합니다. 가져오기를 실행한 후 10개 항목을 가져왔는지 확인하세요. 분류별로 실행되는 각 항목에 라벨을 지정합니다. summary는 AI 항목에 대해서만 실행됩니다.
- 검토를 위해 실행하면 전체 실행이 일시 중지되고 상태가 PENDING_APPROVAL로 변경됩니다. "승인 관리"로 전환하면 승인 대기 항목이 표시됩니다. Markdown 초안을 읽으려면 "보기"를 클릭하세요.
- 만족스러우면 "승인"을 클릭하세요. 워크플로는 자동으로 계속 전달되고 Slack 메시지가 전송됩니다.
- 실행 후 워크플로 세부 정보 페이지로 돌아가서 이 실행의 토큰/비용 통계를 확인하세요.
약 1~3분(네트워크에 따라 다름)이 소요되고 비용은 약 5000~15000개 토큰(openai gpt-4.1-mini에 따르면 약 $0.01~0.03)입니다. 이 범위 아래에서는 뉴스를 가져오지 못한 경우가 있을 수 있으며, 이 범위를 초과하면 요약에 대한 반영이 있을 수 있습니다.
13단계: 매일 자동으로 실행되도록 cron 설치
- 왼쪽의 "일정관리" → "새일정".
- 대상 작업 흐름: daily-tech-digest; 유형: 크론; 표현:
0 0 8 * * ?; 시간대: 아시아/상하이. - "매개변수 기본값"은 비어 있을 수 있습니다. 모든 변수에는 합리적인 기본값이 있습니다.
- 저장합니다. "다음 트리거 시간"은 내일 8시로 표시됩니다.
워크플로 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)
- 유효성 검사/시험 실행/실제 실행/크론 온라인 주기 완료
- Credential Center와 Workflow YAML 간의 협력 방법
다음
- 8가지 단계 유형을 읽어보세요. — 각각의 사용법, 필드 및 조합 제약
- 중단점을 사용하여 디버깅하는 방법 알아보기 — 작업 흐름이 복잡해지면 문제 해결 시간을 80% 절약
- 모듈화 및 재사용 — 두 번째 및 세 번째 워크플로가 있는 경우 공통 로직을 sub_workflow로 추출합니다.