代理流V2

本指南深入探讨了代理流V2架构,详细阐述了其核心概念、用例、流状态以及全面的节点参考。

免责声明:本文档描述的是当前官方发布的代理流V2版本。在Nvmme未来的更新和版本中,特性、功能和节点参数可能会有所变化。请查阅最新的官方发布说明或应用内信息,以获取最新详情。

核心概念

代理流V2代表了重大的架构演进,在Nvmme中引入了一种新的范式,该范式侧重于明确的工作流编排和增强的灵活性。与V1主要依赖外部框架来实现其核心智能体图逻辑不同,V2将重点转向使用一组细粒度的、专门化的、独立节点来设计整个工作流,这些节点是作为核心Nvmme组件原生开发的。

在这种V2架构中,每个节点都作为一个独立单元运行,根据其特定设计和配置执行离散操作。画布上节点之间的可视化连接明确地定义了工作流的路径和控制序列,数据可以通过引用当前流程中任何先前执行过的节点的输出来在节点之间传递,而流程状态则提供了一种在整个工作流中管理和共享数据的明确机制。

V2架构实现了一个全面的节点依赖和执行队列系统,该系统在保持组件之间清晰分离的同时,精确遵循这些定义的路径,从而使工作流程既更加复杂又更易于设计。这使得循环、条件分支、人机交互等复杂模式成为可能。这使得它更能适应多样化的用例,同时保持更高的可维护性和可扩展性。

代理流与自动化平台的区别

最常见的问题之一:代理流与n8n、Make或Zapier等自动化平台有何区别?

💬 智能体间通信

支持智能体之间的多模态通信。一个监督者智能体可以制定任务并委托给多个工作者智能体,随后将工作者智能体的输出返回给监督者。

在每一步中,智能体都可以访问完整的对话历史记录,从而使监督者能够确定下一个任务,并使工作者智能体能够解读任务、选择适当的工具,并据此执行操作。

这种架构支持多个智能体之间的协作、委托和共享任务管理,而传统自动化工具通常不具备这些功能。

🙋‍♂ 人工干预

在等待人工输入时,执行会暂停,但不会阻塞正在运行的线程。每个检查点都会被保存,这样即使应用程序重启,工作流也能从相同的位置继续执行。

检查点的使用使得长时间运行的有状态智能体成为可能。

智能体也可以配置为在执行工具前请求权限,这与Claude在使用MCP工具前请求用户批准的方式类似。这有助于防止未经用户明确批准而自主执行敏感操作。

📖 共享状态

共享状态使得智能体之间能够进行数据交换,这在流程中跨分支或非相邻步骤传递数据时尤其有用。请参阅#理解流程状态

⚡ 流媒体

支持服务器发送事件(SSE),用于大型语言模型(LLM)或智能体响应的实时流式传输。流式传输还允许在工作流进行过程中订阅执行更新。

🌐 MCP工具

虽然传统自动化平台通常拥有丰富的预构建集成库,但代理流允许将MCP(模型上下文协议)工具作为工作流的一部分进行连接,而不仅仅是作为智能体工具使用。

自定义MCP也可以独立创建,无需依赖平台提供的集成。MCP被广泛认为是行业标准,通常由官方提供商提供支持和维护。例如,GitHub MCP由GitHub团队开发和维护,Atlassian Jira、Brave Search等也提供类似的支持。

代理流V2 节点参考

本节为每个可用节点提供了详细参考,概述了其具体用途、关键配置参数、预期输入、生成输出以及在代理流V2架构中的作用。


1. 起始节点

