@lobehub/chat 0.105.2 → 0.107.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/README.md +18 -0
- package/README.zh-CN.md +18 -0
- package/docs/Environment-Variable.md +4 -2
- package/docs/Environment-Variable.zh-CN.md +4 -2
- package/locales/en_US/common.json +19 -0
- package/locales/en_US/migration.json +45 -0
- package/locales/en_US/setting.json +7 -7
- package/locales/ja_JP/common.json +19 -0
- package/locales/ja_JP/migration.json +45 -0
- package/locales/ja_JP/setting.json +2 -2
- package/locales/ko_KR/common.json +19 -0
- package/locales/ko_KR/migration.json +45 -0
- package/locales/ko_KR/setting.json +2 -2
- package/locales/ru_RU/common.json +19 -0
- package/locales/ru_RU/migration.json +45 -0
- package/locales/ru_RU/setting.json +2 -2
- package/locales/zh_CN/common.json +19 -0
- package/locales/zh_CN/migration.json +45 -0
- package/locales/zh_CN/setting.json +1 -1
- package/locales/zh_TW/common.json +19 -0
- package/locales/zh_TW/migration.json +45 -0
- package/locales/zh_TW/setting.json +2 -2
- package/package.json +2 -1
- package/src/app/api/openai/chat/createChatCompletion.test.ts +4 -4
- package/src/app/api/openai/chat/createChatCompletion.ts +4 -10
- package/src/app/api/openai/createBizOpenAI/index.ts +1 -1
- package/src/app/api/openai/errorResponse.test.ts +1 -1
- package/src/app/chat/(desktop)/features/ChatInput/Footer/index.tsx +2 -1
- package/src/app/chat/(mobile)/features/ChatInput/SendButton.tsx +2 -2
- package/src/app/chat/features/ChatHeader/ShareButton/Inner.tsx +2 -5
- package/src/app/chat/features/ChatHeader/ShareButton/index.tsx +2 -2
- package/src/app/chat/features/ChatInput/ActionBar/Clear.tsx +2 -2
- package/src/app/chat/features/ChatInput/ActionBar/ModelSwitch.tsx +1 -1
- package/src/app/chat/features/ChatInput/ActionBar/Token/TokenTag.tsx +8 -2
- package/src/app/chat/features/ChatInput/InputAreaInner/index.tsx +2 -2
- package/src/app/chat/features/ChatInput/STT/index.tsx +2 -2
- package/src/app/chat/features/ChatInput/Topic/index.tsx +2 -2
- package/src/app/chat/features/ChatInput/useSend.ts +3 -3
- package/src/app/chat/features/Conversation/ChatList/Actions/index.ts +2 -2
- package/src/app/chat/features/Conversation/ChatList/Error/ApiKeyForm.tsx +2 -2
- package/src/app/chat/features/Conversation/ChatList/Error/InvalidAccess.tsx +2 -2
- package/src/app/chat/features/Conversation/ChatList/Error/Plugin/PluginSettings.tsx +2 -2
- package/src/app/chat/features/Conversation/ChatList/Extras/Assistant.test.tsx +4 -4
- package/src/app/chat/features/Conversation/ChatList/Extras/Assistant.tsx +30 -31
- package/src/app/chat/features/Conversation/ChatList/Extras/TTS.tsx +2 -2
- package/src/app/chat/features/Conversation/ChatList/Extras/Translate.tsx +2 -2
- package/src/app/chat/features/Conversation/ChatList/Extras/User.tsx +8 -5
- package/src/app/chat/features/Conversation/ChatList/Extras/index.ts +3 -3
- package/src/app/chat/features/Conversation/ChatList/Extras/type.ts +5 -0
- package/src/app/chat/features/Conversation/ChatList/Messages/Assistant.tsx +10 -6
- package/src/app/chat/features/Conversation/ChatList/Messages/Default.tsx +7 -3
- package/src/app/chat/features/Conversation/ChatList/Messages/Function.tsx +7 -6
- package/src/app/chat/features/Conversation/ChatList/Messages/index.ts +7 -7
- package/src/app/chat/features/Conversation/ChatList/Plugins/Render/StandaloneType/Iframe.tsx +6 -6
- package/src/app/chat/features/Conversation/ChatList/index.tsx +16 -24
- package/src/app/chat/features/Conversation/ScrollAnchor/index.tsx +2 -2
- package/src/app/chat/features/Conversation/index.tsx +3 -3
- package/src/app/chat/features/Conversation/useInitConversation.ts +43 -0
- package/src/app/chat/features/Migration/ExportConfigButton.tsx +33 -0
- package/src/app/chat/features/Migration/Failed.tsx +115 -0
- package/src/app/chat/features/Migration/Modal.tsx +80 -0
- package/src/app/chat/features/Migration/Start.tsx +106 -0
- package/src/app/chat/features/Migration/UpgradeButton.tsx +74 -0
- package/src/app/chat/features/Migration/const.ts +15 -0
- package/src/app/chat/features/Migration/index.tsx +44 -0
- package/src/app/chat/features/SessionListContent/DefaultMode.tsx +54 -0
- package/src/app/chat/features/SessionListContent/List/Item/Actions.tsx +5 -4
- package/src/app/chat/features/SessionListContent/List/Item/index.tsx +22 -28
- package/src/app/chat/features/SessionListContent/SearchMode.tsx +15 -0
- package/src/app/chat/features/SessionListContent/index.tsx +4 -44
- package/src/app/chat/features/SessionSearchBar/index.tsx +11 -3
- package/src/app/chat/features/TopicListContent/Header.tsx +4 -4
- package/src/app/chat/features/TopicListContent/Topic/TopicContent.tsx +11 -9
- package/src/app/chat/features/TopicListContent/Topic/TopicItem.tsx +15 -13
- package/src/app/chat/features/TopicListContent/Topic/index.tsx +9 -16
- package/src/app/chat/features/TopicListContent/TopicSearchBar/index.tsx +13 -4
- package/src/app/chat/features/TopicListContent/index.tsx +1 -2
- package/src/app/chat/page.tsx +6 -1
- package/src/app/chat/settings/features/HeaderContent.tsx +3 -3
- package/src/app/home/Redirect.tsx +13 -7
- package/src/app/settings/(mobile)/features/ExtraList.tsx +12 -4
- package/src/app/settings/common/Common.tsx +16 -4
- package/src/app/welcome/features/Banner/index.tsx +9 -10
- package/src/chains/summaryTitle.ts +5 -2
- package/src/components/DataStyleModal/index.tsx +64 -0
- package/src/config/client.ts +5 -0
- package/src/const/session.ts +21 -0
- package/src/const/settings.ts +1 -1
- package/src/database/core/__tests__/db.test.ts +8 -5
- package/src/database/core/__tests__/model.test.ts +3 -3
- package/src/database/core/db.ts +38 -10
- package/src/database/core/index.ts +1 -0
- package/src/database/core/model.ts +121 -10
- package/src/database/core/schemas.ts +22 -0
- package/src/database/core/types/db.ts +13 -0
- package/src/database/models/__DEBUG.ts +119 -0
- package/src/database/models/{file.test.ts → __tests__/file.test.ts} +19 -6
- package/src/database/models/__tests__/message.test.ts +314 -0
- package/src/database/models/__tests__/session.test.ts +117 -0
- package/src/database/models/__tests__/topic.test.ts +250 -0
- package/src/database/models/file.ts +9 -5
- package/src/database/models/message.ts +186 -0
- package/src/database/models/session.ts +160 -0
- package/src/database/models/topic.ts +196 -0
- package/src/{types/database → database/schemas}/files.ts +2 -2
- package/src/database/schemas/message.ts +37 -0
- package/src/database/schemas/session.ts +56 -0
- package/src/database/schemas/topic.ts +12 -0
- package/src/features/AgentSetting/AgentConfig/index.tsx +8 -1
- package/src/features/AgentSetting/AgentTTS/SelectWithTTSPreview.tsx +1 -1
- package/src/features/AgentSetting/store/action.ts +1 -1
- package/src/features/AgentSetting/store/initialState.ts +1 -1
- package/src/features/AgentSetting/store/reducers/config.ts +1 -1
- package/src/features/DataImporter/index.tsx +240 -0
- package/src/features/DebugUI/index.tsx +34 -0
- package/src/features/SideBar/BottomActions.tsx +8 -14
- package/src/hooks/useImportConfig.ts +13 -30
- package/src/hooks/useTTS.ts +1 -1
- package/src/layout/GlobalLayout/index.tsx +16 -1
- package/src/locales/default/common.ts +19 -0
- package/src/locales/default/migration.ts +47 -0
- package/src/locales/default/setting.ts +1 -1
- package/src/locales/resources/en_US.ts +2 -0
- package/src/locales/resources/ja_JP.ts +2 -0
- package/src/locales/resources/ko_KR.ts +2 -0
- package/src/locales/resources/ru_RU.ts +2 -0
- package/src/locales/resources/zh_CN.ts +2 -0
- package/src/locales/resources/zh_TW.ts +2 -0
- package/src/migrations/FromV0ToV1.ts +2 -4
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +191 -0
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +202 -0
- package/src/migrations/FromV1ToV2/index.ts +82 -0
- package/src/migrations/FromV1ToV2/migrations.test.ts +224 -0
- package/src/migrations/FromV1ToV2/types/v1.ts +78 -0
- package/src/migrations/FromV1ToV2/types/v2.ts +52 -0
- package/src/{utils → migrations}/VersionController.test.ts +1 -3
- package/src/{utils → migrations}/VersionController.ts +5 -2
- package/src/migrations/index.ts +17 -3
- package/src/services/__tests__/file.test.ts +3 -3
- package/src/services/chat.ts +66 -5
- package/src/services/config.ts +184 -0
- package/src/services/debug.ts +13 -0
- package/src/services/file.ts +6 -2
- package/src/services/github.ts +25 -0
- package/src/services/message.ts +79 -0
- package/src/services/session.ts +63 -0
- package/src/services/topic.ts +56 -0
- package/src/store/chat/actions/enhance.ts +95 -0
- package/src/store/{session/slices/chat → chat}/actions/message.ts +225 -247
- package/src/store/{session/slices/chat → chat}/actions/plugin.ts +29 -34
- package/src/store/{session/slices/chat → chat}/actions/share.ts +9 -13
- package/src/store/chat/actions/topic.ts +197 -0
- package/src/store/chat/helpers.ts +23 -0
- package/src/store/chat/index.ts +3 -0
- package/src/store/chat/initialState.ts +48 -0
- package/src/store/chat/reducers/message.test.ts +83 -0
- package/src/store/chat/reducers/message.ts +83 -0
- package/src/store/chat/selectors/__tests__/topic.test.ts +43 -0
- package/src/store/chat/selectors/chat.ts +119 -0
- package/src/store/chat/selectors/index.ts +2 -0
- package/src/store/chat/selectors/topic.ts +28 -0
- package/src/store/chat/store.ts +63 -0
- package/src/store/files/slices/images/action.ts +6 -4
- package/src/store/global/selectors/__snapshots__/settings.test.ts.snap +99 -0
- package/src/store/global/selectors/settings.test.ts +51 -0
- package/src/store/global/selectors/settings.ts +36 -5
- package/src/store/global/store.ts +1 -1
- package/src/store/middleware/createHyperStorage/index.ts +40 -24
- package/src/store/middleware/createHyperStorage/keyMapper.ts +8 -2
- package/src/store/middleware/createHyperStorage/type.ts +10 -8
- package/src/store/plugin/slices/plugin/action.ts +1 -1
- package/src/store/plugin/store.ts +2 -4
- package/src/store/session/helpers.ts +1 -1
- package/src/store/session/hooks/useSessionHydrated.ts +6 -10
- package/src/store/session/initialState.ts +26 -7
- package/src/store/session/selectors.ts +1 -2
- package/src/store/session/slices/agent/action.ts +26 -35
- package/src/store/session/slices/agent/selectors.ts +32 -37
- package/src/store/session/slices/session/action.ts +81 -88
- package/src/store/session/slices/session/helpers.ts +19 -0
- package/src/store/session/slices/session/initialState.ts +7 -10
- package/src/store/session/slices/session/selectors/export.ts +12 -9
- package/src/store/session/slices/session/selectors/index.ts +2 -35
- package/src/store/session/slices/session/selectors/list.test.ts +25 -203
- package/src/store/session/slices/session/selectors/list.ts +40 -78
- package/src/store/session/store.ts +11 -17
- package/src/types/agent/index.ts +61 -0
- package/src/types/chatMessage.ts +11 -20
- package/src/types/exportConfig.ts +7 -2
- package/src/types/files.ts +2 -2
- package/src/types/llm.ts +1 -1
- package/src/types/meta.ts +24 -12
- package/src/types/openai/chat.ts +9 -1
- package/src/types/openai/functionCall.ts +4 -0
- package/src/types/session.ts +10 -94
- package/src/types/settings.ts +2 -0
- package/src/types/translate.ts +2 -1
- package/src/utils/config.ts +5 -11
- package/src/utils/fetch.ts +8 -2
- package/src/app/chat/features/Conversation/usePluginsInit.ts +0 -14
- package/src/database/core/schema.ts +0 -9
- package/src/helpers/export.ts +0 -69
- package/src/hooks/useExportConfig.ts +0 -6
- package/src/store/session/slices/chat/actions/index.ts +0 -32
- package/src/store/session/slices/chat/actions/topic.ts +0 -171
- package/src/store/session/slices/chat/actions/translate.ts +0 -113
- package/src/store/session/slices/chat/helpers.ts +0 -9
- package/src/store/session/slices/chat/initialState.ts +0 -13
- package/src/store/session/slices/chat/reducers/message.test.ts +0 -319
- package/src/store/session/slices/chat/reducers/message.ts +0 -156
- package/src/store/session/slices/chat/reducers/topic.test.ts +0 -179
- package/src/store/session/slices/chat/reducers/topic.ts +0 -81
- package/src/store/session/slices/chat/selectors/chat.ts +0 -111
- package/src/store/session/slices/chat/selectors/index.ts +0 -26
- package/src/store/session/slices/chat/selectors/topic.ts +0 -30
- package/src/store/session/slices/chat/selectors/utils.test.ts +0 -385
- package/src/store/session/slices/chat/selectors/utils.ts +0 -91
- package/src/store/session/slices/chat/utils.ts +0 -13
- package/src/store/session/slices/session/reducers/session.test.ts +0 -577
- package/src/store/session/slices/session/reducers/session.ts +0 -182
- package/src/types/database/db.ts +0 -4
- /package/src/store/{session/slices/chat → chat}/reducers/files.test.ts +0 -0
- /package/src/store/{session/slices/chat → chat}/reducers/files.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ActionIcon, DiscordIcon, Icon } from '@lobehub/ui';
|
|
2
|
-
import { Badge, ConfigProvider, Dropdown, MenuProps
|
|
2
|
+
import { Badge, ConfigProvider, Dropdown, MenuProps } from 'antd';
|
|
3
3
|
import {
|
|
4
4
|
Book,
|
|
5
5
|
Feather,
|
|
@@ -17,8 +17,8 @@ import { useTranslation } from 'react-i18next';
|
|
|
17
17
|
import { Flexbox } from 'react-layout-kit';
|
|
18
18
|
|
|
19
19
|
import { ABOUT, CHANGELOG, DISCORD, FEEDBACK, GITHUB, WIKI } from '@/const/url';
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
20
|
+
import DataImporter from '@/features/DataImporter';
|
|
21
|
+
import { configService } from '@/services/config';
|
|
22
22
|
import { GlobalStore, useGlobalStore } from '@/store/global';
|
|
23
23
|
import { SettingsTabs, SidebarTabKey } from '@/store/global/initialState';
|
|
24
24
|
|
|
@@ -30,8 +30,6 @@ export interface BottomActionProps {
|
|
|
30
30
|
const BottomActions = memo<BottomActionProps>(({ tab, setTab }) => {
|
|
31
31
|
const router = useRouter();
|
|
32
32
|
const { t } = useTranslation('common');
|
|
33
|
-
const { exportSessions, exportSettings, exportAll, exportAgents } = useExportConfig();
|
|
34
|
-
const { importConfig } = useImportConfig();
|
|
35
33
|
|
|
36
34
|
const [hasNewVersion, useCheckLatestVersion] = useGlobalStore((s) => [
|
|
37
35
|
s.hasNewVersion,
|
|
@@ -44,28 +42,24 @@ const BottomActions = memo<BottomActionProps>(({ tab, setTab }) => {
|
|
|
44
42
|
{
|
|
45
43
|
icon: <Icon icon={HardDriveUpload} />,
|
|
46
44
|
key: 'import',
|
|
47
|
-
label: (
|
|
48
|
-
<Upload maxCount={1} onChange={importConfig} showUploadList={false}>
|
|
49
|
-
{t('import')}
|
|
50
|
-
</Upload>
|
|
51
|
-
),
|
|
45
|
+
label: <DataImporter>{t('import')}</DataImporter>,
|
|
52
46
|
},
|
|
53
47
|
{
|
|
54
48
|
children: [
|
|
55
49
|
{
|
|
56
50
|
key: 'allAgent',
|
|
57
51
|
label: <div>{t('exportType.allAgent')}</div>,
|
|
58
|
-
onClick: exportAgents,
|
|
52
|
+
onClick: configService.exportAgents,
|
|
59
53
|
},
|
|
60
54
|
{
|
|
61
55
|
key: 'allAgentWithMessage',
|
|
62
56
|
label: <div>{t('exportType.allAgentWithMessage')}</div>,
|
|
63
|
-
onClick: exportSessions,
|
|
57
|
+
onClick: configService.exportSessions,
|
|
64
58
|
},
|
|
65
59
|
{
|
|
66
60
|
key: 'globalSetting',
|
|
67
61
|
label: <div>{t('exportType.globalSetting')}</div>,
|
|
68
|
-
onClick: exportSettings,
|
|
62
|
+
onClick: configService.exportSettings,
|
|
69
63
|
},
|
|
70
64
|
{
|
|
71
65
|
type: 'divider',
|
|
@@ -73,7 +67,7 @@ const BottomActions = memo<BottomActionProps>(({ tab, setTab }) => {
|
|
|
73
67
|
{
|
|
74
68
|
key: 'all',
|
|
75
69
|
label: <div>{t('exportType.all')}</div>,
|
|
76
|
-
onClick: exportAll,
|
|
70
|
+
onClick: configService.exportAll,
|
|
77
71
|
},
|
|
78
72
|
],
|
|
79
73
|
icon: <Icon icon={HardDriveDownload} />,
|
|
@@ -1,43 +1,26 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { ImportResults, configService } from '@/services/config';
|
|
4
|
+
import { useChatStore } from '@/store/chat';
|
|
5
5
|
import { useSessionStore } from '@/store/session';
|
|
6
6
|
import { importConfigFile } from '@/utils/config';
|
|
7
7
|
|
|
8
8
|
export const useImportConfig = () => {
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const checkLocalEnabledPlugins = usePluginStore((s) => s.checkLocalEnabledPlugins);
|
|
9
|
+
const refreshSessions = useSessionStore((s) => s.refreshSessions);
|
|
10
|
+
const [refreshMessages, refreshTopics] = useChatStore((s) => [s.refreshMessages, s.refreshTopic]);
|
|
12
11
|
|
|
13
|
-
const importConfig = (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
importAppSettings(config.state.settings);
|
|
18
|
-
break;
|
|
19
|
-
}
|
|
12
|
+
const importConfig = async (file: File) =>
|
|
13
|
+
new Promise<ImportResults | undefined>((resolve) => {
|
|
14
|
+
importConfigFile(file, async (config) => {
|
|
15
|
+
const data = await configService.importConfigState(config);
|
|
20
16
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
await refreshSessions();
|
|
18
|
+
await refreshMessages();
|
|
19
|
+
await refreshTopics();
|
|
24
20
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
case 'all': {
|
|
31
|
-
importSessions(config.state.sessions);
|
|
32
|
-
importAppSettings(config.state.settings);
|
|
33
|
-
|
|
34
|
-
// 检查一下插件开启情况
|
|
35
|
-
checkLocalEnabledPlugins(config.state.sessions);
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
21
|
+
resolve(data);
|
|
22
|
+
});
|
|
39
23
|
});
|
|
40
|
-
};
|
|
41
24
|
|
|
42
25
|
return useMemo(() => ({ importConfig }), []);
|
|
43
26
|
};
|
package/src/hooks/useTTS.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { OPENAI_URLS, TTS_URL } from '@/services/_url';
|
|
|
15
15
|
import { settingsSelectors, useGlobalStore } from '@/store/global';
|
|
16
16
|
import { useSessionStore } from '@/store/session';
|
|
17
17
|
import { agentSelectors } from '@/store/session/selectors';
|
|
18
|
-
import { TTSServer } from '@/types/
|
|
18
|
+
import { TTSServer } from '@/types/agent';
|
|
19
19
|
|
|
20
20
|
interface TTSConfig extends SWRConfiguration {
|
|
21
21
|
server?: TTSServer;
|
|
@@ -3,12 +3,26 @@
|
|
|
3
3
|
import { App } from 'antd';
|
|
4
4
|
import { createStyles } from 'antd-style';
|
|
5
5
|
import 'antd/dist/reset.css';
|
|
6
|
-
import
|
|
6
|
+
import dynamic from 'next/dynamic';
|
|
7
|
+
import { FC, PropsWithChildren, memo } from 'react';
|
|
8
|
+
|
|
9
|
+
import { getClientConfig } from '@/config/client';
|
|
7
10
|
|
|
8
11
|
import AppTheme, { AppThemeProps } from './AppTheme';
|
|
9
12
|
import Locale from './Locale';
|
|
10
13
|
import StoreHydration from './StoreHydration';
|
|
11
14
|
|
|
15
|
+
let DebugUI: FC = () => null;
|
|
16
|
+
|
|
17
|
+
// we need use Constant Folding to remove code below in production
|
|
18
|
+
// refs: https://webpack.js.org/plugins/internal-plugins/#constplugin
|
|
19
|
+
if (process.env.NODE_ENV === 'development') {
|
|
20
|
+
// eslint-disable-next-line unicorn/no-lonely-if
|
|
21
|
+
if (getClientConfig().DEBUG_MODE) {
|
|
22
|
+
DebugUI = dynamic(() => import('@/features/DebugUI'), { ssr: false }) as FC;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
12
26
|
const useStyles = createStyles(({ css, token }) => ({
|
|
13
27
|
bg: css`
|
|
14
28
|
overflow-y: hidden;
|
|
@@ -37,6 +51,7 @@ const GlobalLayout = ({ children, defaultLang, ...theme }: GlobalLayoutProps) =>
|
|
|
37
51
|
<Locale lang={defaultLang}>
|
|
38
52
|
<StoreHydration />
|
|
39
53
|
<Container>{children}</Container>
|
|
54
|
+
<DebugUI />
|
|
40
55
|
</Locale>
|
|
41
56
|
</AppTheme>
|
|
42
57
|
);
|
|
@@ -30,6 +30,25 @@ export default {
|
|
|
30
30
|
feedback: '反馈与建议',
|
|
31
31
|
historyRange: '历史范围',
|
|
32
32
|
import: '导入配置',
|
|
33
|
+
importModal: {
|
|
34
|
+
finish: {
|
|
35
|
+
onlySettings: '系统设置导入成功',
|
|
36
|
+
start: '开始使用',
|
|
37
|
+
subTitle: '数据导入成功,耗时 {{duration}} 秒。导入明细如下:',
|
|
38
|
+
title: '数据导入完成',
|
|
39
|
+
},
|
|
40
|
+
loading: '数据导入中,请耐心等待...',
|
|
41
|
+
result: {
|
|
42
|
+
added: '导入成功',
|
|
43
|
+
errors: '导入出错',
|
|
44
|
+
messages: '消息',
|
|
45
|
+
sessions: '助手',
|
|
46
|
+
skips: '重复跳过',
|
|
47
|
+
topics: '话题',
|
|
48
|
+
type: '数据类型',
|
|
49
|
+
},
|
|
50
|
+
title: '导入数据',
|
|
51
|
+
},
|
|
33
52
|
lang: {
|
|
34
53
|
'en': '英语',
|
|
35
54
|
'en-US': '英语',
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
dbV1: {
|
|
3
|
+
action: {
|
|
4
|
+
clearDB: '清空本地数据',
|
|
5
|
+
downloadBackup: '下载数据备份',
|
|
6
|
+
reUpgrade: '重新升级',
|
|
7
|
+
start: '开始使用',
|
|
8
|
+
upgrade: '一键升级',
|
|
9
|
+
},
|
|
10
|
+
clear: {
|
|
11
|
+
confirm: '即将清空本地数据(全局设置不受影响),请确认你已经下载了数据备份。',
|
|
12
|
+
},
|
|
13
|
+
description:
|
|
14
|
+
'在新版本中,LobeChat 的数据存储有了巨大的飞跃。因此我们要对旧版数据进行升级,进而为你带来更好的使用体验。',
|
|
15
|
+
features: {
|
|
16
|
+
capability: {
|
|
17
|
+
desc: '基于 IndexedDB 技术,足以装下你一生的会话消息',
|
|
18
|
+
title: '大容量',
|
|
19
|
+
},
|
|
20
|
+
performance: {
|
|
21
|
+
desc: '百万条消息自动索引,检索查询毫秒级响应',
|
|
22
|
+
title: '高性能',
|
|
23
|
+
},
|
|
24
|
+
use: {
|
|
25
|
+
desc: '支持标题、描述、标签、消息内容乃至翻译文本检索,日常搜索效率大大提升',
|
|
26
|
+
title: '更易用',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
title: 'LobeChat 数据进化',
|
|
30
|
+
upgrade: {
|
|
31
|
+
error: {
|
|
32
|
+
subTitle:
|
|
33
|
+
'非常抱歉,数据库升级过程发生异常。请尝试以下方案:A. 清空本地数据后,重新导入备份数据; B.点击 「重新升级」按钮。<br><br> 如仍然出错,请 <1>提交问题</1> ,我们将会第一时间帮你排查',
|
|
34
|
+
title: '数据库升级失败',
|
|
35
|
+
},
|
|
36
|
+
success: {
|
|
37
|
+
subTitle: 'LobeChat 的数据库已经升级到最新版本,立即开始体验吧',
|
|
38
|
+
title: '数据库升级成功',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
upgradeTip: '升级大致需要 1~2 秒,升级过程中请不要关闭 LobeChat',
|
|
42
|
+
},
|
|
43
|
+
migrateError: {
|
|
44
|
+
missVersion: '导入数据缺少版本号,请检查文件后重试',
|
|
45
|
+
noMigration: '没有找到当前版本对应的迁移方案,请检查版本号后重试。如仍有问题请提交问题反馈',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
@@ -3,6 +3,7 @@ import common from '../../../locales/en_US/common.json';
|
|
|
3
3
|
import empty from '../../../locales/en_US/empty.json';
|
|
4
4
|
import error from '../../../locales/en_US/error.json';
|
|
5
5
|
import market from '../../../locales/en_US/market.json';
|
|
6
|
+
import migration from '../../../locales/en_US/migration.json';
|
|
6
7
|
import plugin from '../../../locales/en_US/plugin.json';
|
|
7
8
|
import setting from '../../../locales/en_US/setting.json';
|
|
8
9
|
import welcome from '../../../locales/en_US/welcome.json';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -3,6 +3,7 @@ import common from '../../../locales/ja_JP/common.json';
|
|
|
3
3
|
import empty from '../../../locales/ja_JP/empty.json';
|
|
4
4
|
import error from '../../../locales/ja_JP/error.json';
|
|
5
5
|
import market from '../../../locales/ja_JP/market.json';
|
|
6
|
+
import migration from '../../../locales/ja_JP/migration.json';
|
|
6
7
|
import plugin from '../../../locales/ja_JP/plugin.json';
|
|
7
8
|
import setting from '../../../locales/ja_JP/setting.json';
|
|
8
9
|
import welcome from '../../../locales/ja_JP/welcome.json';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -3,6 +3,7 @@ import common from '../../../locales/ko_KR/common.json';
|
|
|
3
3
|
import empty from '../../../locales/ko_KR/empty.json';
|
|
4
4
|
import error from '../../../locales/ko_KR/error.json';
|
|
5
5
|
import market from '../../../locales/ko_KR/market.json';
|
|
6
|
+
import migration from '../../../locales/ko_KR/migration.json';
|
|
6
7
|
import plugin from '../../../locales/ko_KR/plugin.json';
|
|
7
8
|
import setting from '../../../locales/ko_KR/setting.json';
|
|
8
9
|
import welcome from '../../../locales/ko_KR/welcome.json';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -3,6 +3,7 @@ import common from '../../../locales/ru_RU/common.json';
|
|
|
3
3
|
import empty from '../../../locales/ru_RU/empty.json';
|
|
4
4
|
import error from '../../../locales/ru_RU/error.json';
|
|
5
5
|
import market from '../../../locales/ru_RU/market.json';
|
|
6
|
+
import migration from '../../../locales/ru_RU/migration.json';
|
|
6
7
|
import plugin from '../../../locales/ru_RU/plugin.json';
|
|
7
8
|
import setting from '../../../locales/ru_RU/setting.json';
|
|
8
9
|
import welcome from '../../../locales/ru_RU/welcome.json';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -3,6 +3,7 @@ import common from '../default/common';
|
|
|
3
3
|
import empty from '../default/empty';
|
|
4
4
|
import error from '../default/error';
|
|
5
5
|
import market from '../default/market';
|
|
6
|
+
import migration from '../default/migration';
|
|
6
7
|
import plugin from '../default/plugin';
|
|
7
8
|
import setting from '../default/setting';
|
|
8
9
|
import welcome from '../default/welcome';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -3,6 +3,7 @@ import common from '../../../locales/zh_TW/common.json';
|
|
|
3
3
|
import empty from '../../../locales/zh_TW/empty.json';
|
|
4
4
|
import error from '../../../locales/zh_TW/error.json';
|
|
5
5
|
import market from '../../../locales/zh_TW/market.json';
|
|
6
|
+
import migration from '../../../locales/zh_TW/migration.json';
|
|
6
7
|
import plugin from '../../../locales/zh_TW/plugin.json';
|
|
7
8
|
import setting from '../../../locales/zh_TW/setting.json';
|
|
8
9
|
import welcome from '../../../locales/zh_TW/welcome.json';
|
|
@@ -13,6 +14,7 @@ const resources = {
|
|
|
13
14
|
empty,
|
|
14
15
|
error,
|
|
15
16
|
market,
|
|
17
|
+
migration,
|
|
16
18
|
plugin,
|
|
17
19
|
setting,
|
|
18
20
|
welcome,
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import type { Migration, MigrationData } from '
|
|
1
|
+
import type { Migration, MigrationData } from './VersionController';
|
|
2
2
|
|
|
3
3
|
export class MigrationV0ToV1 implements Migration {
|
|
4
|
-
|
|
5
|
-
* 配置项里的当前版本号
|
|
6
|
-
*/
|
|
4
|
+
// from this version to start migration
|
|
7
5
|
version = 0;
|
|
8
6
|
|
|
9
7
|
migrate(data: MigrationData): MigrationData {
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
{
|
|
2
|
+
"exportType": "sessions",
|
|
3
|
+
"state": {
|
|
4
|
+
"sessions": {
|
|
5
|
+
"06cc3e20-e870-4099-a619-c07a849d742d": {
|
|
6
|
+
"chats": {
|
|
7
|
+
"n2Tsl3Dm": {
|
|
8
|
+
"content": "是的,你可以使用 Prisma 来自定义生成 `id` 的逻辑,例如使用 `nanoid` 库来生成唯一标识符。\n\n首先,你需要在项目中安装 `nanoid` 库:\n\n```\nnpm install nanoid\n```\n\n然后,你可以在 Prisma 的模型定义中使用 `@default` 指令,并提供一个自定义的默认值函数来生成 `id`。\n\n```prisma\nmodel Message {\n id String @id @default(dbgenerated(\"nanoid(10)\"))\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n```\n\n在上述模型定义中,我们使用 `dbgenerated` 指令来定义一个自定义的默认值函数。函数 `nanoid(10)` 会生成一个长度为 10 的唯一标识符。\n\n请注意,使用自定义的 `id` 生成逻辑可能会对数据库性能产生一些影响,因为每次创建新记录时都需要执行自定义函数。因此,请确保你的自定义逻辑是高效的,并在实际使用中进行测试和评估性能。",
|
|
9
|
+
"createAt": 1698463981313,
|
|
10
|
+
"id": "n2Tsl3Dm",
|
|
11
|
+
"meta": {},
|
|
12
|
+
"parentId": "JSZaJOGj",
|
|
13
|
+
"role": "assistant",
|
|
14
|
+
"updateAt": 1698464004494,
|
|
15
|
+
"topicId": "CZg3IEdy",
|
|
16
|
+
"extra": { "fromModel": "gpt-3.5-turbo" }
|
|
17
|
+
},
|
|
18
|
+
"xPft8Msa": {
|
|
19
|
+
"content": "如何指定 自定义函数的引入位置?",
|
|
20
|
+
"createAt": 1698464173224,
|
|
21
|
+
"id": "xPft8Msa",
|
|
22
|
+
"meta": {},
|
|
23
|
+
"role": "user",
|
|
24
|
+
"updateAt": 1698464173226,
|
|
25
|
+
"topicId": "CZg3IEdy"
|
|
26
|
+
},
|
|
27
|
+
"jZc2KKRs": {
|
|
28
|
+
"content": "在 Prisma 中,你可以通过在 `schema.prisma` 文件的顶部使用 `generator` 块来指定自定义函数的引入位置。\n\n例如,假设你想使用 `nanoid` 库来生成自定义的 `id`,你可以按照以下方式配置:\n\n```prisma\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./node_modules/@prisma/client\"\n}\n\ngenerator dbgenerated {\n provider = \"prisma-dbgenerator\"\n output = \"./node_modules/@prisma/client\"\n binaryTargets = [\"native\"]\n previewFeatures = [\"nativeTypes\"]\n config = {\n \"generator\": {\n \"dbgenerated\": {\n \"output\": \"./src/db/generated\",\n \"provider\": \"./src/db/generated/provider.js\"\n }\n }\n }\n}\n```\n\n在上述配置中,我们定义了两个生成器。`client` 生成器用于生成 Prisma 客户端代码,而 `dbgenerated` 生成器用于生成数据库相关的代码。\n\n注意到 `dbgenerated` 生成器的 `config` 部分中有一个 `provider` 字段,它指定了自定义函数的引入位置。在这个示例中,我们将自定义函数放在 `./src/db/generated/provider.js` 文件中。\n\n你可以根据你的项目结构和需要来调整路径和文件名,确保指定的 `provider` 路径正确引入了自定义函数。",
|
|
29
|
+
"createAt": 1698464173228,
|
|
30
|
+
"id": "jZc2KKRs",
|
|
31
|
+
"meta": {},
|
|
32
|
+
"parentId": "xPft8Msa",
|
|
33
|
+
"role": "assistant",
|
|
34
|
+
"updateAt": 1698464181896,
|
|
35
|
+
"topicId": "CZg3IEdy",
|
|
36
|
+
"extra": { "fromModel": "gpt-3.5-turbo" }
|
|
37
|
+
},
|
|
38
|
+
"LjG9XSuq": {
|
|
39
|
+
"content": "如何启动一个 postgres Docker 镜像?",
|
|
40
|
+
"createAt": 1698754460196,
|
|
41
|
+
"id": "LjG9XSuq",
|
|
42
|
+
"meta": {},
|
|
43
|
+
"role": "user",
|
|
44
|
+
"updateAt": 1698754463118,
|
|
45
|
+
"topicId": "MNWhBEh5"
|
|
46
|
+
},
|
|
47
|
+
"CL7E1Mc5": {
|
|
48
|
+
"content": "要启动一个 PostgreSQL Docker 镜像,你可以按照以下步骤操作:\n\n1. 首先,确保你已经安装了 Docker,可以在终端中运行 `docker --version` 来检查。\n\n2. 在终端中运行以下命令以下载并启动一个 PostgreSQL 镜像:\n\n ```shell\n docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres\n ```\n\n 这将从 Docker Hub 下载 PostgreSQL 镜像",
|
|
49
|
+
"createAt": 1698754479751,
|
|
50
|
+
"id": "CL7E1Mc5",
|
|
51
|
+
"meta": {},
|
|
52
|
+
"parentId": "LjG9XSuq",
|
|
53
|
+
"role": "assistant",
|
|
54
|
+
"updateAt": 1698754507690,
|
|
55
|
+
"topicId": "MNWhBEh5",
|
|
56
|
+
"extra": { "fromModel": "gpt-3.5-turbo" }
|
|
57
|
+
},
|
|
58
|
+
"UIvHZr7m": {
|
|
59
|
+
"content": "如何指定本地存储的目录到 /www/database/postgres",
|
|
60
|
+
"createAt": 1698754591763,
|
|
61
|
+
"id": "UIvHZr7m",
|
|
62
|
+
"meta": {},
|
|
63
|
+
"role": "user",
|
|
64
|
+
"updateAt": 1698754591764,
|
|
65
|
+
"topicId": "MNWhBEh5"
|
|
66
|
+
},
|
|
67
|
+
"XLJOK44r": {
|
|
68
|
+
"content": "要将本地存储的目录映射到容器内的 `/var/lib/postgresql/data` 目录,你可以使用 Docker 的 `-v` 参数。\n\n以下是示例命令:\n\n```shell\ndocker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -v /www/database/postgres:/var/lib/postgresql/data -d postgres\n```\n\n在这个命令中,我们使用了 `-v` 参数来指定本地目录 `/www/database/postgres` 映射到容器内的 `/var/lib/postgresql/data` 目录。这样,所有的 PostgreSQL 数据将会保存在本地指定的目录中。",
|
|
69
|
+
"createAt": 1698754591765,
|
|
70
|
+
"id": "XLJOK44r",
|
|
71
|
+
"meta": {},
|
|
72
|
+
"parentId": "UIvHZr7m",
|
|
73
|
+
"role": "assistant",
|
|
74
|
+
"updateAt": 1698754609275,
|
|
75
|
+
"topicId": "MNWhBEh5",
|
|
76
|
+
"extra": { "fromModel": "gpt-3.5-turbo" }
|
|
77
|
+
},
|
|
78
|
+
"W3J6jQjm": {
|
|
79
|
+
"content": "docker run --name postgres -e POSTGRES_PASSWORD=DSLapHYdzNrai5j6 -p 33300:5432 -v /www/database/postgres:/var/lib/postgresql/data -d postgres",
|
|
80
|
+
"createAt": 1698754700529,
|
|
81
|
+
"id": "W3J6jQjm",
|
|
82
|
+
"meta": {},
|
|
83
|
+
"role": "user",
|
|
84
|
+
"updateAt": 1698754700530,
|
|
85
|
+
"topicId": "MNWhBEh5"
|
|
86
|
+
},
|
|
87
|
+
"L7mq0ehV": {
|
|
88
|
+
"content": "如何启动 pgadmin",
|
|
89
|
+
"createAt": 1698755749886,
|
|
90
|
+
"id": "L7mq0ehV",
|
|
91
|
+
"meta": {},
|
|
92
|
+
"role": "user",
|
|
93
|
+
"updateAt": 1698755749888,
|
|
94
|
+
"topicId": "MNWhBEh5"
|
|
95
|
+
},
|
|
96
|
+
"d5XTX9EQ": {
|
|
97
|
+
"content": "要启动 pgAdmin,你可以按照以下步骤操作:\n\n1. 首先,确保你已经安装了 Docker,并且已经成功启动了 PostgreSQL Docker 容器。\n\n2. 在终端中运行以下命令以启动 pgAdmin Docker 容器:\n\n ```shell\n docker run --name my-pgadmin -p 5050:80 -e PGADMIN_DEFAULT_EMAIL=myemail@example.com -e PGADMIN_DEFAULT_PASSWORD=mypassword -d dpage/pgadmin4\n ```\n\n 在这个命令中,我们使用了 `-p` 参数来将容器的端口 80 映射到本地的端口 5050。你可以根据需要修改这个端口映射。\n\n 我们还使用了 `-e` 参数来设置 pgAdmin 的默认登录邮箱和密码。你可以根据需要修改这些值。\n\n3. 在浏览器中访问 `http://localhost:5050`,你将看到 pgAdmin 的登录界面。\n\n4. 使用在上一步中设置的邮箱和密码进行登录。\n\n5. 在 pgAdmin 中,你可以添加一个新的服务器连接,以连接到运行在 Docker 容器中的 PostgreSQL 数据库。要添加一个新的服务器连接,你需要提供以下信息:\n\n - 主机名/地址:使用 Docker 容器的 IP 地址或者 `localhost`。\n - 端口:使用 Docker 容器中 PostgreSQL 的映射端口,例如 33300。\n - 用户名和密码:使用在启动 PostgreSQL 容器时设置的用户名和密码。\n\n 完成上述信息的填写后,点击保存并连接到 PostgreSQL 服务器。\n\n现在,你已经成功启动了 pgAdmin 并连接到了你的 PostgreSQL 数据库。你可以使用 pgAdmin 来管理和操作你的数据库。",
|
|
98
|
+
"createAt": 1698755749889,
|
|
99
|
+
"id": "d5XTX9EQ",
|
|
100
|
+
"meta": {},
|
|
101
|
+
"parentId": "L7mq0ehV",
|
|
102
|
+
"role": "assistant",
|
|
103
|
+
"updateAt": 1698755786183,
|
|
104
|
+
"topicId": "MNWhBEh5",
|
|
105
|
+
"extra": { "fromModel": "gpt-3.5-turbo" }
|
|
106
|
+
},
|
|
107
|
+
"KPPDiRyW": {
|
|
108
|
+
"content": "abcabc",
|
|
109
|
+
"createAt": 1690650544852,
|
|
110
|
+
"id": "KPPDiRyW",
|
|
111
|
+
"meta": {},
|
|
112
|
+
"parentId": "42k72jMi",
|
|
113
|
+
"role": "function",
|
|
114
|
+
"updateAt": 1690650572399,
|
|
115
|
+
"extra": {
|
|
116
|
+
"fromModel": "gpt-3.5-turbo-16k"
|
|
117
|
+
},
|
|
118
|
+
"function_call": {
|
|
119
|
+
"name": "websiteCrawler",
|
|
120
|
+
"arguments": "{\n \"url\": \"https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651264337&idx=1&sn=d7d9126578c74c912e1f0d42cb5629da&chksm=bd48ccd58a3f45c3f2cbc7d7b732c820b9e7cd6b547c06acc8170b233710b5fb5ed62f5fd94d&mpshare=1&scene=1&srcid=07294Mpw7C6JCLgtagL1cBDR&sharer_sharetime=1690622712877&sharer_shareid=0358058a42fc25387d28337fc3d22c3c#rd\"\n}"
|
|
121
|
+
},
|
|
122
|
+
"name": "websiteCrawler"
|
|
123
|
+
},
|
|
124
|
+
"9cRjevRQ": {
|
|
125
|
+
"content": "bbbbb",
|
|
126
|
+
"createAt": 1700065743405,
|
|
127
|
+
"id": "9cRjevRQ",
|
|
128
|
+
"meta": {},
|
|
129
|
+
"parentId": "3nDXtEKv",
|
|
130
|
+
"role": "function",
|
|
131
|
+
"updateAt": 1700065751861,
|
|
132
|
+
"extra": {
|
|
133
|
+
"fromModel": "gpt-3.5-turbo-16k"
|
|
134
|
+
},
|
|
135
|
+
"plugin": {
|
|
136
|
+
"apiName": "getWebsiteContent",
|
|
137
|
+
"arguments": "{\n \"url\": \"https://nodejs.org/api/packages.html#dual-package-hazard\"\n}",
|
|
138
|
+
"identifier": "website-crawler",
|
|
139
|
+
"type": "default"
|
|
140
|
+
},
|
|
141
|
+
"name": "website-crawler"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"config": {
|
|
145
|
+
"displayMode": "chat",
|
|
146
|
+
"historyCount": 1,
|
|
147
|
+
"model": "gpt-3.5-turbo",
|
|
148
|
+
"params": {
|
|
149
|
+
"frequency_penalty": 0,
|
|
150
|
+
"presence_penalty": 0,
|
|
151
|
+
"temperature": 0.6,
|
|
152
|
+
"top_p": 1,
|
|
153
|
+
"max_tokens": 2200
|
|
154
|
+
},
|
|
155
|
+
"plugins": [],
|
|
156
|
+
"systemRole": "你是一名 Postgresql 的数据库专家。用户是一名数据库小白,你需要使用简单直白的方式告诉用户如何使用 ostgresql 和它相应的 orm 工具 primsa",
|
|
157
|
+
"enableCompressThreshold": false,
|
|
158
|
+
"enableMaxTokens": false,
|
|
159
|
+
"inputTemplate": ""
|
|
160
|
+
},
|
|
161
|
+
"createAt": 1698463356269,
|
|
162
|
+
"id": "06cc3e20-e870-4099-a619-c07a849d742d",
|
|
163
|
+
"meta": {
|
|
164
|
+
"avatar": "🐘",
|
|
165
|
+
"backgroundColor": "rgba(0,0,0,0)",
|
|
166
|
+
"title": "Postgresql 指南",
|
|
167
|
+
"description": "PostgreSQL 数据库和 Prisma ORM 工具的简单使用指南",
|
|
168
|
+
"tags": ["数据库", "PostgreSQL", "教程", "ORM", "Prisma"]
|
|
169
|
+
},
|
|
170
|
+
"type": "agent",
|
|
171
|
+
"updateAt": 1698463356269,
|
|
172
|
+
"pinned": true,
|
|
173
|
+
"topics": {
|
|
174
|
+
"CZg3IEdy": {
|
|
175
|
+
"createAt": 1698463911747,
|
|
176
|
+
"id": "CZg3IEdy",
|
|
177
|
+
"title": "Prisma中的cuid函数作用是什么",
|
|
178
|
+
"updateAt": 1698463915716
|
|
179
|
+
},
|
|
180
|
+
"MNWhBEh5": {
|
|
181
|
+
"createAt": 1698754463117,
|
|
182
|
+
"id": "MNWhBEh5",
|
|
183
|
+
"title": "启动 PostgreSQL Docker 镜像方法",
|
|
184
|
+
"updateAt": 1698754464867
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"version": 1
|
|
191
|
+
}
|