📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Build & Deploy AI Agent Workflow Builder using NextJs, Mongodb, React, Prisma, Upstash

TechWithEmma5:04:28

Transcription

因此,要执行工作流,我们将使用后台作业。我们将使用 upst 提供我们称之为工作流的功能。所以把它想象成一个运行器。因此,我们将定义我们将用于在后台运行 um 工作流,以便我们能够 um 也能流式传输每个工作流,因为 um 也提供实时功能。我们还可以将每个工作流的响应流式传输到客户端。所以如果你去,你可以注册 um 我已经注册过一次,一旦你注册,我们就有现成的工作流和东西。所以只需点击这里,然后去文档。所以我已经在文档中了。如果你去文档,你应该会看到 um 入门指南,你应该点击 Ostach 工作流。所以点击工作流,然后我们可以向下滚动并点击下一步。是的。所以要使用 Ostach 工作流,我们将安装 Oach。所以只需点击这个,然后 um,让我们前往 um 代码并安装一个包。所以我将 um 我将打开我的终端。我将取消服务器,然后让我清除终端,然后我将粘贴命令。所以我正在安装 0.2.3。所以只需点击安装。所以让我们等待它安装。所以我们将服务我们将把执行器运行在后台。所以它将是一个后台作业,通过工作流,我们可以做到这一点。所以让我们等待它安装。所以这个已经安装好了。让我们去浏览器,看看文档,看看接下来是什么。所以让我让我回去。所以我认为我们回去了。所以 um,接下来我们要做的就是你可以运行这个,当你运行这个时,它会给我们 um um 队列启动 URL 到当前登录密钥和登录密钥。所以我们将继续运行它。所以我将去我的代码,让我们运行 CLI。所以我将在这里运行它,我们将离开 CLI。CLI 将始终运行,即使我们想运行服务器,我们的应用程序服务器,我们将打开一个新的终端来运行它。所以我将说“是”,然后让我们看看这将粘贴 um 生成 um 事件。所以我将复制所有内容,然后将其粘贴到我自己的 EMV 文件中。所以让我等待它运行。所以 um 我已经在我的系统上使用了 um,off 正在尝试使用的端口。所以我将使用不同的端口。所以我点击我将直接输入。所以我已经粘贴了,只需输入 um 端口 8081,然后我将点击回车。所以这将使用 08081 端口。所以现在我们可以看到它给了我们 um,我们将复制所有这些。我将复制这个。抱歉,我认为我犯了一个错误。我来到了服务器。所以我将把所有这些粘贴到我的 EMV 中。所以让我在这里粘贴。然后我们需要传入端口和 URL,即 127.0.1。所以让我们在这里这样做。所以我将在这里粘贴。就是这样。所以现在我们有了它。让我们去文档,看看我们接下来要做什么。所以接下来我们要做的就是创建工作流端点。所以要找到 um,我能够获取 um 的本地服务器,以设置端口,你可以去快速入门,然后如果你向下滚动,你会看到 um 本地,然后你向下到如何,然后你应该能够看到本地开发,这就是我能够获取 um 设置以添加自定义端口的地方。所以让我们回到工作流,然后继续下一步。所以让我关闭。所以完成这些之后,我们将创建端点工作流端点。所以我们将创建这个路由 API 工作流。所以我们自己的将是 workflow/ chat/ route。所以让我们复制所有这些。然后让我们去代码。我将关闭我的终端。然后让我们前往。让我关闭所有东西。然后进入 um 应用,然后进入 API,然后进入工作流,我将创建一个名为 chat 的文件夹。我将说 route.tx。然后我们可以将 post 请求粘贴在这里。所以让我们回到文档,看看我们接下来能做什么。所以 um,然后我们需要创建一个触发器。这将触发 um,我们创建的端点。这是工作流端点。所以我们将创建一个触发器,它将 um,它将触发工作流。然后客户端,你将使用这个路由。我们将在客户端调用这个路由。这将是你将在客户端调用的路由。所以只需复制它。让我们去代码编辑器。然后我将在 API 本身内部,在工作流内部创建这个。你可以把它放在这里。这并不意味着我只能在这里创建它。你可以创建一个触发器文件夹。但我将按照我做的方式来做。所以让我说触发器。让我创建一个 route tx,然后我们在这里粘贴它,就像这样。所以现在我们完成了。所以让我们去文档,看看。所以我认为就是这样。好的,我们需要在触发器中添加这两个,这样如果我们使用 V,它将指向 V,一旦我们部署到 V,我们将使用它。所以我将复制这个,然后,我认为工作流就是这样了。所以让我们回到代码,让我们 um,让我们把它做得更好,以便它符合我们的需求。所以我将处理这个问题。所以让我关闭这个,然后我将粘贴它。所以让我像这样,在这里我将粘贴如下。所以这里它也将需要基础 URL。所以我将 um stack base URL 传递它。现在我们正在传递我们的 um div 的基础 URL。所以请确保我们部署时会在 um env 中添加 vis。然后现在一旦你使用 upstage 的触发器,客户端就可以获取你的工作流。所以这会生成一个唯一的工作流运行 ID。所以我要做的是,我将用基础 URL 替换这个,然后我将说 API 工作流,我将指向我们创建的 chat 端点,然后我们可以说我们尝试三次,然后我们也可以说 keep config trigger true,然后我们需要传递 body,因为这将需要消息,而且 um,我们也需要从客户端获取消息。我将把它发送到后端。所以我将说 messages,然后 um,抱歉我需要把它包装在一个 post 路由中。我忘了。所以我假设 async 在这里,让我们在这里使用 try catch,然后我们将其粘贴进去,然后我们将获取消息。所以我将说 constants messages await request JSON,然后我们可以传入消息。现在我们还需要处理传入的头。所以让我把它放在顶部。是的。所以这个头是当你想要部署到 v 时所必需的。我们需要传递 x vil protection bypass 像这样。这不会是真的。我们将说 process env。我们将 um,一旦我们部署就创建 env。所以这将添加,这将使我们能够很好地工作。所以 um,我们将返回工作流运行器。所以让我在这里这样做。所以我将说 return next response JSON。我说 success true。让我删除这个。然后我们还将为每个工作流传递一个唯一的 ID。所以我将说逗号在这里。所以你可以从客户端传递一个唯一的 ID。所以我将使用 workflow runner,因为它对每次运行都是唯一的。所以对于每个工作流。现在我们还需要让我复制这个。在这里测试。然后我们将更改为 um,抱歉 success for,然后我们说 error。只是将其更改为 fail to trigger workflow。然后我们需要将状态设置为 status 500。所以让我删除这个。所以现在我们有了触发器。现在我们需要将这个触发器端点与 um 与 use chat hook 连接起来。所以 um,在客户端内部,我们将回到 chat 端点,但让我们将其连接到 use chat hook。因为 use chat hook 将调用这个端点,然后这个端点将调用 in chat world 内部的端点。所以让我们也创建一个,我们将把它包装起来,所以我们将创建一个 um,我们将创建一个 get 请求。所以让我先抱歉各位,让我们先连接起来,这样我们就不会混淆自己。所以让我们先将其连接到客户端。拿走它。所以客户端是 component,是 workflow chart index。所以不是 index,而是你的 chart manual 内部。记住我们有 um,API/chart。所以我们正在使用默认路由。所以我们不能直接连接到 um,我们不能就这样做 API of stash stash um stash and trigger。不,我们不会这样做。我们将创建一个自定义的自定义传输,我们将能够连接到触发器,就像我们期望的那样。然后我们还将创建一个 get 请求,在 um,在 workflow chart 内部。记住 ostage 触发器路由指向 post 请求,即 API workflow chart,即这里的 post 请求。post um workflow。然后我们需要一个 get 请求来监听。你将能够监听发生在这个工作流中的所有事情。因为我们将实时发送数据,我们将使用实时,然后我们将发送数据。所以,我们需要一个 get 请求来监听这个 um 事件,然后我们将把它发送到 um,我们将把它发送到 um,我们将把它发送到客户端。所以,所以我们要做的就是,让我们先快速创建一个自定义传输。然后我们将创建一个 get 请求路由,我们也将将其添加到自定义 um 传输中。所以,让我关闭所有这些。 um,让我们进入 chat panel,然后让我们,我们将创建一个函数。所以我将称之为内部。我将创建一个文件。我将称之为 transport cx,然后我们将在那里创建一个 transport 函数。所以让我们去浏览器,看看如何在 AI SDK 中实现自定义传输。所以如果你去 AI SDK,然后在 Google 上搜索 AI SDK UI 和 transport,你可以看到如何在这里使用 transport。你说 use chat hook,然后你可以设置 default transport。现在如果你想拥有自定义传输,你只需传入 API chart 和 credentials。现在我们也可以看到如何使用 for trans。你还有 prepare send message request 和类似的东西。然后有几种方法可以做到这些是你可以做的动态配置请求转换等等。所以让我们在文件中实现我们的自定义传输。所以我将回到我的代码。所以让我们来实现它。所以我们将导入默认的 default trans default chart transport。然后我们将创建一个函数。我将说 export constant create a workflow transport,然后在这里我们将返回,让我们返回 new and default transport,然后现在我们需要指向 API I,然后我们说 oach trigger。然后我们需要创建一个自定义的。我们说 prepare async um prepare send message request,然后在那里我们可以获取消息。我说 messages,然后我们需要返回,然后我说 body,然后让我们传入我们需要用于触发器 um 端点 off trigger 端点的消息。现在我们有了这个。所以 u 下一步我们要做的就是添加一个 ed,我们说 pair 我们连接请求流,让我们获取数据,然后让我们返回结构化数据,然后我们将添加头,让我们也获取它,数据头,然后我们还将传递一个 X is reconnect true。然后现在一旦我们完成了这个,我们需要连接到,我们需要使用 fetch,这就是我们将 um 连接到 get 请求端点的地方。所以我将说 um,抱歉我认为我犯了一个错误。这应该是 async 像这样,然后我们说 input 和 init。所以现在我们将说 constant triggers um sorry trigger response。所以 regard response 是等于 await f say impute。我们将传入 impute 和 init。现在我们可以得到一个响应。现在我们可以说 constant trigger data 是等于 await trigger respond.json。现在我们可以得到 constant workflow runner workflow runner id,它将等于 trigger um,我只是说 data 而不是 trigger,让我们说 data.workflow runner id。所以让我们确保这与我们在 route workflow runner ID 中看到的一样。好的,现在我们有了这个。现在我们将返回 fetch / AI / SLworkflow SL chat。然后我们将传入 ID,然后我们将传入 workflow runner ID。然后让我们说 method,所以这个 get get,所以让我们创建 get 路由,现在我们可以创建一个 get rout,所以进入 API API workflow chat endpoint route 的顶部,我们可以说 export constant get is equals to async,让我们说 request.request this,然后让我们返回。所以我们可以获取 search paramel request URL。现在我们可以获取 ID。它是 constant id 等于 search brand get ID。所以让我们称之为,让我称之为 um overflow runner id,然后我们可以说如果不是 workflow ID,那么我们将返回 say um missing workflow runner id,然后,然后我们将创建一个流。所以在我们创建可读流之前,我们将需要添加一个实时 um,来自 OB 的实时。所以让我们保存这个,然后让我们去文档。所以让我们进入文档。现在我们已经看了工作流。所以让我们去实时,然后要使用 up real time,我们需要安装 real time redix。所以实时使用 radics。所以你需要你必须提供一个 radics URL。我们有 radius token 和 URL。所以我们将复制这个,然后安装这两个。所以我们已经有了,我们只是安装了实时和 radics,然后我们可以获取 rad URL 和 token。所以让我们去文档。所以代码编辑器,然后让我们 um,打开终端。所以我将打开一个新的终端。这个,然后让我们安装。所以,确保你首先只安装 1.0.0,然后我们将安装 1.36.0,然后删除这个,然后让我们等待它安装。所以,现在它已经安装好了。让我们去文档,看看我们接下来要做什么。所以,我们需要获取 off URL 这个。所以让我们去这里,然后让我们创建一个新的 radics。所以我点击登录,点击 ver,然后点击创建数据库,我将给它 flow AI,然后选择任何主区域,然后点击下一步,然后选择免费版本,然后点击下一步,然后让我们点击创建。所以这将创建,然后我们可以点击进去,让我们移动它,让我们等待加载。所以让我们向下滚动,这就是我们需要的。所以让我们复制这个。所以我将复制它,然后让我们去代码,然后让我们进入 EMV。所以我将把它粘贴到我的 EMV 中。所以让我在这里粘贴。然后一旦你粘贴了,让我们去文档,然后让我们说接下来我们要做的就是去文档。我们需要滚动。我们需要添加 radics。所以我们可以复制这个,然后我们也将添加实时。所以我将复制 um,我们也将复制两者。所以我将复制两者。然后让我们去代码,然后让我们 um,让我关闭终端。然后让我们进入 leaf 文件夹,然后让我们创建一个文件。所以我将创建 real time.tx。现在我将粘贴 real time on。所以让我们粘贴这个。然后在顶部这里我将 um 我将,让我删除这个 radics。我不需要它。我不需要创建一个新文件。所以我将在这里使用它。所以让我粘贴 radics 示例。抱歉,radics 示例将从文档中复制。所以让我把它移到顶部。现在 um,我们有了我们需要的。所以我将更改这个。所以我们不会使用通知。所以让我在这里粘贴。所以我们将使用 workflow chunks。然后我将从 AI SDK 导入 UI message chunk。所以现在我们有了我们拥有的,我们有了实时。所以我们可以在 get 请求端点中使用它。所以让我们回到 charts route,然后让我们在这里使用它。所以我们将导入它。所以我们将说 constant channel 是等于 real time。所以从 lib 导入 real time,我们将说 dot 我们将说 channel,然后我们将传入 workflow runner id。所以现在我们将创建一个流。我们说 stream 是等于 new readable readable stream,然后我们说 async um sorry async start controller,然后在这里我们将说 constant encoder 是等于 new text sorry text encoder。现在我们可以 await channels subscribe。所以我们将订阅事件,正如你所知,事件是 workflow u 这个相同的 um,我们在这里拥有的模式,我们将看到 um workflow.chunk 像这样。所以我们将 um,然后指向 history,如果你想,你可以指向 history 为 true。然后我们有 on data,这就是我们将获取事件数据的地方,而且我们也可以获取 channel,如果你想要的话,这个数据将被发送到客户端。所以我将说 control encode sorry enq 像这样,然后我们需要将其转换为,所以我将说 data 我将说 JSON stringify data 像这样,所以我们将其转换为字符串,然后我们将说 if data if data.pipe 等于 finish then controller close。所以我们关闭这个,现在就是这样。所以现在 um,让我们在这里看看,我们将说 request.and signal.add event listener abot。所以让我关闭这个,然后我们说 controller controller close。所以我需要移动这个。我将把它移到这里,就像这样。所以 controller close。是的。然后我们需要返回流。所以说 return new stream 像这样。然后让我们传递其他 content type text stream。然后让我们关闭它。所以我们完成了 get 端点,这将连接到 um 到这里的 transport,这将发送,所以让我们在 use chat hook 中使用它。所以让我们进入 component workflow chart chat panel。所以我们将用这个 um 函数替换这个。所以让我们看看,让我们导入这个。所以这是可以的。现在我们将 um,只是 um,所以一旦 use chat 将调用这个,然后我们将,一旦它完成,我们将调用这个端点,us 将继续监听,继续监听这个。所以任何时候我们发送消息,任何时候我们发送响应,我们将,它将被添加到消息列表中,然后我们可以在这个 channel um chat panel 或这个 conversation list 中显示它。所以我们完成了这个。所以接下来我们要处理的是 post 请求,实际的工作流。抱歉,实际的工作流。我们还没有处理这个。所以让我们 um,获取我们将从触发器中获取消息。所以记住一旦我们触发,一旦我们调用触发器端点,我们将消息传递到 body 到 API workflow chart,这是一个 post 请求,然后这将获取消息,然后我们将从数据库中获取节点 node 和 edges,然后我们将创建一个名为 execute workflow 的文件。所以让我们在这里获取它。所以要获取 um,um,在 upstarch workflow 的工作流中,我们可以使用 context。所以我将快速将其更改为 CTX say X.request payload,然后我就可以说 as,然后我们将看到 messages。所以让我从这里导入 messages,然后我将将其设置为 um messages,它是 UI message 类型,来自 AI SDK,它是一个列表。所以现在我们有了消息。现在让我们获取 um 工作流运行器。所以我们可以说 constant um workflow runner。所以我说 this is equals to 你可以说 context.workflow runner,然后我们还需要 constant,我们还需要 channel,我们将把它传递给 execute workflow,以及 workflow runner ID。然后我们将说 constant message 是等于 messages 或 message length.minus one 来获取用户消息。然后我们可以说 constant user um user impute。我不知道我们是否应该获取用户输入,但让我们 just,让我们 just say message row is equals to user and message part index zero.type is equals to X then say message like this。所以我们有了用户输入。现在我们将获取 um,我们将从数据库中获取 node。我们可以使用 runner 这个 context runner 来获取 um,node 和 edges。所以只需调用这个 fetch um database fetch data from database 或 fetch from database。然后我们将说我们将从这个获得响应。所以在这里我们将说 workflow workflow data is equals to Prisma。所以让我们导入 Prisma。所以让我添加一个 sync。所以让我们导入 um Prisma。所以让我从 at lima 导入 prism,我说 dot workflow do find。所以我们也需要传递一个工作流 ID。所以我们忘了我们需要从客户端传递工作流 ID。所以让我们回到触发器路由。所以从这里开始,我们将从 transport 开始。我们将传递,让我们将这个 workflow ID。所以我们也将其传递给 body。所以是的,我们将传递 workflow ID。所以让我进入,让我们进入 component chart chat panel。记住我们在这里传递 workflow ID。所以我将传递它。现在在触发器端点触发器中,我们将获得 wful ID,让我们在这里传递它。现在我们有了它。让我们进入 chat route,然后我们将获取 workflow ID。所以让我将其设置为 string。所以现在我们可以将其传递在这里来获取工作流。所以现在如果我们有了这个,让我说 if not workflow data um,让我们抛出错误。现在我们可以说 constant object 将等于 JSON。我们将把字符串转换为 um,我们将把字符串传递给 JSON。我们将说 workflow data.flow object。现在我们将说 constant node 将等于 object node,作为 flow 中的 node 类型。所以我们将说 constant edges 将等于 object edges,让我们也导入 edges。让我们也导入 note,然后我们将返回两者。所以 return note and edges。所以现在我们可以得到这里的 note 和 edges。所以现在我们有了执行工作流所需的全部内容。所以让我们说 workflow execution,然后我们还需要添加一个 sync。所以让我在这里添加 try catch。然后我将抛出错误。现在我们将创建一个函数。我将称之为 execute sorry execute workflow。然后我们将传入 nodes,edges,user impute messages,channel,以及 workflow runner um,workflow runner ID,而不是 workflow ID,它是 um,所以 um,我们将处理这个问题,所以我也想快速添加它,这样我们就不会忘记在部署到 facil um 时,从文档中我们需要添加 um,我们需要添加 qu sorry Q starch 这里我们需要使用 crystal client,记住我们也在里面做过,我们也在触发器端点里面做过,我们添加了 protection bypass,我们也需要在这里做。所以要做到这一点,我们将说 client start client equals to new client,然后我们需要,我们需要导入。它应该像这样。我们需要从 um 导入。我们需要从 ost 导入 kind。所以我们需要从那里导入。现在 um,这里我们可以说 token,我们说 process enq token。所以让我确认一下 env 中是否有。是的,我们有。然后我们还需要传递与这里相同的头。所以我将复制这个,然后我将在这里传递它。所以这是可以的。所以让我们去创建 execute workflow 的函数。所以我将关闭所有东西。让我们进入 le 文件夹。你可以把它放在任何你想要的地方。你可以把它放在这里。但我真的想把它放在这里。所以我将打开 le 文件夹中的这个 workflow。我将说 execute workflow.x。所以让我们在这里做。所以我将,我将导入 edge 和 node,让我们也导入 UI message。所以现在我们将 um,我们将首先检查我们是否有 um,start node。记住 start node 是启动 um,工作流的东西。所以我们将,而不是 constant,我们将首先运行 um start node。所以让我在这里这样做。所以我说 constant,然后 start node。所以让我先导入,那是 execute um,or flow。所以我导入它,我说 start node 等于 node。我们将找到 node.type.sorry,这应该是我们使用 node node type in start,然后我说 if if not start node then let's throw an error like。所以现在 um,我们有了 execute workflow。现在我们还需要每个 node 的 executor 文件。所以在这里我们将循环遍历 nodes。然后我们将执行每个 um,每个 node。所以每个 node,每个 node,我们都有另一个文件,我们将称之为 executor。而且 um,我们将实现所有这些,它们也将返回每个文件中的响应。所以 um,我不知道我应该把它放在这里,还是应该把它放在 workflow 中。我们应该在这里创建一个自定义 node,然后有每个 um,每个自定义 node 的 executor 文件,或者我们可以把它放在这里。所以我我将,我将按照我感觉的方式去做。我将把它放在每个 node 中。但是如果你不想把它放在 um 组件文件夹中,你可以轻松创建一个自定义 um,我们可以称之为自定义 executor,自定义 node executor,在这里。然后 um,你可以使用它在这个文件中。所以我将这样做。所以我们要做的第一件事是,在实现之前,我们需要进入 node config,让我们设置,让我们设置,就像我们有 node type 一样,我们也将有 node config base,node config,我们也,我们将为 node executor 也这样做。所以,所以让我们在这里这样做。所以我将做 node executor,让我在这里做。所以说 export constant node_executor 将等于。所以现在它将是空的。然后我们还将创建一个函数,类似于我们做的 get node config。我们将为 node executor 也这样做。所以让我只是传递 let me just say oh um,让我只是说 node executor,所以我将说 export constants。所以我将称之为 get node exeutor。所以 type,然后我们将说 um constant executor node exeutor pipe。目前它是空的,我知道。所以我就说 as um key K of type of,让我们 just,让我们 just leave this for now。 um,让我删除。让我检查一下我在这里做了什么。Bit type,我只是复制,让我们 just forget about the error。所以,只是复制这个,然后让我在这里粘贴。所以,我说如果不是 executor,我只想抛出一个错误。所以,让我在这里抛出一个错误。作为 true error。让我指向 no exec for node type。然后我们将返回 um,executor。所以让我们开始 start node executor。实际上 start node executor 甚至不需要,因为我们不会使用它。我只是在这里添加它,因为类型在这里。我们实际上不会使用它。所以我现在就创建它。所以 executor tx,让我们写 export constant sorry export async function。我将称之为 execute start。让我们称之为 execute start node。然后让我导入,让我们也 um,让我们 just write node,让我们导入 node。所以 import node from um react flow react。然后我们还将传入 context。现在我将,让我们创建一个类型。所以进入 um,进入 root 文件夹,我将说 types,然后让我创建 workflow tx,然后我将粘贴它。所以我们将拥有的类型是 executor contest type。所以让我从 workflow type 导入类型,然后在这里我们将拥有 output record 或 string 和 any,所以我不知道每个 node 都有不同的输出。所以写出输出。如果你真的想写出输出,你可以写出来。所以我们将说 output 将是一个对象。然后我们将说 start node.ID。所以这就是为什么我说我们不需要 start node 的 executor,因为我们已经在输出中了。所以我们已经在输出中了。所以让我们也传递 history。所以 history 是我们将发送给 AI agent 的东西,给 AI 模型。抱歉。然后我们需要也传递 workflow run。我们将使用它来获取 ID,抱歉,用于每个 um,实时,我们将把 workflow ID 传递给客户端。所以我们也将在通道上传递,我们将使用它来发送到 emit 数据到客户端。所以现在我们有了,我们结构化了 context。现在你可以看到我们实际上不需要 exit codes 和 start,但别担心,我们可以把它留在这里。所以一切,但我们将排除 output 的更新。所以没有必要,因为即使是 um,即使是 um,如果你进入 start node execute,我认为它也需要 output 来获取 input。所以你说它不需要。所以 um,所以我们要做的下一件事是创建 um,agent 的 executor。然后一旦我们创建了 agent,我们就可以开始处理 um,for loop 来 um,循环遍历 um,nodes。所以让我们在这里创建它。让我们说 um,agent node executor,让我们在这里实现它。所以我还想让你知道,在 execute workflow 中,out um,抱歉我在这里犯了一个错误。它们应该移出去,就像这样,错误应该停止。所以 output,如果你还记得 um,在 um,mention input 中,如果我进入 component,进入 mention input um,我们能够我们能够设置 um,一个特定的 um,一个特定的 node ID.impute。所以这将是,如果我进入 sorry,如果我进入 node config,然后如果我向下滚动到我们有 node config 的地方,现在记住我们有这个 impute impute values,我认为它是 output text,这里我们可以看到 output text,是的,所以记住 um,设置 um,start node,start um output 在 agent um mention input 中,在 system prompt 或 system input 中,我们将使用 agent 像这样 agent.output text,如果是 start,我们有 um,um,start id.impute,这就是我们在 execute workflow 中所做的。所以你可以看到我们有 start node id。现在我们也有 impute,有了这个,我们可以替换它,我们可以替换任何地方的这个,在 um impute 或在 um,是的,在 um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um