这是启动任何AgentFlow V2工作流执行的指定入口点。每个流程都必须从这个节点开始。

  • **功能:**定义工作流的触发方式并设置初始条件。它可以直接从聊天界面或通过呈现给用户的可自定义表单接受输入。它还允许在执行开始时初始化“流状态”变量,并可以管理运行过程中对话记忆的处理方式。

  • 配置参数

    • 输入类型:决定工作流执行的方式,是通过用户的“聊天输入”还是通过提交的“表单输入”来启动。

      • 表单标题、表单描述、表单输入类型:如果选择了“表单输入”,这些字段将配置呈现给用户的表单的外观,允许使用具有已定义标签和变量名的各种输入字段类型。

    • 临时内存:如果启用,则指示工作流开始执行时无需考虑会话线程中的任何历史消息,从而有效地从零开始。

    • 流状态:定义工作流运行时状态 $flow.state 的完整初始键值对集合。所有后续节点将使用或更新的状态键必须在此处声明并初始化。

  • **输入:**接收触发工作流的初始数据,该数据可以是聊天消息,也可以通过表单提交的数据。

  • 输出: 提供单个输出锚点,用于连接到第一个操作节点,并传递初始输入数据和初始化的流状态。


2. LLM节点

提供对已配置的大型语言模型(LLM)的直接访问,以执行人工智能任务,使工作流程能够在需要时执行结构化数据提取。

  • **功能:**此节点根据提供的指令(消息)和上下文向大型语言模型(LLM)发送请求。它可用于文本生成、摘要、翻译、分析、回答问题,以及根据定义的架构生成结构化的JSON输出。它能够访问会话线程的内存,并可对“流状态”进行读写操作。

  • 配置参数

    • 模型:指定来自选定服务的AI模型,例如OpenAI的GPT-4o或Google Gemini。 消息:为大型语言模型(LLM)定义对话输入,将其构建为一系列角色序列——系统、用户、助手、开发者——以引导人工智能的响应。可以使用{{ variable }}插入动态数据。 记忆:如果启用,则决定大型语言模型(LLM)在生成响应时是否应考虑当前对话线程的历史记录。

      • 内存类型、窗口大小、最大标记限制:如果使用内存,这些设置将细化对话历史的管理方式以及向大型语言模型(LLM)呈现的方式——例如,是包含所有消息、仅包含最近的轮次窗口,还是包含摘要版本。

      • 输入消息:指定在大型语言模型(LLM)/智能体处理之前,将作为最新用户消息附加到现有对话上下文(包括初始上下文和记忆)末尾的变量或文本。

    • 返回响应类型:配置大型语言模型(LLM)的输出如何分类——是作为“用户消息”还是“助手消息”——这会影响后续内存系统或日志记录对它的处理方式。

    • JSON结构化输出:指示大型语言模型(LLM)根据特定的JSON模式来格式化其输出,包括键、数据类型和描述,以确保输出数据具有可预测性和机器可读性。

  • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此LLM节点的输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**此节点利用来自工作流初始触发器或前置节点输出的数据,将这些数据合并到MessagesInput Message字段中。当输入变量引用$flow.state时,它还可以从中检索值。

  • 输出: 生成大型语言模型(LLM)的响应,该响应可以是纯文本或结构化的JSON对象。此输出的分类(用户或助手)由返回响应设置决定。


3. 智能体节点

