Hands-on: Build a Daily Summary Workflow from Scratch
اتبع سيناريو أعمال محدداً لتجميع جميع المفاهيم الأساسية: سحب البيانات → تصنيف . ملخص التنفيذ.
تتناول هذه المقالة سيناريو عمل محددًا من البداية إلى النهاية، مما يسمح لجميع المفاهيم التي تم تعلمها مسبقًا (سير العمل/الخطوة/الوكيل/المتغيرات/المصنف/سير العمل الفرعي/بيانات الاعتماد) بالتوافق مع عملية حقيقية. بعد 15 دقيقة، سيكون لديك شعور "أستطيع القيام بسير العمل بشكل مستقل".
- لقد قمت بالفعل بتسجيل حساب Braidrun وقمت بتسجيل الدخول. إذا كنت لا تعرف، فابحث أولاً التسجيل والتسجيل.
- يوجد مفتاح API لأي من OpenAI / Anthropic / DeepSeek. لا يزال بإمكانك اتخاذ الخطوات القليلة الأولى بدونها على الإطلاق، ولكنك ستتخطى خطوة LLM عند التشغيل فعليًا.
- (Optional) A Slack Incoming Webhook URL - مطلوب إذا كنت تريد تجربة عملية التسليم.
سيناريو الأعمال: ملخص أخبار التكنولوجيا اليومية
متطلبات:
- تشغيل تلقائيا في الساعة 8:00 كل صباح؛
- احصل على 10 أخبار تقنية جديدة من Hacker News / 36Kr / The Verge RSS؛
- صنف كل عنصر إلى ثلاث فئات: "الذكاء الاصطناعي/الأجهزة/أخرى"؛
- إنشاء ملخصات صينية مكونة من 60 كلمة فقط لتلك العناصر المصنفة على أنها ذكاء اصطناعي؛
- قم بتلخيصها في Markdown وتسليمه إلى قناة Slack؛
- اطلب مني النقر فوق "تأكيد" قبل الإرسال - لتجنب تسليم البيانات القذرة.
خطوات التفكيك إلى Braidrun
fetch— code الخطوات: استخدم Node لالتقاط RSS وتحليله إلى JSON.classify— classifier الخطوات: قم بتسمية كل خبر بتسمية فئة.summarize— single الخطوات: قم بإنشاء ملخصات باللغة الصينية لفصول الذكاء الاصطناعي فقط.compile— code الخطوات: قم بتجميع تخفيض السعر بالكامل.review— manual_approval: توقف مؤقتًا للسماح لي بإلقاء نظرة قبل الإرسال.deliver— sub_workflow:تم إصداره بواسطة Slack.
الخطوة 1 · إنشاء سير عمل جديد
- نقطة التنقل الرئيسية على اليسار هي "سير العمل" ← "سير العمل الجديد" في الزاوية اليمنى العليا.
- اسم:
daily-tech-digest، وصف:每天早 8 点的科技新闻摘要. - انقر فوق "إنشاء". انتقل إلى المحرر على الفور.
يفتح المحرر بعمودين: اللوحة القماشية (تصور DAG) على اليسار وYAML على اليمين. ستتم مزامنة التغييرات على أي من الجانبين مع الجانب الآخر في الوقت الفعلي.
الخطوة 2 · إعلان الوكيل
قم بالتبديل إلى عمود YAML وأضف قسمًا من الوكلاء في الأعلى (بعد المتغيرات):
agents:
writer:
preset: writer
overrides:
max_iterations: 3
provider: openai_api_key # 引用凭据中心里的 Keyالوصف: تم تحسين الإعداد المسبق للكاتب خصيصًا للكتابة الصينية. التجاوزات تحدد الحد الأقصى للتكرارات بـ 3 بحيث لا يفكر الوكيل كثيرًا في الملخص (الملخص نفسه بسيط جدًا).
للحصول على شرح مفصل للإعداد المسبق، راجع دليل المفاوضة.
الخطوة 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— يعد Node 20 أحد أوقات التشغيل التي تتمتع بدعم مدمج.extract— اختر حقل المقالات من stdout JSON الخاص بالبرنامج النصي وقم بالرجوع إليه في اتجاه مجرى النهر باستخدام Steps.fetch.data.articles.idempotent: true— "من المرجح أن يؤدي نشر الأخبار في نفس اليوم إلى نفس النتيجة" - يمكن تخطي هذا عند إعادة تشغيل الخدمة واستئنافها.
السيناريو الخاص بك سوف تشغيل في صندوق رمل منعزلة يمكن التخلص منه مع تخلف 512MB من الذاكرة، 0.5 من وحدة العناية المركزة، و 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 · التلخيص: اكتب ملخصًا لفصل الذكاء الاصطناعي فقط
- id: summarize
type: single
agent: writer
idempotent: true
condition: "{{classifier.category}} == 'ai'"
task: |
用一段中文(不超过 60 字)概括下面这条 AI 新闻:
{{steps.fetch.data.articles[0].title}}وصف:
conditionدع هذه الخطوة يتم تنفيذها فقط عندما تكون نتيجة التصنيف هي ai، ويتم تخطي الفئات الأخرى (تم تخطي الحالة، ولا يتم احتسابها كفشل).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تقوم هذه الخطوة بتجميع كافة النتائج الملخصة الأولية في تخفيض السعر الذي يمكن إرساله مباشرة. يعرضه الاستخراج كخطوات.compile.data.markdown، مما يجعل المراجع النهائية أكثر نظافة.
الخطوة 7 · المراجعة: التأكيد اليدوي قبل الإرسال
- id: review
type: manual_approval
title: "请审阅今日 AI 摘要"
body: "{{steps.compile.data.markdown}}"
approvers: [] # 空 = 团队所有 Admin 都可审批
notify: [in_app] # 也可以 slack / email / feishuهذا هو أبسط شكل من أشكال الموافقة اليدوية - سيتم إيقاف العملية مؤقتًا هنا وستظهر الموافقة المعلقة في صفحة إدارة الموافقة. انقر فوق "موافقة" لمتابعة سير العمل؛ انقر على "رفض" وتتغير حالة التنفيذ إلى "فشل"، ويتم إلغاء جميع الخطوات اللاحقة.
للحصول على تكوين موافقة أكثر مرونة (تعيين الموافقين، وإخطار القنوات، وانتهاء الصلاحية)، راجع الموافقة على الدليل.
الخطوة 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الإشارة إلى أن موقع (سليك) الجديد (ويهوك) قد تم تشكيله في المتغير.
الخطوة 9 · معاينة اللوحة القماشية
قم بالتبديل مرة أخرى إلى شريط القماش الأيسر، وسترى 6 عقد متصلة في سطر عن طريق الجلب → التصنيف → التلخيص → التجميع → المراجعة → التسليم. انقر نقرًا مزدوجًا فوق أي عقدة لتوسيع جزء YAML الخاص بها؛ اسحب العقدة لضبط موضعها - تكون تغييرات التخطيط مرئية فقط ولا تؤثر على YAML.
الخطوة 10 · أكمل بيانات الاعتماد
قبل تشغيل سير العمل هذا، يجب أن يكون لديك:
openai_api_key(مفتاح LLM يستخدمه الوكيل)- حدد api_key كنوع، ثم الصق sk-... الذي حصلت عليه من OpenAI كقيمة.
slack_webhook_url(Slack Incoming Webhook URL for delivery)- "اختاروا "بي-كى" أو السر "تيكست" كنوع من واقية الـ "سليك" القادم "ويهوك" كقيمة.
بعد الحفظ، تتوافق أسماء بيانات الاعتماد المشار إليها في سير العمل مع هذا الاسم الفردي ويمكن تحليلها في وقت التشغيل.
الخطوة 11 · التحقق من الصحة والتشغيل الجاف
11.1 التحقق
انقر على "التحقق" في الأعلى. تستخدم المنصة محلل الوكيل الكامل للقيام برحلة ذهابًا وإيابًا؛ إذا كان هناك خطأ في بناء الجملة/المرجع، فسيتم تقديم رقم السطر المحدد + السبب. احصل على جميع الخطوط الحمراء قبل اتخاذ الخطوة التالية.
11.2 الجفاف
انقر فوق "تنفيذ"، وحدد التشغيل الجاف في مربع الحوار، ثم انقر فوق "بدء التنفيذ". هذه المرة:
- سيتم تشغيل الجلب فعليًا - من الصعب الحكم على الآثار الجانبية لخطوة التعليمات البرمجية، لذلك نتركه يعمل افتراضيًا (لكن وضع حماية الشبكة محدود)؛
- التصنيف/التلخيص/الترجمة - لأنه LLM، يتم إرجاع القيم المحاكاة أثناء التشغيل الجاف؛
- المراجعة - الموافقة التلقائية أثناء التشغيل الجاف (لا توجد موافقة حقيقية على الذخيرة)؛
- التسليم - تعرف الوحدة وضع التشغيل الجاف ولن ترسل رسائل Telegram فعليًا.
إذا نجحت، فستكون جميع الخطوات باللون الأخضر مكتملة أو رمادية اللون تم تخطيها. انتقل إلى المنطقة اليمنى السفلية لعرض "لقطة الإدخال/الإخراج/المتغير" لكل خطوة وتأكد من توصيل جميع المتغيرات بشكل صحيح.
الخطوة 12 · قم بجولة حقيقية
- انقر فوق "تنفيذ"، إلغاء تحقق من التشغيل الجاف لبدء التنفيذ.
- يبدأ تدفق الأحداث في الوقت الفعلي على اليمين في الوميض. تحقق لمعرفة ما إذا كان قد تم جلب 10 عناصر بعد تشغيل الجلب؛ قم بتسمية كل عنصر يتم تشغيله حسب التصنيف؛ يتم تنفيذ التلخيص فقط على عناصر الذكاء الاصطناعي.
- عند التشغيل للمراجعة، سيتم تعليق التنفيذ بالكامل وستتغير الحالة إلى PENDING_APPROVAL. قم بالتبديل إلى "إدارة الموافقة" وسترى عنصرًا في انتظار الموافقة. انقر على "عرض" لقراءة مسودة تخفيض السعر.
- إضغطي "إقبلي" عندما ترضى The work flow automatically continues to deliver and the Slack message is sent.
- بعد التشغيل، ارجع إلى صفحة تفاصيل سير العمل لرؤية إحصائيات الرمز المميز/التكلفة لهذا التنفيذ.
يستغرق الأمر حوالي 1-3 دقائق (اعتمادًا على الشبكة) ويكلف حوالي 5000-15000 رمزًا (حوالي 0.01-0.03 دولارًا وفقًا لـ openai gpt-4.1-mini). تحت هذا النطاق قد يكون هناك فشل في سحب الأخبار، وفوق هذا النطاق قد يكون هناك انعكاس على التلخيص.
الخطوة 13: قم بتثبيت cron ليتم تشغيله تلقائيًا كل يوم
- "إدارة الجدولة" على اليسار → "جدول جديد".
- سير العمل المستهدف: ملخص التكنولوجيا اليومي؛ النوع: كرون؛ تعبير:
0 0 8 * * ?; المنطقة الزمنية: آسيا/شنغهاي. - يمكن أن تكون "افتراضيات المعلمات" فارغة - جميع المتغيرات لدينا لها قيم افتراضية معقولة.
- يحفظ. "وقت التشغيل التالي" سيُظهر الساعة 8:00 غدًا.
سير العمل 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
- طرق الكتابة الفعلية للأنماط الخمسة الرئيسية لخطوات التعليمات البرمجية، والمصنف، والمفرد، والموافقة اليدوية، وسير العمل الفرعي
- الاستخدامات المختلفة للمراجع المتغيرة (var/steps/classifier/credentials)
- التحقق من صحة / التشغيل الجاف / التشغيل الحقيقي / دورة كرون الكاملة عبر الإنترنت
- كيفية التعاون بين مركز الاعتماد وسير العمل YAML
التالي
- اقرأ 8 أنواع من الخطوات — الاستخدام والحقول وقيود المجموعة لكل منها
- تعلم كيفية تصحيح الأخطاء باستخدام نقاط التوقف — وفر 80% من وقت استكشاف الأخطاء وإصلاحها عندما يصبح سير العمل معقدًا
- التحديث وإعادة الاستخدام — عندما يكون لديك سير العمل الثاني والثالث، قم باستخراج المنطق المشترك في سير العمل الفرعي