UNPKG

@flowlab/all

Version:

A cool library focusing on handling various flows

109 lines (90 loc) 9.24 kB
## @flowlab/main 修改意见和未来的拓展建议 非常棒!你准确地抓住了 FlowLab 这类工作流引擎的核心价值所在:**通过结构化的方式编排和管理业务逻辑,从而提升代码质量、可维护性和可扩展性,并将开发者从繁琐的流程控制、状态管理、错误处理等“管道代码”中解放出来,更专注于核心业务功能的实现。** 基于我们之前讨论的统一设计,以下是一些针对性的修改意见和未来可能的拓展模块想法: ## 对当前统一设计的修改意见 (Modification Suggestions) 这些建议旨在进一步优化易用性、健壮性和灵活性: 1. **增强 Input/Output Mapping:** * **痛点:** 当前的字符串路径映射 (`'variables.user.id'`) 虽然直观,但在处理嵌套数据、数组、或需要简单转换(如类型转换、默认值)时可能不够灵活。 * **建议:** * **引入简单转换函数:** 允许映射值是一个小函数或预定义转换器,例如 `{ targetField: 'variables.order.total | toInt | default(0)' }``{ targetField: (ctx) => ctx.variables.price * ctx.variables.quantity }` (后者需注意安全性)。 * **JSONata 或类似查询语言:** 对于复杂的对象导航和转换,考虑集成类似 JSONata 的查询/转换语言。 * **更清晰的步骤输出引用:** 定义更明确、更健壮的方式来引用先前步骤的输出,例如引入一个专门的上下文属性 `stepsOutput.stepId.outputFieldName`,而不是依赖可能不稳定的 `history` 或易混淆的 `variables` 约定。 2. **细化错误处理与分支:** * **痛点:** 目前主要是通过 `retryOptions``compensateOnFailure` 处理失败。但有时我们希望根据 *不同类型* 的错误执行 *不同* 的后续步骤(例如,瞬时错误重试,验证错误走修正流程,权限错误直接拒绝)。 * **建议:**`StepConfig` 中增加 `onError` 配置,允许定义错误处理分支。 ```typescript interface TaskStepConfig extends BaseStepConfig { // ... 其他配置 onError?: { // 可以匹配错误名称 (TimeoutError, AuthorizationError) 或自定义错误码 [errorMatcher: string]: string; // 错误匹配符 -> 下一个步骤 ID _default?: string; // 可选的默认错误处理步骤 ID } } ``` 执行器在捕获到节点错误时,会检查 `onError` 配置,如果匹配到,则跳转到指定的错误处理步骤,而不是直接失败整个流程。 3. **增强 Context API:** * **痛点:** `INodeContext` 提供了 `get/setVariable`,但对于复杂状态管理可能略显不足。 * **建议:** * **类型化的 Variables:** 考虑引入一种方式让开发者能为 `context.variables` 提供类型定义,增强类型安全。 * **作用域变量 (Scoped Variables):** 对于并行或子流程,可能需要提供局部作用域的变量,避免命名冲突。 (这个比较复杂,可能是 V2 功能) * **更丰富的日志上下文:** `context.log` 可以自动附加更多信息,如 `stepId`, `nodeId`, `traceId`4. **节点元数据与发现:** * **痛点:** 如果节点非常多,管理和查找节点会变得困难。可视化编辑器的集成也需要知道节点的输入输出。 * **建议:** * **强制 Input/Output Schema:** 对于 `BaseNode`,可以考虑将 `inputSchema``outputSchema` (使用 JSON Schema 定义) 作为 `metadata` 的必填项(或者强烈推荐),引擎可以在执行前后进行校验。 * **节点标签/分类:**`NodeMetadata` 中增加 `tags``category` 字段,方便组织和查找。 * **自动注册/发现机制 (高级):** (可能过于复杂)考虑提供 CLI 工具或装饰器 (`@Node(...)`) 来扫描代码并自动注册节点及其元数据。 5. **版本控制:** * **痛点:** 工作流定义会演进,需要管理不同版本。 * **建议:**`WorkflowDefinitionData` 中明确 `version` 字段。`IPersistence` 接口的 `loadDefinition` 应支持按版本加载。引擎在执行时应记录所使用的定义版本。 6. **补偿机制 (Compensation):** * **痛点:** 当前 `compensateOnFailure` 比较简单。真正的补偿(Saga 模式)通常需要按相反顺序执行补偿操作。 * **建议:** 考虑引入专门的 `CompensationWorkflow` 或在 `WorkflowDefinition` 中定义一个可选的、与主流程关联的补偿流程。当主流程某一步失败且需要补偿时,引擎根据执行历史逆序触发补偿流程中对应的补偿节点。`BaseNode``compensate` 方法是实现补偿逻辑的基础。 ## 未来拓展模块建议 (Future Extension Module Ideas) 这些模块可以作为独立的包 (`@flowlab/xxx`) 发布,依赖于 `@flowlab/core`,提供特定领域的功能和节点: 1. **`@flowlab/data` (数据处理流):** * **目标:** 专注于 ETL、数据清洗、转换、同步等场景。 * **核心节点:** * `ReaderNode`: 从各种来源读取数据 (CSV, JSON, Database, API, Queue)。提供适配器模式。 * `WriterNode`: 写入数据到各种目标。 * `TransformNode`: 执行数据转换(JS 函数、表达式语言如 JSONata、或集成 Dask/Pandas 等库)。 * `ValidationNode`: 基于 Schema (JSON Schema, Zod 等) 验证数据。 * `FilterNode`: 根据条件过滤数据记录。 * `AggregationNode`: 对数据进行聚合操作 (Count, Sum, Avg)。 * `JoinNode`: 合并来自不同来源的数据。 * `BatchNode` / `UnbatchNode`: 处理批量数据。 * **特性:** 可能包含数据流模式(处理记录流而非单个上下文)、Schema 管理集成、连接器管理等。 2. **`@flowlab/message` (消息/事件驱动流):** * **目标:** 简化与消息队列 (MQ)、事件总线 (Event Bus) 的集成,构建事件驱动的流程。 * **核心节点:** * `MQListenerNode` / `EventListenerNode` (作为起点): 监听来自 RabbitMQ, Kafka, SQS, Google Pub/Sub, Azure Event Hub, Webhook 等的事件/消息,触发工作流。需要与 `IEventManager` 或专门的适配器集成。 * `MQPublishNode` / `EventPublishNode`: 向 MQ 或事件总线发布消息/事件。 * `RequestReplyNode`: 发送请求到 MQ 并等待回复。 * `MessageRouterNode`: 根据消息内容或头部路由到不同处理分支。 * `DeadLetterHandlerNode`: 处理无法成功处理的消息。 * **特性:** 消息确认机制 (自动/手动 ack/nack)、消息属性处理、相关性 ID (Correlation ID) 传递、与 `@flowlab/core``IEventManager` 紧密集成。 3. **`@flowlab/ai` (AI Flow - 如前所述):** * **目标:** 封装与 AI 模型(特别是 LLMs)交互的常用模式。 * **核心节点:** `LLMCompletionNode`, `LLMChatNode`, `EmbeddingNode`, `FunctionCallingNode`, `StructuredDataExtractionNode`, `ClassificationNode`, `VectorSearchNode` (可能需要向量数据库客户端), `ImageGenerationNode` 等。 * **特性:** Prompt 模板管理、AI Provider 抽象与管理、Token 使用统计、内容安全过滤处理等。 4. **`@flowlab/human` (人机交互流):** * **目标:** 将需要人工干预的步骤(审批、审核、数据录入)集成到自动化流程中。 * **核心节点:** * `AssignTaskNode`: 创建并分配一个人工任务给指定用户或角色组。 * `WaitForTaskCompletionNode`: 暂停工作流,等待指定的人工任务完成。 * `GetTaskOutcomeNode`: 获取人工任务的结果(如批准/拒绝、填写的表单数据)。 * `EscalateTaskNode`: 如果任务超时未处理,进行升级(重新分配、通知等)。 * `GenerateFormNode`: 定义需要在人工任务中展示和填写的表单。 * **特性:** 需要与外部的人工任务管理系统(Tasklist UI)或服务集成。涉及工作流的暂停与恢复,对持久化 (`IPersistence`) 和可能的回调机制有较高要求。 5. **`@flowlab/testing` (测试工具库):** * **目标:** 提供测试 FlowLab 工作流和节点的工具。 * **核心功能:** * `MockNode`: 轻松模拟特定节点的行为和输出。 * `TestExecutor`: 用于在测试环境中执行工作流,可以注入 Mock 节点和服务。 * `ContextBuilder`: 方便地构建测试用的 `IWorkflowContext``INodeContext` * `HistoryAsserter`: 提供断言方法来检查执行历史是否符合预期。 6. **`@flowlab/connectors` (通用连接器库):** * **目标:** 提供一系列预构建的节点,用于连接常见的第三方 SaaS 服务或数据库。 * **示例节点:** `SalesforceNode`, `SlackNotificationNode`, `DatabaseQueryNode`, `RestApiNode` (更通用的 HTTP 请求节点), `GraphQLNode` 等。这个模块可以包含许多子模块。 通过这些修改建议和拓展模块,FlowLab 可以逐步发展成为一个既易用又强大,且能适应多种复杂业务场景的综合性工作流平台生态。