代表一个具备推理、规划能力,并能与工具或知识源交互以实现既定目标的自主人工智能实体。

  • **功能:**该节点使用大型语言模型(LLM)来动态决定一系列操作。根据用户通过消息/输入提供的目标,它可以选择使用可用工具或查询文档库来收集信息或执行操作。它管理自己的推理周期,并可以利用内存进行对话线程和“流状态”管理。适用于需要多步推理或与外部系统或工具动态交互的任务。

  • 配置参数

    • 模型:指定来自选定服务的AI模型——例如,OpenAI的GPT-4o或Google Gemini——该模型将驱动智能体的推理和决策过程。 消息:为智能体定义初始对话输入、目标或上下文,将其构建为一系列角色序列——系统、用户、助手、开发者——以引导智能体的理解和后续行动。可以使用{{ variable }}插入动态数据。

    • 工具:指定智能体有权使用哪些预定义的Flowise工具来实现其目标。

      • 对于每个选定的工具,都有一个可选的**“需要人工输入”标志**,用于指示该工具的操作是否会暂停以请求人工干预。

    • 知识/文档库:配置对Flowise托管文档库中信息的访问权限。

      • 文档存储区:选择一个预先配置好的文档存储区,智能体程序可以从该存储区中检索信息。这些存储区必须提前设置并填充内容。

      • 描述知识:用自然语言描述此文档库的内容和目的。该描述有助于智能体理解文档库中包含的信息类型,以及何时查询该文档库最为合适。

    • 知识/向量嵌入:配置对外部已有的向量存储的访问权限,作为智能体的额外知识源。

      • 向量存储:选择智能体可以查询的特定、预先配置的向量数据库。

      • 嵌入模型:指定与所选向量存储相关的嵌入模型,确保查询的兼容性。

      • 知识名称:为这个基于向量的知识源分配一个简短的描述性名称,以便智能体程序参考。

      • 知识描述:用自然语言描述该向量存储的内容和目的,指导智能体何时以及如何利用这一特定知识源。

      • 返回源文档:如果启用,则指示智能体在从向量存储中检索的数据中包含源文档信息。 记忆:如果启用,则决定智能体在做出决策和生成响应时是否应考虑当前会话线程的历史记录。

      • 内存类型、窗口大小、最大标记限制:如果使用内存,这些设置将细化对话历史的管理和呈现方式给智能体——例如,是包含所有消息、仅包含最近一轮的对话窗口,还是包含一个摘要版本。

      • 输入消息:指定在大型语言模型(LLM)/智能体处理之前,将作为最新用户消息附加到现有对话上下文(包括初始上下文和记忆)末尾的变量或文本。

    • 返回响应:配置智能体的最终输出或消息如何被分类——是作为用户消息还是助手消息——这会影响后续内存系统或日志记录对它的处理方式。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。这使得例如可以将此智能体节点的输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**此节点利用来自工作流初始触发器或前节点输出的数据,这些数据通常会纳入MessagesInput Message字段。它根据需要访问已配置的工具和知识源。

  • 输出: 在智能体完成推理、规划以及与工具或知识源的任何交互后,生成最终结果或响应。


4. 工具节点

提供了一种机制,用于在工作流序列中直接且确定性地执行特定的、预定义的Flowise工具。与智能体节点不同,在智能体节点中,大型语言模型(LLM)会根据推理动态选择工具,而工具节点则会精确执行工作流设计人员在配置时选择的工具。

  • **功能:**当工作流程需要在特定时间点执行已知的特定功能,且输入数据易于获取时,可使用此节点。它确保了操作的确定性,无需大型语言模型(LLM)推理来选择工具。

  • 工作原理

    1. **触发:**当工作流执行到达工具节点时,该节点会被激活。

    2. 工具识别:它能够识别在其配置中选定的特定Flowise工具。

    3. 输入参数解析:它查看工具输入参数配置。针对所选工具的每个必需输入参数。

    4. **执行:**它调用与所选Flowise工具相关联的底层代码或API,并传递解析后的输入参数。

    5. 输出生成:它接收工具执行后返回的结果。

    6. 输出传播:它通过其输出锚点使该结果可供后续节点使用。

  • 配置参数

    • 工具选择:从下拉列表中选择此节点将执行的特定、已注册的Flowise工具。

    • 输入参数:定义如何将您工作流程中的数据提供给所选工具。此部分会根据所选工具动态调整,展示其特定的所需输入参数:

      • 映射参数名称:对于所选工具所需的每个输入(例如,对于计算器而言,输入为input),此字段将显示工具本身定义的预期参数名称。

      • 提供参数值:为相应的参数设置值,可以使用动态变量,如{{ previousNode.output }}{{ $flow.state.someKey }},或输入静态文本。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此工具节点的输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**通过Input Arguments映射接收工具参数所需的数据,这些数据来源于前一个节点的输出、$flow.state或静态配置。

  • 输出: 生成由执行工具生成的原始输出——例如,来自API的JSON字符串、文本结果或数值。


5. 检索节点

