Merge branch 'main' of https://gitee.com/aiflowy/aiflowy
| | |
| | | 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"; |
| | |
| | | rowSelectEnable?: boolean, |
| | | params?: any, |
| | | paramsToUrl?: boolean, |
| | | editLayout?: EditLayout |
| | | editLayout?: EditLayout, |
| | | onRefresh?: () => void; |
| | | externalRefreshTrigger?: number; // 当这个值变化时触发刷新 |
| | | } |
| | | |
| | | const CrudPage: React.FC<CurdPageProps> = ({ |
| | |
| | | params, |
| | | paramsToUrl = false, |
| | | editLayout, |
| | | externalRefreshTrigger |
| | | }) => { |
| | | |
| | | const isPage = showType === "page"; |
| | |
| | | // |
| | | // console.log("index", urlParams, {pageNumber, pageSize}) |
| | | |
| | | useEffect(() => { |
| | | actions.onFetchList?.(pageNumber, pageSize, urlParams); |
| | | }, [externalRefreshTrigger]); |
| | | |
| | | return ( |
| | | <AntdCrud columns={columnsConfig} |
| | |
| | | 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"; |
| | | |
| | | |
| | | //字段配置 |
| | |
| | | |
| | | 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({ |
| | |
| | | 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); |
| | | } |
| | | }) |
| | | }, |
| | |
| | | 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'}, |
| | | ] |
| | | }, |
| | | { |
| | |
| | | {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'}, |
| New file |
| | |
| | | # 通过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 |
| | | } |
| | | } |
| | | ``` |
| New file |
| | |
| | | # Bot web 客户端 |
| | | |
| | | Bot Web 客户端是指专门为机器人 Bot 设计的基于网页的用户界面或操作平台。它的主要功能是让用户能够通过浏览器来管理、控制和与自动化程序(机器人)进行交互。 |
| | | |
| | | ## 如何进入Bot Web 客户端 |
| | | 点击如下所示的按钮,进入 Bot Web 客户端 |
| | |  |
| | | |
| | | ## Bot Web 界面 |
| | | 这里是 Bot Web 界面,这个 Bot 包含了 **对话**、**插件**、**工作流**、**知识库** 四个模块,分别对应 Bot 的对话、插件、工作流、知识库功能。 |
| | | 用户输入想要提问的问题,点击 **发送** 按钮,Bot 会根据用户输入的提问,主动判断是调用哪个插件还是调用哪个工作流,然后调用对应的插件或者工作流,得到结果,返回给用户。 |
| | |  |
| | |
| | | # 挂载工作流 |
| | | # 挂载工作流 |
| | | |
| | | ## 1. 创建工作流 |
| | | 创建工作流请参考 [如何创建一个工作流](/zh/product/workflow/quick_start) |
| | | |
| | | ## 2. 挂载工作流 |
| | | 挂载工作流首先点击左侧菜单栏的 Bot 进入 Bot 对话页面,挂载工作流之前,我已经创建了一个名为 **获取IP信息** 的工作流,然后点击 **工作流** 右上角的 **+** 按钮,选择刚才创建好的 **获取IP信息**,点击 **添加**, 这样就给我们的智能机器人挂上了工作流。 |
| | |  |
| | | |
| | | ## 3. 工作流测试 |
| | | 如下结果为 Bot 从挂载的工作流得到的结果 |
| | |  |
| | |
| | | |
| | | ## 2. OpenSearch 知识库配置样例 |
| | | |
| | |  |
| | |  |
| | | |
| | | ## 阿里云 向量数据库 |
| | | |
| | | ## 1. 登录阿里云配置向量数据库,并创建集合名称 |
| | |  |
| | | 注意:集合名称需要先在阿里云上创建,才能配置在AIFlowy中 |
| | | |
| | | ## 2. 阿里云向量数据库配置样例 |
| | |  |
| New file |
| | |
| | | # 动态代码 |
| | | |
| | | 动态代码节点允许用户编写自定义代码逻辑,并将其嵌入到执行链中。 |
| | | |
| | | ## 支持的语言 |
| | | |
| | | ### QLExpress |
| | | |
| | | #### 简介 |
| | | |
| | | QLExpress 是由阿里的电商业务规则演化而来的嵌入式 Java 动态脚本工具,在阿里集团有很强的影响力, |
| | | 同时为了自身不断优化、发扬开源贡献精神,于2012年开源。 |
| | | |
| | | 在基本的表达式计算的基础上,增加以下特色功能: |
| | | |
| | | 灵活的自定义能力,通过 Java API 自定义函数和操作符,可以快速实现业务规则的 DSL |
| | | |
| | | 兼容Java语法,最新的 QLExpress4 可以兼容 Java8 语法,方便 Java 程序员快速熟悉 |
| | | |
| | | 友好的报错提示,无论是编译还是运行时错误,都能精确友好地提示错误位置 |
| | | |
| | | 默认安全,脚本默认不允许和应用代码进行交互,如果需要交互,也可以自行定义安全的交互方式 |
| | | |
| | | 解释执行,不占用 JVM 元空间,可以开启缓存提升解释性能 |
| | | |
| | | 代码精简,依赖最小,适合所有 java 的运行环境 |
| | | |
| | | #### 示例 |
| | | |
| | | 下面是一个简单示例: |
| | | |
| | |  |
| | | |
| | | 执行代码: |
| | | ``` |
| | | function add(int a, int b) { |
| | | return a + b; |
| | | }; |
| | | |
| | | res = add(num,2); |
| | | |
| | | _result.put("addResult",res); |
| | | |
| | | _result.put("resStr","返回常量"); |
| | | ``` |
| | | 运行结果: |
| | | |
| | |  |
| | | |
| | | ### Groovy |
| | | |
| | | #### 简介 |
| | | |
| | | Groovy 是一种基于 JVM (Java虚拟机)的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性, |
| | | Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性, |
| | | Groovy 也可以使用其他非 Java 语言编写的库。 |
| | | |
| | | #### 示例 |
| | | |
| | | 下面是一个简单的示例: |
| | | |
| | |  |
| | | |
| | | 执行代码: |
| | | ``` |
| | | int i = 1; |
| | | |
| | | def add(a, b) { |
| | | return a + b; |
| | | } |
| | | |
| | | def r = add(i, num); |
| | | |
| | | _result.put("result", r) |
| | | ``` |
| | | |
| | | 运行结果: |
| | | |
| | |  |
| | | |
| | | ### JavaScript |
| | | |
| | | #### 简介 |
| | | JavaScript 是一种高级的、解释型的编程语言,主要用于网页开发,但如今已扩展到服务器端、移动应用和桌面应用开发。 |
| | | |
| | | #### 示例 |
| | | |
| | | 下面是一个简单的示例: |
| | | |
| | |  |
| | | |
| | | 执行代码: |
| | | ``` |
| | | var a = 1; |
| | | |
| | | for (var i=1; i<=num; i++) { |
| | | a+=i; |
| | | } |
| | | |
| | | _result.put("jsRes", a); |
| | | ``` |
| | | 运行结果: |
| | | |
| | |  |
| | | |
| | | ## 输出参数 |
| | | |
| | | 代码块中使用 `_result.put(key, value)` 的变量都可作为输出参数输出。 |
| | |
| | | # 什么是工作流 |
| | | |
| | | ## 1. 概述 |
| | | |
| | | 在 AIFlowy 中,**工作流(Workflow)** 是 |
| | | 一种用于描述和管理任务执行流程的核心概念。它通过可视化的界面或代码配置, |
| | | 将多个操作步骤串联起来,形成一个完整的自动化流程。工作流适用于各种场景, |