Zum Hauptinhalt springen
DokumentErste SchrittePraktischer Kampf: der erste Arbeitsablauf
Praktischer Kampf · 15 Minuten

Praktischer Kampf: Schreiben Sie einen täglichen Zusammenfassungsworkflow von Grund auf

Folgen Sie einem bestimmten Geschäftsszenario, um alle Kernkonzepte zusammenzuführen: Daten abrufen → klassifizieren → zusammenfassen → liefern.

In diesem Artikel wird ein bestimmtes Geschäftsszenario von Anfang bis Ende durchgegangen, sodass alle zuvor erlernten Konzepte (Workflow/Schritt/Agent/Variablen/Klassifikator/Unterworkflow/Anmeldeinformationen) in einen realen Prozess passen. Nach 15 Minuten haben Sie das Gefühl „Ich schaffe einen Workflow selbstständig“.

bevor es losgeht
  • Sie haben bereits ein Braidrun-Konto registriert und angemeldet. Wenn Sie es nicht wissen, schauen Sie zuerst nach Registrierung und Login.
  • Es gibt einen API-Schlüssel für alle OpenAI / Anthropic / DeepSeek. Die ersten paar Schritte kannst du auch ganz ohne machen, aber beim eigentlichen Laufen überspringst du den LLM-Schritt.
  • (Optional) Eine eingehende Slack-Webhook-URL – erforderlich, wenn Sie den Bereitstellungsprozess erleben möchten.

Geschäftsszenario: Tägliche Zusammenfassung der Technologienachrichten

Anforderungen:

  • Wird jeden Morgen automatisch um 8:00 Uhr ausgeführt.
  • Erhalten Sie 10 aktuelle Tech-News von Hacker News / 36Kr / The Verge RSS;
  • Klassifizieren Sie jedes Element in drei Kategorien: „KI/Hardware/Andere“;
  • Generieren Sie chinesische Zusammenfassungen mit 60 Wörtern nur für die als KI klassifizierten Elemente.
  • Fassen Sie es in Markdown zusammen und liefern Sie es an den Telegram-Kanal.
  • Bitten Sie mich, vor dem Senden auf „Bestätigen“ zu klicken, um die Übermittlung fehlerhafter Daten zu vermeiden.

Schritte zum Zerlegen in Braidrun

  1. fetchcode Schritte: Verwenden Sie Node, um RSS zu erfassen und in JSON zu analysieren.
  2. classifyclassifier Schritte: Beschriften Sie jede Nachricht mit einer Kategoriebezeichnung.
  3. summarizesingle Schritte: Generieren Sie chinesische Zusammenfassungen nur für KI-Kurse.
  4. compilecode Schritte: Stellen Sie einen gesamten Markdown zusammen.
  5. reviewmanual_approval: Machen Sie eine Pause, damit ich vor dem Senden einen Blick darauf werfen kann.
  6. deliversub_workflow: Das integrierte Braidrun-Module-Telegram-Deliver wiederverwenden.

Schritt 1 · Erstellen Sie einen neuen Workflow

  1. Der Hauptnavigationspunkt links ist „Workflow“ → „Neuer Workflow“ in der oberen rechten Ecke.
  2. Name: daily-tech-digest, Beschreibung: 每天早 8 点的科技新闻摘要.
  3. Klicken Sie auf „Erstellen“. Springen Sie sofort in den Editor.

Der Editor wird mit zwei Spalten geöffnet: Canvas (DAG-Visualisierung) links und YAML rechts. Änderungen auf beiden Seiten werden in Echtzeit mit der anderen Seite synchronisiert.

Schritt 2 · Agent deklarieren

Wechseln Sie zur YAML-Spalte und fügen Sie oben (nach den Variablen) einen Abschnitt mit Agenten hinzu:

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

Beschreibung: Das Writer-Preset ist speziell für die chinesische Schrift optimiert. Überschreibt die Grenze von max_iterations auf 3, damit der Agent nicht zu viel über eine Zusammenfassung nachdenkt (die Zusammenfassung selbst ist sehr einfach).

Eine ausführliche Erläuterung der Voreinstellungen finden Sie unter Detaillierte Erläuterung der Agentenkonfiguration.

Schritt 3 · fetch:code-Schritt zum Abrufen von RSS

Fahren Sie in der YAML fort und fügen Sie „fetch“ unter den folgenden Schritten hinzu:

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

Ein paar wichtige Punkte:

  • language: node — Knoten 20 ist eine der Laufzeitumgebungen mit integrierter Unterstützung.
  • extract — Wählen Sie das Feld „Artikel“ aus dem Standard-JSON-Code des Skripts aus und referenzieren Sie es nachgelagert mit „steps.fetch.data.articles“.
  • idempotent: true — „Die Veröffentlichung von Nachrichten am selben Tag wird höchstwahrscheinlich zum gleichen Ergebnis führen“ – dies kann übersprungen werden, wenn der Dienst neu gestartet und fortgesetzt wird.
