黑炭儿呀
2025-05-19 ef479060f251d58de31e5c0b659b620f56dd7a6e
Merge branch 'main' of https://gitee.com/aiflowy/aiflowy
6个文件已修改
16个文件已添加
341 ■■■■■ 已修改文件
aiflowy-ui-react/src/components/CrudPage/index.tsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aiflowy-ui-react/src/pages/system/SysApiKey.tsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/.vitepress/config.mts 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/bot-api-key.md 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/bot-web-client.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/mount-workflow.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/resource/bot-web-client-1.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/resource/bot-web-client-2.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/resource/mount-workflow-1.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/resource/mount-workflow-2.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/bot-application/resource/mount-workflow-3.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/knowledge/resource/config-aliyun-1.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/knowledge/resource/config-aliyun-2.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/knowledge/vector-database.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/nodes/dynamic-code.md 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/groovy-code.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/groovy-res.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/javascript-code.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/javascript-res.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/qlexpress-code.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/resource/qlexpress-res.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/zh/product/workflow/what_is_workflow.md 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aiflowy-ui-react/src/components/CrudPage/index.tsx
@@ -1,4 +1,4 @@
import React from 'react';
import React, {useEffect} from 'react';
import {useList, usePage, useRemove, useRemoveBatch, useSave, useUpdate} from "../../hooks/useApis.ts";
import AntdCrud, {ActionConfig, Actions, ColumnsConfig} from "../AntdCrud";
import {Page} from "../../types/Page.ts";
@@ -19,7 +19,9 @@
    rowSelectEnable?: boolean,
    params?: any,
    paramsToUrl?: boolean,
    editLayout?: EditLayout
    editLayout?: EditLayout,
    onRefresh?: () => void;
    externalRefreshTrigger?: number; // 当这个值变化时触发刷新
}
const CrudPage: React.FC<CurdPageProps> = ({
@@ -35,6 +37,7 @@
                                               params,
                                               paramsToUrl = false,
                                               editLayout,
                                               externalRefreshTrigger
                                           }) => {
    const isPage = showType === "page";
@@ -110,6 +113,9 @@
    //
    // console.log("index", urlParams, {pageNumber, pageSize})
    useEffect(() => {
        actions.onFetchList?.(pageNumber, pageSize, urlParams);
    }, [externalRefreshTrigger]);
    return (
        <AntdCrud columns={columnsConfig}
aiflowy-ui-react/src/pages/system/SysApiKey.tsx
@@ -4,7 +4,7 @@
import {EditLayout} from "../../components/AntdCrud/EditForm.tsx";
import {dateFormat} from "../../libs/utils.ts";
import {Button, message, Modal} from "antd";
import {useGetManual, usePostManual} from "../../hooks/useApis.ts";
import {usePostManual} from "../../hooks/useApis.ts";
//字段配置
@@ -90,13 +90,9 @@
export const SysApiKey: React.FC = () => {
    const {doPost: useApiKeyPost} = usePostManual('/api/v1/sysApiKey/key/save');
    const {doGet: doPage} = useGetManual('/api/v1/sysApiKey/page');
    const [queryParam] = useState({
        pageNum: 1,
        pageSize: 10
    });
    const [refreshTrigger, setRefreshTrigger] = useState(0);
    return (
        <CrudPage columnsConfig={columnsConfig} tableAlias="sysApiKey" addButtonEnable={false}
        <CrudPage columnsConfig={columnsConfig} tableAlias="sysApiKey" addButtonEnable={false} externalRefreshTrigger={refreshTrigger}
                  customButton={() => {
                      return <><Button type="primary" onClick={() => {
                              Modal.confirm({
@@ -111,12 +107,7 @@
                                          console.log(res);
                                          if (res.data.errorCode === 0) {
                                              message.success("apiKey生成成功");
                                              doPage({params: {
                                                  ...queryParam,
                                                  }}).then((res) => {
                                                  console.log('res');
                                                  console.log(res);
                                              })
                                              setRefreshTrigger(prev => prev + 1);
                                          }
                                      })
                                  },
docs/.vitepress/config.mts
@@ -175,9 +175,11 @@
            items: [
                {text: '什么是 Bot', link: 'bot-application/what-is-a-bot'},
                {text: '快速开始', link: 'bot-application/quick-start'},
                {text: '挂载知识库', link: 'bot-application/mount-Knowledge'},
                {text: '挂载知识库', link: 'bot-application/mount-knowledge'},
                {text: '挂载插件', link: 'bot-application/mount-plugins'},
                {text: '挂载工作流', link: 'bot-application/mount-workflow'},
                {text: 'Web 客户端', link: 'bot-application/bot-web-client'},
                {text: '通过 API 请求', link: 'bot-application/bot-api-key'},
            ]
        },
        {
@@ -216,6 +218,7 @@
                        {text: '知识库', link: 'workflow/nodes/knowledge'},
                        {text: '搜索引擎', link: 'workflow/nodes/search-engine'},
                        {text: 'Http 请求', link: 'workflow/nodes/http'},
                        {text: '动态代码', link: 'workflow/nodes/dynamic-code'},
                        {text: '内容模板', link: 'workflow/nodes/template-node'},
                        {text: '文件内容提取', link: 'workflow/nodes/doc-content'},
                        {text: '文件生成', link: 'workflow/nodes/file-generator'},
docs/zh/product/bot-application/bot-api-key.md
New file
@@ -0,0 +1,163 @@
# 通过api key 请求一个bot
apiKey 的作用是 用于身份认证,通过 apiKey 第三方可以携带对应的参数访问到 AIFlowy 对应的Bot进行对话。
## 第三方接入 Bot 聊天地址:
请求方式: POST
请求地址: http://127.0.0.1:8080/api/v1/aiBot/externalChat
### 默认请求方式以 JSON格式返回
请求头:
Headers: {
Authorization: apiKey
}
请求格式参数说明:
```
messages: 消息体
botId: 第三方想要请求的 BotId
```
请求示例:
```json
{
    "messages": [
        {
            "role": "user",
            "content": "你好"
        },
          {
            "role": "assistant",
            "content": "你好我是科大讯飞模型"
        },
         {
            "role": "user",
            "content": "帮我翻译 what's your name ?"
        }
    ],
    "botId": "267848016181075968"
}
```
响应参数说明:
```json
status: END 表示本次对话正常结束
created: 创建时间
message: 消息体
```
请求成功示例:
```json
{
    "status": "END",
    "usage": {
        "completionTokens": 3,
        "promptTokens": 22,
        "totalTokens": 25
    },
    "created": 1745205152874,
    "choices": {
        "index": 0,
        "message": {
            "content": "你叫什么名字?",
            "role": "assistant"
        }
    }
}
```
### stream 格式返回
参数说明:
```
stream: true 表示以流式返回
```
请求示例:
```json
{
    "stream": true,
    "messages": [
        {
            "role": "user",
            "content": "你好"
        },
          {
            "role": "assistant",
            "content": "你好我是科大讯飞模型"
        },
         {
            "role": "user",
            "content": "你叫什么名字?"
        }
    ],
    "botId": "267848016181075968"
}
```
返回参数说明:
```
status: START 表示本次对话开始
status: MIDDLE 表示本次对话进行中
status: END 表示本次对话正常结束
```
请求成功示例:
```json
{
    "status": "START",
    "created": 1745205750472,
    "choices": {
        "delta": {
            "content": "我的名字叫讯",
            "role": "assistant"
        },
        "index": 0
    }
}
```
```json
{
    "status": "MIDDLE",
    "created": 1745205750750,
    "choices": {
        "delta": {
            "content": "认知大模型,很高兴",
            "role": "assistant"
        },
        "index": 0
    }
}
```
```json
{
    "status": "END",
    "created": 1745205750901,
    "choices": {
        "delta": {
            "content": "为你服务。",
            "role": "assistant"
        },
        "index": 0
    }
}
```
docs/zh/product/bot-application/bot-web-client.md
New file
@@ -0,0 +1,12 @@
# Bot web 客户端
Bot Web 客户端是指专门为机器人 Bot 设计的基于网页的用户界面或操作平台。它的主要功能是让用户能够通过浏览器来管理、控制和与自动化程序(机器人)进行交互。
## 如何进入Bot Web 客户端
点击如下所示的按钮,进入 Bot Web 客户端
![img.png](resource/bot-web-client-1.png)
## Bot Web 界面
这里是 Bot Web 界面,这个 Bot 包含了 **对话**、**插件**、**工作流**、**知识库** 四个模块,分别对应 Bot 的对话、插件、工作流、知识库功能。
用户输入想要提问的问题,点击 **发送** 按钮,Bot 会根据用户输入的提问,主动判断是调用哪个插件还是调用哪个工作流,然后调用对应的插件或者工作流,得到结果,返回给用户。
![img_1.png](resource/bot-web-client-2.png)
docs/zh/product/bot-application/mount-workflow.md
@@ -1 +1,12 @@
# 挂载工作流
# 挂载工作流
## 1. 创建工作流
创建工作流请参考 [如何创建一个工作流](/zh/product/workflow/quick_start)
## 2. 挂载工作流
挂载工作流首先点击左侧菜单栏的 Bot 进入 Bot 对话页面,挂载工作流之前,我已经创建了一个名为 **获取IP信息** 的工作流,然后点击 **工作流** 右上角的 **+** 按钮,选择刚才创建好的 **获取IP信息**,点击 **添加**, 这样就给我们的智能机器人挂上了工作流。
![img.png](resource/mount-workflow-1.png)
## 3. 工作流测试
如下结果为 Bot 从挂载的工作流得到的结果
![img_2.png](resource/mount-workflow-3.png)
docs/zh/product/bot-application/resource/bot-web-client-1.png
docs/zh/product/bot-application/resource/bot-web-client-2.png
docs/zh/product/bot-application/resource/mount-workflow-1.png
docs/zh/product/bot-application/resource/mount-workflow-2.png
docs/zh/product/bot-application/resource/mount-workflow-3.png
docs/zh/product/knowledge/resource/config-aliyun-1.png
docs/zh/product/knowledge/resource/config-aliyun-2.png
docs/zh/product/knowledge/vector-database.md
@@ -129,4 +129,13 @@
## 2. OpenSearch 知识库配置样例
![open_search_config.png](../../development/ai/resource/open_search_config.png)
![open_search_config.png](../../development/ai/resource/open_search_config.png)
## 阿里云 向量数据库
## 1. 登录阿里云配置向量数据库,并创建集合名称
![img_1.png](resource/config-aliyun-2.png)
注意:集合名称需要先在阿里云上创建,才能配置在AIFlowy中
## 2. 阿里云向量数据库配置样例
![img.png](resource/config-aliyun-1.png)
docs/zh/product/workflow/nodes/dynamic-code.md
New file
@@ -0,0 +1,108 @@
# 动态代码
动态代码节点允许用户编写自定义代码逻辑,并将其嵌入到执行链中。
## 支持的语言
### QLExpress
#### 简介
QLExpress 是由阿里的电商业务规则演化而来的嵌入式 Java 动态脚本工具,在阿里集团有很强的影响力,
同时为了自身不断优化、发扬开源贡献精神,于2012年开源。
在基本的表达式计算的基础上,增加以下特色功能:
灵活的自定义能力,通过 Java API 自定义函数和操作符,可以快速实现业务规则的 DSL
兼容Java语法,最新的 QLExpress4 可以兼容 Java8 语法,方便 Java 程序员快速熟悉
友好的报错提示,无论是编译还是运行时错误,都能精确友好地提示错误位置
默认安全,脚本默认不允许和应用代码进行交互,如果需要交互,也可以自行定义安全的交互方式
解释执行,不占用 JVM 元空间,可以开启缓存提升解释性能
代码精简,依赖最小,适合所有 java 的运行环境
#### 示例
下面是一个简单示例:
![qlexpress-code.png](../resource/qlexpress-code.png)
执行代码:
```
function add(int a, int b) {
    return a + b;
};
res = add(num,2);
_result.put("addResult",res);
_result.put("resStr","返回常量");
```
运行结果:
![qlexpress-res.png](../resource/qlexpress-res.png)
### Groovy
#### 简介
Groovy 是一种基于 JVM (Java虚拟机)的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性,
Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,
Groovy 也可以使用其他非 Java 语言编写的库。
#### 示例
下面是一个简单的示例:
![groovy-code.png](../resource/groovy-code.png)
执行代码:
```
int i = 1;
def add(a, b) {
    return a + b;
}
def r = add(i, num);
_result.put("result", r)
```
运行结果:
![groovy-res.png](../resource/groovy-res.png)
### JavaScript
#### 简介
JavaScript 是一种高级的、解释型的编程语言,主要用于网页开发,但如今已扩展到服务器端、移动应用和桌面应用开发。
#### 示例
下面是一个简单的示例:
![javascript-code.png](../resource/javascript-code.png)
执行代码:
```
var a = 1;
for (var i=1; i<=num; i++) {
    a+=i;
}
_result.put("jsRes", a);
```
运行结果:
![javascript-res.png](../resource/javascript-res.png)
## 输出参数
代码块中使用 `_result.put(key, value)` 的变量都可作为输出参数输出。
docs/zh/product/workflow/resource/groovy-code.png
docs/zh/product/workflow/resource/groovy-res.png
docs/zh/product/workflow/resource/javascript-code.png
docs/zh/product/workflow/resource/javascript-res.png
docs/zh/product/workflow/resource/qlexpress-code.png
docs/zh/product/workflow/resource/qlexpress-res.png
docs/zh/product/workflow/what_is_workflow.md
@@ -1,7 +1,5 @@
# 什么是工作流
## 1. 概述
在 AIFlowy 中,**工作流(Workflow)** 是
一种用于描述和管理任务执行流程的核心概念。它通过可视化的界面或代码配置,
将多个操作步骤串联起来,形成一个完整的自动化流程。工作流适用于各种场景,