mcpField
W
workflow-automation

workflow-automation

github.com/sickn33开发48.7k1.5k 次安装今天更新
代码仓库

关于 workflow-automation

面向构建可靠自动化的 Agent,介绍 n8n、Temporal 和 Inngest 等平台及工作流设计模式,强调持久执行与按需求选择平台。

主要功能

  1. 01比较 n8n、Temporal 和 Inngest
  2. 02讲解顺序与并行工作流
  3. 03介绍 orchestrator-worker 模式
  4. 04说明持久执行与失败恢复
  5. 05涵盖外部操作去重与校验

适用场景

  1. 01设计事件驱动的后台任务
  2. 02构建可恢复的支付流程
  3. 03规划并行文档分析
  4. 04选择工作流自动化平台

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill workflow-automation

安装后在 Claude Code 中输入/workflow-automation确认已加载。

附带文件references/detailed-guide.md

详细介绍

工作流自动化

工作流自动化是让 AI Agent 可靠运行的基础设施。 如果没有持久化执行,10 步支付流程中发生网络波动,就可能导致资金损失和客户不满。有了它,工作流就能从中断处准确恢复。

此技能涵盖各个平台(n8n、Temporal、Inngest)和模式(顺序、并行、编排器-工作者),帮助将脆弱的脚本转变为生产级自动化。

关键在于:各个平台做出了不同的权衡。n8n 注重易用性,Temporal 注重正确性,Inngest 注重开发者体验。请根据实际需求选择,而不是盲目追逐炒作。

可靠性与示例限制

持久化并不能保证外部操作恰好执行一次。支付/配送辅助程序必须向服务提供商传递稳定的操作键,并协调处理结果不明确的成功状态;电子邮件则需要发件箱/去重策略。示例是不完整的代码片段,且 SDK 签名可能因版本而异。请根据已安装的类型定义验证示例,使用测试账户,并避免将有效负载/凭据写入工作流历史记录和日志。

详细指南

执行此技能前,请阅读详细指南。其中保留了完整的操作步骤和参考资料。必须遵守其中的安全要求、先决条件和验证要求。若只需处理特定事项,请加载相关章节;若需端到端处理,请完整阅读指南。

Inngest 示例(TypeScript)

import { inngest } from "./client";

export const processOrder = inngest.createFunction(
  { id: "process-order" },
  { event: "order/created" },
  async ({ event, step }) => {
    // Step 1: Validate order
    const validated = await step.run("validate-order", async () => {
      return validateOrder(event.data.order);
    });

    // Step 2: Process payment (durable - survives crashes)
    const payment = await step.run("process-payment", async () => {
      return chargeCard(validated.paymentMethod, validated.total, { idempotencyKey: `order-${event.data.orderId}-payment` });
    });

    // Step 3: Create shipment
    const shipment = await step.run("create-shipment", async () => {
      return createShipment(validated.items, validated.address);
    });

    // Step 4: Send confirmation
    await step.run("send-confirmation", async () => {
      return sendEmail(validated.email, { payment, shipment });
    });

    return { success: true, orderId: event.data.orderId };
  }
);

Temporal 示例(TypeScript)

import { proxyActivities } from '@temporalio/workflow';
import type * as activities from './activities';

const { validateOrder, chargeCard, createShipment, sendEmail } =
  proxyActivities<typeof activities>({
    startToCloseTimeout: '30 seconds',
    retry: {
      maximumAttempts: 3,
      backoffCoefficient: 2,
    }
  });

export async function processOrderWorkflow(order: Order): Promise<void> {
  const validated = await validateOrder(order);
  const payment = await chargeCard(validated.paymentMethod, validated.total, { idempotencyKey: `order-${order.id}-payment` });
  const shipment = await createShipment(validated.items, validated.address);
  await sendEmail(validated.email, { payment, shipment });
}

Inngest 示例

export const analyzeDocument = inngest.createFunction(
  { id: "analyze-document" },
  { event: "document/uploaded" },
  async ({ event, step }) => {
    // Run analyses in parallel
    const [security, performance, compliance] = await Promise.all([
      step.run("security-analysis", () =>
        analyzeForSecurityIssues(event.data.document)
      ),
      step.run("performance-analysis", () =>
        analyzeForPerformance(event.data.document)
      ),
      step.run("compliance-analysis", () =>
        analyzeForCompliance(event.data.document)
      ),
    ]);

    // Aggregate results
    const report = await step.run("generate-report", () =>
      generateReport({ security, performance, compliance })
    );

    return report;
  }
);

Temporal 示例

export async function orchestratorWorkflow(task: ComplexTask) {
  // Orchestrator decides what work needs to be done
  const plan = await analyzeTask(task);

  // Dispatch to specialized worker workflows
  const results = await Promise.all(
    plan.subtasks.map(subtask => {
      switch (subtask.type) {
        case 'create':
          return executeChild(createWorkerWorkflow, { args: [subtask] });
        case 'modify':
          return executeChild(modifyWorkerWorkflow, { args: [subtask] });
        case 'delete':
          return executeChild(deleteWorkerWorkflow, { args: [subtask] });
      }
    })
  );

  // Aggregate results
  return aggregateResults(results);
}

适用场景

  • 用户提到或暗示:工作流
  • 用户提到或暗示:自动化
  • 用户提到或暗示:n8n
  • 用户提到或暗示:temporal
  • 用户提到或暗示:inngest
  • 用户提到或暗示:步骤函数
  • 用户提到或暗示:后台作业
  • 用户提到或暗示:持久化执行
  • 用户提到或暗示:事件驱动
  • 用户提到或暗示:计划任务
  • 用户提到或暗示:作业队列
  • 用户提到或暗示:cron
  • 用户提到或暗示:触发器

限制

  • 仅当任务明确符合上述范围时才使用此技能。
  • 不要将输出视为对特定环境进行验证、测试或专家审查的替代。
  • 如果缺少必要输入、权限、安全边界或成功标准,请停止并要求澄清。

评论

支持 Markdown