Files
FastGPT/client/src/constants/app.ts
2023-07-25 13:19:59 +08:00

857 lines
24 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { AppItemType } from '@/types/app';
import { FlowInputItemTypeEnum, FlowModuleTypeEnum, FlowOutputItemTypeEnum } from './flow';
import { chatModelList } from './data';
/* app */
export enum AppModuleItemTypeEnum {
'initInput' = 'initInput', // default chat input: userChatInput, history
'http' = 'http', // send a http request
'switch' = 'switch', // one input and two outputs
'answer' = 'answer' // redirect response
}
export enum SystemInputEnum {
'switch' = 'switch', // a trigger switch
'history' = 'history',
'userChatInput' = 'userChatInput'
}
export enum SpecificInputEnum {
'answerText' = 'answerText' // answer module text key
}
export const answerModule = ({ id }: { id: string }) => ({
moduleId: id,
type: AppModuleItemTypeEnum.answer,
flowType: FlowModuleTypeEnum.answerNode,
inputs: [
{
key: SystemInputEnum.switch,
type: FlowInputItemTypeEnum.target,
label: '触发器',
connected: true
},
{
key: SpecificInputEnum.answerText,
value: '',
type: FlowInputItemTypeEnum.input,
label: '响应内容',
connected: true
}
],
outputs: []
});
export const chatModule = ({
id,
systemPrompt = '',
limitPrompt = '',
history = 10
}: {
id: string;
systemPrompt?: string;
limitPrompt?: string;
history?: number;
}) => {
return {
moduleId: id,
flowType: FlowModuleTypeEnum.chatNode,
type: AppModuleItemTypeEnum.http,
url: '/openapi/modules/chat/gpt',
inputs: [
{
key: 'model',
type: FlowInputItemTypeEnum.select,
label: '对话模型',
value: chatModelList[0].value,
list: chatModelList
},
{
key: 'temperature',
type: FlowInputItemTypeEnum.slider,
label: '温度',
value: 0,
min: 0,
max: 10,
step: 1,
markList: [
{ label: '严谨', value: 0 },
{ label: '发散', value: 10 }
]
},
{
key: 'maxToken',
type: FlowInputItemTypeEnum.slider,
label: '回复上限',
value: 3000,
min: 0,
max: 4000,
step: 50,
markList: [
{ label: '0', value: 0 },
{ label: '4000', value: 4000 }
]
},
{
key: 'systemPrompt',
type: FlowInputItemTypeEnum.textarea,
label: '系统提示词',
description:
'模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。',
placeholder:
'模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。',
value: systemPrompt
},
{
key: 'limitPrompt',
type: FlowInputItemTypeEnum.textarea,
label: '限定词',
description:
'限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。例如:\n1. 知识库是关于 Laf 的介绍,参考知识库回答问题,与 "Laf" 无关内容,直接回复: "我不知道"。\n2. 你仅回答关于 "xxx" 的问题,其他问题回复: "xxxx"',
placeholder:
'限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。例如:\n1. 知识库是关于 Laf 的介绍,参考知识库回答问题,与 "Laf" 无关内容,直接回复: "我不知道"。\n2. 你仅回答关于 "xxx" 的问题,其他问题回复: "xxxx"',
value: limitPrompt
},
{
key: SystemInputEnum.switch,
type: FlowInputItemTypeEnum.target,
label: '触发器',
connected: true
},
{
key: 'quotePrompt',
type: FlowInputItemTypeEnum.target,
label: '引用内容(字符串)',
connected: true
},
{
key: SystemInputEnum.history,
type: FlowInputItemTypeEnum.numberInput,
label: '最长上下文',
description: '为 0 时,代表不需要上下文。',
value: history,
min: 0,
max: 50
},
{
key: SystemInputEnum.userChatInput,
type: FlowInputItemTypeEnum.none,
label: '用户输入(系统自动填写)',
description: ''
}
],
outputs: [
{
key: 'answer',
label: '模型回复',
type: FlowOutputItemTypeEnum.answer,
targets: []
}
]
};
};
export const chatAppDemo: AppItemType = {
id: 'chat',
name: '',
// 标记字段
modules: [chatModule({ id: 'chat' })]
};
export const kbChatAppDemo: AppItemType = {
id: 'kbchat',
name: 'kbchat',
// 标记字段
modules: [
{
moduleId: 'kbsearch',
flowType: FlowModuleTypeEnum.kbSearchNode,
type: AppModuleItemTypeEnum.http,
url: '/openapi/modules/kb/search',
position: { x: -500, y: 0 },
inputs: [
{
key: 'kb_ids',
type: FlowInputItemTypeEnum.custom,
label: '关联的知识库',
value: ['646627f4f7b896cfd8910e38'],
list: []
},
{
key: 'similarity',
type: FlowInputItemTypeEnum.slider,
label: '相似度',
value: 0.8,
min: 0,
max: 1,
step: 0.01,
markList: [
{ label: '0', value: 0 },
{ label: '1', value: 1 }
]
},
{
key: 'limit',
type: FlowInputItemTypeEnum.slider,
label: '单次搜索上限',
value: 5,
min: 1,
max: 20,
step: 1,
markList: [
{ label: '1', value: 1 },
{ label: '20', value: 20 }
]
},
{
key: SystemInputEnum.history,
type: FlowInputItemTypeEnum.hidden,
label: '引用复用数量',
value: 1
},
{
key: SystemInputEnum.userChatInput,
type: FlowInputItemTypeEnum.none,
label: '用户输入(系统自动填写)',
description: ''
}
],
outputs: [
{
key: 'rawSearch',
label: '源搜索数据',
type: FlowOutputItemTypeEnum.none,
response: true,
targets: []
},
{
key: 'isEmpty',
label: '无搜索结果',
type: FlowOutputItemTypeEnum.source,
targets: [
{
moduleId: 'tfswitch',
key: SystemInputEnum.switch
}
]
},
{
key: 'quotePrompt',
label: '引用内容(字符串)',
type: FlowOutputItemTypeEnum.source,
targets: [
{
moduleId: 'chat',
key: 'quotePrompt'
}
]
}
]
},
{
moduleId: 'tfswitch',
type: AppModuleItemTypeEnum.switch,
flowType: FlowModuleTypeEnum.tfSwitchNode,
position: { x: 0, y: 510 },
inputs: [
{
key: SystemInputEnum.switch,
type: FlowInputItemTypeEnum.target,
label: '触发器',
connected: true
}
],
outputs: [
{
key: 'true',
label: '无搜索数据',
type: FlowOutputItemTypeEnum.source,
targets: [
{
moduleId: 'answer',
key: SystemInputEnum.switch
}
]
},
{
key: 'false',
label: '有搜索数据',
type: FlowOutputItemTypeEnum.source,
targets: [
{
moduleId: 'chat',
key: SystemInputEnum.switch
}
]
}
]
},
{
...chatModule({ id: 'chat', limitPrompt: '参考知识库内容进行回答', history: 5 }),
position: { x: 300, y: 240 }
},
{
...answerModule({ id: 'answer' }),
position: { x: 300, y: 0 }
}
]
};
// export const classifyQuestionDemo: AppItemType = {
// id: 'classifyQuestionDemo',
// // 标记字段
// modules: [
// {
// moduleId: '1',
// type: AppModuleItemTypeEnum.http,
// url: '/openapi/modules/agent/classifyQuestion',
// body: {
// systemPrompt:
// 'laf 一个云函数开发平台,提供了基于 Node 的 serveless 的快速开发和部署。是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台。支持云函数、云数据库、在线编程 IDE、触发器、云存储和静态网站托管等功能。',
// agents: [
// {
// desc: '打招呼、问候、身份询问等问题',
// key: 'a'
// },
// {
// desc: "询问 'laf 使用和介绍的问题'",
// key: 'b'
// },
// {
// desc: "询问 'laf 代码问题'",
// key: 'c'
// },
// {
// desc: '其他问题',
// key: 'd'
// }
// ]
// },
// inputs: [
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'a',
// value: undefined,
// targets: [
// {
// moduleId: 'a',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'b',
// value: undefined,
// targets: [
// {
// moduleId: 'b',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'c',
// value: undefined,
// targets: [
// {
// moduleId: 'c',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'd',
// value: undefined,
// targets: [
// {
// moduleId: 'd',
// key: SystemInputEnum.switch
// }
// ]
// }
// ]
// },
// {
// moduleId: 'a',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '你好,我是 Laf 助手,有什么可以帮助你的?'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// // laf 知识库
// {
// moduleId: 'b',
// type: 'http',
// url: '/openapi/modules/kb/search',
// body: {
// kb_ids: ['646627f4f7b896cfd8910e24'],
// similarity: 0.82,
// limit: 4,
// maxToken: 2500
// },
// inputs: [
// {
// key: SystemInputEnum.switch,
// value: undefined
// },
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'rawSearch',
// value: undefined,
// response: true,
// targets: []
// },
// {
// key: 'quotePrompt',
// value: undefined,
// targets: [
// {
// moduleId: 'lafchat',
// key: 'quotePrompt'
// }
// ]
// }
// ]
// },
// // laf 对话
// {
// moduleId: 'lafchat',
// type: 'http',
// url: '/openapi/modules/chat/gpt',
// body: {
// model: 'gpt-3.5-turbo-16k',
// temperature: 5,
// maxToken: 4000,
// systemPrompt: '知识库是关于 Laf 的内容。',
// limitPrompt: '你仅能参考知识库的内容回答问题,不能超出知识库范围。'
// },
// inputs: [
// {
// key: 'quotePrompt',
// value: undefined
// },
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'answer',
// answer: true,
// value: undefined,
// targets: []
// }
// ]
// },
// // laf 代码知识库
// {
// moduleId: 'c',
// type: 'http',
// url: '/openapi/modules/kb/search',
// body: {
// kb_ids: ['646627f4f7b896cfd8910e26'],
// similarity: 0.8,
// limit: 4,
// maxToken: 2500
// },
// inputs: [
// {
// key: SystemInputEnum.switch,
// value: undefined
// },
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'rawSearch',
// value: undefined,
// response: true,
// targets: []
// },
// {
// key: 'quotePrompt',
// value: undefined,
// targets: [
// {
// moduleId: 'lafcodechat',
// key: 'quotePrompt'
// }
// ]
// }
// ]
// },
// // laf代码对话
// {
// moduleId: 'lafcodechat',
// type: 'http',
// url: '/openapi/modules/chat/gpt',
// body: {
// model: 'gpt-3.5-turbo-16k',
// temperature: 5,
// maxToken: 4000,
// systemPrompt: `下例是laf结构\n~~~ts\nimport cloud from '@lafjs/cloud'\nexport default async function(ctx: FunctionContext){\nreturn \"success\"\n};\n~~~\n下例是@lafjs/cloud的api\n~~~\ncloud.fetch//完全等同axios\ncloud.database()// 获取操作数据库实例,和mongo语法相似.\ncloud.getToken(payload)//获取token\ncloud.parseToken(token)//解析token\n// 下面是持久化缓存Api\ncloud.shared.set(key,val); //设置缓存,仅能设置值,无法设置过期时间\ncloud.shared.get(key);\ncloud.shared.has(key); \ncloud.shared.delete(key); \ncloud.shared.clear(); \n~~~\n下例是ctx对象\n~~~\nctx.requestId\nctx.method\nctx.headers//请求的 headers, ctx.headers.get('Content-Type')获取Content-Type的值\nctx.user//Http Bearer Token 认证时,获取token值\nctx.query\nctx.body\nctx.request//同express的Request\nctx.response//同express的Response\nctx.socket/WebSocket 实例\nctx.files//上传的文件 (File对象数组)\nctx.env//自定义的环境变量\n~~~\n下例是数据库获取数据\n~~~ts\nconst db = cloud.database();\nexport default async function(ctx: FunctionContext){\nconst {minMemory} = ctx.query\nconst _ = db.command;\nconst {data: users,total} = collection(\"users\")\n .where({//条件查询\n category: \"computer\",\n type: {\n memory: _gt(minMemory), \n }\n }) \n .skip(10)//跳过10条-分页时使用\n .limit(10)//仅返回10条\n .orderBy(\"name\", \"asc\") \n .orderBy(\"age\", \"desc\")\n .field({age:true,name: false})//返回age不返回name\n}\nconst {data:user} = db.where({phone:req.body.phone}).getOne()//获取一个满足条件的用户\nreturn {users,total}\n~~~\n下例是数据库添加数据\n~~~ts\nconst db = cloud.database();\nexport default async function(ctx: FunctionContext) {\n const {username} = ctx.body\n const {id:userId, ok} = await collection(\"users\")\n .add({\n username, \n })\n if(ok) return {userId}\n return {code:500,message:\"失败\"}\n}\n~~~\n下例是数据库更新数据\n~~~ts\nconst db = cloud.database();\nexport default async function(ctx: FunctionContext){\nconst {id} = req.query\n//id直接修改\nawait collection(\"user\").doc(\"id\").update({\n name: \"Hey\",\n});\n//批量更新\nawait collection\n .where({name:\"1234\"})\n .update({\n age:18\n })\nconst _ = db.command;\nawait collection(\"user\")\n .doc(id)\n .set({\n count: _.inc(1)\n count: _.mul(2)\n count: _.remove()\n users: _.push([\"aaa\", \"bbb\"])\n users: _.push(\"aaa\")\n users: _.pop()\n users: _.unshift()\n users: _.shift()\n })\n}\n~~~\n下例是删除数据库记录\n~~~ts\nconst db = cloud.database();\nexport default async function(ctx: FunctionContext){\nconst {id} = req.query\ncollection(\"user\").doc(id).remove();\n//批量删除\ncollection\n .where({age:18}) \n .remove({multi: true})\nreturn \"success\"\n}\n~~~\n你只需返回 ts 代码块!不需要说明.\n用户的问题与 Laf 代码无关时,你直接回答: \"我不确定,我只会写 Laf 代码。\"`,
// limitPrompt:
// '你是由 Laf 团队开发的代码助手,把我的需求用 Laf 代码实现.参考知识库中 Laf 的例子.'
// },
// inputs: [
// {
// key: 'quotePrompt',
// value: undefined
// },
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'answer',
// answer: true,
// value: undefined,
// targets: []
// }
// ]
// },
// {
// moduleId: 'd',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '你好,我没有理解你的意思,请问你有什么 Laf 相关的问题么?'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// }
// ]
// };
// export const lafClassifyQuestionDemo: AppItemType = {
// id: 'test',
// // 标记字段
// modules: [
// {
// moduleId: '1',
// type: AppModuleItemTypeEnum.http,
// url: '/openapi/modules/agent/classifyQuestion',
// body: {
// systemPrompt:
// 'laf 一个云函数开发平台,提供了基于 Node 的 serveless 的快速开发和部署。是一个集「函数计算」、「数据库」、「对象存储」等于一身的一站式开发平台。支持云函数、云数据库、在线编程 IDE、触发器、云存储和静态网站托管等功能。\nsealos是一个 k8s 云平台,可以让用户快速部署云服务。',
// agents: [
// {
// desc: '打招呼、问候、身份询问等问题',
// key: 'a'
// },
// {
// desc: "询问 'laf 的使用和介绍'",
// key: 'b'
// },
// {
// desc: "询问 'laf 代码相关问题'",
// key: 'c'
// },
// {
// desc: "用户希望运行或知道 'laf 代码' 运行结果",
// key: 'g'
// },
// {
// desc: "询问 'sealos 相关问题'",
// key: 'd'
// },
// {
// desc: '其他问题',
// key: 'e'
// },
// {
// desc: '商务类问题',
// key: 'f'
// }
// ]
// },
// inputs: [
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'a',
// value: undefined,
// targets: [
// {
// moduleId: 'a',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'b',
// value: undefined,
// targets: [
// {
// moduleId: 'b',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'c',
// value: undefined,
// targets: [
// {
// moduleId: 'c',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'd',
// value: undefined,
// targets: [
// {
// moduleId: 'd',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'e',
// value: undefined,
// targets: [
// {
// moduleId: 'e',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'f',
// value: undefined,
// targets: [
// {
// moduleId: 'f',
// key: SystemInputEnum.switch
// }
// ]
// },
// {
// key: 'g',
// value: undefined,
// targets: [
// {
// moduleId: 'g',
// key: SystemInputEnum.switch
// }
// ]
// }
// ]
// },
// {
// moduleId: 'a',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '你好,我是 环界云 助手,你有什么 Laf 或者 sealos 的 问题么?'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'b',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '查询 Laf 通用知识库xxxxx'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'c',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '查询 Laf 代码知识库xxxxx'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'd',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '查询 sealos 通用知识库: xxxx'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'e',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '其他问题。回复引导语xxxx'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'f',
// type: 'answer',
// body: {},
// inputs: [
// {
// key: SpecificInputEnum.answerText,
// value: '商务类问题联系方式xxxxx'
// },
// {
// key: SystemInputEnum.switch,
// value: undefined
// }
// ],
// outputs: []
// },
// {
// moduleId: 'g',
// type: 'http',
// url: '/openapi/modules/agent/extract',
// body: {
// description: '运行 laf 代码',
// agents: [
// {
// desc: '代码内容',
// key: 'code'
// }
// ]
// },
// inputs: [
// {
// key: SystemInputEnum.switch,
// value: undefined
// },
// {
// key: SystemInputEnum.history,
// value: undefined
// },
// {
// key: SystemInputEnum.userChatInput,
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'code',
// value: undefined,
// targets: [
// {
// moduleId: 'code_run',
// key: 'code'
// }
// ]
// }
// ]
// },
// {
// moduleId: 'code_run',
// type: AppModuleItemTypeEnum.http,
// url: 'https://v1cde7.laf.run/tess',
// body: {},
// inputs: [
// {
// key: 'code',
// value: undefined
// }
// ],
// outputs: [
// {
// key: 'star',
// value: undefined,
// targets: []
// }
// ]
// }
// ]
// };