我上去。您将把这个响应模式转换为 JSON。抱歉,转换为 Zord。我们将把它转换为 Zord。所以让我们进入代理节点执行器,在这里我们将首先检查此输出格式是否为文本。如果它是 JSON,那么我们将进行转换。所以我将说常量 JSON 对象或 JSON 输出输出,如果 JSON 输出等于 JSON,然后我还需要 um 并响应抱歉,请让我正确设置它,并且响应模式和 um 响应模式不为 null。请记住,在节点配置中,如果我进入节点配置,默认值是 null。所以我们将说如果它不为 null,那么我们将打开一个括号,然后我们将说像这样输出。然后我们将指向抱歉。所以我们将从 AISD 导入输出。所以您可以看到从执行。所以我们将能够将此传递给 AI um AI exec text um 函数。这将强制 AI um 返回 um 对象。所以 um 所以现在我们有了它。我们将说点对象,现在我们可以传入模式,而模式是响应模式,但我们需要将其转换为正确的模式。目前我们还没有。所以让我们去浏览器,让我们安装一个包。所以如果我们到这里,让我们搜索 mpm 的 JSON schema。然后如果我们向下滚动,我们可以看到如何设置 JSON schema,然后我们可以将其传递给 convert JSON schema to S。然后您可以使用它来 um 验证您想要的任何内容。所以 um 您可以看到您看到我们拥有它的地方。我们有一个类型对象属性名称,您还记得我们有属性,我们有键是 f dot um header name,我们在 JSON schema 组件中定义了它。所以您定义了一个键集在类型中,您也可以设置最小长度和最大长度,所有这些,但目前我们只有一个键和一个类型。所以让我们安装这个包。所以我将进入我的代码编辑器,让我们安装这个版本。所以我将粘贴它。所以让我们安装 0.5.2。所以让我们安装它。所以它已经安装了。所以我将从 Okay 导入它。所以让我在这里导入它。然后我们可以说 convert convert JSON schema to Z。我认为 um,我们可以将其设置为 undefined。像这样未定义。是的。所以现在我们有了 JSON 输出。现在我们将能够将其传递到内部。我们将将其传递给 AI um AI stream text from AI SDK。所以现在我们将创建一个函数。这将给我们结果,我们将调用 stream agent。所以这将是一个操作。所以我将称之为 action stream agent action。然后我们将传入模型。我们将传入指令,它将是 replace instruction。然后我认为我认为我们说 selected model。所以我认为我们也可以到这里,让我们说 model 等于 selected model,然后从常量中的模型列表中选择任何一个或第一个模型。然后我们可以将模型传入这里。所以我们还将传入历史记录。我们还将传入 JSON 输出以及选定的工具。所以一旦我们得到响应,我们将检查输出格式是否等于 JSON。所以如果它等于 JSON,抱歉,我们将在这里使用 try catch 错误,然后我们可以得到 so,让我们先实现这个 stream action agent action,然后我们将返回输出。所以,让我们走吧,我将关闭所有这些。现在,让我们进入 app 并创建一个名为 actions 的文件夹,然后我们称之为 um workflow 或我们称之为 action。抱歉,execute workflow.x。好的,将其设置为 use server。保存。然后说 export async function stream agent actions。所以我们也需要获取历史记录。所以 history 将是 U not any UI message array 的类型,UI 消息列表。然后我们可以将 JSON 输出设置为任何内容。让我添加注释。然后我们还可以传入 selected tool。所以 selected tools,然后我们可以看到 selected tools。这将是一个数组。所以我们目前只有两个工具。如果我们进入常量,我们有 um web search tool 和 NCP servers。所以,我将先复制这个。我将说我认为我们将传入。所以,让我进入节点配置。所以让我们进入 um 进入组件代理工作流节点自定义节点代理。现在如果我们进入设置,我认为它在设置中,我们在那里设置工具。所以如果我点击工具。所以我们在这里传递类型和值。这就是我们传递的内容。所以我们将为 NCP server 设置类型和值。我认为我们也做同样的事情。让我检查工具。是的,就是这样。所以让我们 um,让我们回到 action,然后让我们传入这将是类型,让我让我像这样创建一个对象,我将说 um 类型,抱歉,各位,这不应该是对象,这应该是 um,让我们使用数组。好的。然后我将说 pipe。我们将拥有 native,这将有一个字符串类型的 value。然后我们可以说 um,这可以是或 NCP server 之类的东西,所以 NCP server 我们也只有两个工具的数组,目前就让它为空。所以这应该是 twos 而不是 two,这与我们在常量中拥有的相似吗?您可以看到我们这里有两个 twos,这就是我们将从代理设置中传递的内容。所以现在完成了。所以让我们说常量模型消息。我们将把这些消息转换为 um 模型消息,这是 AI SDK 所必需的。所以我们将说 await convert to model messages,然后我们将像这样传入 history。然后我们可以得到工具。所以 um,我们将说 tools for now 等于让我们称之为 record type of record string any,它将是一个对象,然后目前我们没有任何东西,我们将说 native tools。所以我们将遍历 native tools,然后我们将添加 two here。目前,如果我们查看常量,我们只设置了 ID,我们实际上并没有将其设置为实际的 two 函数。所以我们将使用一个包来处理 um web search。所以我将说 for let's do constant two,然后我们将过滤 selected to that matches the native type,然后我只想确保我说 if to 等于 web search。所以它应该与我们这里拥有的相似。然后我们将设置 tools.web search。这将等于地址。目前我们还没有工具。让我 um,让我暂时注释掉。我们没有工具。所以我们将去,我们将使用一个包。所以让我们继续实现它。所以只需转到 AI SDK 文档。然后如果我们转到 AI SDK。回到 SDK。点击工具注册表。一旦您单击此项,我们就有 um web search 的额外功能,我们有 publicity search,我们有不同的功能,我们有 fire 等等。所以我更喜欢这个。我将单击此工具。然后我们需要安装这个包。然后我们有 um 我们需要提供 API 密钥。这就是如何使用它。只需导入包。然后我们将 um 调用 web search too。所以让我们去这个网站获取 API 密钥。所以只需转到。ai 然后登录。一旦您登录到您的帐户,您就需要创建一个 API 密钥。所以只需单击此处 API 密钥,然后单击此处创建一个新的。所以只需说 flow flow AI,然后单击创建,这将为您创建 API 密钥,然后您可以复制它,然后让我们去。所以现在我们需要去文档到代码编辑器,然后将此传递到 EMV,然后让我们进入 EMV。所以我进入我的 EMV 并将其传递。是的。所以只需传递 EMV 密钥。现在让我们安装包。所以让我们安装它。我正在安装 1.0.5。所以让我们点击 enter,这应该安装 air SDK。所以让我们等待它安装。所以我认为这是一个错误。让我尝试安装另一个版本。所以我将删除版本。所以我们将查看版本安装。所以有些东西不对。让我看看。所以问题在于与 um AI SDK 冲突。所以我不得不将我的 AI 版本更改为 6.05。它仍然要求我将其更改为 5.0 A3。但我仍然想使用 6.05,因为我就是这样测试的。所以我所做的,我将首先安装这个。您可以去 um,他们有其他工具,您可以使用其他工具,例如 u fire core 等等。所以我将强制安装这个,这不是最好的方法,或者您可以降级 AI。我将就这样使用它。所以我将回到我的 execute workflow 在 action 中,在这里我将导入它。所以让我在这里粘贴它。现在我们也可以使用它。我可以启用它,然后我可以就这样说,这将等于 web search。所以,我们将调用它,让我删除这个错误应该停止。有些东西不对。哦,所以我找到了问题。我需要在这里关闭它。所以现在让我们定义一个系统提示。所以我将粘贴它。我们可以这样做,您执行流程,然后 um,所以让我让我更改我拥有的。所以这是您的助手只回复用户必须给您发送的消息,您必须遵循指令。所以我还想让代理知道我们拥有的工具。所以我可以调用常量工具列表等于对象条目工具,然后让我们说 map,然后让我们获取 name,它将是这样的,然后我们说 dot join。在这里我们可以传入它。我们可以说如果工具列表如果工具列表说可用的工具,然后我们可以说工具列表,然后空字符串。让我们关闭。让我们说 stream by this。所以我们有系统提示。现在我们将使用 AI 和 stream text。所以我将说 result 等于 stream text。让我们导入它。是的,我们已经从 AI SDK 导入了。现在我们需要传入模型。所以我们将获取模型。我们将使用 open router,让我们 um,让我们暂时将其留空字符串。但这会显示错误。所以让我们传入 system,它将是 system prompt。然后消息将是 message model。然后我们有 two。然后对于工具,我们将说 object do keys to sorry do length,如果大于零,那么我们就说我们传入它,我们只设置未定义,然后对于 JSON out,对于 JSON out,我们只是 um 和结构化。这将 um,如果我们去 agent node executor,我们可以看到类型,类型是 output,output on on,所以如果我悬停在 JSON output 上,它将给出 output on 和 undefined。所以通常这会设置 output,您可以看到我们有 output,这个 output 需要 um 抱歉,需要从 um output from AI SDK。您看到 output object。所以既然我们已经有了 JSON 输出,那么这就行了。我们还需要传入 stop when import stop count。这将告诉 AI 代理代理可以 um 循环它自己,因为我们 um,我们正在提供工具。所以我们需要 AI 代理 um 循环它自己的响应,并通过调用工具并查看工具的结果来给我们最终输出,然后再给我们响应。所以一旦代理完成,我们需要说 u 抱歉,我们需要在这里返回结果。所以,我们现在完成了 AI。所以,好的,我们没有传入 open router。所以让我们去获取 open router。所以 inside the folder,我将创建一个文件 open router.x,然后我们将去获取 API。所以让我们进入 a SDK。点击提供商。然后如果我们向下滚动,我们可以看到我们应该能看到 open router 在这里。所以让我看看。您应该看到 open router,这里是。您可以单击 open router,然后您可以看到您需要从 AI SDK provider 安装这个包,然后我们需要 um 像这样使用它并传入 open router open API key,然后您可以传入用户选择的模型,然后您可以简单地像这样使用 open router chart 并传入模型,它就可以工作了。所以让我们去 open router。所以 um 来吧。所以尝试登录您的帐户,然后转到 key,然后您可以快速单击此处并创建一个 key。所以我已经有一个 key,让我创建一个新的,说 flow AI,然后单击创建,这将为您提供 key。您可以复制它,然后让我们使用它。所以让我们回到 AI SDK,看看如何定义 API 密钥。好的,我们可以指向这里,然后复制它。所以让我们进入我们的代码,让我进入 EMV,然后粘贴在这里。所以我将传入我的 open AI key。所以让我进入 open router tx,然后粘贴在这里。所以请确保好的,我们还没有安装包。所以让我们安装它。所以请确保我们安装这个版本 1 1.5.4,然后点击 enter,这应该为我们安装包。所以再次出现冲突问题,所以让我尝试删除这个 1 点包版本。所以它们都给了问题。所以我将 um,我将强制使用我目前使用的版本。所以让我们等待它安装。所以现在它已经安装了。现在我们可以使用它了。我可以复制 open router,然后直接进入 action execute workflow action,然后 um,这里我们有 model,我们可以说 open router,让我们导入它,抱歉,让我们从 libchart 导入它,不是 model,不是 com charts model,像这样。所以我们完成了这个。所以让我们回到 So,让我将其更改为 agent execute agent action。抱歉,各位,让我将其更改为 agent action。Agent tx。这很好。所以让我们直接进入 execute um custom execution。然后 inside the agent node agent node executor,然后让我们导入 um string the stream agent action。现在我们有了结果。现在我们将 um 获取输出。所以我们可以获取文本。我们说 text 等于 response.text。所以像这样 stream text 结果的文本,然后我们可以像往常一样返回 output,然后我们说 Jingp text,然后如果有任何错误,我们可以抛出 new error um,我们可以说 failed to pass output,然后我们可以 console log 错误。所以现在我们有了 JSON 的处理。现在我们还将处理文本。所以我们 um,我们也可以直接去,让我们直接去 AI SDK 的文档。然后我将去 docs,然后我将去 generate text,然后如果我们向下滚动到 stream text 的输出,您可以看到 um,我们可以看到 results stream 的文本部分,这将返回文本部分,如果我们向下滚动查看文本部分是什么。所以如果我滚动到底部,现在我们可以看到部分,我们有 start,抱歉,part of type,我们有 start,我们有 start step,我们有 text start。所以这是 holding the depths 和 text delta。然后我们有 text end,我们有 five,我们有 two core,我们有很多。我们有 to impute delta 2 impute n 和所有这些。现在要 um 自定义 um,所以 um,让我们去使用它。抱歉,各位,让我们去使用它。所以 um 在这里下面,所以我将从 u 文档中复制。现在我们可以说 text part of resource text string。我们还需要设置 full text。这将是一个空字符串。现在我们将 um 将 AI 的输出流式传输到客户端。所以,我们将使用 switch 语句,就像我们看到的。然后我说 text type。 um,为什么它会出错?我等待。所以我再次说 switch,然后我说 text part type,这正在尝试一个错误类型不存在。抱歉,我不会使用 text stream。我将使用 full stream,错误仍然会出现。所以如果我悬停在 type 上,您可以看到一个文件错误 um reasoning stream 和 two approval raw 等。现在在这里,我们将说 if if text delta,您可以看到我们有 text end。我们不关心 text。我们不关心 text end。我们需要的是实际的文本。所以这是类型,然后我们将使用 full text.plus text pass text,这将传递它。保存在这里。 um,您也可以将其更改为 chunks。所以让我们就这样保留它,让我们就这样保留它,或者让我将其更改为 chunks 更好,因为我们在实时中将其保存为 chunks,正如您所见。所以 inside,如果我进入 real timetx,您可以看到我们在这里传递 chunks。所以现在我们将流式传输,我们需要将其流式传输到客户端。所以,我记得我们正在使用 upstatch 的实时。所以我们将使用我们传入代理 um 内部的上下文中的 channel。您可以看到 channel。所以我们可以使用 channel 来发出 um 事件,并且要发出事件,我们需要像这样定义它。所以让我向下滚动。所以我将说 channel emit,然后我们需要传入,因为我们定义了 workflow 和 chunk,那么我们就需要使用 workflow chunk。所以我将去说 workflow.chunk 像这样。所以现在我们需要传入 um,我们需要传入数据。所以要传入数据 um,我们需要确保我们传入 AI 使用的 chat 所需的确切内容。所以如果我们进入 component inside the chart。所以让我去 not here inside the workflow folder chat and then if you go into index.tx sorry not index channel.panel panel we using the use chat hook and this is requiring this require the type the um sorry if I scroll down here we can see that we are we are doing a switch statement for part type now you can see on the client side this type are converted to use use ui message so we can use text then we need a different we need a custom type so we know this is coming from our workflow And to add a custom um type in AI SDK, we can simply just do it like this. 所以我将进入 um 我的 agent node executor。所以我将设置 type。所以而不是 text,我们需要说您必须传入 data。然后传入 type。我说 workflow node 像这样。所以您必须传入 data 来发送自定义类型到客户端。所以我们将传入一个 id。现在我们可以传入我们的 data。所以对于 data,我只是说 ID node ID,因为我们需要它在 um 我们需要它。所以 id,然后我们还需要 node type,它是 node.ype.type,然后我还可以,是的,我们还需要 node name,我将说 node name,然后对于 status,我们也需要 status,我将说 loading,或者您可以称之为 streaming,如果您愿意,我将保留为 loading,然后我可以设置 um,这应该是 data.um,我认为是 name,我使用了,我认为我使用了 label,是的。所以 um,让我删除这个。然后我们还将传入 type。我说 type 是 text delta。然后 output um,我们将说 um,我们不会使用 text。我们将使用 full,full text 像这样。所以现在我们有了 um,我们正在将文本 um,我们将文本向下发送到客户端,如果结果来自这里是文本。现在我们还需要处理 two call,记住在 action agent.x 中,我们传入了 two。所以我们还需要处理 two。所以我将说 case do call,然后我们可以说 um emit channel emit 同样的事情。所以我们再次添加这个 ID 的原因是,因为我们正在流式传输这个,我们将逐块接收数据。所以我们不想总是从后端接收多个 um 多个 um 数据,从代理节点。所以有了这个 ID,SDK 使用的 chat 会替换,我们会用我们已经传入的这个数据替换那个数据,因为这个 ID,我们传入它。所以 ID 必须是唯一的,我们使用 node ID,因为我们知道 node ID 对每个节点都是唯一的。所以我们将有一个 two。所以我将说 ID node id。然后我们可以传入 data。所以我在这里也这样做,因为我们需要在客户端显示名称和 um 类型。所以我只是粘贴在这里。然后 status loading type to call,然后然后我们将有 output。所以我将说 full text,sour,我们只说 name.name,我认为这里不需要 output,因为这不是 text。所以让我注释掉。所以我们只需要 two,two call。所以我们将显示执行的 two。所以让我们定义它,然后让我说 break here,然后在此之后我们可以折叠它,然后发送剩余的结果。我们可以返回它。我们将说 return output text 和 full text 像这样。所以这就是代理节点的节点执行器。现在我们可以在内部使用它。让我们开始处理 exeutor workflow。所以 um,或者我们应该工作?让我们也实现 if else。所以让我们快速实现 if else 和 end。然后就完成了。所以让我们继续这样做。所以我将为此创建一个文件。所以让我们继续创建 if else exeutor。所以让我们进入 li workflow custom executor,然后让我们创建。所以在我们创建这个之前,让我们进入 node config。然后我们忘记了传入 um,我们忘记了传入这个 agent,然后是 executor,抱歉,executor agent node exe,或者您称之为任何名称。所以一旦您传入它,让我们创建一个文件。所以我说 if um if else。所以让我使用 if else 像这样。我说 executor cx。所以我们也将 um 做同样的事情,我们在 um agent executor 中所做的。我们将说 export async function。所以让我把它移下来,让我关闭它。所以我们将传入 node。我们将传入 um,抱歉,不是 um workflow context。这将是 execute execute u context type,让我们从 react flow x reflow 导入 node。现在我们需要 um,我们需要进入 if else 节点。所以说 if else,让我搜索 node。然后点击 if else,然后让我们复制这个 pipe,然后也粘贴在这里。所以现在我们将获取 output,常量 output 抱歉,等于 context。所以我犯了一个错误。现在我们可以获取条件。这将来自 data。我们说 node data.conditions as condition。我将说空数组。现在我们需要循环。我们需要 um,检查它。说 if if not array.is array。所以让我只使用 array。然后我将抛出一个错误。所以 condition 必须是 array。然后我们需要循环,我们需要循环条件。所以这是一个数组。所以我们说 for let i equals to 0,然后 i 小于 condition。um i++。现在我们需要检查。所以目前,如果您进入 component workflow custom node if else,然后是 node,您可以看到我们有条件,然后我们还有 else。所以我们将要做的是,我们将跳过 condition,并且没有值。我们将说常量 condition,然后我们得到一个 condition。现在我们将说 if if um not,那么我们将,让我把它移下来,然后 if um condition value is undefined,那么让我们抱歉,不需要打开,我将说 continue。所以这将跳过,如果这不是一个有效的条件。现在我们将说常量 um,我们将获取变量,然后我们将替换它。所以 replace variable,我们将传入 condition variable 和 output。所以我认为对于 value,我们不需要传入,我认为我们不需要,我们没有向 value 传入任何变量。所以我将把它留在这里。所以我可以说 value 等于 condition value 像这样。现在我们需要 um,我们需要检查传入的值是否为字符串。所以如果它是字符串,我们需要将其包装在引号中。否则,如果它不是字符串,我们只需要像这样。所以我将创建一个辅助函数。让我在这里做。所以这将检查这个值是否 um,这将帮助我们检查它是否已经以引号开头和结尾。所以我将 um,并且它不是数字,抱歉,它是 um,它不是数字,抱歉,我将在这里粘贴它。所以您可以看到检查是否不以引号开头和结尾。所以这是为什么我们需要这个包来评估 um,我们正在传入的条件。我们将使用一个包。所以我们需要确保值,如果它是字符串,我们正在比较,我们正在比较变量与值。我们需要确保值是字符串,而这个包都需要。所以我们将查看我们将要安装的包,但先写出来,然后我们将使用 to check。所以我们将说 if 抱歉,不是 if constant variable expression 等于您可以看到 if need quotes if needing,我们将传入 value,然后然后让我们说 stringify 并传入抱歉,variable。我们将对两者都这样做。所以我将说 variable,然后否则我们将传入一个 variable。我们将切换 value。所以只是同样的事情。现在我们将合并两者。我们将说 constant 抱歉,constant expression 等于 um variable expression,然后是 condition.operation 和 value expression。所以现在我们将 um,让我们添加 try,让我们安装包。所以让我们去我们的浏览器。所以让我让我们使用它。所以这是一个简单的例子。他们说只需传入 2 * 2 + 1 像这样。所以这很简单。所以让我们回到代码并安装它。所以我将粘贴 um,包,然后使用这个函数 2.0.2,然后点击安装。所以这应该会安装。所以发生的事情是它显示了一些 um,它显示了冲突错误。我刚刚添加了这个,然后强制它 um 来安装,然后让我去并导入包。所以只需从我们安装的包中导入 pa,然后在这里我们将使用它来评估 um,这个表达式。所以我们将说 constant um partial new partial,然后我们将说 we sort psi evaluate expression。现在我们将说 if we sort,那么我们将返回 output output,我们将说 result。您可以看到我们是 true。但这是这里最重要的部分。它说 selected branch。Selected branch 将是,我们将说 condition 像这样。抱歉,它将是这样的。所以,我们从哪里得到这个?如果您去 um,让我们进入 if else node tx,如果您查看 condition here,请记住我们有这个 ID,所以这应该是 condition index here,请记住我们在 base 中传入了这个 ID,这将添加到边。所以我们将使用它来知道我们将重定向 um 工作流的哪个分支。所以这是我们将要提取的内容。所以,所以让我们不要犯任何错误。所以现在我们可以捕获错误。我将说 console.log error。我将说 condition error,然后我将说 true new error 像这样。然后他们说 evaluating error,但我只是删除它,它现在很好。让我们返回,所以如果我们完成了这个,我们将返回抱歉。所以我们将返回 output,这将是 result force,然后 selected branch 将是 else。所以如果我们进入 not sorry not not config if else um,所以让我去,是的,node.tx。现在如果您向下滚动,您可以看到我们这里的最后一个 ID 是 else。所以如果我们没有任何条件,我们将返回到 um else。所以让我们使用这个,在 um 内部,我们将 um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um um