从配置的文档库中执行有针对性的信息检索。

  • **功能:**此节点可查询一个或多个指定的文档库,根据语义相似性提取相关文档块。当唯一需要的操作是检索且无需大型语言模型(LLM)进行动态工具选择时,它是使用智能体节点的集中替代方案。

  • 配置参数

    • 知识/文档库:指定此节点应查询哪个(或哪些)预先配置并填充的文档库以查找相关信息。

    • 检索查询:定义用于搜索所选文档库的文本查询。可以使用{{ variables }}插入动态数据。

    • 输出格式:选择检索到的信息应如何呈现——是作为纯文本呈现,还是作为带元数据的文本呈现,后者可能包含源文档名称或位置等详细信息。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此检索器节点的输出存储在这样的键下,从而使后续节点能够访问。

  • 输入: 需要一个查询字符串——通常作为前一步的变量或用户输入提供——并访问所选文档库以获取信息。

  • 输出: 根据所选的输出格式,生成从知识库中检索到的文档块,并进行格式化。


  1. HTTP节点

通过超文本传输协议(HTTP)促进与外部Web服务和API的直接通信。

  • **功能:**此节点使工作流能够与任何可通过HTTP访问的外部系统进行交互。它能够向指定URL发送各种类型的请求(GET、POST、PUT、DELETE、PATCH),从而支持与第三方API集成、从Web资源获取数据或触发外部Webhook。该节点支持配置身份验证方法、自定义头、查询参数以及不同的请求正文类型,以满足多样化的API需求。

  • 配置参数

    • HTTP凭据:可选择预配置的凭据(如基本认证、持有者令牌或API密钥)来对目标服务的请求进行身份验证。

    • 请求方法:指定请求所使用的HTTP方法,例如GETPOSTPUTDELETEPATCH

    • 目标URL:定义请求将发送到的外部端点的完整URL。

    • 请求头:设置任何必要的HTTP头,以键值对的形式包含在请求中。

    • URL查询参数:定义键值对,这些键值对将作为查询参数附加到URL后面。

    • 请求正文类型:如果发送数据,请选择请求有效负载的格式 — 选项包括JSON原始文本表单数据x-www-form-urlencoded

    • 请求正文:为POST或PUT等方法提供实际的数据有效负载。格式应与所选的正文类型匹配,并且可以使用{{ 变量 }}插入动态数据。

    • 响应类型:指定工作流应如何解释从服务器接收到的响应——选项包括JSONTextArray Buffer或用于二进制数据的Base64

  • **输入:**接收配置数据,如URL、方法、头部信息和正文,这些数据通常包含来自先前工作流步骤或$flow.state的动态值。

  • **输出:**根据所选的响应类型解析并生成从外部服务器接收到的响应。


  1. 条件节点**

根据既定规则,在工作流中实现确定性分支逻辑。

  • **功能:**此节点作为决策点,评估一个或多个指定条件,以将工作流导向不同的路径。它使用各种逻辑运算符(如等于、包含、大于或为空)比较输入值(可以是字符串、数字或布尔值)。根据这些条件的评估结果为真或假,工作流执行将沿着与此节点相连的不同输出分支之一进行。

  • 配置参数

    • 条件:配置节点将评估的逻辑规则集。

      • 类型:指定此规则所比较的数据类型 — 字符串数字布尔值

      • 值1:定义用于比较的第一个值。可以使用{{ variables }}插入动态数据。

      • 操作:选择要在值1和值2之间应用的逻辑运算符,例如equal(等于)、notEqual(不等于)、contains(包含)、larger(大于)或isEmpty(为空)。

      • 值2:如果所选操作需要,请在此定义用于比较的第二个值。也可以使用{{ variables }}在此处插入动态数据。

  • **输入:**需要为每个评估条件提供“值1”和“值2”的数据。这些值可以从前一个节点的输出中获取,或者从$flow.state中检索。

  • **输出端:**提供多个输出端,分别对应于评估条件的布尔结果(真/假)。工作流将沿着与结果匹配的输出端所连接的特定路径继续进行。


  1. 条件智能体节点**

