- | {item.label} |
+
+
+ |
+ {item.label} |
{item.key} |
{item.required ? '✔' : ''} |
@@ -190,18 +206,21 @@ const VariableEdit = ({
{t('core.module.Field Type')}
-
+
{VariableTypeList.map((item) => (
- {item.label}
+ {item.label}
))}
@@ -225,14 +244,14 @@ const VariableEdit = ({
{t('core.module.variable.text max length')}
-
+
@@ -258,16 +277,18 @@ const VariableEdit = ({
})}
/>
- removeEnums(i)}
- />
+ {selectEnums.length > 1 && (
+ removeEnums(i)}
+ />
+ )}
))}
diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput.tsx
index 80d463ee6..c485764ce 100644
--- a/projects/app/src/components/core/module/Flow/components/render/RenderInput.tsx
+++ b/projects/app/src/components/core/module/Flow/components/render/RenderInput.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo, useState } from 'react';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
import type { SelectAppItemType } from '@fastgpt/global/core/module/type';
import type { FlowNodeInputItemType } from '@fastgpt/global/core/module/node/type';
import {
@@ -36,11 +36,13 @@ import type { SelectedDatasetType } from '@fastgpt/global/core/module/api.d';
import { useQuery } from '@tanstack/react-query';
import type { EditFieldModeType, EditFieldType } from '../modules/FieldEditModal';
import { feConfigs } from '@/web/common/system/staticData';
+import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constant';
const FieldEditModal = dynamic(() => import('../modules/FieldEditModal'));
const SelectAppModal = dynamic(() => import('../../SelectAppModal'));
const AIChatSettingsModal = dynamic(() => import('../../../AIChatSettingsModal'));
const DatasetSelectModal = dynamic(() => import('../../../DatasetSelectModal'));
+const DatasetParamsModal = dynamic(() => import('../../../DatasetParamsModal'));
export const Label = React.memo(function Label({
moduleId,
@@ -232,6 +234,9 @@ const RenderInput = ({
{item.type === FlowNodeInputTypeEnum.selectDataset && (
)}
+ {item.type === FlowNodeInputTypeEnum.selectDatasetParamsModal && (
+
+ )}
{item.type === FlowNodeInputTypeEnum.custom && CustomComponent[item.key] && (
<>{CustomComponent[item.key]({ ...item })}>
)}
@@ -251,7 +256,7 @@ type RenderProps = {
moduleId: string;
};
-var NumberInputRender = React.memo(function NumberInputRender({ item, moduleId }: RenderProps) {
+const NumberInputRender = React.memo(function NumberInputRender({ item, moduleId }: RenderProps) {
return (
{
const obj: Record = {};
@@ -440,15 +445,15 @@ var AISetting = React.memo(function AISetting({ inputs = [], moduleId }: RenderP
);
});
-var SelectChatModelRender = React.memo(function SelectChatModelRender({
+const SelectChatModelRender = React.memo(function SelectChatModelRender({
inputs = [],
item,
moduleId
}: RenderProps) {
const modelList = chatModelList || [];
- function onChangeModel(e: string) {
- {
+ const onChangeModel = useCallback(
+ (e: string) => {
onChangeNode({
moduleId,
type: 'updateInput',
@@ -477,8 +482,9 @@ var SelectChatModelRender = React.memo(function SelectChatModelRender({
value: model.maxResponse / 2
}
});
- }
- }
+ },
+ [inputs, item, modelList, moduleId]
+ );
const list = modelList.map((item) => {
const priceStr = `(${formatPrice(item.price, 1000)}元/1k Tokens)`;
@@ -489,9 +495,11 @@ var SelectChatModelRender = React.memo(function SelectChatModelRender({
};
});
- if (!item.value && list.length > 0) {
- onChangeModel(list[0].value);
- }
+ useEffect(() => {
+ if (!item.value && list.length > 0) {
+ onChangeModel(list[0].value);
+ }
+ }, [item.value, list, onChangeModel]);
return (
);
});
+
+const SelectDatasetParamsRender = React.memo(function SelectDatasetParamsRender({
+ inputs = [],
+ moduleId
+}: RenderProps) {
+ const { t } = useTranslation();
+ const [data, setData] = useState({
+ searchMode: DatasetSearchModeEnum.embedding,
+ limit: 5,
+ similarity: 0.5
+ });
+
+ const { isOpen, onOpen, onClose } = useDisclosure();
+
+ useEffect(() => {
+ inputs.forEach((input) => {
+ // @ts-ignore
+ if (data[input.key] !== undefined) {
+ setData((state) => ({
+ ...state,
+ [input.key]: input.value
+ }));
+ }
+ });
+ }, [inputs]);
+
+ return (
+ <>
+ }
+ onClick={onOpen}
+ >
+ {t('core.dataset.search.Params Setting')}
+
+ {isOpen && (
+ {
+ for (let key in e) {
+ const item = inputs.find((input) => input.key === key);
+ if (!item) continue;
+ onChangeNode({
+ moduleId,
+ type: 'updateInput',
+ key,
+ value: {
+ ...item,
+ //@ts-ignore
+ value: e[key]
+ }
+ });
+ }
+ }}
+ />
+ )}
+ >
+ );
+});
diff --git a/projects/app/src/components/support/apikey/Table.tsx b/projects/app/src/components/support/apikey/Table.tsx
index 63f48c467..2bfd452b6 100644
--- a/projects/app/src/components/support/apikey/Table.tsx
+++ b/projects/app/src/components/support/apikey/Table.tsx
@@ -82,14 +82,16 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
API 秘钥管理
-
- 查看文档
-
+ {feConfigs.docUrl && (
+
+ 查看文档
+
+ )}
{tips}
diff --git a/projects/app/src/global/common/api/systemRes.d.ts b/projects/app/src/global/common/api/systemRes.d.ts
index 69c68d6f4..30a567f17 100644
--- a/projects/app/src/global/common/api/systemRes.d.ts
+++ b/projects/app/src/global/common/api/systemRes.d.ts
@@ -4,7 +4,8 @@ import type {
LLMModelItemType,
VectorModelItemType,
AudioSpeechModels,
- WhisperModelType
+ WhisperModelType,
+ ReRankModelItemType
} from '@fastgpt/global/core/ai/model.d';
import type { FeConfigsType } from '@fastgpt/global/common/system/types/index.d';
@@ -19,6 +20,7 @@ export type ConfigFileType = {
ExtractModels: FunctionModelItemType[];
QGModels: LLMModelItemType[];
VectorModels: VectorModelItemType[];
+ ReRankModels: ReRankModelItemType[];
AudioSpeechModels: AudioSpeechModelType[];
WhisperModel: WhisperModelType;
};
@@ -29,6 +31,7 @@ export type InitDateResponse = {
extractModels: FunctionModelItemType[];
vectorModels: VectorModelItemType[];
audioSpeechModels: AudioSpeechModels[];
+ reRankModels: ReRankModelItemType[];
feConfigs: FeConfigsType;
priceMd: string;
systemVersion: string;
diff --git a/projects/app/src/global/core/app/constants.ts b/projects/app/src/global/core/app/constants.ts
index 8a844461f..47ca29e51 100644
--- a/projects/app/src/global/core/app/constants.ts
+++ b/projects/app/src/global/core/app/constants.ts
@@ -1,4 +1,5 @@
import { AppSimpleEditConfigTemplateType } from '@fastgpt/global/core/app/type.d';
+import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constant';
export const SimpleModeTemplate_FastGPT_Universal: AppSimpleEditConfigTemplateType = {
id: 'fastgpt-universal',
@@ -17,7 +18,7 @@ export const SimpleModeTemplate_FastGPT_Universal: AppSimpleEditConfigTemplateTy
datasets: true,
similarity: true,
limit: true,
- rerank: true,
+ searchMode: DatasetSearchModeEnum.embedding,
searchEmptyText: true
},
userGuide: {
diff --git a/projects/app/src/global/core/dataset/api.d.ts b/projects/app/src/global/core/dataset/api.d.ts
index 6c25dbeb8..1c9c0d9be 100644
--- a/projects/app/src/global/core/dataset/api.d.ts
+++ b/projects/app/src/global/core/dataset/api.d.ts
@@ -1,5 +1,5 @@
import { PushDatasetDataChunkProps } from '@fastgpt/global/core/dataset/api';
-import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constant';
+import { DatasetSearchModeEnum, TrainingModeEnum } from '@fastgpt/global/core/dataset/constant';
import {
DatasetDataIndexItemType,
SearchDataResponseItemType
@@ -43,7 +43,7 @@ export type SearchTestProps = {
datasetId: string;
text: string;
limit?: number;
- rerank?: boolean;
+ searchMode?: `${DatasetSearchModeEnum}`;
};
export type SearchTestResponse = {
list: SearchDataResponseItemType[];
diff --git a/projects/app/src/pages/_app.tsx b/projects/app/src/pages/_app.tsx
index 98a154e61..29dc4ab61 100644
--- a/projects/app/src/pages/_app.tsx
+++ b/projects/app/src/pages/_app.tsx
@@ -90,13 +90,15 @@ function App({ Component, pageProps }: AppProps) {
hiId && localStorage.setItem('inviterId', hiId);
}, [hiId]);
+ const title = feConfigs?.systemTitle || process.env.SYSTEM_NAME || '';
+
return (
<>
- {feConfigs?.systemTitle || process.env.SYSTEM_NAME || ''}
+ {title}
- {process.env.SYSTEM_NAME || 'FastGPT'}
diff --git a/projects/app/src/pages/api/admin/initv46-2.ts b/projects/app/src/pages/api/admin/initv46-2.ts
index 77d79943d..cbb1f83ab 100644
--- a/projects/app/src/pages/api/admin/initv46-2.ts
+++ b/projects/app/src/pages/api/admin/initv46-2.ts
@@ -152,6 +152,7 @@ async function init(limit: number): Promise {
collectionId: data.collection_id,
q: data.q,
a: data.a,
+ fullTextToken: '',
indexes: [
{
defaultIndex: !data.a,
diff --git a/projects/app/src/pages/api/admin/initv462-2.ts b/projects/app/src/pages/api/admin/initv462-2.ts
new file mode 100644
index 000000000..8212c0d04
--- /dev/null
+++ b/projects/app/src/pages/api/admin/initv462-2.ts
@@ -0,0 +1,80 @@
+import type { NextApiRequest, NextApiResponse } from 'next';
+import { jsonRes } from '@fastgpt/service/common/response';
+import { connectToDatabase } from '@/service/mongo';
+import { delay } from '@/utils/tools';
+import { authCert } from '@fastgpt/service/support/permission/auth/common';
+import { MongoApp } from '@fastgpt/service/core/app/schema';
+import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
+import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constant';
+import { ModuleDataTypeEnum, ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants';
+import { ModuleItemType } from '@fastgpt/global/core/module/type';
+
+let success = 0;
+/* pg 中的数据搬到 mongo dataset.datas 中,并做映射 */
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ try {
+ const { limit = 50 } = req.body as { limit: number };
+ await authCert({ req, authRoot: true });
+ await connectToDatabase();
+ success = 0;
+
+ console.log('total', await MongoApp.countDocuments());
+
+ await initApp(limit);
+
+ jsonRes(res, {
+ message: 'success'
+ });
+ } catch (error) {
+ console.log(error);
+
+ jsonRes(res, {
+ code: 500,
+ error
+ });
+ }
+}
+export async function initApp(limit = 50): Promise {
+ try {
+ const apps = await MongoApp.find({ inited: false }).limit(limit);
+ if (apps.length === 0) return;
+
+ const result = await Promise.allSettled(
+ apps.map(async (app) => {
+ // 遍历app的modules,找到 datasetSearch, 如果 rerank=true, searchMode = embFullTextReRank, 否则等于embedding
+ const modules = JSON.parse(JSON.stringify(app.modules)) as ModuleItemType[];
+ modules.forEach((module) => {
+ if (module.flowType === FlowNodeTypeEnum.datasetSearchNode) {
+ module.inputs.forEach((input, i) => {
+ if (input.key === 'rerank') {
+ const val = !!input.value as boolean;
+ module.inputs.splice(i, 1, {
+ key: ModuleInputKeyEnum.datasetSearchMode,
+ type: FlowNodeInputTypeEnum.hidden,
+ label: 'core.dataset.search.Mode',
+ valueType: ModuleDataTypeEnum.string,
+ showTargetInApp: false,
+ showTargetInPlugin: false,
+ value: val
+ ? DatasetSearchModeEnum.embFullTextReRank
+ : DatasetSearchModeEnum.embedding
+ });
+ }
+ });
+ }
+ });
+ app.modules = modules;
+ app.inited = true;
+ await app.save();
+ })
+ );
+
+ success += result.filter((item) => item.status === 'fulfilled').length;
+ console.log(`success: ${success}`);
+ return initApp(limit);
+ } catch (error) {
+ console.log(error);
+ await delay(1000);
+ return initApp(limit);
+ }
+}
diff --git a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts
index 5ee44bcf2..ca65f345f 100644
--- a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts
+++ b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts
@@ -8,6 +8,7 @@ import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d';
import type { ModuleItemType } from '@fastgpt/global/core/module/type';
import { FlowNodeInputTypeEnum } from '@fastgpt/global/core/module/node/constant';
import { FormatForm2ModulesProps } from '@fastgpt/global/core/app/api';
+import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constant';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
@@ -378,7 +379,7 @@ function datasetTemplate({
},
{
key: 'similarity',
- value: 0.5,
+ value: 0.4,
type: FlowNodeInputTypeEnum.slider,
label: '相似度',
connected: true
@@ -403,13 +404,23 @@ function datasetTemplate({
connected: true
},
{
- key: 'rerank',
- type: FlowNodeInputTypeEnum.switch,
- label: '结果重排',
- description: '将召回的结果进行进一步重排,可增加召回率',
- plusField: true,
- connected: true,
- value: true
+ key: 'searchMode',
+ type: 'hidden',
+ label: 'core.dataset.search.Mode',
+ valueType: 'string',
+ showTargetInApp: false,
+ showTargetInPlugin: false,
+ value: DatasetSearchModeEnum.embFullTextReRank,
+ connected: false
+ },
+ {
+ key: 'datasetParamsModal',
+ type: 'selectDatasetParamsModal',
+ label: '',
+ connected: false,
+ valueType: 'any',
+ showTargetInApp: false,
+ showTargetInPlugin: false
}
],
outputs: [
diff --git a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts
index 9e3b0e89c..1f157f974 100644
--- a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts
+++ b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts
@@ -312,13 +312,23 @@ function datasetTemplate(formData: AppSimpleEditFormType): ModuleItemType[] {
connected: true
},
{
- key: 'rerank',
- type: FlowNodeInputTypeEnum.switch,
- label: '结果重排',
- description: '将召回的结果进行进一步重排,可增加召回率',
- plusField: true,
+ key: 'searchMode',
+ type: 'hidden',
+ label: 'core.dataset.search.Mode',
+ valueType: 'string',
+ showTargetInApp: false,
+ showTargetInPlugin: false,
+ value: formData.dataset.searchMode,
+ connected: false
+ },
+ {
+ key: 'datasetParamsModal',
+ type: 'selectDatasetParamsModal',
+ label: '',
connected: false,
- value: formData.dataset.rerank
+ valueType: 'any',
+ showTargetInApp: false,
+ showTargetInPlugin: false
}
],
outputs: [
diff --git a/projects/app/src/pages/api/core/app/update.ts b/projects/app/src/pages/api/core/app/update.ts
index 7d2f121f3..c2526305a 100644
--- a/projects/app/src/pages/api/core/app/update.ts
+++ b/projects/app/src/pages/api/core/app/update.ts
@@ -4,7 +4,6 @@ import { connectToDatabase } from '@/service/mongo';
import { MongoApp } from '@fastgpt/service/core/app/schema';
import type { AppUpdateParams } from '@fastgpt/global/core/app/api';
import { authApp } from '@fastgpt/service/support/permission/auth/app';
-import { ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
/* 获取我的模型 */
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
diff --git a/projects/app/src/pages/api/core/dataset/exportAll.ts b/projects/app/src/pages/api/core/dataset/exportAll.ts
index e05ddc8a4..12b3030a1 100644
--- a/projects/app/src/pages/api/core/dataset/exportAll.ts
+++ b/projects/app/src/pages/api/core/dataset/exportAll.ts
@@ -67,8 +67,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
'limit.exportKbTime': new Date()
});
});
+
+ cursor.on('error', (err) => {
+ addLog.error(`export dataset error`, err);
+ res.status(500);
+ res.end();
+ });
} catch (err) {
res.status(500);
+ addLog.error(`export dataset error`, err);
jsonRes(res, {
code: 500,
error: err
diff --git a/projects/app/src/pages/api/core/dataset/searchTest.ts b/projects/app/src/pages/api/core/dataset/searchTest.ts
index aae2a02d6..1d4322c09 100644
--- a/projects/app/src/pages/api/core/dataset/searchTest.ts
+++ b/projects/app/src/pages/api/core/dataset/searchTest.ts
@@ -15,7 +15,7 @@ import { BillSourceEnum } from '@fastgpt/global/support/wallet/bill/constants';
export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
await connectToDatabase();
- const { datasetId, text, limit = 20, rerank } = req.body as SearchTestProps;
+ const { datasetId, text, limit = 20, searchMode } = req.body as SearchTestProps;
if (!datasetId || !text) {
throw new Error('缺少参数');
@@ -40,7 +40,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
model: dataset.vectorModel,
limit: Math.min(limit, 50),
datasetIds: [datasetId],
- rerank
+ searchMode
});
// push bill
diff --git a/projects/app/src/pages/api/system/getInitData.ts b/projects/app/src/pages/api/system/getInitData.ts
index 135515de8..d149540ce 100644
--- a/projects/app/src/pages/api/system/getInitData.ts
+++ b/projects/app/src/pages/api/system/getInitData.ts
@@ -14,7 +14,8 @@ import {
defaultQGModels,
defaultVectorModels,
defaultAudioSpeechModels,
- defaultWhisperModel
+ defaultWhisperModel,
+ defaultReRankModels
} from '@fastgpt/global/core/ai/model';
import { SimpleModeTemplate_FastGPT_Universal } from '@/global/core/app/constants';
import { getSimpleTemplatesFromPlus } from '@/service/core/app/utils';
@@ -31,11 +32,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
cqModels: global.cqModels,
extractModels: global.extractModels,
vectorModels: global.vectorModels,
- audioSpeechModels: global.audioSpeechModels.map((item) => ({
+ reRankModels: global.reRankModels.map((item) => ({
...item,
- baseUrl: undefined,
- key: undefined
+ requestUrl: undefined,
+ requestAuth: undefined
})),
+ audioSpeechModels: global.audioSpeechModels,
priceMd: global.priceMd,
systemVersion: global.systemVersion || '0.0.0',
simpleModeTemplates: global.simpleModeTemplates
@@ -50,12 +52,11 @@ const defaultSystemEnv: SystemEnvType = {
};
const defaultFeConfigs: FeConfigsType = {
show_emptyChat: true,
- show_contact: true,
show_git: true,
- docUrl: 'https://docs.fastgpt.in',
+ show_register: false,
+ docUrl: 'https://doc.fastgpt.in',
openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi',
systemTitle: 'FastGPT',
- authorText: 'Made by FastGPT Team.',
limit: {
exportLimitMinutes: 0
},
@@ -99,7 +100,14 @@ export function setDefaultData(res?: ConfigFileType) {
? { ...defaultSystemEnv, ...res.SystemParams }
: defaultSystemEnv;
global.feConfigs = res?.FeConfig
- ? { ...defaultFeConfigs, ...res.FeConfig, isPlus: !!res.SystemParams?.pluginBaseUrl }
+ ? {
+ concatMd: res?.FeConfig?.show_git
+ ? '* 项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n* 交流群: '
+ : '',
+ ...defaultFeConfigs,
+ ...res.FeConfig,
+ isPlus: !!res.SystemParams?.pluginBaseUrl
+ }
: defaultFeConfigs;
global.chatModels = res?.ChatModels || defaultChatModels;
@@ -110,6 +118,8 @@ export function setDefaultData(res?: ConfigFileType) {
global.vectorModels = res?.VectorModels || defaultVectorModels;
+ global.reRankModels = res?.ReRankModels || defaultReRankModels;
+
global.audioSpeechModels = res?.AudioSpeechModels || defaultAudioSpeechModels;
global.whisperModel = res?.WhisperModel || defaultWhisperModel;
diff --git a/projects/app/src/pages/api/v1/embeddings.ts b/projects/app/src/pages/api/v1/embeddings.ts
index 157a8d91c..8ddec5e3d 100644
--- a/projects/app/src/pages/api/v1/embeddings.ts
+++ b/projects/app/src/pages/api/v1/embeddings.ts
@@ -15,7 +15,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
try {
let { input, model, billId } = req.body as Props;
await connectToDatabase();
- const { teamId, tmbId } = await authCert({ req, authToken: true });
+ const { teamId, tmbId } = await authCert({ req, authToken: true, authApiKey: true });
if (!Array.isArray(input) || typeof input !== 'string') {
throw new Error('input is nor array or string');
diff --git a/projects/app/src/pages/api/v1/rerank.ts b/projects/app/src/pages/api/v1/rerank.ts
new file mode 100644
index 000000000..03d097254
--- /dev/null
+++ b/projects/app/src/pages/api/v1/rerank.ts
@@ -0,0 +1,42 @@
+import type { NextApiRequest, NextApiResponse } from 'next';
+import { jsonRes } from '@fastgpt/service/common/response';
+import { authCert } from '@fastgpt/service/support/permission/auth/common';
+import { withNextCors } from '@fastgpt/service/common/middle/cors';
+import { pushReRankBill } from '@/service/support/wallet/bill/push';
+import { connectToDatabase } from '@/service/mongo';
+import { authTeamBalance } from '@/service/support/permission/auth/bill';
+import { PostReRankProps } from '@fastgpt/global/core/ai/api';
+import { reRankRecall } from '@/service/core/ai/rerank';
+
+export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse) {
+ try {
+ let { query, inputs } = req.body as PostReRankProps;
+ await connectToDatabase();
+ const { teamId, tmbId } = await authCert({
+ req,
+ authApiKey: true
+ });
+ await authTeamBalance(teamId);
+
+ // max 150 length
+ inputs = inputs.slice(0, 150);
+
+ const result = await reRankRecall({ query, inputs });
+
+ pushReRankBill({
+ teamId,
+ tmbId,
+ source: 'api'
+ });
+
+ jsonRes(res, {
+ data: result
+ });
+ } catch (err) {
+ console.log(err);
+ jsonRes(res, {
+ code: 500,
+ error: err
+ });
+ }
+});
diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx
index 2c3be635f..ac8691e41 100644
--- a/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx
+++ b/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx
@@ -33,7 +33,6 @@ import { AppSchema } from '@fastgpt/global/core/app/type.d';
import { delModelById } from '@/web/core/app/api';
import { useTranslation } from 'next-i18next';
import { getGuideModule } from '@fastgpt/global/core/module/utils';
-import { DatasetParamsModal } from '@/components/core/module/DatasetSelectModal';
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useAppStore } from '@/web/core/app/store/useAppStore';
@@ -56,6 +55,7 @@ import VariableEdit from '@/components/core/module/Flow/components/modules/Varia
const InfoModal = dynamic(() => import('../InfoModal'));
const DatasetSelectModal = dynamic(() => import('@/components/core/module/DatasetSelectModal'));
+const DatasetParamsModal = dynamic(() => import('@/components/core/module/DatasetParamsModal'));
const AIChatSettingsModal = dynamic(() => import('@/components/core/module/AIChatSettingsModal'));
function ConfigForm({
@@ -72,7 +72,6 @@ function ConfigForm({
const { appDetail, updateAppDetail } = useAppStore();
const { loadAllDatasets, allDatasets } = useDatasetStore();
const { isPc } = useSystemStore();
- const [editVariable, setEditVariable] = useState();
const [refresh, setRefresh] = useState(false);
const { register, setValue, getValues, reset, handleSubmit, control } =
@@ -197,8 +196,8 @@ function ConfigForm({
})}
>
- 应用配置
-
+ {t('core.app.App params config')}
+
@@ -215,7 +214,7 @@ function ConfigForm({
}
}}
>
- {isPc ? '保存并预览' : '保存'}
+ {isPc ? t('core.app.Save and preview') : t('common.Save')}
@@ -248,7 +247,7 @@ function ConfigForm({
- 对话开场白
+ {t('core.app.Welcome Text')}
@@ -351,7 +350,7 @@ function ConfigForm({
)}
{(selectSimpleTemplate.systemForm.dataset.limit ||
- selectSimpleTemplate.systemForm.dataset.rerank ||
+ selectSimpleTemplate.systemForm.dataset.searchMode ||
selectSimpleTemplate.systemForm.dataset.searchEmptyText ||
selectSimpleTemplate.systemForm.dataset.similarity) && (
@@ -459,7 +458,7 @@ function ConfigForm({
{
+ onSuccess={(e) => {
setValue('dataset', {
...getValues('dataset'),
...e
diff --git a/projects/app/src/pages/app/list/index.tsx b/projects/app/src/pages/app/list/index.tsx
index 2bcaea6bf..a8cecb55b 100644
--- a/projects/app/src/pages/app/list/index.tsx
+++ b/projects/app/src/pages/app/list/index.tsx
@@ -66,12 +66,12 @@ const MyApps = () => {
);
/* 加载模型 */
- useQuery(['loadApps'], () => loadMyApps(true), {
+ const { isFetching } = useQuery(['loadApps'], () => loadMyApps(true), {
refetchOnMount: true
});
return (
-
+
diff --git a/projects/app/src/pages/components/Navbar.tsx b/projects/app/src/pages/components/Navbar.tsx
index 68fc51a7d..92a993a0d 100644
--- a/projects/app/src/pages/components/Navbar.tsx
+++ b/projects/app/src/pages/components/Navbar.tsx
@@ -20,7 +20,7 @@ const Navbar = () => {
const { isOpen: isOpenMenu, onOpen: onOpenMenu, onClose: onCloseMenu } = useDisclosure();
const { isPc } = useSystemStore();
const menuList = [
- ...(feConfigs?.show_contact
+ ...(feConfigs?.concatMd
? [
{
label: t('home.Commercial'),
diff --git a/projects/app/src/pages/dataset/detail/components/Import/Csv.tsx b/projects/app/src/pages/dataset/detail/components/Import/Csv.tsx
index 9ff7a8a39..76ee37018 100644
--- a/projects/app/src/pages/dataset/detail/components/Import/Csv.tsx
+++ b/projects/app/src/pages/dataset/detail/components/Import/Csv.tsx
@@ -5,7 +5,10 @@ import { useImportStore, SelectorContainer, PreviewFileOrChunk } from './Provide
import { useTranslation } from 'next-i18next';
const fileExtension = '.csv';
-const csvTemplate = `index,content\n"被索引的内容","对应的答案。CSV 中请注意内容不能包含双引号,双引号是列分割符号"\n"什么是 laf","laf 是一个云函数开发平台……",""\n"什么是 sealos","Sealos 是以 kubernetes 为内核的云操作系统发行版,可以……"`;
+const csvTemplate = `index,content
+"必填内容","可选内容。CSV 中请注意内容不能包含双引号,双引号是列分割符号"
+"结合人工智能的演进历程,AIGC的发展大致可以分为三个阶段,即:早期萌芽阶段(20世纪50年代至90年代中期)、沉淀积累阶段(20世纪90年代中期至21世纪10年代中期),以及快速发展展阶段(21世纪10年代中期至今)。",""
+"AIGC发展分为几个阶段?","早期萌芽阶段(20世纪50年代至90年代中期)、沉淀积累阶段(20世纪90年代中期至21世纪10年代中期)、快速发展展阶段(21世纪10年代中期至今)"`;
const CsvImport = () => {
const { t } = useTranslation();
diff --git a/projects/app/src/pages/dataset/detail/components/Test.tsx b/projects/app/src/pages/dataset/detail/components/Test.tsx
index 9224d41d3..69a5d9c3a 100644
--- a/projects/app/src/pages/dataset/detail/components/Test.tsx
+++ b/projects/app/src/pages/dataset/detail/components/Test.tsx
@@ -1,5 +1,15 @@
import React, { useEffect, useMemo, useState } from 'react';
-import { Box, Textarea, Button, Flex, useTheme, Grid, Progress, Switch } from '@chakra-ui/react';
+import {
+ Box,
+ Textarea,
+ Button,
+ Flex,
+ useTheme,
+ Grid,
+ Progress,
+ Switch,
+ useDisclosure
+} from '@chakra-ui/react';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useSearchTestStore, SearchTestStoreItemType } from '@/web/core/dataset/store/searchTest';
import { getDatasetDataItemById, postSearchText } from '@/web/core/dataset/api';
@@ -13,12 +23,14 @@ import { useToast } from '@/web/common/hooks/useToast';
import { customAlphabet } from 'nanoid';
import MyTooltip from '@/components/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
-import { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import { useTranslation } from 'next-i18next';
-import { feConfigs } from '@/web/common/system/staticData';
-import { SearchTestResponse } from '../../../../global/core/dataset/api';
+import { SearchTestResponse } from '@/global/core/dataset/api';
+import { DatasetSearchModeEnum, DatasetSearchModeMap } from '@fastgpt/global/core/dataset/constant';
+import dynamic from 'next/dynamic';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12);
+const DatasetParamsModal = dynamic(() => import('@/components/core/module/DatasetParamsModal'));
+
const Test = ({ datasetId }: { datasetId: string }) => {
const { t } = useTranslation();
const theme = useTheme();
@@ -30,15 +42,24 @@ const Test = ({ datasetId }: { datasetId: string }) => {
const [inputText, setInputText] = useState('');
const [datasetTestItem, setDatasetTestItem] = useState();
const [editInputData, setEditInputData] = useState();
- const [rerank, setRerank] = useState(false);
+ const [searchMode, setSearchMode] = useState<`${DatasetSearchModeEnum}`>(
+ DatasetSearchModeEnum.embedding
+ );
+ const searchModeData = DatasetSearchModeMap[searchMode];
- const kbTestHistory = useMemo(
+ const {
+ isOpen: isOpenSelectMode,
+ onOpen: onOpenSelectMode,
+ onClose: onCloseSelectMode
+ } = useDisclosure();
+
+ const testHistories = useMemo(
() => datasetTestList.filter((item) => item.datasetId === datasetId),
[datasetId, datasetTestList]
);
const { mutate, isLoading } = useRequest({
- mutationFn: () => postSearchText({ datasetId, text: inputText.trim(), rerank, limit: 30 }),
+ mutationFn: () => postSearchText({ datasetId, text: inputText.trim(), searchMode, limit: 30 }),
onSuccess(res: SearchTestResponse) {
if (!res || res.list.length === 0) {
return toast({
@@ -71,6 +92,7 @@ const Test = ({ datasetId }: { datasetId: string }) => {
return (
+ {/* input */}
{
{t('core.dataset.test.Test Text')}
- {feConfigs?.isPlus && (
-
- {t('dataset.recall.rerank')}
- setRerank(e.target.checked)} />
-
- )}
+ }
+ size={'sm'}
+ onClick={onOpenSelectMode}
+ >
+ {t(searchModeData.title)}
+
- {kbTestHistory.map((item) => (
+ {testHistories.map((item) => (
{
+ {/* result show */}
{!datasetTestItem?.results || datasetTestItem.results.length === 0 ? (
{
}}
/>
)}
+ {isOpenSelectMode && (
+ {
+ setSearchMode(e.searchMode);
+ }}
+ />
+ )}
);
};
diff --git a/projects/app/src/pages/login/components/LoginForm.tsx b/projects/app/src/pages/login/components/LoginForm.tsx
index 10395b763..4f193ace4 100644
--- a/projects/app/src/pages/login/components/LoginForm.tsx
+++ b/projects/app/src/pages/login/components/LoginForm.tsx
@@ -11,7 +11,6 @@ import { feConfigs } from '@/web/common/system/staticData';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import MyIcon from '@/components/Icon';
import { customAlphabet } from 'nanoid';
-import { useUserStore } from '@/web/support/user/useUserStore';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 8);
interface Props {
@@ -86,6 +85,8 @@ const LoginForm = ({ setPageType, loginSuccess }: Props) => {
: [])
];
+ const isCommunityVersion = feConfigs?.show_register === false && feConfigs?.show_git;
+
return (
<>
@@ -94,7 +95,7 @@ const LoginForm = ({ setPageType, loginSuccess }: Props) => {
|