@lobehub/chat 0.82.1 → 0.82.3
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 +52 -0
- package/README.md +22 -6
- package/README.zh-CN.md +21 -5
- package/docs/Environment-Variable.md +45 -9
- package/locales/en_US/common.json +1 -1
- package/locales/ru_RU/common.json +1 -1
- package/locales/zh_CN/common.json +1 -1
- package/locales/zh_TW/common.json +1 -1
- package/package.json +1 -1
- package/public/images/screenshot_background.webp +0 -0
- package/src/app/chat/features/Conversation/ChatList/Error/ApiKeyForm.tsx +44 -20
- package/src/app/chat/features/Conversation/ChatList/Error/InvalidAccess.tsx +20 -18
- package/src/app/chat/features/Conversation/ChatList/Error/OpenAiBizError.tsx +1 -11
- package/src/app/chat/features/Conversation/ChatList/OTPInput.tsx +0 -6
- package/src/app/chat/features/Header/Mobile.tsx +12 -7
- package/src/app/chat/features/Header/ShareButton/Inner.tsx +31 -26
- package/src/app/chat/features/Header/ShareButton/index.tsx +6 -1
- package/src/app/chat/features/SessionList/Header/Desktop.tsx +2 -4
- package/src/app/chat/features/SessionList/Header/Mobile.tsx +15 -14
- package/src/app/chat/features/Sidebar/Mobile.tsx +3 -17
- package/src/app/chat/layout.desktop.tsx +2 -1
- package/src/app/chat/layout.mobile.tsx +2 -1
- package/src/app/chat/settings/features/Header/index.tsx +3 -3
- package/src/app/chat/settings/layout.mobile.tsx +1 -8
- package/src/app/market/features/AgentCard/AgentCardBanner.tsx +2 -1
- package/src/app/market/features/Header/Mobile.tsx +2 -21
- package/src/app/market/features/SideBar/AgentInfo/Header.tsx +2 -1
- package/src/app/market/features/SideBar/AgentInfo/index.tsx +10 -2
- package/src/app/market/features/SideBar/Mobile.tsx +3 -17
- package/src/app/market/layout.desktop.tsx +2 -1
- package/src/app/market/layout.mobile.tsx +2 -1
- package/src/app/settings/agent/index.tsx +20 -0
- package/src/app/settings/agent/page.tsx +7 -0
- package/src/app/settings/{features/Settings → common}/Common.tsx +1 -1
- package/src/app/settings/common/index.tsx +20 -0
- package/src/app/settings/common/page.tsx +7 -0
- package/src/app/settings/features/Header/Desktop.tsx +9 -2
- package/src/app/settings/features/Header/Mobile.tsx +5 -2
- package/src/app/settings/features/SideBar/Item.tsx +39 -0
- package/src/app/settings/features/SideBar/List.tsx +30 -0
- package/src/app/settings/features/SideBar/index.tsx +38 -0
- package/src/app/settings/index.tsx +5 -7
- package/src/app/settings/layout.desktop.tsx +6 -2
- package/src/app/settings/layout.mobile.tsx +1 -3
- package/src/app/settings/{features/Settings → llm}/LLM/index.tsx +4 -2
- package/src/app/settings/llm/index.tsx +20 -0
- package/src/app/settings/llm/page.tsx +7 -0
- package/src/app/settings/mobile/ExtraList.tsx +61 -0
- package/src/app/settings/mobile/index.tsx +43 -0
- package/src/app/settings/mobile/page.tsx +7 -0
- package/src/app/settings/page.tsx +1 -7
- package/src/components/MobilePadding/index.tsx +32 -0
- package/src/const/layoutTokens.ts +1 -0
- package/src/features/AgentSetting/AgentMeta/index.tsx +0 -1
- package/src/features/AgentSetting/AgentPlugin/MarketSettingModal.tsx +29 -16
- package/src/features/MobileTabBar/index.tsx +15 -3
- package/src/features/PluginDevModal/PluginPreview.tsx +11 -4
- package/src/features/PluginDevModal/index.tsx +14 -10
- package/src/features/SideBar/BottomActions.tsx +3 -3
- package/src/features/SideBar/TopActions.tsx +5 -4
- package/src/locales/default/common.ts +1 -1
- package/src/locales/default/error.ts +1 -0
- package/src/locales/default/plugin.ts +2 -1
- package/src/store/global/hooks/useSwitchSettingsOnInit.ts +9 -0
- package/src/store/global/initialState.ts +13 -4
- package/src/store/global/selectors.ts +7 -0
- package/src/store/global/slices/settings.ts +5 -1
- package/src/store/global/store.ts +0 -4
- package/src/store/session/slices/chat/actions/share.ts +1 -1
- package/src/styles/antdOverride.ts +2 -26
- package/src/styles/global.ts +9 -0
- package/src/app/settings/features/Banner/index.tsx +0 -94
- package/src/app/settings/features/Settings/index.tsx +0 -53
- /package/src/app/settings/{features/Settings → agent}/Agent.tsx +0 -0
- /package/src/app/settings/{features/Settings → llm}/LLM/Checker.tsx +0 -0
- /package/src/app/settings/{features/Settings → llm}/LLM/ModelList.tsx +0 -0
- /package/src/app/settings/{features/Settings → llm}/LLM/getModelList.ts +0 -0
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { DEFAULT_SETTINGS } from '@/const/settings';
|
|
2
2
|
import type { GlobalSettings } from '@/types/settings';
|
|
3
3
|
|
|
4
|
-
export
|
|
4
|
+
export enum SidebarTabKey {
|
|
5
|
+
Chat = 'chat',
|
|
6
|
+
Market = 'market',
|
|
7
|
+
Setting = 'settings',
|
|
8
|
+
}
|
|
5
9
|
|
|
6
|
-
export
|
|
10
|
+
export enum SettingsTabs {
|
|
11
|
+
Agent = 'agent',
|
|
12
|
+
Common = 'common',
|
|
13
|
+
LLM = 'llm',
|
|
14
|
+
}
|
|
7
15
|
|
|
8
16
|
export interface Guide {
|
|
9
17
|
// Topic 引导
|
|
@@ -21,7 +29,7 @@ export interface GlobalState {
|
|
|
21
29
|
* 用户设置
|
|
22
30
|
*/
|
|
23
31
|
settings: GlobalSettings;
|
|
24
|
-
settingsTab
|
|
32
|
+
settingsTab: SettingsTabs;
|
|
25
33
|
sidebarKey: SidebarTabKey;
|
|
26
34
|
}
|
|
27
35
|
|
|
@@ -44,5 +52,6 @@ export const initialState: GlobalState = {
|
|
|
44
52
|
showSessionPanel: true,
|
|
45
53
|
},
|
|
46
54
|
settings: DEFAULT_SETTINGS,
|
|
47
|
-
|
|
55
|
+
settingsTab: SettingsTabs.Common,
|
|
56
|
+
sidebarKey: SidebarTabKey.Chat,
|
|
48
57
|
};
|
|
@@ -13,6 +13,9 @@ const defaultAgentConfig = (s: GlobalStore) => merge(DEFAULT_AGENT_CONFIG, defau
|
|
|
13
13
|
|
|
14
14
|
const defaultAgentMeta = (s: GlobalStore) => merge(DEFAULT_AGENT_META, defaultAgent(s).meta);
|
|
15
15
|
|
|
16
|
+
const openAIAPIKeySelectors = (s: GlobalStore) =>
|
|
17
|
+
s.settings.languageModel.openAI.OPENAI_API_KEY || s.settings.OPENAI_API_KEY;
|
|
18
|
+
|
|
16
19
|
export const exportSettings = (s: GlobalStore) => {
|
|
17
20
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
21
|
const { OPENAI_API_KEY: _, password: __, ...settings } = s.settings;
|
|
@@ -27,3 +30,7 @@ export const globalSelectors = {
|
|
|
27
30
|
defaultAgentMeta,
|
|
28
31
|
exportSettings,
|
|
29
32
|
};
|
|
33
|
+
|
|
34
|
+
export const settingsSelectors = {
|
|
35
|
+
openAIAPI: openAIAPIKeySelectors,
|
|
36
|
+
};
|
|
@@ -23,6 +23,7 @@ export interface SettingsAction {
|
|
|
23
23
|
* 重置设置
|
|
24
24
|
*/
|
|
25
25
|
resetSettings: () => void;
|
|
26
|
+
setOpenAIAPIKey: (apikey: string) => void;
|
|
26
27
|
/**
|
|
27
28
|
* 设置部分配置设置
|
|
28
29
|
* @param settings - 部分配置设置
|
|
@@ -62,6 +63,10 @@ export const createSettingsSlice: StateCreator<
|
|
|
62
63
|
resetSettings: () => {
|
|
63
64
|
set({ settings: DEFAULT_SETTINGS }, false, t('resetSettings'));
|
|
64
65
|
},
|
|
66
|
+
setOpenAIAPIKey: (apikey) => {
|
|
67
|
+
get().setSettings({ languageModel: { openAI: { OPENAI_API_KEY: apikey } } });
|
|
68
|
+
},
|
|
69
|
+
|
|
65
70
|
setSettings: (settings) => {
|
|
66
71
|
const oldSetting = get().settings;
|
|
67
72
|
const nextSettings = merge(oldSetting, settings);
|
|
@@ -70,7 +75,6 @@ export const createSettingsSlice: StateCreator<
|
|
|
70
75
|
|
|
71
76
|
set({ settings: merge(oldSetting, settings) }, false, t('setSettings', settings));
|
|
72
77
|
},
|
|
73
|
-
|
|
74
78
|
switchSettingTabs: (tab) => {
|
|
75
79
|
set({ settingsTab: tab });
|
|
76
80
|
},
|
|
@@ -14,7 +14,7 @@ interface ShareMessage {
|
|
|
14
14
|
from: 'human' | 'gpt';
|
|
15
15
|
value: string;
|
|
16
16
|
}
|
|
17
|
-
const AVATAR =
|
|
17
|
+
export const AVATAR =
|
|
18
18
|
'data:image/webp;base64,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';
|
|
19
19
|
|
|
20
20
|
const Footer: ShareMessage = {
|
|
@@ -1,31 +1,7 @@
|
|
|
1
1
|
import { Theme, css } from 'antd-style';
|
|
2
|
-
import { readableColor } from 'polished';
|
|
3
2
|
|
|
4
|
-
export default ({ token
|
|
5
|
-
.${prefixCls}-
|
|
6
|
-
box-shadow: none;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.${prefixCls}-popover {
|
|
3
|
+
export default ({ token }: { prefixCls: string; token: Theme }) => css`
|
|
4
|
+
.${token.prefixCls}-popover {
|
|
10
5
|
z-index: 1100;
|
|
11
6
|
}
|
|
12
|
-
|
|
13
|
-
.${prefixCls}-slider-track, .${prefixCls}-tabs-ink-bar, .${prefixCls}-switch-checked {
|
|
14
|
-
background: ${token.colorPrimary} !important;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.${prefixCls}-btn-primary:not(.${prefixCls}-btn-dangerous) {
|
|
18
|
-
color: ${readableColor(token.colorPrimary)};
|
|
19
|
-
background: ${token.colorPrimary};
|
|
20
|
-
|
|
21
|
-
&:hover {
|
|
22
|
-
color: ${readableColor(token.colorPrimary)} !important;
|
|
23
|
-
background: ${token.colorPrimaryHover} !important;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
&:active {
|
|
27
|
-
color: ${readableColor(token.colorPrimaryActive)} !important;
|
|
28
|
-
background: ${token.colorPrimaryActive} !important;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
7
|
`;
|
package/src/styles/global.ts
CHANGED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { GridBackground, Icon, Logo } from '@lobehub/ui';
|
|
2
|
-
import { createStyles, useResponsive } from 'antd-style';
|
|
3
|
-
import { PackageCheck } from 'lucide-react';
|
|
4
|
-
import { rgba } from 'polished';
|
|
5
|
-
import { ReactNode, memo } from 'react';
|
|
6
|
-
import { Flexbox } from 'react-layout-kit';
|
|
7
|
-
|
|
8
|
-
import pkg from '@/../package.json';
|
|
9
|
-
|
|
10
|
-
const useStyles = createStyles(({ css, token, isDarkMode, prefixCls }) => ({
|
|
11
|
-
background: css`
|
|
12
|
-
position: absolute;
|
|
13
|
-
bottom: -10%;
|
|
14
|
-
left: 0;
|
|
15
|
-
width: 100%;
|
|
16
|
-
`,
|
|
17
|
-
banner: css`
|
|
18
|
-
position: relative;
|
|
19
|
-
|
|
20
|
-
overflow: hidden;
|
|
21
|
-
|
|
22
|
-
width: 100%;
|
|
23
|
-
max-width: 1024px;
|
|
24
|
-
height: 160px;
|
|
25
|
-
padding: 4px;
|
|
26
|
-
|
|
27
|
-
background: radial-gradient(
|
|
28
|
-
120% 120% at 20% 100%,
|
|
29
|
-
${isDarkMode ? rgba(token.colorBgContainer, 0.5) : token.colorBgContainer} 32%,
|
|
30
|
-
${isDarkMode ? token.colorPrimaryBgHover : rgba(token.colorPrimaryBgHover, 0.3)} 50%,
|
|
31
|
-
${isDarkMode ? token.colorPrimaryHover : rgba(token.colorPrimaryHover, 0.3)} 100%
|
|
32
|
-
);
|
|
33
|
-
border: 1px solid ${token.colorBorderSecondary};
|
|
34
|
-
border-radius: ${token.borderRadiusLG}px;
|
|
35
|
-
`,
|
|
36
|
-
logo: css`
|
|
37
|
-
position: absolute;
|
|
38
|
-
top: 50%;
|
|
39
|
-
left: 32px;
|
|
40
|
-
transform: translateY(-50%);
|
|
41
|
-
`,
|
|
42
|
-
mobile: css`
|
|
43
|
-
margin-top: -16px;
|
|
44
|
-
|
|
45
|
-
.${prefixCls}-tabs-tab, .${prefixCls}-tabs-tab + .${prefixCls}-tabs-tab {
|
|
46
|
-
margin: 4px 8px !important;
|
|
47
|
-
}
|
|
48
|
-
`,
|
|
49
|
-
tag: css`
|
|
50
|
-
position: absolute;
|
|
51
|
-
top: 6px;
|
|
52
|
-
right: 12px;
|
|
53
|
-
|
|
54
|
-
font-family: ${token.fontFamilyCode};
|
|
55
|
-
font-size: 12px;
|
|
56
|
-
color: ${isDarkMode ? token.colorPrimaryBg : token.colorPrimaryActive};
|
|
57
|
-
|
|
58
|
-
opacity: 0.5;
|
|
59
|
-
`,
|
|
60
|
-
}));
|
|
61
|
-
|
|
62
|
-
const Banner = memo<{ nav: ReactNode }>(({ nav }) => {
|
|
63
|
-
const { styles, theme } = useStyles();
|
|
64
|
-
const { mobile } = useResponsive();
|
|
65
|
-
|
|
66
|
-
if (mobile)
|
|
67
|
-
return (
|
|
68
|
-
<Flexbox align={'flex-end'} className={styles.mobile} horizontal justify={'center'}>
|
|
69
|
-
{nav}
|
|
70
|
-
</Flexbox>
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<Flexbox align={'flex-end'} className={styles.banner} horizontal justify={'center'}>
|
|
75
|
-
<GridBackground
|
|
76
|
-
animation
|
|
77
|
-
className={styles.background}
|
|
78
|
-
colorBack={theme.colorFillSecondary}
|
|
79
|
-
colorFront={theme.colorPrimary}
|
|
80
|
-
random
|
|
81
|
-
/>
|
|
82
|
-
{nav}
|
|
83
|
-
<div className={styles.logo}>
|
|
84
|
-
<Logo extra={'Chat'} type={'text'} />
|
|
85
|
-
</div>
|
|
86
|
-
<Flexbox align={'center'} className={styles.tag} gap={4} horizontal>
|
|
87
|
-
<Icon icon={PackageCheck} />
|
|
88
|
-
<div>{`${pkg.version}`}</div>
|
|
89
|
-
</Flexbox>
|
|
90
|
-
</Flexbox>
|
|
91
|
-
);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
export default Banner;
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { TabsNav } from '@lobehub/ui';
|
|
2
|
-
import { memo, useMemo } from 'react';
|
|
3
|
-
import { useTranslation } from 'react-i18next';
|
|
4
|
-
import { Center } from 'react-layout-kit';
|
|
5
|
-
|
|
6
|
-
import { useGlobalStore } from '@/store/global';
|
|
7
|
-
|
|
8
|
-
import Banner from '../Banner';
|
|
9
|
-
import Agent from './Agent';
|
|
10
|
-
import Common from './Common';
|
|
11
|
-
import LLM from './LLM';
|
|
12
|
-
|
|
13
|
-
const Settings = memo(() => {
|
|
14
|
-
const { t } = useTranslation('setting');
|
|
15
|
-
|
|
16
|
-
const [tab, setTab] = useGlobalStore((s) => [s.settingsTab, s.switchSettingTabs]);
|
|
17
|
-
|
|
18
|
-
const content = useMemo(() => {
|
|
19
|
-
switch (tab) {
|
|
20
|
-
case 'llm': {
|
|
21
|
-
return <LLM />;
|
|
22
|
-
}
|
|
23
|
-
case 'agent': {
|
|
24
|
-
return <Agent />;
|
|
25
|
-
}
|
|
26
|
-
default:
|
|
27
|
-
case 'common': {
|
|
28
|
-
return <Common />;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}, [tab]);
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<Center gap={16} width={'100%'}>
|
|
35
|
-
<Banner
|
|
36
|
-
nav={
|
|
37
|
-
<TabsNav
|
|
38
|
-
activeKey={tab}
|
|
39
|
-
items={[
|
|
40
|
-
{ key: 'common', label: t('tab.common') },
|
|
41
|
-
{ key: 'llm', label: t('tab.llm') },
|
|
42
|
-
{ key: 'agent', label: t('tab.agent') },
|
|
43
|
-
]}
|
|
44
|
-
onChange={(e) => setTab(e as any)}
|
|
45
|
-
/>
|
|
46
|
-
}
|
|
47
|
-
/>
|
|
48
|
-
{content}
|
|
49
|
-
</Center>
|
|
50
|
-
);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
export default Settings;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|