基于自然语言指令和上下文,提供由人工智能驱动的动态分支功能。

  • **功能:**此节点使用大型语言模型(LLM)来路由工作流程。它根据一组用户定义的“场景”(潜在结果或类别)以及定义决策任务的高级自然语言“指令”,对提供的输入数据进行分析。然后,LLM会确定哪个场景最适合当前的输入上下文。基于这种人工智能驱动的分类,工作流程执行将沿着与所选场景相对应的特定输出路径进行。此节点对于用户意图识别、复杂条件路由或细微情境决策等任务特别有用,在这些任务中,简单的预定义规则(如条件节点中的规则)是不够的。

  • 配置参数

    • 模型:指定来自选定服务的AI模型,该模型将执行分析和场景分类。 说明:为自然语言中的大型语言模型(LLM)定义总体目标或任务——例如,“判断用户请求是关于销售、支持还是一般咨询。”

    • 输入:使用{{ variables }}指定数据,通常是来自前一步的文本或用户输入,大型语言模型(LLM)将分析这些数据以做出路由决策。 场景:配置一个数组,定义工作流可能采取的不同结果或路径。每个场景都用自然语言描述——例如,“销售咨询”、“支持请求”、“一般问题”——并且每个场景都对应节点上的一个唯一输出锚点。

  • **输入:**需要用于分析的Input数据和指导大型语言模型(LLM)的Instructions

  • 输出: 提供多个输出锚点,每个定义的Scenario对应一个。工作流程沿着与大型语言模型(LLM)认为最匹配输入的输出锚点相连的特定路径继续进行。


9. 迭代节点

对输入数组中的每个项目执行一个已定义的“子流程”——即嵌套在其中的一系列节点,实现一个“for-each”循环。"

  • **功能:**此节点专为处理数据集合而设计。它接收一个数组作为输入,该数组可以直接提供,也可以通过变量引用。对于该数组中的每个单独元素,迭代节点会顺序执行在画布上其边界内可视放置的其他节点序列。

  • 配置参数

    • 数组输入:指定节点将遍历的输入数组。这是通过引用一个变量来提供的,该变量包含来自前一个节点输出或$flow.state的数组,例如{{ $flow.state.itemList }}

  • 输入: 需要向其“数组输入”参数提供一个数组。

  • 输出: 提供了一个单一的输出锚点,该锚点仅在嵌套子流完成对输入数组中所有项目的执行后才会激活。通过此输出传递的数据可以包括聚合结果或在循环中修改的变量的最终状态,具体取决于子流的设计。放置在迭代块内的节点具有各自独特的输入和输出连接,这些连接定义了每个项目的操作顺序。


10. 循环节点

将工作流执行明确重定向回之前已执行的节点。

  • **功能:**此节点可在工作流中创建循环或迭代重试。当执行流程到达循环节点时,它不会继续前进到新的节点;相反,它会“跳转”回当前工作流运行中已执行过的指定目标节点。此操作会导致该目标节点以及该流程部分中的任何后续节点重新执行。

  • 配置参数

    • 循环返回至:选择当前工作流中先前已执行节点的唯一ID,执行应返回至该节点。

    • 最大循环次数:定义在单次工作流执行中可以执行此循环操作的最大次数,以防止无限循环。默认值为5。

  • 输入: 接收执行信号以激活。它在内部跟踪当前执行循环已发生的次数。

  • **输出:**此节点没有标准的向前指向输出锚点,因为其主要功能是将执行流向后重定向到“循环返回”目标节点,然后工作流程从该节点继续。


11. 人工输入节点

暂停工作流程执行,以请求人类用户的明确输入、批准或反馈——这是人机协作(Human-in-the-Loop,HITL)流程的关键组成部分。

  • **功能:**该节点会暂停工作流的自动执行,并通过聊天界面向人类用户展示信息或问题。展示给用户的内容可以是预定义的静态文本,也可以是由大型语言模型(LLM)根据当前工作流上下文动态生成的。用户会被提供不同的操作选择,例如“继续”或“拒绝”,如果启用,还会提供一个字段以提供文本反馈。一旦用户做出选择并提交响应,工作流就会沿着与所选操作对应的特定输出路径继续执行。

  • 配置参数

    • 描述类型:决定向用户展示的消息或问题是如何生成的——要么是固定(静态文本),要么是动态(由大型语言模型生成)。

      • 如果描述类型为Fixed

        • 描述:此字段包含要向用户显示的确切文本。它支持使用{{ variables }}插入动态数据

      • 如果描述类型动态 模型:从所选服务中选择将生成面向用户消息的AI模型。 提示:为所选的大型语言模型(LLM)提供指令或提示,以生成向用户展示的消息。

    • **反馈:**如果启用,系统将弹出一个反馈窗口提示用户留下反馈,该反馈将附加到节点的输出中。

  • **输入:**接收暂停工作流的执行信号。如果配置为动态内容,则可通过DescriptionPrompt字段中的变量利用来自先前步骤的数据或$flow.state

  • 输出: 提供两个输出锚点,每个锚点对应一个不同的用户操作——一个用于“继续”,另一个用于“拒绝”。工作流程将沿着与用户选择相匹配的锚点所连接的路径继续进行。