在一个关键点。所以让我复制我这里的这个关键点。所以,而不是索引,我将只把它改成我将只添加工作流来使其唯一。然后我将在这里传入数据数据。所以,让我们创建这个组件。所以,我将在下面创建这个组件。所以,导出常量显示。所以,让我们获取数据。我认为传递一个数据。然后我们需要定义一个类型。这甚至还不完整。所以,我将要做的是,让我把它剪掉。然后让我们来到这里顶部,让我们说类型,我说类型,嗯,我们应该怎么称呼它?好的,让我们说节点道具节点类型,或者让我称它为节点显示类型。我将把它粘贴在这里。所以,嗯,对于状态,我们也忘了我们正在传递错误。然后我们只有分数和这个,然后我们也需要代理执行器内部,我们传递两个调用,我们也传递嗯,结果两个结果。所以,我们需要得到两者。所以,我将进入聊天手册,我将说嗯,让我们说两个两个调用,让我们说名字喝,像这样。然后我们有两个结果。让我们说名字字符串和结果。让我们只获取结果。所以,我将把它设置为任何。我们有输出。我们也需要获取错误。说任何我认为一切都完成了。所以,让我们复制这个。让我向下滚动。让我把它粘贴在这里。而且我也将在这里做同样的事情。所以,现在我们要做什么?我们将使用节点类型来获取嗯,配置节点配置。所以,我们可以得到ID,抱歉,节点的图标以及节点配置中的其他信息。所以,我说获取节点配置。所以,让我们传入数据点。好的。我认为我认为我在这里犯了一个错误。所以,数据。好的。好的。好的。所以,让我让我把它改成节点数据类型。这更好。所以,我将向下滚动到这里,让我把它改成节点数据类型。然后在这里我说类型节点节点显示类型类型它将等于数据节点数据类型,然后我可以复制它并粘贴在这里,它应该停止。所以,现在我们可以得到节点类型,然后我们将说如果节点配置不是。所以,只返回所有,所以我们可以得到图标。所以,说图标等于节点节点配置点图标。然后让我们获取数据。所以我将获取状态输出错误和两个调用以及两个结果。所以,让我们返回让我们在这里创建一个div一个div。所以,让我们说span。所以,让我们给它一个类名,深度小,字体中等。所以我说数据点节点名称,或者我们也可以使用节点配置只是标签是一样的。所以,是的,我也将在这里添加ner。所以我将说状态等于加载。然后我们将显示一个加载器。然后否则我们将说如果状态等于错误。然后我们将显示一个图标。所以,让我导入这个加载器。然后我们将从露西反应导入警报圆圈图标。让我们给它一个类名,破坏性的文本。让我们给它高度四宽度四。所以,这是来自配置的图标。所以,现在我们有了这个。所以,让我们给它一个类名。说类名。让我们导入CN。所以,我们说PX1 PY2 Flex item center got two。状态等于加载。让我们说动画帖子。所以,现在我们要做的下一件事。所以,我折叠了它。所以,让我们有一个div。所以,我们将检查两个调用。如果有一个两个调用或两个结果,那么,抱歉,让我们有一个div。所以,让我们在这里设置。所以,让我们给它一个类名,MX3 MY2。然后我们将说Pentry。我将说BG BG muted。我将给它50。然后圆大边框flex item center gra。所以,这里我们将说,如果它是一个两个,如果它有两个结果,那么让我们打开一个片段。让我们导入检查图标。作为我们的类名练习四x绿色500,然后我们说sp,然后我们说类名文本小,然后我们可以说两个结果加名称。为什么?如果不是,如果它是两个调用,我们将只显示一个加载。我将说文本。所以,我拥有的加载器组件中的加载。就像我之前说的,这将来自我在UI文件夹中添加的其他组件。所以,这将在GitHub资产中可用。所以我将在这里传递一个文本,我说调用。我将传递两个调用名称。两个调用名称。所以,我传递两个调用名称。好的,这是可选的。所以,让我在这里做一个可选的两个调用名称。然后我将添加3.0。所以,在此之后,我们将说,如果有输出,让我们说div。让我们关闭div。让我们给它一个类名,PX3 PY2,然后让我们从AI元素导入消息响应。在这里我想检查类型,如果输出的类型等于字符串,那么让我们说输出,否则字符串化输出字符串化输出,让我们说不,然后。所以,我认为这已经完成了。所以,是的,我们将为我们也将显示错误状态等于错误。然后,让我们有一个div。让我们给它一个类名。A3 BG destructive text destructive rounded medium,然后这里我们将做字符串化错误。所以,我们完成了这个,错误应该停止。所以,是时候测试一下了。所以,一切正常。所以,让我折叠所有东西。让我删除这个未使用的导入,然后让我们继续测试。所以,让我们前往浏览器。所以,我将折叠它,我将忽略所有东西。所以,让我们尝试预览一下。所以,我们也忘了运行本地服务器进行upstarch。所以,让我们去你的文档。点击quatch,然后去如何点击本地开发,然后复制这个命令,然后确保它正在运行。所以,去我的代码,我将打开我的终端在这里打开一个新的终端,我将粘贴命令,然后点击回车。所以,这将本地运行QST CLI。所以,我将等待它运行。所以,它正在运行,并确保所有这些都已添加到EMV,就像我们之前所做的那样。所以,我将去我的EMV,并确保一切都正确。所以,快速入门已添加,等等。所以,我将然后去,让我们回到代码到浏览器,然后让我们去本地3000,然后让我们点击这个。所以,让我发送一条消息。所以,我说你好,这是fing。所以,让我们检查一下,然后点击网络标签来触发运行。所以,我将再次说你好。现在你可以看到触发器显示404错误。所以,让我们去然后看看这个,并确保这是正确的。所以,我将去我的代码,然后让我去,所以让我去app app API trigger route workflow charts。这是正确的触发器。所以,让我去我的客户端。所以,我将进入传输。让我比较一下。好的,我犯了一个错误。我在这里使用了C。所以,这应该是H。对应的H。所以,让我把它重命名为oach。所以我已经把它改成了oach cored it。所以,让我们去浏览器。所以,我忘了东西。让我们回到代码。所以,让我们去proy。所以,如果我们不传入触发器API和工作流图,这将要求用户进行身份验证。所以,我将在这里传入它。所以,只说API of / trigger API workflow chat。这些都不是插件。所有这些都是公开的。所以,让我们在这样做之后进行测试。所以,嗯,让我,让我们尝试再次发送消息。让我们点击预览,然后让我发送你好。让我们看看我们是否会看到开始节点。所以,让我们等待。看到触发器端点。所以,它已经通过了。所以,它仍在加载。所以,现在它应该开始。我们可以看到开始节点。你好。并且代理节点正在运行。现在你可以看到这是有效的,你可以看到它去了if else,我们搜索了选定的else,并且没有连接的结束节点。所以,这就是原因。所以,我只是点击结束,然后点击保存,然后让我们检查一下。所以,我们没有添加任何嗯,我们没有添加任何提示系统提示。所以,让我们再次测试一下。所以,我说你好。现在我们可以看到它已经开始了。代理节点正在运行。所以,一旦代理节点完成,我们就会触及if else。现在我们可以看到结束节点。所以,这是非常非常有效的。所以,它运行良好。所以,让我们嗯,添加一些系统泵。所以,我们可以做一个实际的嗯,实际的真实工作流,比如客户服务或客户支持。所以,我将把它改成分类节点,分类代理,然后我将给它一个系统。所以我将在这里粘贴系统提示。所以,系统点是将用户意图分类为以下类别之一。退货商品取消订阅或获取信息。任何与设备相关的退货请求,您必须退货商品。任何保留或取消风险,包括任何折扣请求,您想要取消订阅。任何其他请求,您将获取信息。所以,现在我们将选择文本,让我们选择着装,然后让我们添加一个字段,然后我将称之为分类,类型将是枚举,对于枚举,我将复制退货商品,然后在这里添加逗号,然后我将复制取消订阅,然后我将把它粘贴在这里。然后最后一个是获取信息。现在让我们把它粘贴在这里。现在我们完成了这个代理。所以,让我们保存更改。所以,让我关闭它并保存更改。现在我们有了分类节点。所以,让我们使用if else。所以,我将删除这个代理节点。我们不需要它。所以,对于if else,让我删除它。所以,我们将指向分类输出,这应该是退货商品。现在我们可以添加另一个if if块。所以,让我们嗯,选择输出,然后这应该等于,然后我们将选择。所以,我在这里犯了一个错误。这应该是下划线。然后在这里我们将传入嗯,取消订阅。所以,确保它在引号中。然后最后一个if检查我们将说,让我们选择这个。我们将嗯,获取获取信息,比如获取,也选择等于。所以,我们完成了。所以,让我保存更改。现在我将带来一个不同的代理来处理所有这些。所以,这将是一个退货代理,而这将作为取消代理,而最后一个将是处理一般信息的代理。所以,让我们把它改成退货代理,然后让我们给它一个系统。让我粘贴系统点很简单。提供免费送货的替换设备。所以,我将关闭它并保存更改,这样我们就不会丢失嗯,任何嗯,问题。所以,我将选择这个,我将称之为保留保留代理。所以,让我们写下它保留代理,然后让我们给它一个系统。我将说你是一个客户保留对话代理,你的目标是防止取消订阅。询问他们的当前计划和取消订阅的原因。满意度。现在只说有一年28%的折扣可用。所以,让我们关闭它并保存它。最后一个代理是通用信息代理。所以,让我称之为信息代理。它只会有一个系统p,用于公司。所以,我将在这里粘贴一个系统提示。嗯,有问题。所以,我们在这里有问题。所以,我将修复它。没问题。所以,我说你是一个信息代理,用于信息查询。你的目标是提供清晰的关注响应给用户的问题。使用下面的策略。所以,公司名称,策略编号,目的计划,设备只是关于公司建设和信用的信息等等。所以,我将添加一个文件。我将嗯,我将称之为客户支持代理。我将把它添加到GitHub中的资产代码中,这样你就可以获得所有这些提示。所以,我将保存它。所以,我认为,让我保存它。所以,让我们测试一下。所以,我将点击预览,然后我将说我想退货。所以,让我们看看。所以,它将开始,然后它将通过嗯,分类代理,代理已将其分类为退货商品。现在它将,好的,有问题,分类退货,然后我去了else块,所以让我让我看看,让我们好的,退货商品退货商品,是的,我认为问题来自这里,所以让我们去代码看看,所以问题来自if else嗯,if else执行器,所以我想它来自,是的,所以嗯,在这个我将也添加替换变量的值,然后我将要做的是,我说trim嗯,让我们也trim这些,你也可以这样做,而无需这个并替换,这样就没有空格,我们可以cons错误。好的。所以,让我们继续测试。所以,我将回到浏览器,并确保这里的一切都正确。所以,嗯,让我点击预览。然后我将说我想退货。所以,让我们等待。所以,第二天早上,让我们看看。分类代理将给我们退货商品。所以,退货商品。所以,希望现在你可以看到它工作了,因为我们添加了trim。所以,现在你可以看到它选择了条件零,这是第一个嗯,if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将 অবিলম্বে创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将称之为自定义模型消息。我们将遍历历史记录。所以,我说消息。然后我将检查是否嗯,消息等于用户。那么我们就不用再做什么了。我们只需要返回消息。但这次因为TypeScript,我们将不得不说文本常量文本。然后我们将说消息部分。我将把它设置为任何。所以,这里我们将只找到,我们将找到我说部分任何抱歉,我将说传递类型等于文本,然后我们将返回一个文本,然后我们将说嗯,让我删除这个。所以,我们将返回用户上下文。所以,现在我们完成了这个if检查。所以,我们也检查助手。我们将说,如果消息等于助手。然后我们将返回。所以,我将为此创建一个函数。我将称之为提取。提取助手助手消息。让我们说助手内容,然后我们将在这里传递路径。所以,让我们复制这个,然后让我们来到下面,让我们实现它。我说函数嗯,我们将说嗯,部分类型为任何,然后返回我们将说常量内容这将等于部分,然后我们将过滤,所以我们将说嗯,数据工作流节点。所以,然后我们将说,并且我想确保数据点节点类型是代理。所以,说等于代理。然后我们只过滤代理,而不是if else和其他所有东西。我们不将其发送给AI模型。所以,我们将只按代理过滤。所以,我们将然后映射,然后在这里我说,让我们说很多,然后让我们说常量,然后让我们从部分点数据中获取输出。然后我们可以只返回这个,然后我们说类型,所以输出的类型等于字符串。然后我们将说输出。否则,我们只说输出文本,像这样,然后我们可以只过滤布尔值,然后我们也连接,然后我们可以只返回原始助手和内容。在这个提取内容的例子中,如果你注意到,我们没有添加两个调用,因为即使是SDK,我们也可以将两个调用传递给模型消息。所以我没有添加它。我只是创建了一个简单的版本。但是,如果你真的想让代理或AI模型也知道它进行了一次调用,一个两个调用,我也可以创建一个我将粘贴我创建的函数。所以我将把它粘贴在这里,它与我们拥有的非常相似,嗯,提取代理内容。所以,从这里我们有。所以,这是同样的事情。所以,我们所做的就是获取类型两个调用两个结果。然后我们检查类型,检查是否有两个调用。然后我们将把它推到我们这里的数组中。对结果做同样的事情。对于输出,而不是返回输出,我们将进行if检查并将其添加到数组中。所以,我们添加文本,如果有输出文本,那么我们就传递文本和输出文本。所以,如果内容大于零,我们就传递内容,否则只传递一个空字符串。所以,基本上是一样的。所以,我将使用这个。也许你也可以用这个来测试。所以,现在我们有了这个。现在我们需要返回否。然后我们需要过滤。所以我说过滤消息,然后我说消息不等于否。所以,就是这样。所以,我们完成了这个。并且模型消息被传递给嗯,让我们看看它被传递给消息。所以,我们可以去客户端进行测试。所以,我将回到浏览器。所以,在这里我们将点击预览,并确保你的本地服务器服务器正在运行。所以,让我们点击预览,然后我将问同样的问题,我想退货,让我们等待它运行。所以,现在它正在运行,你可以看到分类代理。现在它将其分类为分类是退货商品。现在它正在选择选定的分支,即条件零,第一个if块。所以,你可以说我很抱歉听到你想退货。我可以为你提供免费送货的替换设备。你想继续这个意见吗?所以,我们可以看到它它现在正在工作。所以,让我们测试一下取消。所以,让我们说嗯,让我们看看一般信息。嗯,这家公司的名字是什么,你们做什么?所以,让我们看看这家公司的名字是什么,你们做什么?所以,让我们看看它将嗯,分类代理将将其分类为一般信息。哇。它将嗯,退货商品。所以,这里有问题。好的。所以,我们在这里有问题。代理将认为它正在处理最后一条消息,我们之前问过的上一条消息。所以,让我们去修改系统提示。所以,让我们进入代理执行器,而不是代理,让我们进入操作,在那里,所以我认为问题来自系统提示消息,所以我认为,所以我们可以做什么,让我们尝试并cons嗯,让我cons模型消息。抱歉,模型消息。应该是模型消息,而不是模型消息。所以,我们可以对这个系统提示做什么?所以,让我尝试改变它为不同的系统提示。所以我将粘贴它。所以,我在调试后找到了问题。我发现模型消息不包含助手消息。所以,因为这样,代理倾向于倾向于回复我们问的第一个消息,因为没有回复第一个消息。所以,这就是原因。所以,转换到模型消息不不接受我们拥有的自定义数据工作流节点。所以,它只发送它只将用户的文本转换为AI的文本消息。所以,因为这样,我们将不得不创建我们自己的自定义转换到自定义模型消息,以便在回复时包含助手消息。所以,因为我们构建它的方式,我们正在使用自定义数据数据类型自定义类型,它嗯,为我们提供了使用。所以,因为这样,我们将不得不创建我们自己的。所以,我将注释掉这个。我将

