@lobehub/chat 0.14.0 → 0.15.1
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 +51 -0
- package/locales/en_US/common.json +19 -27
- package/locales/en_US/plugin.json +10 -0
- package/locales/en_US/setting.json +42 -6
- package/locales/zh_CN/common.json +8 -17
- package/locales/zh_CN/plugin.json +10 -0
- package/locales/zh_CN/setting.json +36 -0
- package/package.json +1 -1
- package/src/components/HeaderSpacing/index.tsx +3 -1
- package/src/components/HeaderTitle/index.tsx +42 -0
- package/src/const/layoutTokens.ts +6 -1
- package/src/const/meta.ts +3 -0
- package/src/locales/default/common.ts +31 -51
- package/src/locales/default/plugin.ts +10 -0
- package/src/locales/default/setting.ts +46 -1
- package/src/locales/resources/en_US.ts +2 -0
- package/src/locales/resources/zh_CN.ts +2 -0
- package/src/pages/chat/SessionList/List/SessionItem.tsx +1 -2
- package/src/pages/chat/[id]/Config/Header.tsx +26 -0
- package/src/pages/chat/[id]/Config/SideBar.tsx +86 -0
- package/src/pages/chat/[id]/Config/index.tsx +5 -45
- package/src/pages/chat/[id]/Conversation/FunctionMessage.tsx +1 -1
- package/src/pages/chat/[id]/Conversation/Input/Action.tsx +13 -5
- package/src/pages/chat/[id]/Conversation/Input/index.tsx +11 -3
- package/src/pages/chat/[id]/Conversation/MessageExtra.tsx +1 -1
- package/src/pages/chat/[id]/Header.tsx +34 -43
- package/src/pages/chat/[id]/edit/AgentConfig/index.tsx +154 -95
- package/src/pages/chat/[id]/edit/AgentMeta/AutoGenerateInput.tsx +39 -0
- package/src/pages/chat/[id]/edit/AgentMeta/BackgroundSwatches.tsx +31 -0
- package/src/pages/chat/[id]/edit/AgentMeta/EmojiPicker.tsx +7 -3
- package/src/pages/chat/[id]/edit/AgentMeta/index.tsx +68 -75
- package/src/pages/chat/[id]/edit/AgentPlugin/index.tsx +44 -0
- package/src/pages/chat/[id]/edit/AgentPrompt/index.tsx +48 -0
- package/src/pages/chat/[id]/edit/Header.tsx +31 -0
- package/src/pages/chat/[id]/edit/index.page.tsx +12 -40
- package/src/pages/chat/[id]/index.page.tsx +2 -1
- package/src/pages/setting/Header.tsx +4 -11
- package/src/pages/setting/SettingForm.tsx +9 -9
- package/src/pages/setting/index.page.tsx +2 -1
- package/src/store/session/slices/agentConfig/initialState.ts +1 -5
- package/src/store/session/slices/agentConfig/selectors.ts +15 -5
- package/src/store/session/slices/chat/selectors/chat.ts +2 -2
- package/src/store/session/slices/session/selectors/chat.ts +1 -1
- package/src/utils/genSiteHeadTitle.ts +1 -0
- package/src/pages/chat/[id]/Config/ReadMode.tsx +0 -64
- package/src/pages/chat/[id]/edit/AgentConfig/Plugin.tsx +0 -46
- package/src/pages/chat/[id]/edit/AgentConfig/Prompt.tsx +0 -69
|
@@ -1,30 +1,34 @@
|
|
|
1
|
+
import { DEFAULT_AVATAR, DEFAULT_BACKGROUND_COLOR } from '@/const/meta';
|
|
1
2
|
import { SessionStore } from '@/store/session';
|
|
2
3
|
import { LanguageModel } from '@/types/llm';
|
|
3
4
|
import { MetaData } from '@/types/meta';
|
|
4
5
|
import { LobeAgentConfig } from '@/types/session';
|
|
5
6
|
|
|
6
7
|
import { sessionSelectors } from '../session';
|
|
7
|
-
import {
|
|
8
|
+
import { initialLobeAgentConfig } from './initialState';
|
|
8
9
|
|
|
9
10
|
const currentAgentMeta = (s: SessionStore): MetaData => {
|
|
10
11
|
const session = sessionSelectors.currentSession(s);
|
|
11
12
|
|
|
12
|
-
return session?.meta
|
|
13
|
+
return { avatar: DEFAULT_AVATAR, backgroundColor: DEFAULT_BACKGROUND_COLOR, ...session?.meta };
|
|
13
14
|
};
|
|
14
15
|
|
|
15
16
|
const currentAgentTitle = (s: SessionStore) => currentAgentMeta(s)?.title;
|
|
16
17
|
|
|
17
|
-
const
|
|
18
|
+
const currentAgentBackgroundColor = (s: SessionStore) => {
|
|
18
19
|
const session = sessionSelectors.currentSession(s);
|
|
20
|
+
if (!session) return DEFAULT_BACKGROUND_COLOR;
|
|
21
|
+
return session.meta.backgroundColor || DEFAULT_BACKGROUND_COLOR;
|
|
22
|
+
};
|
|
19
23
|
|
|
24
|
+
const currentAgentAvatar = (s: SessionStore) => {
|
|
25
|
+
const session = sessionSelectors.currentSession(s);
|
|
20
26
|
if (!session) return DEFAULT_AVATAR;
|
|
21
|
-
|
|
22
27
|
return session.meta.avatar || DEFAULT_AVATAR;
|
|
23
28
|
};
|
|
24
29
|
|
|
25
30
|
const currentAgentConfig = (s: SessionStore) => {
|
|
26
31
|
const session = sessionSelectors.currentSession(s);
|
|
27
|
-
|
|
28
32
|
return session?.config;
|
|
29
33
|
};
|
|
30
34
|
|
|
@@ -32,6 +36,10 @@ const currentAgentConfigSafe = (s: SessionStore): LobeAgentConfig => {
|
|
|
32
36
|
return currentAgentConfig(s) || initialLobeAgentConfig;
|
|
33
37
|
};
|
|
34
38
|
|
|
39
|
+
const currentAgentSystemRole = (s: SessionStore) => {
|
|
40
|
+
return currentAgentConfigSafe(s).systemRole;
|
|
41
|
+
};
|
|
42
|
+
|
|
35
43
|
const currentAgentModel = (s: SessionStore): LanguageModel => {
|
|
36
44
|
const config = currentAgentConfig(s);
|
|
37
45
|
|
|
@@ -45,10 +53,12 @@ const hasSystemRole = (s: SessionStore) => {
|
|
|
45
53
|
};
|
|
46
54
|
export const agentSelectors = {
|
|
47
55
|
currentAgentAvatar,
|
|
56
|
+
currentAgentBackgroundColor,
|
|
48
57
|
currentAgentConfig,
|
|
49
58
|
currentAgentConfigSafe,
|
|
50
59
|
currentAgentMeta,
|
|
51
60
|
currentAgentModel,
|
|
61
|
+
currentAgentSystemRole,
|
|
52
62
|
currentAgentTitle,
|
|
53
63
|
hasSystemRole,
|
|
54
64
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { DEFAULT_USER_AVATAR } from '@/const/meta';
|
|
1
2
|
import { agentSelectors } from '@/store/session';
|
|
2
3
|
import { useSettings } from '@/store/settings';
|
|
3
4
|
import { ChatMessage } from '@/types/chatMessage';
|
|
4
5
|
|
|
5
6
|
import type { SessionStore } from '../../../store';
|
|
6
|
-
import { DEFAULT_AVATAR } from '../../agentConfig';
|
|
7
7
|
import { sessionSelectors } from '../../session';
|
|
8
8
|
import { organizeChats } from './utils';
|
|
9
9
|
|
|
@@ -14,7 +14,7 @@ export const currentChats = (s: SessionStore): ChatMessage[] => {
|
|
|
14
14
|
|
|
15
15
|
return organizeChats(session, {
|
|
16
16
|
assistant: agentSelectors.currentAgentAvatar(s),
|
|
17
|
-
user: useSettings.getState().settings.avatar ||
|
|
17
|
+
user: useSettings.getState().settings.avatar || DEFAULT_USER_AVATAR,
|
|
18
18
|
});
|
|
19
19
|
};
|
|
20
20
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const genSiteHeadTitle = (title?: string) => (title ? `${title} - LobeChat` : 'LobeChat');
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Avatar } from '@lobehub/ui';
|
|
2
|
-
import { createStyles } from 'antd-style';
|
|
3
|
-
import isEqual from 'fast-deep-equal';
|
|
4
|
-
import { LucideBrain, LucideThermometer, WholeWord } from 'lucide-react';
|
|
5
|
-
import { memo } from 'react';
|
|
6
|
-
import { useTranslation } from 'react-i18next';
|
|
7
|
-
import { Center, Flexbox } from 'react-layout-kit';
|
|
8
|
-
import { shallow } from 'zustand/shallow';
|
|
9
|
-
|
|
10
|
-
import { agentSelectors, sessionSelectors, useSessionStore } from '@/store/session';
|
|
11
|
-
import { DEFAULT_TITLE } from '@/store/session/slices/agentConfig';
|
|
12
|
-
|
|
13
|
-
import { ConfigCell, ConfigCellGroup } from './ConfigCell';
|
|
14
|
-
|
|
15
|
-
const useStyles = createStyles(({ css, token }) => ({
|
|
16
|
-
desc: css`
|
|
17
|
-
color: ${token.colorText};
|
|
18
|
-
`,
|
|
19
|
-
model: css`
|
|
20
|
-
color: ${token.colorTextTertiary};
|
|
21
|
-
`,
|
|
22
|
-
title: css`
|
|
23
|
-
font-size: ${token.fontSizeHeading4}px;
|
|
24
|
-
font-weight: bold;
|
|
25
|
-
`,
|
|
26
|
-
}));
|
|
27
|
-
|
|
28
|
-
const ReadMode = memo(() => {
|
|
29
|
-
const { styles } = useStyles();
|
|
30
|
-
const session = useSessionStore(sessionSelectors.currentSessionSafe, isEqual);
|
|
31
|
-
const avatar = useSessionStore(agentSelectors.currentAgentAvatar, shallow);
|
|
32
|
-
const title = useSessionStore(agentSelectors.currentAgentTitle, shallow);
|
|
33
|
-
const model = useSessionStore(agentSelectors.currentAgentModel, shallow);
|
|
34
|
-
|
|
35
|
-
const { t } = useTranslation('common');
|
|
36
|
-
return (
|
|
37
|
-
<Center gap={12} paddingBlock={16} style={{ marginTop: 8 }}>
|
|
38
|
-
<Avatar avatar={avatar} size={100} />
|
|
39
|
-
<Flexbox className={styles.title}>{title || DEFAULT_TITLE}</Flexbox>
|
|
40
|
-
<Flexbox className={styles.model}>{model}</Flexbox>
|
|
41
|
-
<Flexbox className={styles.desc}>{session.meta.description}</Flexbox>
|
|
42
|
-
|
|
43
|
-
<Flexbox flex={1} gap={12} width={'100%'}>
|
|
44
|
-
<ConfigCell icon={LucideBrain} label={t('agentPrompt')} />
|
|
45
|
-
<ConfigCellGroup
|
|
46
|
-
items={[
|
|
47
|
-
{
|
|
48
|
-
icon: LucideThermometer,
|
|
49
|
-
label: t('modelTemperature'),
|
|
50
|
-
value: session.config.params.temperature,
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
icon: WholeWord,
|
|
54
|
-
label: t('agentMaxToken'),
|
|
55
|
-
value: session.config.params.max_tokens,
|
|
56
|
-
},
|
|
57
|
-
]}
|
|
58
|
-
/>
|
|
59
|
-
</Flexbox>
|
|
60
|
-
</Center>
|
|
61
|
-
);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
export default ReadMode;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Avatar } from '@lobehub/ui';
|
|
2
|
-
import { List, Switch, Tag } from 'antd';
|
|
3
|
-
import isEqual from 'fast-deep-equal';
|
|
4
|
-
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import { Flexbox } from 'react-layout-kit';
|
|
6
|
-
import { shallow } from 'zustand/shallow';
|
|
7
|
-
|
|
8
|
-
import pluginList from '@/plugins';
|
|
9
|
-
import { agentSelectors, useSessionStore } from '@/store/session';
|
|
10
|
-
|
|
11
|
-
const PluginList = () => {
|
|
12
|
-
const { t } = useTranslation('common');
|
|
13
|
-
|
|
14
|
-
const config = useSessionStore(agentSelectors.currentAgentConfigSafe, isEqual);
|
|
15
|
-
|
|
16
|
-
const [toggleAgentPlugin] = useSessionStore((s) => [s.toggleAgentPlugin], shallow);
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<List
|
|
20
|
-
bordered
|
|
21
|
-
dataSource={pluginList}
|
|
22
|
-
renderItem={(item) => (
|
|
23
|
-
<List.Item>
|
|
24
|
-
<List.Item.Meta
|
|
25
|
-
avatar={<Avatar avatar={item.avatar} />}
|
|
26
|
-
description={item.schema.description}
|
|
27
|
-
title={
|
|
28
|
-
<Flexbox align={'center'} gap={8} horizontal>
|
|
29
|
-
{t(`plugin-${item.name}` as any)} <Tag>{item.name}</Tag>
|
|
30
|
-
</Flexbox>
|
|
31
|
-
}
|
|
32
|
-
/>
|
|
33
|
-
<Switch
|
|
34
|
-
checked={!config.plugins ? false : config.plugins.includes(item.name)}
|
|
35
|
-
onChange={() => {
|
|
36
|
-
toggleAgentPlugin(item.name);
|
|
37
|
-
}}
|
|
38
|
-
/>
|
|
39
|
-
</List.Item>
|
|
40
|
-
)}
|
|
41
|
-
size={'large'}
|
|
42
|
-
/>
|
|
43
|
-
);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export default PluginList;
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { EditableMessage } from '@lobehub/ui';
|
|
2
|
-
import { Button } from 'antd';
|
|
3
|
-
import { createStyles } from 'antd-style';
|
|
4
|
-
import { useState } from 'react';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { Flexbox } from 'react-layout-kit';
|
|
7
|
-
import { shallow } from 'zustand/shallow';
|
|
8
|
-
|
|
9
|
-
import { agentSelectors, useSessionStore } from '@/store/session';
|
|
10
|
-
|
|
11
|
-
import { FormItem } from '../FormItem';
|
|
12
|
-
|
|
13
|
-
export const useStyles = createStyles(({ css, token }) => ({
|
|
14
|
-
input: css`
|
|
15
|
-
padding: 12px;
|
|
16
|
-
background: ${token.colorFillTertiary};
|
|
17
|
-
border: 1px solid ${token.colorPrimaryBorder};
|
|
18
|
-
border-radius: 8px;
|
|
19
|
-
`,
|
|
20
|
-
markdown: css`
|
|
21
|
-
padding: 12px;
|
|
22
|
-
background: ${token.colorFillTertiary};
|
|
23
|
-
`,
|
|
24
|
-
}));
|
|
25
|
-
|
|
26
|
-
const Prompt = () => {
|
|
27
|
-
const { t } = useTranslation('common');
|
|
28
|
-
|
|
29
|
-
const [editing, setEditing] = useState(false);
|
|
30
|
-
const { styles } = useStyles();
|
|
31
|
-
|
|
32
|
-
const systemRole = useSessionStore((s) => {
|
|
33
|
-
const config = agentSelectors.currentAgentConfigSafe(s);
|
|
34
|
-
return config.systemRole;
|
|
35
|
-
}, shallow);
|
|
36
|
-
|
|
37
|
-
const [updateAgentConfig] = useSessionStore((s) => [s.updateAgentConfig], shallow);
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<FormItem label={t('agentPrompt')}>
|
|
41
|
-
<Flexbox gap={16}>
|
|
42
|
-
<EditableMessage
|
|
43
|
-
classNames={styles}
|
|
44
|
-
editing={editing}
|
|
45
|
-
onChange={(e) => {
|
|
46
|
-
updateAgentConfig({ systemRole: e });
|
|
47
|
-
}}
|
|
48
|
-
onEditingChange={setEditing}
|
|
49
|
-
showEditWhenEmpty
|
|
50
|
-
value={systemRole}
|
|
51
|
-
/>
|
|
52
|
-
{!editing && !!systemRole && (
|
|
53
|
-
<Flexbox direction={'horizontal-reverse'}>
|
|
54
|
-
<Button
|
|
55
|
-
onClick={() => {
|
|
56
|
-
setEditing(true);
|
|
57
|
-
}}
|
|
58
|
-
type={'primary'}
|
|
59
|
-
>
|
|
60
|
-
{t('edit')}
|
|
61
|
-
</Button>
|
|
62
|
-
</Flexbox>
|
|
63
|
-
)}
|
|
64
|
-
</Flexbox>
|
|
65
|
-
</FormItem>
|
|
66
|
-
);
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export default Prompt;
|