12. 直接回复节点

向用户发送一条最终消息,并终止当前执行路径。

  • **功能:**此节点作为特定分支或整个工作流的端点。它接收一条配置好的消息——可以是静态文本或来自变量的动态内容——并通过聊天界面直接传递给最终用户。发送此消息后,沿此特定工作流路径的执行即告结束;自此点起连接的任何其他节点都不会再被处理。

  • 配置参数

    • 消息:定义文本或变量{{ variable }},该变量将保存作为最终回复发送给用户的内容。

  • **输入:**接收消息内容,该内容来源于前一个节点的输出或存储在$flow.state中的值。

  • **输出:**此节点没有输出锚点,因为其功能是在发送回复后终止执行路径。


13. 自定义功能节点

提供了一种在工作流中执行自定义服务器端JavaScript代码的机制。

  • **功能:**此节点允许编写和运行任意JavaScript代码片段,为实施复杂的数据转换、定制业务逻辑或与其他标准节点不直接支持的资源交互提供了一种有效方式。执行的代码在Node.js环境中运行,并具有特定的数据访问方式:

    • 输入变量:通过“输入变量”配置传递的值可在函数内访问,通常以“$”为前缀——例如,如果定义了输入变量“userid”,则可以访问为“$userid”。

    • 流程上下文:默认流程配置变量可用,如$flow.sessionId$flow.chatId$flow.chatflowId$flow.input(启动工作流的初始输入)以及整个$flow.state对象。

    • 自定义变量:在Flowise中设置的任何自定义变量,例如$vars.<variable-name>。 **库:**该函数可以利用任何已在Flowise后端环境中导入并可用的库。函数执行结束后必须返回一个字符串值

  • 配置参数

    • 输入变量:配置一组输入定义,这些定义将作为变量传递到您的Javascript函数作用域中。对于您希望定义的每个变量,您需要指定:

      • 变量名:您在JavaScript代码中引用此变量时将使用的名称,通常以 $ 作为前缀——例如,如果您在此处输入 myValue,则您在脚本中可能会以 $myValue 的形式访问它,这与输入模式属性的映射方式相对应。

      • 变量值:分配给此变量的实际数据,可以是静态文本,或者更常见的是来自工作流的动态值,例如{{ previousNode.output }}{{ $flow.state.someKey }}

    • Javascript函数:代码编辑器字段,用于编写服务器端的Javascript函数。此函数最终必须返回一个字符串值。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此自定义函数节点的字符串输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**通过Input Variables中配置的变量接收数据。还可以隐式访问$flow上下文和$vars中的元素。

  • 输出: 生成由已执行的 Javascript 函数返回的字符串值。


14. 执行流程节点

通过w* 配置参数,可以调用并执行另一个完整的Flowise Chatflow或AgentFlow

  • 循环返回至:选择当前工作流中之前已执行节点的唯一ID,执行应返回至该节点。

  • 最大循环次数:定义在单次工作流执行中可执行此循环操作的最大次数,以防止无限循环。默认值为5。

  • **输入:**接收执行信号以激活。它在内部跟踪当前执行循环发生的次数。

  • **输出:**此节点没有标准的向前指向输出锚点,因为其主要功能是将执行流向后重定向到“循环返回”目标节点,然后工作流程从该节点继续。


11. 人工输入节点