将是 ncp 类型,并且是数组类型。然后我们还需要 uh 安装用户选择的工具。所以我们要说 set selected tools,因为我们不想要任何重复项,所以我们要说 use state,然后这将是一个 set 类型,我们将存储字符串。所以 string,我们称之为 new set,就像这样。所以我想我们也会存储 um 描述。所以我们再说一次,我们也有一个状态。所以这将是一个 loading 状态 set loading 等于 use state hook boolean,默认值为 false。所以现在让我们定义 handle connect。所以说 async,然后我们说 set loading 为 true。所以一旦我们调用这个函数,我们将把状态设置为 true,然后我们在这里使用 try catch。然后我们将进入 action 并复制 connect server 函数。我认为我可能不会添加这个。所以我不认为这是必要的。所以我只是复制。如果你愿意,你可以保留它,但我不认为这是必要的。所以 uh 所以我说 constant this 等于 await connect SCP server,我们将传入 URL 和 uh 对不起,我没有保留 AI key 状态。所以我要说 constant uh 这应该在 label API key set API key 的下方。这将等于 use state type string,然后我们传入 API key。所以请记住,这将返回在 action 内部,它返回工具。所以我们将获得工具,工具包含名称和描述。所以我在这里只获取工具。现在我要说 set tools。Set tools,然后我将传入 tools。所以这是 true 一个错误。它说 undefined。好的。Description is undefined。Property undefined。我检查一下 agent。好的。我们回到 agent。所以我要做的是,我将说所有都是空字符串。我想错误应该在这里停止。一旦我们有了两个,我们就 uh 设置选定的两个。所以我将在这里复制选定的两个。所以我们将把所有工具都设置为选定的两个。所以我要使用新的 set。所以我们将遍历工具。我将映射工具。然后我将说 to two to do name。所以请记住,我们将其作为字符串存储在 set 对象中。所以然后我们可以说 set uh think set step to select。现在我们可以从 sona 导入这些。我们说 just success connected connected to NCP server。我不认为我们需要在这里添加一个 to。我把它删掉。所以我只是 console.log log uh 让我们说失败。我只是 console log 错误。然后我将调用 post error field to connect to NCP server。然后最后我们将把 loading 设置为 false。所以我们完成了 handle connect。所以现在我们也需要 uh 实现 uh add NCP server。所以 handle add ncp server 到数据库。所以一旦用户连接后选择他们想要的工具。现在我们将有一个用户点击保存到数据库的按钮。所以我说 constant handle add add SCP。可以叫 add SCP to uh 让我们说 add SCP to DB。这太长了。所以让我只说 async 等于 async。而且这个不需要任何参数。所以我要说我 selected selected uh tools 我不认为 okay okay selected tools 等于 choose the filter,然后我们将说 okay,我想这个我将只调用 select 或者让我称之为 selected,所以它不 sorry guys selected,然后我将使用 tools here,我将说 tools.has to do name。所以现在这将给我们工具,这就是我们将 uh 让我们说 let's call this tools 它将 okay 让我们就称之为 selected 这样就可以了。所以这就是我们将保存在 agent data 对象中的内容。所以我们在这里使用 try catch。然后我们将说 await。我们将获取 server ID。我们将说 await um SC sorry add SCB server。所以我们从 action 中导入它,请记住它将返回 server ID。所以我们复制它。我们把它拿出来。我们将传入 URL API key 和 label。所以我们将调用 prop 中的 on hard。我们说 on hard,它将接受 label server id 和 selected tools,它被称为 selected。所以让我这样说 selected to。所以现在我们将说 on open change。我们将关闭 Okay,这是 on open change,不是 open change。让我们将其设置为 false。然后我们也将其设置为 step to connect。同样,我们将 url 设置为空字符串,label 设置为空字符串,API key 设置为空字符串,我们还将工具设置为空。抱歉,我认为是空数组。然后 set selected tools。我们将将其设置为 new set。然后在这里我们将 toast do success NCP server added successfully。所以让我们抛出一个错误。我们说 console log dot so console log,然后说 failed to save NCP,然后我们返回 console log 错误,然后我们将 post error。所以我们将说同样的话 fail to save MCP server,然后最后我们将 sorry 最后我们将设置我认为我没有在这里添加。所以我们也需要添加 loading 状态。我将在这里做。让我做。然后,让我们将 loading 设置为 false。所以让我们实现对话框。所以我要 so 我要将这个改为 fragments,然后我们 uh 从 ui dialog 导入 dialog。然后我们将 open 设置为 open,然后 open change 设置为 on open change。然后我们从 ui dialog 导入 dialog content。所以我将给它一个 class name。我将给它 maximal width large。然后我想我们已经添加了 overlay class。所以我也将在这里做同样的事情。将传入它。让我们就说 black bg black uh 60 和 z index。这就可以了。所以在 uh dialog uh connect sorry dialog content 中,我们将检查 step,如果 step 等于 connect,那么让我们有一个 div。所以这里我们将看到 div class name flex um flex column item center margin button six,然后让我们从 lucat 导入 server,然后给它一个 class name of um weight height imaging bottom。所以我们将然后 okay,我们也给它 text muted forground。然后让我们导入 dialog title。所以让我们说 connect to SCP server。所以我也给它一个 class name。我将说 padding bottom eight。我认为这就可以了。Connect。让我们就给它一个 class name。让我们说 text large then font semibold,然后我只是暂时将其设置为。所以错误应该停止。现在我们有了 um 图标和标题。现在我将在这里创建一个 div。然后让我们说 class name space Y4。现在我们将在这里定义一个 div。然后我们将导入 label。我认为是 ui label。我将说 u URL,然后让我们导入 impute group。让我们导入 uh impute。我认为 impute to group impute 就可以了。所以让我们给它 ID SCP URL。让我们说 placeholder。所以我只是说 http uh 让我们说 http ncbp.acample.com example.com 或者 example.com/ncp。然后我将给一个值,它将是 URL,然后 unchange,它将是 event set URL event target dot。所以我认为就是这样。所以让我给它一个简单的 uh 让我们我认为我应该使用 让我们在这里使用 padding 抱歉 paragraph。我将给一个 class name。我将说 text extra small text muted forground。然后让我们说 only only use NCP the server you trust and verify。然后让我们折叠它。所以我也添加 margin top one。所以让我们复制这个。所以我将复制所有这些代码。粘贴在这里下面。将其更改为 label。然后在这里我将删除这个 ID。我们需要 ID。所以让我删除它。所以这里我只是说 placeholder。我只是说 my SCP server 作为名称。然后我们将更改值到 label。然后我们也将其更改为 set label。所以现在我也将删除这个段落。我们不需要它。所以现在我们也将其复制并粘贴在这里。所以这将是 uh 我们将称之为 authentication。这是我们将传入 uh C authentication 的地方。抱歉,是 API key。所以我将称之为 authentication。然后这里我们将说我们将使用 select 而不是 impute group。所以我们将从 UI 导入 select。然后让我们导入 select uh trigger。我给它一个 class name of W。然后让我们导入 select value。所以我们将导入 select content。所以我将创建一个列表,一个认证的数组。所以我将只使用一个。所以如果你想,你可以添加更多类型的认证。所以目前我只使用 token API tok API key。所以我会在这里循环它。我将说 list do map item。然后我们将导入 select item from UI。然后我们将传入 key,它将是 item do value。然后我将说 value 将是 item do value。然后我也让我们传入 item label。所以目前我只是将其设置为 disable。抱歉,disable。然后在这里我们将有一个我认为我犯了一个错误。所以让我把它拖下来。所以我只是把它剪掉。创建一个 div。我将把它粘贴在这里。然后,这将是 uh 这是我们将粘贴 API key 或 token 的地方。所以,我将导入 uh 让我们导入 impute group add-on。所以我将添加一个图标。我说 key key round icon。让我们创建一个 class name of size four。然后让我们 uh 让我们导入 impute group impute。所以我将设置 type here to password。嗯,让我们给 placeholder。我说 add add your access token。让我们说 API key or token。然后让我们传入 value API key。让我们说 unchange。所以我将说 event set API key to event target dot value。所以我认为 uh 就是这样。所以让我们创建函数。所以我只是让我给它一个 class name。然后我说 margin top two。所以我们将 uh 创建一个按钮,我们用它来连接。所以我说 div 让我给它一个 class name margin top six。所以我也将添加 flex 和 justify end。这里是按钮。所以让我导入按钮组件和 spinner。所以你可以看到 disable no URL API key or loading。所以一旦我们完成了这个,现在让我折叠它。所以我们也对 uh select step 做同样的事情。所以这里我说 div。让我们给它一个 class name withful MX。我认为 just wait for is okay。uh uh 让我们给它一个 div。我将说 class name flex flex column gap one imaging bottom four。所以让我复制我们这里的 same。让我粘贴在这里。让我折叠它。然后我将来到这里。让我有一个 div。我将粘贴在这里。所以让我还添加 class name flex item center gap 2。所以我要 uh 将它从 connect server 改为传入 label。所以现在我将有一个 div。我将称之为 URL。所以让我们给它一个 class name。我将说 text extra small text muted foreground。所以一旦我们有了这个,我认为下面这里我认为是积极的。所以抱歉 guys this should be 让我们将其更改为 span 而不是 u。我也在这里犯了一个错误。所以让我改变它。所以我将关闭它。我将折叠它。也改变它。所以这就可以了。uh semi board。让我把字体减小到 uh deck space。这里有。所以我也把它移下去。所以我只是把它改为 让我把它改为 P dark。这更好。我认为就是这样。所以让我们有一个 div。我将给它一个 class name。所以我也在这里添加一个 class name。让我添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class name。然后让我们添加 space Y4。所以 uh 这里不需要添加 class。所以,我只是说 uh H1。让我们在这里有一个 H1。这将是 tools。让我们给它一个 class name。所以我将说 font semibold text small。然后给它 bottom two。这就可以了。然后下面这里,我们将有一个 div。让我们给它一个 class name。我将说 maximum height 80 overflow overflow y auto。然后它将说 space sorry space y two。然后我们将循环遍历 tools two to map two。让我们有一个 div。所以我将给它一个 key to dot name class name flex item center gap uh three padding two border um 让我们说 border 我认为 border border 让我们就给它 border 哦,bord them border then rounded rounded small is okay。我认为不需要添加 rounded。所以,是的,让我们导入 checkbox。所以我想我们还没有添加 checkbox。所以让我们 uh 在这里添加它。所以我将添加 mpx shanty UI add checkbox。所以让我等待它添加。所以我有这个冲突 uh 错误。所以没有办法安装 shanty component checkbox component。所以我将手动安装它。所以我建议你们 uh 要么 uh 移除这个包,要么更改版本,或者安装这个版本,这样错误就会停止。好吧,我将坚持这个版本。所以我要做的是,我将去浏览器,然后我将去 shanty checkbox,然后手动安装它。所以所以我们将安装 radics UI。所以我将复制这个,然后我将直接去代码。所以让我快速关闭这个,然后进入 UI。然后我说 checkbox X。所以 TXX 不是 TX。所以让我重命名它,然后粘贴在这里。所以我想我们已经有了 UI 了。所以让我们保存它。现在让我们回到 SCP server dialog。所以让我们看看现在我们可以看到 uh checkbox。所以我还将说 selected。所以我们没有选择 is going to be equals to selected to do has to do name like this。所以我们也使用 uncheck change。所以我们将为此创建一个函数。所以让我们完成它。所以让我这里有一个 div。uh 让我们关闭这个 div。然后我将给它一个 class name flex u minimum。让我们给它 minimum width 或者让我们就 uh 让我们给 flex 这样。然后让我们就说 H5,这将是 G2 name。所以这应该是 flex one。所以它不会 uh 名称和描述不会水平浮动。所以我还将有一个 paragraph,然后它应该是 two dot description。所以让我们给它一个 class name。所以我将说,让我们给它 font medium。我将说 text extra small。所以我们也给它一个 class name。所以我将说 text extra small。让我们也给它 text muted forground。对于描述,我们不希望它太长。所以我将说 line clamp one truncate 和 maximum width 75。所以一旦我们完成了这个。所以让我们关闭它。所以让我折叠所有这些。所以我想这应该在这里面。我认为抱歉 guys 让我让我在这里折叠它。所以,是的,嗯,不在外面。所以让我们创建一个 div。让我们给它一个 class

