diff --git a/docSite/assets/imgs/getKbId.png b/docSite/assets/imgs/getDatasetId.png similarity index 100% rename from docSite/assets/imgs/getKbId.png rename to docSite/assets/imgs/getDatasetId.png diff --git a/docSite/assets/imgs/getfile_id.png b/docSite/assets/imgs/getfile_id.png index 3995d5669..2654944b2 100644 Binary files a/docSite/assets/imgs/getfile_id.png and b/docSite/assets/imgs/getfile_id.png differ diff --git a/docSite/content/docs/development/openApi.md b/docSite/content/docs/development/openApi.md index 072bd37de..09866425d 100644 --- a/docSite/content/docs/development/openApi.md +++ b/docSite/content/docs/development/openApi.md @@ -225,9 +225,9 @@ data: [{"moduleName":"KB Search","price":1.2000000000000002,"model":"Embedding-2 此部分 API 需使用全局通用的 API Key。 {{% /alert %}} -| 如何获取知识库ID(kbId) | 如何获取文件ID(file_id) | +| 如何获取知识库ID(datasetId) | 如何获取文件ID(file_id) | | --------------------- | --------------------- | -| ![](/imgs/getKbId.png) | ![](/imgs/getfile_id.png) | +| ![](/imgs/getDatasetId.png) | ![](/imgs/getfile_id.png) | ### 知识库添加数据 @@ -241,7 +241,7 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa --header 'Authorization: Bearer apikey' \ --header 'Content-Type: application/json' \ --data-raw '{ -    "kbId": "64663f451ba1676dbdef0499", +    "collectionId": "64663f451ba1676dbdef0499", "mode": "index", "prompt": "qa 拆分引导词,index 模式下可以忽略", "billId": "可选。如果有这个值,本次的数据会被聚合到一个订单中,这个值可以重复使用。可以参考 [创建训练订单] 获取该值。", @@ -268,7 +268,7 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa ```json { - "kbId": "知识库的ID,可以在知识库详情查看。", + "collectionId": "文件的ID,参考上面的第二张图", "mode": "index | qa ", // index 模式: 直接将 q 转成向量存起来,a 直接入库。qa 模式: 只关注 data 里的 q,将 q 丢给大模型,让其根据 prompt 拆分成 qa 问答对。 "prompt": "拆分提示词,需严格按照模板,建议不要传入。", "data": [ @@ -351,7 +351,7 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/searchTest' --header 'Authorization: Bearer apiKey' \ --header 'Content-Type: application/json' \ --data-raw '{ - "kbId": "xxxxx", + "datasetId": "知识库的ID", "text": "导演是谁" }' ``` diff --git a/docSite/content/docs/installation/upgrading/45.md b/docSite/content/docs/installation/upgrading/45.md index 569ccee23..e85f2f5f2 100644 --- a/docSite/content/docs/installation/upgrading/45.md +++ b/docSite/content/docs/installation/upgrading/45.md @@ -29,6 +29,10 @@ ALTER EXTENSION vector UPDATE; alter system set maintenance_work_mem = '2400MB'; select pg_reload_conf(); +-- 重构数据库索引和排序 +REINDEX DATABASE postgres; +ALTER DATABASE postgres REFRESH COLLATION VERSION; + -- 开始构建索引,该索引构建时间非常久,直接点击右上角的叉,退出 Terminal 即可 CREATE INDEX CONCURRENTLY vector_index ON modeldata USING hnsw (vector vector_ip_ops) WITH (m = 16, ef_construction = 64); -- 可以再次点击一键链接,进入 Terminal,输入下方命令,如果看到 "vector_index" hnsw (vector vector_ip_ops) WITH (m='16', ef_construction='64') 则代表构建完成(注意,后面没有 INVALID) diff --git a/docSite/content/docs/installation/upgrading/451.md b/docSite/content/docs/installation/upgrading/451.md index 71332d0fb..0ee7bb40f 100644 --- a/docSite/content/docs/installation/upgrading/451.md +++ b/docSite/content/docs/installation/upgrading/451.md @@ -32,4 +32,4 @@ curl --location --request POST 'https://{{host}}/api/admin/initv451' \ 1. 新增知识库文件夹管理 2. 修复了 openai4.x sdk 无法兼容 oneapi 的智谱和阿里的接口。 - +3. 修复部分模块无法触发完成事件 \ No newline at end of file diff --git a/projects/app/public/locales/en/common.json b/projects/app/public/locales/en/common.json index fd72230c0..1e8a98767 100644 --- a/projects/app/public/locales/en/common.json +++ b/projects/app/public/locales/en/common.json @@ -14,9 +14,12 @@ "UnKnow": "UnKnow", "Warning": "Warning", "app": { + "AI Advanced Settings": "Advanced Settings", "AI Settings": "AI Settings", "Advance App TestTip": "The current application is advanced editing mode \n. If you need to switch to [simple mode], please click the save button on the left", "App Detail": "App Detail", + "Basic Settings": "Basic Settings", + "Chat Debug": "Chat Debug", "Chat Logs Tips": "Logs record the app's online, shared, and API(chatId is existing) conversations", "Chat logs": "Chat Logs", "Confirm Del App Tip": "Confirm to delete the app and all its chats", @@ -38,6 +41,7 @@ "Logs Title": "Title", "Mark Count": "Mark Count", "My Apps": "My Apps", + "Open AI Advanced Settings": "Advanced Settings", "Output Field Settings": "Output Field Settings", "Paste Config": "Paste Config", "Variable Key Repeat Tip": "Variable Key Repeat", @@ -106,6 +110,7 @@ }, "common": { "Add": "Add", + "Choose": "Choose", "Close": "Clow", "Collect": "Collect", "Confirm Move": "Move here", @@ -131,6 +136,7 @@ "Name is empty": "Name is empty", "Next Step": "Next", "Output": "Output", + "Params": "Params", "Password inconsistency": "Password inconsistency", "Rename": "Rename", "Rename Failed": "Rename Failed", @@ -151,10 +157,30 @@ "folder": { "Drag Tip": "Click and move", "Move Success": "Move Success", - "No Folder": "No Folder", + "No Folder": "There's no subdirectory. Just put it here", "Root Path": "Root Folder" } }, + "core": { + "ai": { + "Model": "Model", + "Prompt": "Prompt" + }, + "app": { + "Next Step Guide": "Next step guide" + }, + "chat": { + "Restart": "Restart" + }, + "dataset": { + "Choose Dataset": "Chookse Dataset", + "Dataset": "Dataset", + "Read Dataset": "Read Dataset", + "Search Top K": "Top K", + "Set Empty Result Tip": ",Response empty text", + "Similarity": "Similarity" + } + }, "dataset": { "Chunk Length": "Chunk Length", "Confirm move the folder": "Confirm Move", @@ -189,6 +215,7 @@ "Click to view folder": "To Folder", "Collection Embedding": "{{total}}Embedding", "Confirm to delete the folder": "Are you sure to delete this folder and all its contents?", + "Create And Import": "Create/Import", "Create Training Data": "Training-{{filename}}", "Create Virtual File Success": "Create Virtual File Success", "Data Amount": "Data Amount", @@ -208,7 +235,7 @@ "deleteFolderTips": "Are you sure to delete this folder and all the knowledge bases it contains? Data cannot be recovered after deletion, please confirm!" }, "file": { - "Click to download CSV template": "Click to download CSV template", + "Click to download file template": "Download Template: {{name}}", "Click to view file": "Click to view file", "Create File": "Create File", "Create file": "Create file", diff --git a/projects/app/public/locales/zh/common.json b/projects/app/public/locales/zh/common.json index 9f0c78e16..f3618c4b4 100644 --- a/projects/app/public/locales/zh/common.json +++ b/projects/app/public/locales/zh/common.json @@ -14,9 +14,12 @@ "UnKnow": "未知", "Warning": "提示", "app": { - "AI Settings": "AI 高级配置", + "AI Advanced Settings": "AI 高级配置", + "AI Settings": "AI 配置", "Advance App TestTip": "当前应用为高级编排模式\n如需切换为【简易模式】请点击左侧保存按键", "App Detail": "应用详情", + "Basic Settings": "基本信息", + "Chat Debug": "调试预览", "Chat Logs Tips": "日志会记录该应用的在线、分享和 API(需填写 chatId) 对话记录", "Chat logs": "对话日志", "Confirm Del App Tip": "确认删除该应用及其所有聊天记录?", @@ -38,6 +41,7 @@ "Logs Title": "标题", "Mark Count": "标注答案数量", "My Apps": "我的应用", + "Open AI Advanced Settings": "高级配置", "Output Field Settings": "输出字段编辑", "Paste Config": "粘贴配置", "Variable Key Repeat Tip": "变量 key 重复", @@ -106,6 +110,7 @@ }, "common": { "Add": "添加", + "Choose": "选择", "Close": "关闭", "Collect": "收藏", "Confirm Move": "移动到这", @@ -131,6 +136,7 @@ "Name is empty": "名称不能为空", "Next Step": "下一步", "Output": "输出", + "Params": "参数", "Password inconsistency": "两次密码不一致", "Rename": "重命名", "Rename Failed": "重命名失败", @@ -151,10 +157,30 @@ "folder": { "Drag Tip": "点我可拖动", "Move Success": "移动成功", - "No Folder": "这个目录空空的~", + "No Folder": "没有子目录了,就放这里吧", "Root Path": "根目录" } }, + "core": { + "ai": { + "Model": "AI 模型", + "Prompt": "提示词" + }, + "app": { + "Next Step Guide": "下一步指引" + }, + "chat": { + "Restart": "重开对话" + }, + "dataset": { + "Choose Dataset": "关联知识库", + "Dataset": "知识库", + "Read Dataset": "查看知识库详情", + "Search Top K": "单次搜索数量", + "Set Empty Result Tip": ",未搜索到内容时回复指定内容", + "Similarity": "相似度" + } + }, "dataset": { "Chunk Length": "数据总量", "Confirm move the folder": "确认移动到该目录", @@ -189,6 +215,7 @@ "Click to view folder": "进入目录", "Collection Embedding": "{{total}}组索引中", "Confirm to delete the folder": "确认删除该文件夹及里面所有内容?", + "Create And Import": "新建/导入", "Create Training Data": "文件训练-{{filename}}", "Create Virtual File Success": "创建虚拟文件成功", "Data Amount": "数据总量", @@ -208,7 +235,7 @@ "deleteFolderTips": "确认删除该文件夹及其包含的所有知识库?删除后数据无法恢复,请确认!" }, "file": { - "Click to download CSV template": "点击下载 CSV 模板", + "Click to download file template": "点击下载模板:{{name}}", "Click to view file": "点击查看原始文件", "Create File": "创建新文件", "Create file": "创建文件", diff --git a/projects/app/src/components/Icon/icons/core/app/aiFill.svg b/projects/app/src/components/Icon/icons/core/app/aiFill.svg new file mode 100644 index 000000000..cc478d8d1 --- /dev/null +++ b/projects/app/src/components/Icon/icons/core/app/aiFill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/projects/app/src/components/Icon/icons/core/app/aiLight.svg b/projects/app/src/components/Icon/icons/core/app/aiLight.svg new file mode 100644 index 000000000..016b34de4 --- /dev/null +++ b/projects/app/src/components/Icon/icons/core/app/aiLight.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/projects/app/src/components/Icon/index.tsx b/projects/app/src/components/Icon/index.tsx index 17f3a7015..674855f40 100644 --- a/projects/app/src/components/Icon/index.tsx +++ b/projects/app/src/components/Icon/index.tsx @@ -89,7 +89,9 @@ const iconPaths = { moveLight: () => import('./icons/light/move.svg'), questionGuide: () => import('./icons/app/questionGuide.svg'), loading: () => import('./icons/light/loading.svg'), - pause: () => import('./icons/common/pause.svg') + pause: () => import('./icons/common/pause.svg'), + 'core/app/aiLight': () => import('./icons/core/app/aiLight.svg'), + 'core/app/aiFill': () => import('./icons/core/app/aiFill.svg') }; export type IconName = keyof typeof iconPaths; diff --git a/projects/app/src/components/Layout/navbar.tsx b/projects/app/src/components/Layout/navbar.tsx index a15afd3c4..cf121318a 100644 --- a/projects/app/src/components/Layout/navbar.tsx +++ b/projects/app/src/components/Layout/navbar.tsx @@ -35,8 +35,8 @@ const Navbar = ({ unread }: { unread: number }) => { }, { label: t('navbar.Apps'), - icon: 'appLight', - activeIcon: 'appFill', + icon: 'core/app/aiLight', + activeIcon: 'core/app/aiFill', link: `/app/list`, activeLink: ['/app/list', '/app/detail'] }, diff --git a/projects/app/src/components/Layout/navbarPhone.tsx b/projects/app/src/components/Layout/navbarPhone.tsx index f42a4bd3f..6153335c8 100644 --- a/projects/app/src/components/Layout/navbarPhone.tsx +++ b/projects/app/src/components/Layout/navbarPhone.tsx @@ -21,7 +21,7 @@ const NavbarPhone = ({ unread }: { unread: number }) => { }, { label: t('navbar.Apps'), - icon: 'tabbarModel', + icon: 'core/app/aiLight', link: `/app/list`, activeLink: ['/app/list', '/app/detail'], unread: 0 diff --git a/projects/app/src/components/MyModal/index.tsx b/projects/app/src/components/MyModal/index.tsx index 6caa4cd67..a78cb1bf3 100644 --- a/projects/app/src/components/MyModal/index.tsx +++ b/projects/app/src/components/MyModal/index.tsx @@ -22,7 +22,7 @@ const MyModal = ({ title, children, isCentered, - w = '100%', + w = 'auto', maxW = ['90vw', '600px'], ...props }: Props) => { diff --git a/projects/app/src/components/core/dataset/SelectModal.tsx b/projects/app/src/components/core/dataset/SelectModal.tsx index 0325f8289..e6891a928 100644 --- a/projects/app/src/components/core/dataset/SelectModal.tsx +++ b/projects/app/src/components/core/dataset/SelectModal.tsx @@ -80,7 +80,7 @@ const DatasetSelectContainer = ({ )} - {children} + {children} ); diff --git a/projects/app/src/constants/flow/ModuleTemplate.ts b/projects/app/src/constants/flow/ModuleTemplate.ts index d91250192..f2da3f6b8 100644 --- a/projects/app/src/constants/flow/ModuleTemplate.ts +++ b/projects/app/src/constants/flow/ModuleTemplate.ts @@ -850,7 +850,7 @@ export const appTemplates: (AppItemType & { key: 'userChatInput' }, { - moduleId: 'kbSearch', + moduleId: 'datasetSearch', key: 'userChatInput' } ] @@ -898,7 +898,7 @@ export const appTemplates: (AppItemType & { ] }, { - moduleId: 'kbSearch', + moduleId: 'datasetSearch', name: '知识库搜索', flowType: 'datasetSearchNode', showStatus: true, diff --git a/projects/app/src/constants/flow/flowField.ts b/projects/app/src/constants/flow/flowField.ts index 3b3e3dcaf..5bdad0b7d 100644 --- a/projects/app/src/constants/flow/flowField.ts +++ b/projects/app/src/constants/flow/flowField.ts @@ -9,6 +9,5 @@ export enum ContextExtractEnum { export enum HttpPropsEnum { url = 'url', - failed = 'failed', - finish = 'finish' + failed = 'failed' } diff --git a/projects/app/src/pages/api/app/update.ts b/projects/app/src/pages/api/app/update.ts index 888cc2acb..d96c63021 100644 --- a/projects/app/src/pages/api/app/update.ts +++ b/projects/app/src/pages/api/app/update.ts @@ -5,6 +5,7 @@ import { authUser } from '@fastgpt/service/support/user/auth'; import { App } from '@/service/models/app'; import type { AppUpdateParams } from '@/types/app'; import { authApp } from '@/service/utils/auth'; +import { SystemOutputEnum } from '@/constants/app'; /* 获取我的模型 */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -40,7 +41,17 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< 'share.isShare': share.isShare, 'share.isShareDetail': share.isShareDetail }), - ...(modules && { modules }) + ...(modules && { + modules: modules.map((modules) => ({ + ...modules, + outputs: modules.outputs.sort((a, b) => { + // finish output always at last + if (a.key === SystemOutputEnum.finish) return 1; + if (b.key === SystemOutputEnum.finish) return -1; + return 0; + }) + })) + }) } ); diff --git a/projects/app/src/pages/api/v1/chat/completions.ts b/projects/app/src/pages/api/v1/chat/completions.ts index 65485aea1..4adb8caef 100644 --- a/projects/app/src/pages/api/v1/chat/completions.ts +++ b/projects/app/src/pages/api/v1/chat/completions.ts @@ -29,7 +29,7 @@ import { pushChatBill } from '@/service/common/bill/push'; import { BillSourceEnum } from '@/constants/user'; import { ChatHistoryItemResType } from '@/types/chat'; import type { UserModelSchema } from '@fastgpt/global/support/user/type'; -import { SystemInputEnum } from '@/constants/app'; +import { SystemInputEnum, SystemOutputEnum } from '@/constants/app'; import { getSystemTime } from '@fastgpt/global/common/time/timezone'; import { authOutLinkChat } from '@fastgpt/service/support/outLink/auth'; import { pushResult2Remote, updateOutLinkUsage } from '@fastgpt/service/support/outLink/tools'; @@ -431,7 +431,7 @@ export async function dispatchModules({ inputs: params }; - const dispatchRes = await (async () => { + const dispatchRes: Record = await (async () => { const callbackMap: Record = { [FlowModuleTypeEnum.historyNode]: dispatchHistory, [FlowModuleTypeEnum.questionInput]: dispatchChatInput, @@ -449,7 +449,10 @@ export async function dispatchModules({ return {}; })(); - return moduleOutput(module, dispatchRes); + return moduleOutput(module, { + [SystemOutputEnum.finish]: true, + ...dispatchRes + }); } // start process width initInput diff --git a/projects/app/src/pages/app/detail/components/AIChatSettingsModal.tsx b/projects/app/src/pages/app/detail/components/AIChatSettingsModal.tsx index 2963f8dac..dcc5a3645 100644 --- a/projects/app/src/pages/app/detail/components/AIChatSettingsModal.tsx +++ b/projects/app/src/pages/app/detail/components/AIChatSettingsModal.tsx @@ -66,7 +66,7 @@ const AIChatSettingsModal = ({ isOpen title={ - {t('app.AI Settings')} + {t('app.AI Advanced Settings')} {feConfigs?.show_doc && ( ({ - ...item, - targets: [] as FlowOutputTargetItemType[] - })) - .sort((a, b) => (a.key === SystemOutputEnum.finish ? 1 : -1)) // finish output always at last + outputs: item.data.outputs.map((item) => ({ + ...item, + targets: [] as FlowOutputTargetItemType[] + })) })); // update inputs and outputs @@ -100,7 +98,7 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({ } return updateAppDetail(app._id, { - modules: modules, + modules, type: AppTypeEnum.advanced }); }, diff --git a/projects/app/src/pages/app/detail/components/AdEdit/components/render/RenderOutput.tsx b/projects/app/src/pages/app/detail/components/AdEdit/components/render/RenderOutput.tsx index e23ba7f34..b2e2a59e8 100644 --- a/projects/app/src/pages/app/detail/components/AdEdit/components/render/RenderOutput.tsx +++ b/projects/app/src/pages/app/detail/components/AdEdit/components/render/RenderOutput.tsx @@ -128,9 +128,15 @@ const RenderOutput = ({ flowOutputList: FlowOutputItemType[]; }) => { const sortOutput = useMemo( - () => [...flowOutputList].sort((a, b) => (a.key === SystemOutputEnum.finish ? -1 : 1)), + () => + [...flowOutputList].sort((a, b) => { + if (a.key === SystemOutputEnum.finish) return -1; + if (b.key === SystemOutputEnum.finish) return 1; + return 0; + }), [flowOutputList] ); + return ( <> {sortOutput.map( diff --git a/projects/app/src/pages/app/detail/components/BasicEdit/index.tsx b/projects/app/src/pages/app/detail/components/BasicEdit/index.tsx index c6b7d5449..b83b9939e 100644 --- a/projects/app/src/pages/app/detail/components/BasicEdit/index.tsx +++ b/projects/app/src/pages/app/detail/components/BasicEdit/index.tsx @@ -82,7 +82,8 @@ const Settings = ({ appId }: { appId: string }) => { const [refresh, setRefresh] = useState(false); const { openConfirm: openConfirmSave, ConfirmModal: ConfirmSaveModal } = useConfirm({ - content: t('app.Confirm Save App Tip') + content: t('app.Confirm Save App Tip'), + bg: appDetail.type === AppTypeEnum.basic ? '' : 'red.600' }); const { openConfirm: openConfirmDel, ConfirmModal: ConfirmDelModal } = useConfirm({ content: t('app.Confirm Del App Tip') @@ -211,7 +212,7 @@ const Settings = ({ appId }: { appId: string }) => { > - 基础信息 + {t('app.Basic Settings')} ( @@ -310,6 +311,7 @@ const Settings = ({ appId }: { appId: string }) => { isLoading={isSaving} fontSize={'sm'} size={['sm', 'md']} + variant={appDetail.type === AppTypeEnum.basic ? 'primary' : 'base'} onClick={() => { if (appDetail.type !== AppTypeEnum.basic) { openConfirmSave(handleSubmit((data) => onSubmitSave(data)))(); @@ -398,21 +400,21 @@ const Settings = ({ appId }: { appId: string }) => { )} - {/* model */} + {/* ai */} - AI 配置 + {t('app.AI Settings')} - 高级配置 + {t('app.Open AI Advanced Settings')} - 对话模型 + {t('core.ai.Model')} { - 提示词 + {t('core.ai.Prompt')} @@ -451,24 +453,29 @@ const Settings = ({ appId }: { appId: string }) => { - 知识库 + {t('core.dataset.Choose Dataset')} - 选择 + {t('common.Choose')} - 参数 + {t('common.Params')} - 相似度: {getValues('kb.searchSimilarity')}, 单次搜索数量: {getValues('kb.searchLimit')}, - 空搜索时拒绝回复: {getValues('kb.searchEmptyText') !== '' ? 'true' : 'false'} + {t('core.dataset.Similarity')}: {getValues('kb.searchSimilarity')},{' '} + {t('core.dataset.Search Top K')}: {getValues('kb.searchLimit')} + {getValues('kb.searchEmptyText') === '' ? '' : t('core.dataset.Set Empty Result Tip')} - + {selectDatasets.map((item) => ( - + { - 下一步指引 + {t('core.app.Next Step Guide')} @@ -635,9 +642,9 @@ const ChatTest = ({ appId }: { appId: string }) => { - 调试预览 + {t('app.Chat Debug')} - + - - - {filterKbList.selected.map((item) => - (() => { - return ( - - - - - {item.name} - - { - setSelectedKbList((state) => - state.filter((kb) => kb.datasetId !== item._id) - ); - }} - /> - - - ); - })() - )} - - - {filterKbList.selected.length > 0 && } - - - {filterKbList.unSelected.map((item) => - (() => { - return ( - + + + + {filterKbList.selected.map((item) => + (() => { + return ( { - if (item.type === DatasetTypeEnum.folder) { - setParentId(item._id); - } else if (item.type === DatasetTypeEnum.dataset) { - const vectorModel = selectedKbList[0]?.vectorModel?.model; - - if (vectorModel && vectorModel !== item.vectorModel.model) { - return toast({ - status: 'warning', - title: '仅能选择同一个索引模型的知识库' - }); - } - setSelectedKbList((state) => [ - ...state, - { datasetId: item._id, vectorModel: item.vectorModel } - ]); - } - }} + bg={'myBlue.300'} > - + {item.name} - - - {item.type === DatasetTypeEnum.folder ? ( - {t('Folder')} - ) : ( - <> - - {item.vectorModel.name} - - )} + { + setSelectedKbList((state) => + state.filter((kb) => kb.datasetId !== item._id) + ); + }} + /> - - ); - })() + ); + })() + )} + + + {filterKbList.selected.length > 0 && } + + + {filterKbList.unSelected.map((item) => + (() => { + return ( + + { + if (item.type === DatasetTypeEnum.folder) { + setParentId(item._id); + } else if (item.type === DatasetTypeEnum.dataset) { + const vectorModel = selectedKbList[0]?.vectorModel?.model; + + if (vectorModel && vectorModel !== item.vectorModel.model) { + return toast({ + status: 'warning', + title: '仅能选择同一个索引模型的知识库' + }); + } + setSelectedKbList((state) => [ + ...state, + { datasetId: item._id, vectorModel: item.vectorModel } + ]); + } + }} + > + + + + {item.name} + + + + {item.type === DatasetTypeEnum.folder ? ( + {t('Folder')} + ) : ( + <> + + {item.vectorModel.name} + + )} + + + + ); + })() + )} + + {filterKbList.unSelected.length === 0 && ( + + + + 这个目录已经没东西可选了~ + + )} - - {filterKbList.unSelected.length === 0 && ( - - - - 这个目录已经没东西可选了~ - - - )} - + - - - + onClose(); + onChange(filterKbList); + }} + > + 完成 + + + ); }; diff --git a/projects/app/src/pages/dataset/detail/components/CollectionCard.tsx b/projects/app/src/pages/dataset/detail/components/CollectionCard.tsx index 8cf9a81f9..fb6481fee 100644 --- a/projects/app/src/pages/dataset/detail/components/CollectionCard.tsx +++ b/projects/app/src/pages/dataset/detail/components/CollectionCard.tsx @@ -47,7 +47,6 @@ import { getCollectionIcon } from '@fastgpt/global/core/dataset/utils'; import EditFolderModal, { useEditFolder } from '../../component/EditFolderModal'; import { TabEnum } from '..'; import ParentPath from '@/components/common/ParentPaths'; -import { useDatasetStore } from '@/web/core/dataset/store/dataset'; import dynamic from 'next/dynamic'; import { useDrag } from '@/web/common/hooks/useDrag'; import SelectCollections from '@/web/core/dataset/components/SelectCollections'; @@ -68,7 +67,6 @@ const CollectionCard = () => { const { isPc } = useSystemStore(); const [searchText, setSearchText] = useState(''); const { setLoading } = useSystemStore(); - const { datasetDetail, loadDatasetDetail } = useDatasetStore(); const { openConfirm, ConfirmModal } = useConfirm({ content: t('dataset.Confirm to delete the file') @@ -114,8 +112,7 @@ const CollectionCard = () => { } }); - const { moveDataId, setMoveDataId, dragStartId, setDragStartId, dragTargetId, setDragTargetId } = - useDrag(); + const { dragStartId, setDragStartId, dragTargetId, setDragTargetId } = useDrag(); // change search const debounceRefetch = useCallback( @@ -209,7 +206,6 @@ const CollectionCard = () => { getDatasetCollectionPathById(parentId) ); - useQuery(['loadDatasetDetail', datasetId], () => loadDatasetDetail(datasetId)); useQuery( ['refreshCollection'], () => { @@ -279,7 +275,7 @@ const CollectionCard = () => { )} { > - - {t('Create New')} + + {t('dataset.collections.Create And Import')} } @@ -410,7 +408,7 @@ const CollectionCard = () => { } }} > - + {''} diff --git a/projects/app/src/pages/dataset/detail/components/DataCard.tsx b/projects/app/src/pages/dataset/detail/components/DataCard.tsx index 4aa5f536e..8e8c1d5df 100644 --- a/projects/app/src/pages/dataset/detail/components/DataCard.tsx +++ b/projects/app/src/pages/dataset/detail/components/DataCard.tsx @@ -100,14 +100,23 @@ const DataCard = () => { } /> - {''} - + {''} + + + + + 文件ID:{' '} + + {collection?._id} + + +