暂停工作流执行,以请求人类用户的明确输入、批准或反馈——这是人机协作(HITL)流程的关键组成部分。

  • **功能:**此节点会暂停工作流的自动执行,并通过聊天界面向人类用户展示信息或问题。展示给用户的内容可以是预定义的静态文本,也可以是由大型语言模型(LLM)根据当前工作流上下文动态生成的。用户会获得不同的操作选择,例如“继续”或“拒绝”,如果启用,还会提供一个字段以提供文本反馈。用户一旦做出选择并提交响应,工作流就会沿着与其所选操作对应的特定输出路径继续执行。

  • 配置参数

    • 描述类型:决定向用户呈现的消息或问题是如何生成的——要么是固定(静态文本),要么是动态(由大型语言模型(LLM)生成)。

      • 如果描述类型为Fixed

        • 描述:此字段包含要向用户展示的确切文本。它支持使用{{ variables }}插入动态数据

      • 如果描述类型动态 模型:从所选服务中选择将生成面向用户消息的AI模型。 提示:为所选的大型语言模型(LLM)提供指令或提示,以生成向用户展示的消息。 **反馈:**若启用,系统将弹出一个反馈窗口提示用户留下反馈,该反馈将附加到节点的输出中。

  • 输入: 接收暂停工作流的执行信号。如果配置为动态内容,则可通过“描述”或“提示”字段中的变量,利用来自先前步骤的数据或$flow.state

  • 输出: 提供两个输出锚点,每个锚点对应一个不同的用户操作——一个用于“继续”,另一个用于“拒绝”。工作流程将沿着与用户选择相匹配的锚点所连接的路径继续进行。


12. 直接回复节点

向用户发送一条最终消息,并终止当前执行路径。

  • **功能:**此节点作为特定分支或整个工作流的端点。它接收一条配置好的消息——可以是静态文本或来自变量的动态内容——并通过聊天界面直接传递给最终用户。发送此消息后,工作流沿着这条特定路径的执行即告结束;从此点开始,将不再处理任何连接的节点。

  • 配置参数

    • 消息:定义文本或变量{{ variable }},该变量将保存作为最终回复发送给用户的内容。

  • **输入:**接收消息内容,该内容来源于前一个节点的输出或存储在$flow.state中的值。

  • **输出:**此节点没有输出锚点,因为其功能是在发送回复后终止执行路径。


13. 自定义功能节点

提供了一种在工作流中执行自定义服务器端JavaScript代码的机制。

  • **功能:**此节点允许编写和运行任意JavaScript代码片段,为实施复杂的数据转换、定制业务逻辑或与其他标准节点不直接支持的资源交互提供了一种有效方法。执行的代码在Node.js环境中运行,并具有特定的数据访问方式:

    • 输入变量:通过“输入变量”配置传递的值可在函数内访问,通常以“$”为前缀——例如,如果定义了输入变量“userid”,则可以访问为“$userid”。

    • 流程上下文:默认流程配置变量可用,如$flow.sessionId$flow.chatId$flow.chatflowId$flow.input(启动工作流的初始输入)以及整个$flow.state对象。

    • 自定义变量:在Flowise中设置的任何自定义变量,例如$vars.<变量名>。 **库:**该函数可以利用在Flowise后端环境中已导入并可用的任何库。函数执行结束后必须返回一个字符串值

  • 配置参数

    • 输入变量:配置一组输入定义,这些定义将作为变量传递到您的Javascript函数作用域中。对于您希望定义的每个变量,您需要指定:

      • 变量名:您在JavaScript代码中引用此变量时将使用的名称,通常以 $ 为前缀——例如,如果您在此处输入 myValue,则您在脚本中可能会以 $myValue 来访问它,这与输入模式属性的映射方式相对应。

      • 变量值:要分配给此变量的实际数据,可以是静态文本,或者更常见的是来自工作流的动态值,例如{{ previousNode.output }}{{ $flow.state.someKey }}

    • Javascript函数:代码编辑器字段,用于编写服务器端的Javascript函数。此函数最终必须返回一个字符串值。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此自定义函数节点的字符串输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**通过Input Variables中配置的变量接收数据。还可以隐式访问$flow上下文和$vars中的元素。

  • 输出: 生成由已执行的 Javascript 函数返回的字符串值。


14. 执行流程节点

