Combate práctico: escriba un flujo de trabajo resumido diario desde cero
Siga un escenario empresarial específico para unir todos los conceptos centrales: extraer datos → clasificar → resumir → entregar.
Este artículo recorre un escenario empresarial específico de principio a fin, permitiendo que todos los conceptos aprendidos previamente (flujo de trabajo/paso/agente/variables/clasificador/sub_flujo de trabajo/credenciales) encajen en un proceso real. Después de 15 minutos, tendrás la sensación de "puedo realizar un flujo de trabajo de forma independiente".
- Ya registró una cuenta de Braidrun e inició sesión. Si no lo sabe, mire primero Registro e inicio de sesión.
- Hay una clave API para cualquiera de OpenAI/Anthropic/DeepSeek. Aún puedes dar los primeros pasos sin él, pero te saltarás el paso LLM cuando realmente lo ejecutes.
- (Opcional) Una URL de webhook entrante de Slack: necesaria si desea experimentar el proceso de entrega.
Escenario empresarial: resumen diario de noticias tecnológicas
Requisitos:
- Se ejecuta automáticamente a las 8:00 todas las mañanas;
- Vea las 10 últimas noticias tecnológicas de Hacker News / 36Kr / The Verge RSS;
- Clasifique cada elemento en tres categorías: "IA/Hardware/Otros";
- Genere resúmenes en chino de 60 palabras solo para aquellos elementos clasificados como AI;
- Resúmalo en Markdown y entréguelo al canal de Telegram;
- Pídeme que haga clic en "Confirmar" antes de enviar, para evitar entregar datos sucios.
Pasos para desmontar en Braidrun
fetch— code Pasos: use Node para capturar RSS y analizarlo en JSON.classify— classifier Pasos: Etiquete cada noticia con una etiqueta de categoría.summarize— single Pasos: genere resúmenes en chino solo para las clases de IA.compile— code Pasos: cree un Markdown completo.review— manual_approval: Haga una pausa para dejarme echar un vistazo antes de enviar.deliver— sub_workflow: reutiliza el módulo integrado de entrega a Slack.
Paso 1 · Crea un nuevo flujo de trabajo
- El punto de navegación principal a la izquierda es "Flujo de trabajo" → "Nuevo flujo de trabajo" en la esquina superior derecha.
- Nombre:
daily-tech-digest, descripción:每天早 8 点的科技新闻摘要. - Haga clic en "Crear". Salta al editor inmediatamente.
El editor se abre con dos columnas: lienzo (visualización DAG) a la izquierda y YAML a la derecha. Los cambios en cada lado se sincronizarán con el otro lado en tiempo real.
Paso 2 · Declarar Agente
Cambie a la columna YAML y agregue una sección de agentes en la parte superior (después de las variables):
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key # 引用凭据中心里的 KeyDescripción: El ajuste preestablecido de escritura está especialmente optimizado para la escritura china. Las anulaciones limitan max_iterations a 3 para que el agente no piense demasiado en un resumen (el resumen en sí es muy simple).
Para una explicación detallada del preajuste, consulte Explicación detallada de la configuración del Agente.
Paso 3 · buscar: paso de código para obtener RSS
Continuando en YAML, agregue buscar en los pasos:
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: $.articlesAlgunos puntos clave:
language: node— El nodo 20 es uno de los tiempos de ejecución con soporte integrado.extract— Seleccione el campo de artículos del JSON de salida estándar del script y haga referencia a él en sentido descendente usando pasos.fetch.data.articles.idempotent: true— "La publicación de noticias el mismo día probablemente producirá el mismo resultado": esto se puede omitir cuando se reinicia y reanuda el servicio.
Su script se ejecutará en una zona de pruebas de aislamiento desechable con 512 MB de memoria predeterminados, núcleo de CPU 0.5 y tiempo de espera de 300 segundos. La red solo permite solicitudes salientes. Puede recuperar datos externos de forma segura, pero no puede escuchar el puerto; sólo /tmp está disponible para escribir en el disco.
Paso 4 · clasificar: etiquetar cada noticia
- 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: categoryLa salida del clasificador se puede pasar. {{classifier.category}} Cita - Es el resultado de la clasificación de la noticia anterior. Lo usaremos para realizar bifurcaciones condicionales en el siguiente paso.
Para obtener la sintaxis completa de las referencias de variables, consulte Variables y expresiones.
Paso 5 · resumir: escriba un resumen solo para la clase de IA
- id: summarize
type: single
agent: writer
idempotent: true
condition: "{{classifier.category}} == 'ai'"
task: |
用一段中文(不超过 60 字)概括下面这条 AI 新闻:
{{steps.fetch.data.articles[0].title}}Descripción:
conditionDeje que este paso solo se ejecute cuando el resultado de la clasificación sea ai, se omitan otras categorías (estado SKIPPED, no cuenta como falla).idempotent: true—— Los resúmenes puros son idempotentes, misma entrada → misma salida.
Paso 6 · compilar: deletrea todo el 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: $.markdownEste paso agrega todos los resultados resumidos ascendentes en un Markdown que se puede enviar directamente. extract lo expone como pasos.compile.data.markdown, lo que hace que las referencias posteriores sean más limpias.
Paso 7 · revisión: confirmación manual antes de enviar
- id: review
type: manual_approval
title: "请审阅今日 AI 摘要"
body: "{{steps.compile.data.markdown}}"
approvers: [] # 空 = 团队所有 Admin 都可审批
notify: [in_app] # 也可以 slack / email / feishuEsta es la forma más sencilla de aprobación_manual: el proceso se detendrá aquí y aparecerá una aprobación pendiente en la página Gestión de aprobaciones. Haga clic en "Aprobar" para continuar con el flujo de trabajo; haga clic en "Rechazar" y el estado de ejecución cambiará a FALLADO y todos los pasos posteriores se cancelarán.
Para una configuración de aprobación más flexible (designación de aprobadores, canales de notificación, vencimiento), consulte Aprobación manual.
Paso 8 · entregar: sub_workflow llama al módulo integrado de la 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}}"Descripción:
dingyue-module-slack-deliverEs uno de los módulos de entrega integrados que viene con la plataforma, que encapsula toda la rutina de "carga útil de ensamblaje → enviar mensaje → reintentar → escribir estado de respuesta".slack_webhook_urlHaga referencia a la URL del webhook entrante de Slack configurada en la variable; configuraremos esto en el paso 10.
Paso 9 · Vista previa del lienzo
Vuelva a la barra de lienzo izquierda y verá 6 nodos conectados en una línea mediante buscar → clasificar → resumir → compilar → revisar → entregar. Haga doble clic en cualquier nodo para expandir su fragmento YAML; arrastre el nodo para ajustar su posición; los cambios de diseño son solo visuales y no afectan el YAML.
Paso 10 · Credenciales completas
Antes de ejecutar este flujo de trabajo, debe tener:
openai_api_key(Clave LLM utilizada por el agente)- Seleccione api_key como tipo y pegue el sk-... que obtuvo de OpenAI como valor.
slack_webhook_url(URL de webhook entrante de Slack para entrega)- Seleccione api_key o secret_text como tipo y pegue la URL del webhook entrante de Slack como valor.
Después de guardar, los nombres de las credenciales a las que se hace referencia en el flujo de trabajo corresponden a este uno a uno y se pueden analizar en tiempo de ejecución.
Paso 11 · Validación y ensayo
11.1 Verificación
Haga clic en "Verificar" en la parte superior. La plataforma utiliza el analizador de agentes completo para realizar un viaje de ida y vuelta; si hay un error de sintaxis/referencia, se proporcionará el número de línea específico + el motivo. Obtenga todas las líneas rojas antes de dar el siguiente paso.
11.2 funcionamiento en seco
Haga clic en "Ejecutar", marque la ejecución en seco en el cuadro de diálogo y haga clic en "Iniciar ejecución". Esta vez:
- fetch realmente se ejecutará; es difícil juzgar los efectos secundarios del paso del código, por lo que dejamos que se ejecute de forma predeterminada (pero la zona de pruebas de la red es limitada);
- clasificar/resumir/compilar: debido a que es LLM, los valores simulados se devuelven durante el ensayo;
- revisión: aprobación automática en simulacro (sin aprobación de munición real);
- entregar: el módulo conoce el modo de ejecución en seco y en realidad no enviará mensajes de Telegram.
Si tiene éxito, todos los pasos aparecerán en verde COMPLETADOS o en gris SALTADOS. Vaya al área inferior derecha para ver la "Instantánea de entrada/salida/variable" de cada paso y confirme que todas las variables estén conectadas correctamente.
Paso 12 · Haz una carrera real
- Haga clic en "Ejecutar", Cancelar Verifique el simulacro para iniciar la ejecución.
- El flujo de eventos en tiempo real a la derecha comienza a parpadear. Verifique si se han recuperado 10 elementos después de ejecutar la búsqueda; etiquetar cada elemento ejecutado por clasificación; El resumen solo se ejecuta en los elementos de IA.
- Al ejecutar la revisión, se suspenderá toda la ejecución y el estado cambiará a PENDING_APPROVAL. Cambie a "Gestión de aprobación" y verá un elemento esperando aprobación. Haga clic en "Ver" para leer el borrador de Markdown.
- Haga clic en "Aprobar" cuando esté satisfecho. El flujo de trabajo continúa entregándose automáticamente y se envía el mensaje de Slack.
- Después de la ejecución, regrese a la página de detalles del flujo de trabajo para ver las estadísticas de token/costo de esta ejecución.
Tarda entre 1 y 3 minutos (dependiendo de la red) y cuesta entre 5.000 y 15.000 tokens (entre 0,01 y 0,03 dólares según openai gpt-4.1-mini). Por debajo de este rango puede haber una falla en la obtención de noticias, y por encima de este rango puede haber un reflejo del resumen.
Paso 13: Instale cron para que se ejecute automáticamente todos los días
- "Gestión de programación" a la izquierda → "Nueva programación".
- Flujo de trabajo objetivo: resumen tecnológico diario; Tipo: cron; Expresión:
0 0 8 * * ?; Zona horaria: Asia/Shanghai. - Los "Parámetros predeterminados" pueden estar vacíos: todas nuestras variables tienen valores predeterminados razonables.
- Guardar. La "próxima hora de activación" será mañana a las 8:00.
Flujo de trabajo YAML versión completa
Ampliar para ver 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}}"Ya Sabrás cómo hacerlo después de hacerlo.
- Edite un flujo de trabajo completo con columnas duales YAML + Canvas
- Los métodos de escritura reales de los cinco modos principales de pasos de código, clasificador, único, aprobación_manual y sub_flujo de trabajo.
- Diferentes usos de referencias variables (var/steps/classifier/credentials)
- validar / ejecutar en seco / ejecutar real / completar el ciclo cron en línea
- Cómo cooperar entre Credential Center y Workflow YAML
Siguiente
- Lea los 8 tipos de pasos — Restricciones de uso, campos y combinación de cada uno
- Aprenda a depurar con puntos de interrupción — Ahorre un 80 % del tiempo de resolución de problemas cuando el flujo de trabajo se vuelva complejo
- Modularización y reutilización — Cuando tenga el segundo y tercer flujo de trabajo, extraiga la lógica común en sub_workflow