Sandbox für Codeschritte

Ihr Skript wird in einer isolierten Einweg-Sandbox mit standardmäßig 512 MB Arbeitsspeicher, 0.5 CPU-Kern und 300 Sekunden Zeitüberschreitung ausgeführt. Das Netzwerk lässt nur ausgehende Anfragen zu. Sie können externe Daten sicher abrufen, aber Sie können den Port nicht abhören; Zum Schreiben auf die Festplatte steht nur /tmp zur Verfügung.

Schritt 4 · Klassifizieren: Beschriften Sie jede Nachricht

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

Die Ausgabe des Klassifikators kann übergeben werden {{classifier.category}} Zitat: Es handelt sich um das Klassifizierungsergebnis der vorherigen Nachrichten. Wir werden es im nächsten Schritt für die bedingte Verzweigung verwenden.

Die vollständige Syntax von Variablenreferenzen finden Sie unter Variablen und Ausdrücke.

Schritt 5 · Zusammenfassen: Schreiben Sie eine Zusammenfassung nur für die KI-Klasse

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

Beschreibung:

  • condition Lassen Sie diesen Schritt nur ausführen, wenn das Klassifizierungsergebnis ai ist, andere Kategorien werden übersprungen (Status SKIPPED, wird nicht als Fehler gezählt).
  • idempotent: true —— Reine Zusammenfassungen sind idempotent, gleiche Eingabe → gleiche Ausgabe.

Schritt 6 · Kompilieren: Buchstabieren Sie den gesamten 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

Dieser Schritt fasst alle vorgelagerten Zusammenfassungsergebnisse in einem Markdown zusammen, der direkt gesendet werden kann. extract macht es als „steps.compile.data.markdown“ verfügbar, wodurch Downstream-Referenzen sauberer werden.

Schritt 7 · Überprüfung: manuelle Bestätigung vor dem Senden

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

Dies ist die einfachste Form von „manual_approval“ – der Prozess wird hier angehalten und eine ausstehende Genehmigung wird auf der Seite „Genehmigungsverwaltung“ angezeigt. Klicken Sie auf „Genehmigen“, um den Workflow fortzusetzen. Klicken Sie auf „Ablehnen“ und der Ausführungsstatus ändert sich in „FEHLGESCHLAGEN“ und alle nachfolgenden Schritte werden abgebrochen.

Für eine flexiblere Genehmigungskonfiguration (Bezeichnung des Genehmigers, Benachrichtigungskanäle, Ablauf) siehe Manuelle Genehmigung.

Schritt 8 · liefern: sub_workflow ruft das integrierte Modul der Plattform auf

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

Beschreibung:

  • dingyue-module-slack-deliver Es handelt sich um eines der integrierten Bereitstellungsmodule, die mit der Plattform geliefert werden und die gesamte Routine „Assembly-Nutzlast → Nachricht senden → erneut versuchen → Status zurückschreiben“ kapseln.
  • slack_webhook_url Verweisen Sie auf die in der Variable konfigurierte Slack Incoming Webhook-URL – wir werden diese in Schritt 10 konfigurieren.

Schritt 9 · Leinwandvorschau

Wechseln Sie zurück zur linken Leinwandleiste und Sie sehen 6 Knoten, die durch Abrufen → Klassifizieren → Zusammenfassen → Kompilieren → Überprüfen → Übermitteln in einer Linie verbunden sind. Doppelklicken Sie auf einen beliebigen Knoten, um dessen YAML-Fragment zu erweitern. Ziehen Sie den Knoten, um seine Position anzupassen. Layoutänderungen sind nur visuell und haben keine Auswirkungen auf die YAML.

Schritt 10 · Vervollständigen Sie die Anmeldeinformationen

Bevor Sie diesen Workflow ausführen können, benötigen Sie Folgendes:

  1. openai_api_key (Vom Agent verwendeter LLM-Schlüssel)
    • Wählen Sie api_key als Typ und fügen Sie den sk-... ein, den Sie von OpenAI erhalten haben, als Wert.
  2. slack_webhook_url (Slack Incoming Webhook URL für die Zustellung)
    • Wählen Sie „api_key“ oder „secret_text“ als Typ und fügen Sie die Slack Incoming Webhook-URL als Wert ein.

Nach dem Speichern entsprechen die im Workflow referenzierten Anmeldeinformationsnamen eins zu eins diesem und können zur Laufzeit geparst werden.

Schritt 11 · Validierung und Probelauf