允许在当前工作流中调用并执行另一个完整的Flowise聊天流或AgentFlow。

  • **功能:**此节点作为子工作流调用器,旨在促进模块化设计和逻辑的可重用性。它允许当前工作流触发一个单独的、预先存在的工作流(在Flowise实例中通过其名称或ID进行标识),向其传递初始输入,并可选择覆盖目标流在特定运行中的特定配置,然后接收其最终输出并将其返回到调用工作流中以继续处理。

  • 配置参数

    • 连接凭证:如果正在调用的目标流程需要特定的身份验证或执行权限,则可选择提供Chatflow API凭证。

    • 选择流程:从Flowise实例中的可用流程列表中,指定此节点将执行的特定Chatflow或AgentFlow。

    • 输入:定义数据——静态文本或{{ variable }}——这些数据将在目标工作流被调用时作为主要输入传递给该工作流。

    • 覆盖配置:可选择提供一个JSON对象,其中包含的参数将专门针对此次执行实例覆盖目标工作流的默认配置,例如,临时更改子流程中使用的模型或提示。

    • 基础URL:可选择为托管目标流的Flowise实例指定一个备选基础URL。这在分布式设置中或通过不同路由访问流时非常有用,如果未设置,则默认为当前实例的URL。

    • 返回响应形式:确定执行后的子流程最终输出返回当前工作流时应如何分类——是作为“用户消息”还是“助手消息”。

    • 更新流状态:允许节点在执行过程中通过更新预定义键来修改工作流的运行时状态$flow.state。例如,这使得可以将此执行流节点的输出存储在这样的键下,从而使后续节点能够访问。

  • **输入:**需要选择一个目标流以及该目标的Input数据。

  • **输出:**生成由执行的目标工作流返回的最终输出,格式根据“返回响应格式”设置。

理解心流状态

实现AgentFlow V2灵活性和数据管理功能的一个关键架构特性是流状态。该机制提供了一种在单个工作流实例执行过程中动态管理和共享数据的方法。

什么是心流状态?

  • Flow State ($flow.state) 是一个运行时键值存储,在单次执行中由节点共享。

  • 它作为临时存储器或共享上下文,仅在该特定运行/执行期间存在。

心流状态的目的

$flow.state的主要目的是实现节点之间的显式数据共享和通信,尤其是在工作流图中那些可能未直接连接的节点之间,或者在需要跨多个步骤有意地保留和修改数据时。它解决了几个常见的编排挑战:

  1. 跨分支传递数据:如果工作流分为多个条件路径,则一个分支中生成或更新的数据可以存储在$flow.state中,以便在路径合并或其他分支需要该信息时稍后访问。

  2. 跨非相邻步骤访问数据:由早期节点初始化或更新的信息,可以由较晚的节点检索,而无需通过每个中间节点的输入和输出明确传递。

心流状态如何运作

  1. 密钥的初始化/声明

    • 在整个工作流中使用的所有状态键必须使用开始节点中的Flow State参数初始化为其默认值(即使为空)。此步骤有效地声明了该工作流的$flow.state的模式或结构。您可以在此处定义初始键值对。

  1. 更新状态/修改现有键

  • 许多操作节点(例如LLMAgentToolHTTPRetrieverCustom Function)在其配置中包含Update Flow State参数。

  • 此参数允许节点在 $flow.state修改已存在键的值

  • 值可以是静态文本、当前节点的直接输出、前一个节点的输出以及许多其他变量。输入{{将显示所有可用变量。

  • 当节点执行成功时,它会用新值更新$flow.state中的指定键。操作节点不能创建新键;只能更新预定义的键。

  1. 从状态读取

  • 任何接受变量的节点输入参数都可以从流状态中读取值。

  • 使用特定语法:{{ $flow.state.yourKey }} — 将yourKey替换为在开始节点中初始化的实际键名。

  • 例如,一个LLM(大型语言模型)节点的提示可能包含“...基于用户状态:{{ $flow.state.customerStatus }}”。

范围与持久性:

  • 工作流执行开始时创建并初始化,特定执行结束时销毁。

  • 会在不同的用户会话或同一工作流的单独运行中保持不变。

  • 工作流的每次并发执行都会维护其自身独立的$flow.state

视频资源

Last updated