重新加载此页面。抱歉,不是此页面。让我重新加载此页面,看看它是否显示出来。所以,它应该显示嵌入的内容。所以,让我检查一下这是否来了,这样我们就可以看到文件了。出于某种原因,它没有显示出来。所以,让我快速检查一下代码。所以,它没有显示出来的原因是,我们需要将其从头部剪切并放入正文中。所以,一旦你这样做了,让我们转到浏览器,让我重新加载此页面。现在我们可以看到这里了。所以,如果我点击它,现在我们可以看到 um 组件 iframe 正在显示构建的 React 应用。所以,我会说列表,我们说嗨或你好。让我们看看这是否会起作用。所以,它将 um 启动节点,然后它将 um 我们认为我们已将其连接到数据库代理。所以,现在我们可以看到它已经回复了,你好吗?所以,让我们说列出项目,这将为我们列出项目。好的,你可以看到它列出了一个项目。所以,它工作正常。所以,如果我回到这里,我将只点击它,删除它,将其连接到实际的工作流程。我保存更改,然后我将回到测试。现在我可以说 um 我想退回一件商品并按回车键,让我们看看。所以,这应该,这应该回复我们。所以我可以帮忙。你能提供我想要退货的订单号和商品名称吗?你可以看到它正在工作。让我们也问一下,你的公司叫什么名字?你做什么?所以,让我们看看。所以,现在你可以看到,现在它已经告诉我公司名称了,而且这工作得非常好。所以,这工作得非常好。所以,现在我们已经看到了如何将这个 um 添加到一个自定义的、不同的应用程序中,比如这个测试 HTML 文件,我们已经添加了我们的 um 工作流程 J 聊天应用程序,你可以在这里点击创建一个新的聊天。所以,让我们继续将 embed JS 转换为最小化版本。所以,让我们转到代码,然后在这里我将打开我的终端,让我快速离开这个目录,然后让我进入 flow AI,抱歉,flow AI,然后将这个 um embed.js 转换为 embed.js 最小化。所以,我将在这里粘贴这个命令,并且 um 如果你想,我可以将其中两个留在里面。所以,我将只移动这个说 embed public,抱歉,np build public。所以,我已经修改了它以添加 embed。现在,让我们输入。所以,这将 um,这将将其转换为最小化版本。所以,让我说是,让我们看看。所以,现在我们可以看到文件了。所以,如果我们打开这个,我们应该能够看到这个正在显示本地。好的。我认为它在里面没有显示本地。所以,一切都很好。一切都工作正常。所以,现在我们可以使用,让我快速保存,保存这个文件。现在我们可以测试它了。现在,让我们快速用最小化版本测试它。所以,我将只说 embed.save this,然后让我们转到浏览器。所以,让我重新加载页面,它正在工作。你好,让我们确保一切都工作正常。所以,现在我们可以看到。所以,它正在工作。所以,就是这样。所以,让我们继续部署这个应用程序到 Vercel。所以,让我们部署应用程序。我们将部署 flow AI。所以,请确保我们打开我们的终端,导航到 flow AI 文件夹,然后让我们初始化 Git。所以,git init,然后 git add。所以,这将添加所有文件。所以,它完成了。然后让我清除我的,让我清除我的终端。然后我们将进行 git commit。commit。所以,现在它完成了。所以,让我们 um,所以,让我们继续创建一个仓库。所以,回到,去我的浏览器,所以,我想创建一个仓库。所以,所以,一旦你输入了名称,然后让我们 um,点击创建仓库,这将创建一个仓库,然后 um,让我们复制这个。我将复制所有这些。让我们回到代码,让我们打开终端,让我粘贴所有内容。所以,让我们等待它完成。现在,它已经推送到我们刚刚创建的分支了。所以,到我们刚刚创建的仓库。所以,让我们转到 um,我将只去浏览器,然后让我重新加载它,然后转到 Vercel。所以我打开了我的 Vercel 账户,现在让我们 um,让我继续使用 GitHub。让我快速连接我的 um,我已经连接了我的 GitHub 账户。所以,让我导入这个,这个特定的分支或仓库。现在我们需要,我们需要编辑这里的东西。所以,不是这里,我们将添加环境变量。好的。审查构建 um 输出设置。所以,我将 um,我认为是这个。所以,是的,我将执行 um npm install -f。所以,然后我们将添加环境变量。所以,请确保你复制你的环境变量,然后让我们粘贴在这里。所以,我将 um,我将在这里添加所有内容。所以,我已经添加了本地的 straight。所以,让我只删除这个。所以,一旦我们部署,我们将 um,我们将更改 um HTTP local。我们将将其更改为实际的部署 URL。所以,um,对于 Qstash,你可以去 Qstash um,只需登录你的账户。所以,让我等待它加载。所以,一旦它加载,只需点击 um,点击 Radix,然后选择你创建的数据库。所以,抱歉,不是我们点击,我们已经有了 Radix um,Radix REST URL 和 REST Token。所以,只需去,让我们等待它加载。然后如果你向下滚动,你可以看到这里的 EMVs。所以,我们将复制这个,然后让我们将其添加到 um,让我们将其添加到 env 中。所以,让我们去 um Vercel,我将粘贴它。所以,我已经在这里粘贴了。你可以看到 Q URL 当前登录密钥,然后是 Q/next 登录密钥。所以,一旦我们完成了这个,我们应该点击部署,稍后我们将添加 Vercel um 保护密钥。所以,我们将只绕过保护,抱歉。所以,让我们点击部署,让我们等待它部署。所以,它正在构建。所以,我将等待它 um,等待它构建。所以,我在内置的提示中遇到了一个错误。所以,我已经纠正了。所以,我将去我的代码并推送。所以,让我去我的代码。所以,只需复制我在 GitHub 中的确切内容,你就不会出错,因为我修复了这个问题。所以,让我快速 um,添加这个并推送它。所以,让我说是 commit,然后我将只推送它,然后这个。所以,让我们转到浏览器,然后我将只去项目。所以,在我们部署之前,让我们去设置。让我们添加 Vercel 绕过保护密钥。所以,只需点击部署保护,我认为在这里我们可以添加一个密钥,只需将所有内容留空,然后添加它,然后你可以复制它。所以,只需复制密钥。让我们去环境变量,并确保,让我们添加一个新的。所以,添加环境变量,然后我将传入值。所以,让我传入 um,我认为我们使用了 um V 自动化绕过密钥,抱歉,不是密钥,我们使用了,我们使用了自动化绕过令牌。所以,这就是我们在代码中使用的。所以,一旦我们添加了它,只需点击保存,然后让我们去部署,然后让我们部署它。所以,我们将创建一个新的部署。所以,选择我。创建新的部署。所以,让我们检查一下。让我们去概述。我认为它已经 um,它已经 ped 好了。所以,我们没有更改 doain。所以,让我去设置并更改 doain。去 doain,我将编辑 doain。所以,而不是 um flow agent builder,所以我将只说 low agent,然后让我们点击保存。保存。好的,它已经分配了。所以,让我尝试一个新的。Glow AI Agent。我将只删除 builder。然后点击保存。然后删除旧的,添加新的。所以,现在我们有了这个。现在我们也可以 um,让我们回到 doain。所以,让我们回到 doain,让我们复制它。抱歉,doain。让我们复制它。我们需要进入环境变量。现在我们需要更改。我们需要编辑这个。所以我将编辑 next public。所以我将使用 https um flow AI agent v2。所以,复制这个。让我们保存这个。让我们去 kind。所以,kind site URL。让我们编辑这个。所以,粘贴它。保存它。然后还有 logout URL。这两个。所以我将快速编辑。让我们编辑这个。让我们也编辑这个。所以我将只像这样粘贴它并点击保存。我认为这个 um 更新。所以我将把它改回来,然后我将保存它。所以,只需确保我们都检查一遍。确保 URL 已更新。所以,一旦我们完成了这个,现在我们可以继续 um,让我们再次重新部署。所以,让我们去部署,我将只点击创建部署。选择 main,然后让我们创建部署。所以,地方正在构建。所以,让我们 um,我们遇到了一些错误。所以,让我们点击它,然后在错误中,我们应该看到那个错误发生。所以,让我向下滚动。所以,我们可以看到 P my client。所以,让我们回到代码,让我们看看它。所以我将直接去 package.json。好的,我们需要在这里添加一个命令。所以,添加 post install Prisma generate。一旦我们这样做了,让我们推送。所以,添加它,我将 commit。然后让我推送到 main,然后让我们回到浏览器,然后让我们重新部署。所以,让我们回到部署。所以,又一个错误。让我回到我的代码,让我修复这个错误。所以,我将 um,让我关闭终端。我认为这是错误。所以,让我保存它并推送它。所以,我将 um,我将添加更改。所以,我认为 um,我认为我犯了一个错误,然后我将 commit 更改,然后让我将它推送到 main。所以,让我们转到浏览器,这将启动,它将创建一个新的部署,我们可以看到它正在构建。所以,我们将等待它构建。希望这次能成功。所以,让我等待它构建。所以,它已经成功构建。所以,我认为它已经完成了。所以,下一步我们将 um,让我们复制。让我打开它,我将复制这个 URL,然后让我们转到 kind。所以,登录你的账户,然后让我们访问应用程序。所以,这是 flow agent kind,让我们在这里添加它。所以,我将在这里添加它,我将做同样的事情,我们在这里有。我将在这里粘贴它。然后我认为我需要复制这个。好的。是的,这里我们需要将其添加为 flow AI agent with sale。我认为就是这样。所以,让我们保存它。一旦完成,我认为我们可以继续登录。所以,让我登录我的账户。所以,我认为它说你提供了。所以,让我想我再次重新加载。所以,我认为 um,所以,让我们点击这个添加 cover 到应用程序现在。我认为我们已经添加了它。我们已经在这里添加了它。好的,但我们需要 um,让我们点击 set,让我看看它做了什么。好的,它在这里添加了。看,我们添加了,我们添加了 API,API kind。所以,让我们保存它,然后让我再试一次。所以,让我去 URL。让我尝试登录。所以,现在我们可以登录了。所以,让我快速 um,现在我们已经登录到账户了。 um,这正在获取工作流程。所以,我们无法获取任何工作流程。所以,当我检查时,当我检查时,我看到我们有 500 错误。所以,如果我们回到 Vercel,尝试点击日志,我看到这个 Prisma 错误。所以,让我们回到代码,让我修复它。所以,你必须做的是回到 schema.prisma,我认为我们需要在这里添加 um -jx。所以,一旦你完成了,让我们再次部署它。所以,我将 commit。所以,让我将其推送到 main。现在,让我们回到浏览器。这将创建一个新的部署。所以,让我去部署。我们可以看到它正在构建。好的,这是旧的。所以,你应该看到它正在构建。所以,让我们等待它完成。所以,它已经完全 um 构建了,而且它 um,它准备好了。所以,让我点击,让我尝试登录。所以我将去登录。让我尝试重新加载这个页面,让我们看看。现在它正在工作。我可以看到我的工作流程。所以,如果我点击这个工作流程,它应该将我导航到 Canva 屏幕或工作流程屏幕。所以,它正在加载。我们可以看到这个。所以,让我尝试发送一条消息。我只想说一条非常简单的消息,让我们看看一切是否正常。所以,我们已经通过了 Qstash URL。所以,一切都工作正常。你可以看到分类代理,然后让我们尝试,我想退回,我想退回我买的一件商品。所以,让我们看看。所以,你可以看到它正在返回,它正在移动到退货 um 分类代理,将其分类为退货商品,选择了分支,然后你可以看到它正在工作。所以,让我们测试另一个。我想取消我的订阅。所以,让我们等待。所以,我想确保所有检查都有效。所以,它应该将我们带到分类代理,将其分类为取消订阅,然后你可以看到它正在顺利地 um,它运行良好。所以,你可以看到我理解取消订阅的东西,我认为 um,就是这样,我们还可以 um,我们还可以点击这里复制代码。现在我们可以看到我们有 URL flow avo。所以,各位 um,所以,这是视频的结尾。所以,请务必订阅,点赞,然后评论。我将在 GitHub 中添加 HTTP 的代码。所以,谢谢。