@lobehub/chat 1.15.21 → 1.15.23
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.
Potentially problematic release.
This version of @lobehub/chat might be problematic. Click here for more details.
- package/CHANGELOG.md +50 -0
- package/locales/ar/metadata.json +6 -6
- package/locales/ar/migration.json +9 -9
- package/locales/ar/plugin.json +1 -1
- package/locales/ar/setting.json +4 -4
- package/locales/ar/welcome.json +13 -13
- package/locales/bg-BG/metadata.json +7 -7
- package/locales/bg-BG/migration.json +12 -12
- package/locales/bg-BG/plugin.json +1 -1
- package/locales/bg-BG/setting.json +4 -4
- package/locales/bg-BG/welcome.json +13 -13
- package/locales/de-DE/metadata.json +6 -6
- package/locales/de-DE/migration.json +9 -9
- package/locales/de-DE/plugin.json +1 -1
- package/locales/de-DE/setting.json +4 -4
- package/locales/de-DE/welcome.json +15 -15
- package/locales/en-US/metadata.json +8 -8
- package/locales/en-US/migration.json +9 -9
- package/locales/en-US/plugin.json +1 -1
- package/locales/en-US/setting.json +4 -4
- package/locales/en-US/welcome.json +16 -16
- package/locales/es-ES/metadata.json +8 -8
- package/locales/es-ES/migration.json +9 -9
- package/locales/es-ES/plugin.json +1 -1
- package/locales/es-ES/setting.json +4 -4
- package/locales/es-ES/welcome.json +15 -15
- package/locales/fr-FR/metadata.json +7 -7
- package/locales/fr-FR/migration.json +8 -8
- package/locales/fr-FR/plugin.json +1 -1
- package/locales/fr-FR/setting.json +4 -4
- package/locales/fr-FR/welcome.json +12 -12
- package/locales/it-IT/metadata.json +6 -6
- package/locales/it-IT/migration.json +11 -11
- package/locales/it-IT/plugin.json +1 -1
- package/locales/it-IT/setting.json +4 -4
- package/locales/it-IT/welcome.json +16 -16
- package/locales/ja-JP/metadata.json +6 -6
- package/locales/ja-JP/migration.json +9 -9
- package/locales/ja-JP/plugin.json +1 -1
- package/locales/ja-JP/setting.json +4 -4
- package/locales/ja-JP/welcome.json +15 -15
- package/locales/ko-KR/metadata.json +6 -6
- package/locales/ko-KR/migration.json +9 -9
- package/locales/ko-KR/plugin.json +1 -1
- package/locales/ko-KR/setting.json +4 -4
- package/locales/ko-KR/welcome.json +13 -13
- package/locales/nl-NL/metadata.json +7 -7
- package/locales/nl-NL/migration.json +9 -9
- package/locales/nl-NL/plugin.json +1 -1
- package/locales/nl-NL/setting.json +4 -4
- package/locales/nl-NL/welcome.json +15 -15
- package/locales/pl-PL/metadata.json +6 -6
- package/locales/pl-PL/migration.json +11 -11
- package/locales/pl-PL/plugin.json +1 -1
- package/locales/pl-PL/setting.json +4 -4
- package/locales/pl-PL/welcome.json +16 -16
- package/locales/pt-BR/metadata.json +8 -8
- package/locales/pt-BR/migration.json +13 -13
- package/locales/pt-BR/plugin.json +1 -1
- package/locales/pt-BR/setting.json +4 -4
- package/locales/pt-BR/welcome.json +16 -16
- package/locales/ru-RU/metadata.json +6 -6
- package/locales/ru-RU/migration.json +11 -11
- package/locales/ru-RU/plugin.json +1 -1
- package/locales/ru-RU/setting.json +4 -4
- package/locales/ru-RU/welcome.json +16 -16
- package/locales/tr-TR/metadata.json +6 -6
- package/locales/tr-TR/migration.json +12 -12
- package/locales/tr-TR/plugin.json +1 -1
- package/locales/tr-TR/setting.json +4 -4
- package/locales/tr-TR/welcome.json +15 -15
- package/locales/vi-VN/metadata.json +6 -6
- package/locales/vi-VN/migration.json +8 -8
- package/locales/vi-VN/plugin.json +1 -1
- package/locales/vi-VN/setting.json +4 -4
- package/locales/vi-VN/welcome.json +9 -9
- package/locales/zh-CN/common.json +3 -3
- package/locales/zh-CN/market.json +1 -1
- package/locales/zh-CN/metadata.json +6 -6
- package/locales/zh-CN/migration.json +4 -4
- package/locales/zh-CN/plugin.json +2 -2
- package/locales/zh-CN/setting.json +4 -4
- package/locales/zh-CN/welcome.json +8 -8
- package/locales/zh-TW/metadata.json +6 -6
- package/locales/zh-TW/migration.json +6 -6
- package/locales/zh-TW/plugin.json +1 -1
- package/locales/zh-TW/setting.json +4 -4
- package/locales/zh-TW/welcome.json +10 -10
- package/package.json +1 -1
- package/src/app/(auth)/login/[[...login]]/page.tsx +2 -1
- package/src/app/(main)/chat/(workspace)/features/ShareButton/useScreenshot.ts +2 -1
- package/src/app/(main)/chat/(workspace)/features/TelemetryNotification.tsx +5 -2
- package/src/app/(main)/chat/(workspace)/page.tsx +5 -4
- package/src/app/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx +2 -2
- package/src/app/(main)/chat/@session/_layout/Mobile/SessionHeader.tsx +2 -2
- package/src/app/(main)/chat/features/Migration/ExportConfigButton.tsx +3 -1
- package/src/app/(main)/chat/features/Migration/Modal.tsx +3 -2
- package/src/app/(main)/chat/features/Migration/Start.tsx +4 -2
- package/src/app/(main)/files/(content)/NotSupportClient.tsx +2 -1
- package/src/app/(main)/market/_layout/Desktop/Header.tsx +3 -2
- package/src/app/(main)/market/features/ShareAgentButton/Inner.tsx +2 -1
- package/src/app/(main)/settings/about/features/Analytics.tsx +2 -1
- package/src/app/(main)/settings/about/features/Version.tsx +3 -2
- package/src/app/(main)/settings/about/index.tsx +6 -1
- package/src/app/(main)/welcome/features/Hero.tsx +3 -1
- package/src/app/(main)/welcome/page.tsx +5 -4
- package/src/app/metadata.ts +11 -12
- package/src/components/Branding/ProductLogo.tsx +14 -0
- package/src/components/Branding/index.ts +1 -0
- package/src/config/featureFlags/schema.ts +11 -5
- package/src/config/modelProviders/deepseek.ts +1 -9
- package/src/config/modelProviders/groq.ts +3 -3
- package/src/config/modelProviders/novita.ts +5 -5
- package/src/config/modelProviders/ollama.ts +6 -6
- package/src/config/modelProviders/perplexity.ts +6 -6
- package/src/config/modelProviders/qwen.ts +1 -10
- package/src/config/modelProviders/siliconcloud.ts +61 -27
- package/src/config/modelProviders/stepfun.ts +8 -0
- package/src/const/branding.ts +5 -0
- package/src/features/Conversation/components/InboxWelcome/QuestionSuggest.tsx +2 -1
- package/src/features/Conversation/components/InboxWelcome/index.tsx +4 -1
- package/src/features/Conversation/components/VirtualizedList/index.tsx +2 -2
- package/src/features/PluginDevModal/UrlManifestForm.tsx +2 -1
- package/src/features/Setting/Footer.tsx +2 -1
- package/src/locales/default/common.ts +3 -3
- package/src/locales/default/market.ts +1 -1
- package/src/locales/default/metadata.ts +6 -6
- package/src/locales/default/migration.ts +4 -4
- package/src/locales/default/plugin.ts +2 -2
- package/src/locales/default/setting.ts +4 -5
- package/src/locales/default/welcome.ts +8 -8
- package/src/server/ld.ts +2 -1
- package/src/server/metadata.ts +2 -1
- package/src/store/user/slices/auth/selectors.ts +2 -1
- package/src/utils/config.ts +2 -1
@@ -1,4 +1,5 @@
|
|
1
1
|
import StructuredData from '@/components/StructuredData';
|
2
|
+
import { BRANDING_NAME } from '@/const/branding';
|
2
3
|
import { ldModule } from '@/server/ld';
|
3
4
|
import { metadataModule } from '@/server/metadata';
|
4
5
|
import { translation } from '@/server/translation';
|
@@ -10,8 +11,8 @@ import TelemetryNotification from './features/TelemetryNotification';
|
|
10
11
|
export const generateMetadata = async () => {
|
11
12
|
const { t } = await translation('metadata');
|
12
13
|
return metadataModule.generate({
|
13
|
-
description: t('chat.
|
14
|
-
title: t('chat.title'),
|
14
|
+
description: t('chat.title', { appName: BRANDING_NAME }),
|
15
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
15
16
|
url: '/chat',
|
16
17
|
});
|
17
18
|
};
|
@@ -20,8 +21,8 @@ const Page = async () => {
|
|
20
21
|
const mobile = isMobileDevice();
|
21
22
|
const { t } = await translation('metadata');
|
22
23
|
const ld = ldModule.generate({
|
23
|
-
description: t('chat.
|
24
|
-
title: t('chat.title'),
|
24
|
+
description: t('chat.title', { appName: BRANDING_NAME }),
|
25
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
25
26
|
url: '/chat',
|
26
27
|
});
|
27
28
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ActionIcon } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { createStyles } from 'antd-style';
|
6
5
|
import { MessageSquarePlus } from 'lucide-react';
|
7
6
|
import { memo } from 'react';
|
8
7
|
import { useTranslation } from 'react-i18next';
|
9
8
|
import { Flexbox } from 'react-layout-kit';
|
10
9
|
|
10
|
+
import { ProductLogo } from '@/components/Branding';
|
11
11
|
import { DESKTOP_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
12
12
|
import SyncStatusTag from '@/features/SyncStatusInspector';
|
13
13
|
import { useActionSWR } from '@/libs/swr';
|
@@ -38,7 +38,7 @@ const Header = memo(() => {
|
|
38
38
|
<Flexbox className={styles.top} gap={16} padding={16}>
|
39
39
|
<Flexbox distribution={'space-between'} horizontal>
|
40
40
|
<Flexbox align={'center'} gap={4} horizontal>
|
41
|
-
<
|
41
|
+
<ProductLogo className={styles.logo} size={36} />
|
42
42
|
{enableWebrtc && <SyncStatusTag />}
|
43
43
|
</Flexbox>
|
44
44
|
{showCreateSession && (
|
@@ -1,12 +1,12 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ActionIcon, MobileNavBar } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { MessageSquarePlus } from 'lucide-react';
|
6
5
|
import { useRouter } from 'next/navigation';
|
7
6
|
import { memo } from 'react';
|
8
7
|
import { Flexbox } from 'react-layout-kit';
|
9
8
|
|
9
|
+
import { ProductLogo } from '@/components/Branding';
|
10
10
|
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
11
11
|
import SyncStatusInspector from '@/features/SyncStatusInspector';
|
12
12
|
import UserAvatar from '@/features/User/UserAvatar';
|
@@ -24,7 +24,7 @@ const Header = memo(() => {
|
|
24
24
|
left={
|
25
25
|
<Flexbox align={'center'} gap={8} horizontal style={{ marginLeft: 8 }}>
|
26
26
|
<UserAvatar onClick={() => router.push('/me')} size={32} />
|
27
|
-
<
|
27
|
+
<ProductLogo />
|
28
28
|
{enableWebrtc && <SyncStatusInspector placement={'bottom'} />}
|
29
29
|
</Flexbox>
|
30
30
|
}
|
@@ -2,6 +2,8 @@ import { Button } from 'antd';
|
|
2
2
|
import { memo } from 'react';
|
3
3
|
import { useTranslation } from 'react-i18next';
|
4
4
|
|
5
|
+
import { BRANDING_NAME } from '@/const/branding';
|
6
|
+
|
5
7
|
const ExportConfigButton = memo<{ primary?: boolean; state: any }>(({ state, primary }) => {
|
6
8
|
const { t } = useTranslation('migration');
|
7
9
|
|
@@ -14,7 +16,7 @@ const ExportConfigButton = memo<{ primary?: boolean; state: any }>(({ state, pri
|
|
14
16
|
|
15
17
|
const a = document.createElement('a');
|
16
18
|
a.href = url;
|
17
|
-
a.download =
|
19
|
+
a.download = `${BRANDING_NAME}-backup-v1.json`;
|
18
20
|
|
19
21
|
document.body.append(a);
|
20
22
|
a.click();
|
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { Center } from 'react-layout-kit';
|
7
7
|
|
8
8
|
import DataStyleModal from '@/components/DataStyleModal';
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
9
10
|
|
10
11
|
import Failed from './Failed';
|
11
12
|
import MigrationStart from './Start';
|
@@ -51,7 +52,7 @@ const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbStat
|
|
51
52
|
icon={<Icon icon={CheckCircle} />}
|
52
53
|
status={'success'}
|
53
54
|
style={{ paddingBlock: 24 }}
|
54
|
-
subTitle={t('dbV1.upgrade.success.subTitle')}
|
55
|
+
subTitle={t('dbV1.upgrade.success.subTitle', { appName: BRANDING_NAME })}
|
55
56
|
title={t('dbV1.upgrade.success.title')}
|
56
57
|
/>
|
57
58
|
);
|
@@ -71,7 +72,7 @@ const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbStat
|
|
71
72
|
};
|
72
73
|
|
73
74
|
return (
|
74
|
-
<DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title')}>
|
75
|
+
<DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title', { appName: BRANDING_NAME })}>
|
75
76
|
<Center gap={48}>{renderContent()}</Center>
|
76
77
|
</DataStyleModal>
|
77
78
|
);
|
@@ -6,6 +6,8 @@ import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { Center, Flexbox } from 'react-layout-kit';
|
7
7
|
import Balancer from 'react-wrap-balancer';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
10
|
+
|
9
11
|
import ExportConfigButton from './ExportConfigButton';
|
10
12
|
import UpgradeButton, { UpgradeButtonProps } from './UpgradeButton';
|
11
13
|
|
@@ -72,7 +74,7 @@ const MigrationStart = memo<UpgradeButtonProps>((props) => {
|
|
72
74
|
<>
|
73
75
|
<Flexbox>
|
74
76
|
<Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
|
75
|
-
{t('dbV1.description')}
|
77
|
+
{t('dbV1.description', { appName: BRANDING_NAME })}
|
76
78
|
</Flexbox>
|
77
79
|
</Flexbox>
|
78
80
|
<Flexbox gap={32}>
|
@@ -96,7 +98,7 @@ const MigrationStart = memo<UpgradeButtonProps>((props) => {
|
|
96
98
|
<UpgradeButton {...props} />
|
97
99
|
</Flexbox>
|
98
100
|
<Flexbox align={'center'} className={styles.hint}>
|
99
|
-
<Balancer>{t('dbV1.upgradeTip')}</Balancer>
|
101
|
+
<Balancer>{t('dbV1.upgradeTip', { appName: BRANDING_NAME })}</Balancer>
|
100
102
|
</Flexbox>
|
101
103
|
</Flexbox>
|
102
104
|
</>
|
@@ -9,6 +9,7 @@ import { Trans, useTranslation } from 'react-i18next';
|
|
9
9
|
import { Center, Flexbox } from 'react-layout-kit';
|
10
10
|
|
11
11
|
import FeatureList from '@/components/FeatureList';
|
12
|
+
import { LOBE_CHAT_CLOUD } from '@/const/branding';
|
12
13
|
import { DATABASE_SELF_HOSTING_URL, OFFICIAL_URL, UTM_SOURCE } from '@/const/url';
|
13
14
|
|
14
15
|
const BLOCK_SIZE = 100;
|
@@ -136,7 +137,7 @@ const NotSupportClient = () => {
|
|
136
137
|
<Link
|
137
138
|
href={`${OFFICIAL_URL}?utm_source=${UTM_SOURCE}&utm_medium=client_not_support_file`}
|
138
139
|
>
|
139
|
-
|
140
|
+
{LOBE_CHAT_CLOUD}
|
140
141
|
</Link>
|
141
142
|
</Trans>
|
142
143
|
</Typography.Text>
|
@@ -1,10 +1,11 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ChatHeader } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { createStyles } from 'antd-style';
|
6
5
|
import { memo } from 'react';
|
7
6
|
|
7
|
+
import { ProductLogo } from '@/components/Branding';
|
8
|
+
|
8
9
|
import ShareAgentButton from '../../features/ShareAgentButton';
|
9
10
|
|
10
11
|
export const useStyles = createStyles(({ css, token }) => ({
|
@@ -19,7 +20,7 @@ const Header = memo(() => {
|
|
19
20
|
|
20
21
|
return (
|
21
22
|
<ChatHeader
|
22
|
-
left={<
|
23
|
+
left={<ProductLogo className={styles.logo} extra={'Discover'} size={36} />}
|
23
24
|
right={<ShareAgentButton />}
|
24
25
|
/>
|
25
26
|
);
|
@@ -5,6 +5,7 @@ import Image from 'next/image';
|
|
5
5
|
import { memo } from 'react';
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
|
8
|
+
import { BRANDING_NAME } from '@/const/branding';
|
8
9
|
import { AGENTS_INDEX_GITHUB, imageUrl } from '@/const/url';
|
9
10
|
|
10
11
|
const Inner = memo(() => {
|
@@ -20,7 +21,7 @@ const Inner = memo(() => {
|
|
20
21
|
/>
|
21
22
|
<h3>
|
22
23
|
<Tag color={'cyan'}>{t('guide.func1.tag')}</Tag>
|
23
|
-
<span>{t('guide.func1.title')}</span>
|
24
|
+
<span>{t('guide.func1.title', { appName: BRANDING_NAME })}</span>
|
24
25
|
</h3>
|
25
26
|
<p>
|
26
27
|
<kbd>
|
@@ -5,6 +5,7 @@ import { Switch } from 'antd';
|
|
5
5
|
import { memo } from 'react';
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
|
8
|
+
import { BRANDING_NAME } from '@/const/branding';
|
8
9
|
import { FORM_STYLE } from '@/const/layoutTokens';
|
9
10
|
import { useUserStore } from '@/store/user';
|
10
11
|
import { preferenceSelectors } from '@/store/user/selectors';
|
@@ -27,7 +28,7 @@ const Analytics = memo(() => {
|
|
27
28
|
}}
|
28
29
|
/>
|
29
30
|
),
|
30
|
-
desc: t('analytics.telemetry.desc'),
|
31
|
+
desc: t('analytics.telemetry.desc', { appName: BRANDING_NAME }),
|
31
32
|
label: t('analytics.telemetry.title'),
|
32
33
|
minWidth: undefined,
|
33
34
|
valuePropName: 'checked',
|
@@ -6,6 +6,7 @@ import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
import { Center, Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
9
10
|
import { MANUAL_UPGRADE_URL, OFFICIAL_SITE, RELEASES_URL } from '@/const/url';
|
10
11
|
import { CURRENT_VERSION } from '@/const/version';
|
11
12
|
import { useNewVersion } from '@/features/User/UserPanel/useNewVersion';
|
@@ -37,11 +38,11 @@ const Version = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
37
38
|
<Flexbox align={'center'} flex={'none'} gap={16} horizontal>
|
38
39
|
<Link href={OFFICIAL_SITE} target={'_blank'}>
|
39
40
|
<Center className={styles.logo} height={64} width={64}>
|
40
|
-
<Image alt={
|
41
|
+
<Image alt={BRANDING_NAME} height={52} src={'/icons/icon-192x192.png'} width={52} />
|
41
42
|
</Center>
|
42
43
|
</Link>
|
43
44
|
<Flexbox>
|
44
|
-
<div style={{ fontSize: 18, fontWeight: 'bolder' }}
|
45
|
+
<div style={{ fontSize: 18, fontWeight: 'bolder' }}>${BRANDING_NAME}</div>
|
45
46
|
<div>
|
46
47
|
<Tag color={theme.colorFillSecondary} style={{ color: theme.colorTextSecondary }}>
|
47
48
|
v{CURRENT_VERSION}
|
@@ -8,6 +8,7 @@ import { memo } from 'react';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
9
9
|
import { Flexbox } from 'react-layout-kit';
|
10
10
|
|
11
|
+
import { BRANDING_NAME } from '@/const/branding';
|
11
12
|
import {
|
12
13
|
BLOG,
|
13
14
|
DISCORD,
|
@@ -45,7 +46,11 @@ const Page = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
45
46
|
|
46
47
|
return (
|
47
48
|
<>
|
48
|
-
<Form.Group
|
49
|
+
<Form.Group
|
50
|
+
style={{ width: '100%' }}
|
51
|
+
title={`${t('about')} ${BRANDING_NAME}`}
|
52
|
+
variant={'pure'}
|
53
|
+
>
|
49
54
|
<Flexbox gap={20} paddingBlock={20} width={'100%'}>
|
50
55
|
<div className={styles.title}>{t('version')}</div>
|
51
56
|
<Version mobile={mobile} />
|
@@ -6,6 +6,8 @@ import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
import { Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
10
|
+
|
9
11
|
const useStyles = createStyles(({ css, token }) => {
|
10
12
|
return {
|
11
13
|
desc: css`
|
@@ -43,7 +45,7 @@ const Hero = memo(() => {
|
|
43
45
|
justify={'center'}
|
44
46
|
wrap={'wrap'}
|
45
47
|
>
|
46
|
-
<strong style={{ fontSize: 'min(56px, 8vw)' }}>
|
48
|
+
<strong style={{ fontSize: 'min(56px, 8vw)' }}>{BRANDING_NAME}</strong>
|
47
49
|
<span>{t('slogan.title')}</span>
|
48
50
|
</Flexbox>
|
49
51
|
<Flexbox
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import StructuredData from '@/components/StructuredData';
|
2
|
+
import { BRANDING_NAME } from '@/const/branding';
|
2
3
|
import { ldModule } from '@/server/ld';
|
3
4
|
import { metadataModule } from '@/server/metadata';
|
4
5
|
import { translation } from '@/server/translation';
|
@@ -11,8 +12,8 @@ import Logo from './features/Logo';
|
|
11
12
|
export const generateMetadata = async () => {
|
12
13
|
const { t } = await translation('metadata');
|
13
14
|
return metadataModule.generate({
|
14
|
-
description: t('welcome.description'),
|
15
|
-
title: t('welcome.title'),
|
15
|
+
description: t('welcome.description', { appName: BRANDING_NAME }),
|
16
|
+
title: t('welcome.title', { appName: BRANDING_NAME }),
|
16
17
|
url: '/welcome',
|
17
18
|
});
|
18
19
|
};
|
@@ -21,8 +22,8 @@ const Page = async () => {
|
|
21
22
|
const mobile = isMobileDevice();
|
22
23
|
const { t } = await translation('metadata');
|
23
24
|
const ld = ldModule.generate({
|
24
|
-
description: t('welcome.description'),
|
25
|
-
title: t('welcome.title'),
|
25
|
+
description: t('welcome.description', { appName: BRANDING_NAME }),
|
26
|
+
title: t('welcome.title', { appName: BRANDING_NAME }),
|
26
27
|
url: '/welcome',
|
27
28
|
});
|
28
29
|
|
package/src/app/metadata.ts
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
import { Metadata } from 'next';
|
2
2
|
|
3
3
|
import { appEnv } from '@/config/app';
|
4
|
+
import { BRANDING_NAME } from '@/const/branding';
|
4
5
|
import { OFFICIAL_URL, OG_URL } from '@/const/url';
|
5
6
|
import { translation } from '@/server/translation';
|
6
7
|
|
7
|
-
const title = 'LobeChat';
|
8
|
-
|
9
8
|
const BASE_PATH = appEnv.NEXT_PUBLIC_BASE_PATH;
|
10
9
|
|
11
10
|
// if there is a base path, then we don't need the manifest
|
@@ -17,9 +16,9 @@ export const generateMetadata = async (): Promise<Metadata> => {
|
|
17
16
|
return {
|
18
17
|
appleWebApp: {
|
19
18
|
statusBarStyle: 'black-translucent',
|
20
|
-
title,
|
19
|
+
title: BRANDING_NAME,
|
21
20
|
},
|
22
|
-
description: t('chat.description'),
|
21
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
23
22
|
icons: {
|
24
23
|
apple: '/apple-touch-icon.png?v=1',
|
25
24
|
icon: '/favicon.ico?v=1',
|
@@ -28,31 +27,31 @@ export const generateMetadata = async (): Promise<Metadata> => {
|
|
28
27
|
manifest: noManifest ? undefined : '/manifest.json',
|
29
28
|
metadataBase: new URL(OFFICIAL_URL),
|
30
29
|
openGraph: {
|
31
|
-
description: t('chat.description'),
|
30
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
32
31
|
images: [
|
33
32
|
{
|
34
|
-
alt: t('chat.title'),
|
33
|
+
alt: t('chat.title', { appName: BRANDING_NAME }),
|
35
34
|
height: 640,
|
36
35
|
url: OG_URL,
|
37
36
|
width: 1200,
|
38
37
|
},
|
39
38
|
],
|
40
39
|
locale: 'en-US',
|
41
|
-
siteName:
|
42
|
-
title:
|
40
|
+
siteName: BRANDING_NAME,
|
41
|
+
title: BRANDING_NAME,
|
43
42
|
type: 'website',
|
44
43
|
url: OFFICIAL_URL,
|
45
44
|
},
|
46
45
|
title: {
|
47
|
-
default: t('chat.title'),
|
48
|
-
template:
|
46
|
+
default: t('chat.title', { appName: BRANDING_NAME }),
|
47
|
+
template: `%s · ${BRANDING_NAME}`,
|
49
48
|
},
|
50
49
|
twitter: {
|
51
50
|
card: 'summary_large_image',
|
52
|
-
description: t('chat.description'),
|
51
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
53
52
|
images: [OG_URL],
|
54
53
|
site: '@lobehub',
|
55
|
-
title: t('chat.title'),
|
54
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
56
55
|
},
|
57
56
|
};
|
58
57
|
};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { LobeChat } from '@lobehub/ui/brand';
|
2
|
+
import { memo } from 'react';
|
3
|
+
|
4
|
+
interface ProductLogoProps {
|
5
|
+
className?: string;
|
6
|
+
extra?: string;
|
7
|
+
size?: number;
|
8
|
+
}
|
9
|
+
|
10
|
+
export const ProductLogo = memo<ProductLogoProps>(({ size, className, extra }) => {
|
11
|
+
return <LobeChat className={className} extra={extra} size={size} type={'text'} />;
|
12
|
+
});
|
13
|
+
|
14
|
+
export default ProductLogo;
|
@@ -0,0 +1 @@
|
|
1
|
+
export { ProductLogo } from './ProductLogo';
|
@@ -2,8 +2,13 @@
|
|
2
2
|
import { z } from 'zod';
|
3
3
|
|
4
4
|
export const FeatureFlagsSchema = z.object({
|
5
|
+
/**
|
6
|
+
*
|
7
|
+
*/
|
5
8
|
webrtc_sync: z.boolean().optional(),
|
9
|
+
check_updates: z.boolean().optional(),
|
6
10
|
|
11
|
+
// settings
|
7
12
|
language_model_settings: z.boolean().optional(),
|
8
13
|
|
9
14
|
openai_api_key: z.boolean().optional(),
|
@@ -13,19 +18,20 @@ export const FeatureFlagsSchema = z.object({
|
|
13
18
|
edit_agent: z.boolean().optional(),
|
14
19
|
|
15
20
|
dalle: z.boolean().optional(),
|
21
|
+
speech_to_text: z.boolean().optional(),
|
22
|
+
token_counter: z.boolean().optional(),
|
16
23
|
|
17
|
-
check_updates: z.boolean().optional(),
|
18
24
|
welcome_suggest: z.boolean().optional(),
|
19
25
|
|
20
26
|
clerk_sign_up: z.boolean().optional(),
|
21
27
|
|
22
|
-
cloud_promotion: z.boolean().optional(),
|
23
|
-
|
24
28
|
market: z.boolean().optional(),
|
25
|
-
speech_to_text: z.boolean().optional(),
|
26
|
-
|
27
29
|
knowledge_base: z.boolean().optional(),
|
30
|
+
|
28
31
|
rag_eval: z.boolean().optional(),
|
32
|
+
|
33
|
+
// internal flag
|
34
|
+
cloud_promotion: z.boolean().optional(),
|
29
35
|
});
|
30
36
|
|
31
37
|
export type IFeatureFlags = z.infer<typeof FeatureFlagsSchema>;
|
@@ -5,20 +5,12 @@ const DeepSeek: ModelProviderCard = {
|
|
5
5
|
chatModels: [
|
6
6
|
{
|
7
7
|
description: '擅长通用对话任务',
|
8
|
-
displayName: 'DeepSeek
|
8
|
+
displayName: 'DeepSeek V2.5',
|
9
9
|
enabled: true,
|
10
10
|
functionCall: true,
|
11
11
|
id: 'deepseek-chat',
|
12
12
|
tokens: 128_000,
|
13
13
|
},
|
14
|
-
{
|
15
|
-
description: '擅长处理编程和数学任务',
|
16
|
-
displayName: 'DeepSeek-Coder-V2',
|
17
|
-
enabled: true,
|
18
|
-
functionCall: true,
|
19
|
-
id: 'deepseek-coder',
|
20
|
-
tokens: 128_000,
|
21
|
-
},
|
22
14
|
],
|
23
15
|
checkModel: 'deepseek-chat',
|
24
16
|
id: 'deepseek',
|
@@ -10,14 +10,14 @@ const Groq: ModelProviderCard = {
|
|
10
10
|
enabled: true,
|
11
11
|
functionCall: true,
|
12
12
|
id: 'llama-3.1-8b-instant',
|
13
|
-
tokens:
|
13
|
+
tokens: 131_072,
|
14
14
|
},
|
15
15
|
{
|
16
16
|
displayName: 'Llama 3.1 70B (Preview)',
|
17
17
|
enabled: true,
|
18
18
|
functionCall: true,
|
19
19
|
id: 'llama-3.1-70b-versatile',
|
20
|
-
tokens:
|
20
|
+
tokens: 131_072,
|
21
21
|
},
|
22
22
|
/*
|
23
23
|
// Offline due to overwhelming demand! Stay tuned for updates.
|
@@ -25,7 +25,7 @@ const Groq: ModelProviderCard = {
|
|
25
25
|
displayName: 'Llama 3.1 405B (Preview)',
|
26
26
|
functionCall: true,
|
27
27
|
id: 'llama-3.1-405b-reasoning',
|
28
|
-
tokens:
|
28
|
+
tokens: 8_192,
|
29
29
|
},
|
30
30
|
*/
|
31
31
|
{
|
@@ -4,30 +4,30 @@ import { ModelProviderCard } from '@/types/llm';
|
|
4
4
|
const Novita: ModelProviderCard = {
|
5
5
|
chatModels: [
|
6
6
|
{
|
7
|
-
displayName: '
|
7
|
+
displayName: 'Llama 3.1 8B Instruct',
|
8
8
|
enabled: true,
|
9
9
|
id: 'meta-llama/llama-3.1-8b-instruct',
|
10
10
|
tokens: 8192,
|
11
11
|
},
|
12
12
|
{
|
13
|
-
displayName: '
|
13
|
+
displayName: 'Llama 3.1 70B Instruct',
|
14
14
|
enabled: true,
|
15
15
|
id: 'meta-llama/llama-3.1-70b-instruct',
|
16
16
|
tokens: 131_072,
|
17
17
|
},
|
18
18
|
{
|
19
|
-
displayName: '
|
19
|
+
displayName: 'Llama 3.1 405B Instruct',
|
20
20
|
enabled: true,
|
21
21
|
id: 'meta-llama/llama-3.1-405b-instruct',
|
22
22
|
tokens: 32_768,
|
23
23
|
},
|
24
24
|
{
|
25
|
-
displayName: '
|
25
|
+
displayName: 'Llama 3 8B Instruct',
|
26
26
|
id: 'meta-llama/llama-3-8b-instruct',
|
27
27
|
tokens: 8192,
|
28
28
|
},
|
29
29
|
{
|
30
|
-
displayName: '
|
30
|
+
displayName: 'Llama 3 70B Instruct',
|
31
31
|
id: 'meta-llama/llama-3-70b-instruct',
|
32
32
|
tokens: 8192,
|
33
33
|
},
|
@@ -4,18 +4,18 @@ import { ModelProviderCard } from '@/types/llm';
|
|
4
4
|
const Ollama: ModelProviderCard = {
|
5
5
|
chatModels: [
|
6
6
|
{
|
7
|
-
displayName: '
|
7
|
+
displayName: 'Llama 3.1 8B',
|
8
8
|
enabled: true,
|
9
9
|
id: 'llama3.1',
|
10
10
|
tokens: 128_000,
|
11
11
|
},
|
12
12
|
{
|
13
|
-
displayName: '
|
13
|
+
displayName: 'Llama 3.1 70B',
|
14
14
|
id: 'llama3.1:70b',
|
15
15
|
tokens: 128_000,
|
16
16
|
},
|
17
17
|
{
|
18
|
-
displayName: '
|
18
|
+
displayName: 'Llama 3.1 405B',
|
19
19
|
id: 'llama3.1:405b',
|
20
20
|
tokens: 128_000,
|
21
21
|
},
|
@@ -41,18 +41,18 @@ const Ollama: ModelProviderCard = {
|
|
41
41
|
tokens: 16_384,
|
42
42
|
},
|
43
43
|
{
|
44
|
-
displayName: '
|
44
|
+
displayName: 'Gemma 2 2B',
|
45
45
|
id: 'gemma2:2b',
|
46
46
|
tokens: 8192,
|
47
47
|
},
|
48
48
|
{
|
49
|
-
displayName: '
|
49
|
+
displayName: 'Gemma 2 9B',
|
50
50
|
enabled: true,
|
51
51
|
id: 'gemma2',
|
52
52
|
tokens: 8192,
|
53
53
|
},
|
54
54
|
{
|
55
|
-
displayName: '
|
55
|
+
displayName: 'Gemma 2 27B',
|
56
56
|
id: 'gemma2:27b',
|
57
57
|
tokens: 8192,
|
58
58
|
},
|
@@ -4,36 +4,36 @@ import { ModelProviderCard } from '@/types/llm';
|
|
4
4
|
const Perplexity: ModelProviderCard = {
|
5
5
|
chatModels: [
|
6
6
|
{
|
7
|
-
displayName: '
|
7
|
+
displayName: 'Llama 3.1 Sonar Small Chat',
|
8
8
|
enabled: true,
|
9
9
|
id: 'llama-3.1-sonar-small-128k-chat',
|
10
10
|
tokens: 128_000,
|
11
11
|
},
|
12
12
|
{
|
13
|
-
displayName: '
|
13
|
+
displayName: 'Llama 3.1 Sonar Large Chat',
|
14
14
|
enabled: true,
|
15
15
|
id: 'llama-3.1-sonar-large-128k-chat',
|
16
16
|
tokens: 128_000,
|
17
17
|
},
|
18
18
|
{
|
19
|
-
displayName: '
|
19
|
+
displayName: 'Llama 3.1 Sonar Small Online',
|
20
20
|
enabled: true,
|
21
21
|
id: 'llama-3.1-sonar-small-128k-online',
|
22
22
|
tokens: 128_000,
|
23
23
|
},
|
24
24
|
{
|
25
|
-
displayName: '
|
25
|
+
displayName: 'Llama 3.1 Sonar Large Online',
|
26
26
|
enabled: true,
|
27
27
|
id: 'llama-3.1-sonar-large-128k-online',
|
28
28
|
tokens: 128_000,
|
29
29
|
},
|
30
30
|
{
|
31
|
-
displayName: '
|
31
|
+
displayName: 'Llama 3.1 8B Instruct',
|
32
32
|
id: 'llama-3.1-8b-instruct',
|
33
33
|
tokens: 128_000,
|
34
34
|
},
|
35
35
|
{
|
36
|
-
displayName: '
|
36
|
+
displayName: 'Llama 3.1 70B Instruct',
|
37
37
|
id: 'llama-3.1-70b-instruct',
|
38
38
|
tokens: 128_000,
|
39
39
|
},
|
@@ -58,15 +58,6 @@ const Qwen: ModelProviderCard = {
|
|
58
58
|
displayName: 'Qwen VL Max',
|
59
59
|
enabled: true,
|
60
60
|
id: 'qwen-vl-max',
|
61
|
-
tokens: 8192,
|
62
|
-
vision: true,
|
63
|
-
},
|
64
|
-
{
|
65
|
-
description:
|
66
|
-
'抢先体验即将升级的 qwen-vl-max 大模型。',
|
67
|
-
displayName: 'Qwen VL Max 0809',
|
68
|
-
enabled: true,
|
69
|
-
id: 'qwen-vl-max-0809',
|
70
61
|
tokens: 32_768,
|
71
62
|
vision: true,
|
72
63
|
},
|
@@ -79,7 +70,7 @@ const Qwen: ModelProviderCard = {
|
|
79
70
|
},
|
80
71
|
{
|
81
72
|
description: '通义千问2对外开源的57B规模14B激活参数的MOE模型',
|
82
|
-
displayName: 'Qwen2 57B
|
73
|
+
displayName: 'Qwen2 57B A14B MoE',
|
83
74
|
id: 'qwen2-57b-a14b-instruct',
|
84
75
|
tokens: 65_536, // https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct
|
85
76
|
},
|