11.1 Überprüfung

Klicken Sie oben auf „Bestätigen“. Die Plattform verwendet den vollständigen Agentenparser, um einen Roundtrip durchzuführen. Wenn ein Syntax-/Referenzfehler vorliegt, werden die spezifische Zeilennummer und der Grund angegeben. Informieren Sie sich über alle roten Linien, bevor Sie den nächsten Schritt unternehmen.

11.2 Trockenlauf

Klicken Sie auf „Ausführen“, aktivieren Sie im Dialogfeld „Probelauf“ und klicken Sie auf „Ausführen starten“. Diesmal:

  • fetch wird tatsächlich ausgeführt – es ist schwierig, die Nebenwirkungen des Codeschritts zu beurteilen, daher lassen wir ihn standardmäßig ausführen (die Netzwerk-Sandbox ist jedoch begrenzt);
  • klassifizieren/zusammenfassen/kompilieren – da es sich um LLM handelt, werden während des Probelaufs simulierte Werte zurückgegeben;
  • Überprüfung – automatische Freigabe im Probelauf (keine echte Munitionsfreigabe);
  • Deliver – Das Modul kennt den Trockenlaufmodus und sendet tatsächlich keine Telegram-Nachrichten.

Bei Erfolg werden alle Schritte grün „ABGESCHLOSSEN“ oder grau „Übersprungen“ angezeigt. Gehen Sie in den unteren rechten Bereich, um den „Eingabe-/Ausgabe-/Variablen-Snapshot“ jedes Schritts anzuzeigen und zu bestätigen, dass alle Variablen korrekt verbunden sind.

Schritt 12 · Machen Sie einen echten Lauf

  1. Klicken Sie auf „Ausführen“, Abbrechen Überprüfen Sie den Probelauf, um die Ausführung zu starten.
  2. Der Echtzeit-Ereignisstrom auf der rechten Seite beginnt zu blinken. Überprüfen Sie nach dem Ausführen von „fetch“, ob 10 Elemente abgerufen wurden. Beschriften Sie jedes Element, das durch Klassifizieren ausgeführt wird. summary wird nur für die KI-Elemente ausgeführt.
  3. Bei der Ausführung zur Überprüfung wird die gesamte Ausführung ausgesetzt und der Status ändert sich in PENDING_APPROVAL. Wechseln Sie zu „Genehmigungsverwaltung“ und Sie sehen ein Element, das auf Genehmigung wartet. Klicken Sie auf „Anzeigen“, um den Markdown-Entwurf zu lesen.
  4. Klicken Sie auf „Genehmigen“, wenn Sie zufrieden sind. Der Workflow setzt die Zustellung automatisch fort und die Slack-Nachricht wird gesendet.
  5. Kehren Sie nach der Ausführung zur Workflow-Detailseite zurück, um die Token-/Kostenstatistik dieser Ausführung anzuzeigen.
Meine Erwartungen an meinen ersten richtigen Lauf

Es dauert etwa 1–3 Minuten (abhängig vom Netzwerk) und kostet etwa 5.000–15.000 Token (etwa 0,01–0,03 $ laut openai gpt-4.1-mini). Unterhalb dieses Bereichs liegt möglicherweise ein Versäumnis vor, Nachrichten abzurufen, und oberhalb dieses Bereichs liegt möglicherweise eine Reflexion über die Zusammenfassung vor.

Schritt 13: Installieren Sie cron, damit es jeden Tag automatisch ausgeführt wird

  1. „Terminverwaltung“ auf der linken Seite → „Neuer Zeitplan“.
  2. Zielworkflow: Daily-Tech-Digest; Typ: Cron; Ausdruck: 0 0 8 * * ?; Zeitzone: Asien/Shanghai.
  3. „Parameter-Standardwerte“ können leer sein – unsere Variablen haben alle vernünftige Standardwerte.
  4. Speichern. Die „nächste Triggerzeit“ zeigt morgen 8:00 Uhr an.

Workflow-yaml-vollversion

Erweitern Sie, um das vollständige YAML anzuzeigen
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}}"

Nachdem Sie es getan haben, wissen Sie bereits, wie es geht

  • Bearbeiten Sie einen vollständigen Workflow mit YAML + Canvas-Doppelspalten
  • Die eigentlichen Schreibmethoden der fünf Hauptmodi sind Codeschritte: Klassifikator, Single, Manual_Approval und Sub_Workflow
  • Verschiedene Verwendungen von Variablenreferenzen (var/steps/classifier/credentials)
  • Validierung / Probelauf / Echtlauf / Vollständiger Cron-Online-Zyklus
  • So kooperieren Sie zwischen Credential Center und Workflow YAML

Als nächstes