Hands-on: Construir um workflow sumário diário de Scratch
Siga um cenário de negócios específico para juntar todos os conceitos principais: puxar dados → classificar → resumir → entregar.
Este artigo percorre um cenário de negócios específico do início ao fim, permitindo que todos os conceitos aprendidos anteriormente (workflow/etapa/agente/variáveis/classificador/sub_workflow/credenciais) se encaixem em um processo real.
- Já registrei uma conta Braidrun e fiz login. Se você não sabe, procure primeiro Registo e login.
- Existe uma chave de API para qualquer OpenAI/Anthropic/DeepSeek.
- (Opcional) Um Slack Incoming Webhook URL - necessário se você quiser experimentar o processo de entrega.
Cenário de negócios: resumo diário de notícias de tecnologia
Requisitos:
- Executar automaticamente às 8h todas as manhãs;
- Veja as 10 últimas notícias de tecnologia do Hacker News / 36Kr / The Verge RSS;
- Classifique cada item em três categorias: “IA/Hardware/Outros”;
- Gere resumos de 60 palavras em chinês apenas para itens classificados como IA;
- Resuma em Markdown e entregue no canal do Slack;
- Peça-me para clicar em "Confirmar" antes de enviar - para evitar a entrega de dados sujos.
Etapas para desmontar no Braidrun
fetch— code Etapas: Use o Node para capturar RSS e analisá-lo em JSON.classify— classifier Passos: Rotule cada notícia com um rótulo de categoria.summarize— single Etapas: Gere resumos em chinês apenas para aulas de IA.compile— code Passos: Monte um Markdown inteiro.review— manual_approval: Faça uma pausa para eu dar uma olhada antes de enviar.deliver— sub_workflow: reutiliza o módulo integrado de entrega pelo Slack.
Passo 1 · Crie um novo workflow
- O principal ponto de navegação à esquerda é "Workflow" â "New Workflow" no canto superior direito.
- Nome:
daily-tech-digest, descrição:每天早 8 点的科技新闻摘要. - Clique em "Criar".
O editor abre com duas colunas: canvas (visualização DAG) à esquerda e YAML à direita.
Passo 2 · Declarar Agente
Mude para a coluna YAML e adicione uma seção de agentes na parte superior (depois das variáveis):
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key # 引用凭据中心里的 KeyDescrição: A predefinição do escritor é especialmente otimizada para escrita chinesa.
Para obter uma explicação detalhada da predefinição, consulte Guia de Configuração do Agente.
Etapa 3 · fetch:code etapa para obter RSS
Continuando no YAML, adicione fetch nas etapas:
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: $.articlesAlguns pontos-chave:
language: node— O nó 20 é um dos tempos de execução com suporte integrado.extract— Escolha o campo articles do JSON stdout do script e faça referência a ele downstream usando steps.fetch.data.articles.idempotent: true— “Publicar notícias no mesmo dia provavelmente resultará no mesmo resultado” – isso pode ser ignorado quando o serviço for reiniciado e retomado.
Seu script será executado em uma sandbox de isolamento descartável com 512MB de memória padrão, 0.5 núcleo de CPU e 300 segundo tempo limite. A rede só permite pedidos de saída. Você pode obter dados externos com segurança, mas você não pode ouvir a porta; somente /tmp está disponível para escrita no disco.
Passo 4 · classificar: rotular cada notícia
- 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: categoryA saída do classificador pode ser passada {{classifier.category}} Citação - É o resultado da classificação da notícia anterior.
Para a sintaxe completa de referências de variáveis, consulte Variáveis e expressões.
Passo 5 · resumir: Escreva um resumo apenas para a aula de IA
- id: summarize
type: single
agent: writer
idempotent: true
condition: "{{classifier.category}} == 'ai'"
task: |
用一段中文(不超过 60 字)概括下面这条 AI 新闻:
{{steps.fetch.data.articles[0].title}}Descrição:
conditionDeixe que esta etapa seja executada apenas quando o resultado da classificação for ai, outras categorias são ignoradas (status SKIPPED, não conta como falha).idempotent: true—— Resumos puros são idempotentes, mesma entrada → mesma saída.
Passo 6 · compilar: soletrar todo o 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: $.markdownEsta etapa agrega todos os resultados resumidos upstream em um Markdown que pode ser enviado diretamente.
Passo 7 · revisão: confirmação manual antes de enviar
- id: review
type: manual_approval
title: "请审阅今日 AI 摘要"
body: "{{steps.compile.data.markdown}}"
approvers: [] # 空 = 团队所有 Admin 都可审批
notify: [in_app] # 也可以 slack / email / feishuEsta é a forma mais simples de manual_approval - o processo será pausado aqui e uma aprovação pendente aparecerá na página Gerenciamento de Aprovações.
Para obter uma configuração de aprovação mais flexível (designação de aprovadores, canais de notificação, expiração), consulte Aprovação manual.
Etapa 8 · entregar: sub_workflow chama o módulo integrado da plataforma
- 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}}"Descrição:
dingyue-module-slack-deliverÉ um dos módulos de entrega embutidos que vem com a plataforma, encapsulando toda a rotina de "montar carga útil → enviar mensagem → repetir → recuperar status".slack_webhook_urlConsulte o URL Slack Incoming Webhook configurado na variável - vamos configurar isso no passo 10.
Passo 9 · Visualização da tela
Volte para a barra esquerda da tela e você verá 6 nós conectados em uma linha por buscar → classificar → resumir → compilar → revisar → entregar.
Passo 10 · Credenciais completas
Antes de executar este workflow, você precisa ter:
openai_api_key(Chave LLM usada pelo Agente)- Selecione api_key como o tipo e cole o sk-... obtido do OpenAI como o valor.
slack_webhook_url(Slack Incoming Webhook URL para entrega)- Selecione api key ou secret text como o tipo e cole o URL Slack Incoming Webhook como o valor.
Depois de salvar, os nomes das credenciais referenciados no workflow correspondem a este um a um e podem ser analisados em tempo de execução.
Etapa 11 · Validação e simulação
11.1 Verificação
Clique em "Verificar" na parte superior.
11.2 teste
Clique em "Executar", marque a simulação na caixa de diálogo e clique em "Iniciar execução".
- fetch será realmente executado - é difícil avaliar os efeitos colaterais da etapa do código, então deixamos ele ser executado por padrão (mas a sandbox da rede é limitada);
- classificar / resumir / compilar - por ser LLM, os valores simulados são retornados durante o teste;
- revisão - aprovação automática em simulação (sem aprovação real de munição);
- entregar - o módulo conhece o modo de simulação e não enviará mensagens do Telegram.
Se for bem-sucedido, todas as etapas ficarão verdes CONCLUÍDAS ou cinza SKIPPED.
Passo 12 · Faça uma corrida de verdade
- Clique em "Executar", Cancelar Verifique o teste para iniciar a execução.
- O fluxo de eventos em tempo real à direita começa a piscar.
- Ao executar para revisão, toda a execução será suspensa e o status mudará para PENDING_APPROVAL.
- Clique em "Aproximar" quando satisfeito. O workflow continua automaticamente a entregar e a mensagem Slack é enviada.
- Após a execução, retorne à página de detalhes do workflow para ver as estatísticas de token/custo dessa execução.
Demora cerca de 1 a 3 minutos (dependendo da rede) e custa cerca de 5.000 a 15.000 tokens (cerca de US$ 0,01 a 0,03 de acordo com openai gpt-4.1-mini).
Etapa 13: Instale o cron para ser executado automaticamente todos os dias
- "Gerenciamento de agendamento" à esquerda â "Novo agendamento".
- workflow alvo: resumo técnico diário;
0 0 8 * * ?; - "Padrões de parâmetro" pode estar vazio - todas as nossas variáveis têm valores padrão razoáveis.
- Salvar.
Versão completa do workflow YAML
Expanda para ver o YAML completo
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}}"Você já saberá como fazer depois de fazer
- Edite um workflow completo com colunas duplas YAML + Canvas
- Os métodos reais de escrita dos cinco modos principais de etapas de código, classificador, único, aprovação_manual e sub_workflow
- Diferentes usos de referências de variáveis (var/steps/classifier/credentials)
- validar / simulação / execução real / ciclo completo do cron online
- Como cooperar entre o Credential Center e o Workflow YAML
Próximo
- Leia 8 tipos de etapas — Uso, campos e restrições de combinação de cada um
- Aprenda a depurar com pontos de interrupção — Economize 80% do tempo de solução de problemas quando o workflow se tornar complexo
- Modularização e reutilização — Quando você tiver o segundo e o terceiro workflows, extraia a lógica comum em sub_workflow