Saltar para o conteúdo principal
DocsComeçarHands-on: Seu Primeiro workflow
Mão-a-mão · 15 minutos

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.

antes de começar
  • 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

  1. fetchcode Etapas: Use o Node para capturar RSS e analisá-lo em JSON.
  2. classifyclassifier Passos: Rotule cada notícia com um rótulo de categoria.
  3. summarizesingle Etapas: Gere resumos em chinês apenas para aulas de IA.
  4. compilecode Passos: Monte um Markdown inteiro.
  5. reviewmanual_approval: Faça uma pausa para eu dar uma olhada antes de enviar.
  6. deliversub_workflow: reutiliza o módulo integrado de entrega pelo Slack.

Passo 1 · Crie um novo workflow

  1. O principal ponto de navegação à esquerda é "Workflow" â "New Workflow" no canto superior direito.
  2. Nome: daily-tech-digest, descrição: 每天早 8 点的科技新闻摘要.
  3. 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):

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

Descriçã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:

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

Alguns 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.
Sandbox para etapas de código

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

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

A 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

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

Descrição:

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

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

Esta 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

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

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

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

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_url Consulte 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:

  1. openai_api_key (Chave LLM usada pelo Agente)
    • Selecione api_key como o tipo e cole o sk-... obtido do OpenAI como o valor.
  2. 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

  1. Clique em "Executar", Cancelar Verifique o teste para iniciar a execução.
  2. O fluxo de eventos em tempo real à direita começa a piscar.
  3. Ao executar para revisão, toda a execução será suspensa e o status mudará para PENDING_APPROVAL.
  4. Clique em "Aproximar" quando satisfeito. O workflow continua automaticamente a entregar e a mensagem Slack é enviada.
  5. Após a execução, retorne à página de detalhes do workflow para ver as estatísticas de token/custo dessa execução.
Minhas expectativas para minha primeira corrida real

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

  1. "Gerenciamento de agendamento" à esquerda â "Novo agendamento".
  2. workflow alvo: resumo técnico diário; 0 0 8 * * ?;
  3. "Padrões de parâmetro" pode estar vazio - todas as nossas variáveis têm valores padrão razoáveis.
  4. Salvar.

Versão completa do workflow YAML

Expanda para ver o YAML completo
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}}"

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