@lobehub/chat 0.161.8 → 0.161.10
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/docs/self-hosting/advanced/feature-flags.mdx +45 -0
- package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +42 -0
- package/docs/self-hosting/environment-variables/basic.mdx +11 -2
- package/docs/self-hosting/environment-variables/basic.zh-CN.mdx +11 -2
- package/package.json +1 -1
- package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/DragUpload.tsx +92 -42
- package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/index.tsx +2 -2
- package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/Files.tsx +4 -3
- package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +5 -2
- package/src/app/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +6 -7
- package/src/app/(main)/settings/llm/components/ProviderModelList/{ModelConfigModal.tsx → ModelConfigModal/Form.tsx} +19 -63
- package/src/app/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +78 -0
- package/src/app/(main)/settings/llm/components/ProviderModelList/Option.tsx +35 -11
- package/src/app/(main)/settings/llm/components/ProviderModelList/index.tsx +15 -18
- package/src/app/(main)/settings/system-agent/features/Translation.tsx +0 -2
- package/src/components/FileList/ImageFileItem.tsx +1 -1
- package/src/components/ModelProviderIcon/index.tsx +2 -2
- package/src/components/ModelSelect/index.tsx +5 -14
- package/src/const/meta.ts +1 -2
- package/src/features/User/UserPanel/PanelContent.tsx +1 -1
- package/src/hooks/useSyncData.ts +3 -1
- package/src/layout/AuthProvider/Clerk/useAppearance.ts +1 -1
- package/src/layout/GlobalProvider/StoreInitialization.tsx +17 -9
- package/src/layout/GlobalProvider/index.tsx +1 -1
- package/src/locales/default/components.ts +1 -0
- package/src/services/message/client.test.ts +0 -24
- package/src/services/message/client.ts +0 -5
- package/src/services/message/type.ts +0 -1
- package/src/services/user/client.test.ts +100 -0
- package/src/services/user/client.ts +16 -14
- package/src/services/user/index.ts +0 -2
- package/src/services/user/type.ts +2 -4
- package/src/store/user/initialState.ts +10 -1
- package/src/store/user/selectors.ts +3 -7
- package/src/store/user/slices/auth/action.test.ts +5 -87
- package/src/store/user/slices/auth/action.ts +3 -58
- package/src/store/user/slices/auth/initialState.ts +2 -1
- package/src/store/user/slices/common/action.test.ts +196 -20
- package/src/store/user/slices/common/action.ts +55 -26
- package/src/store/user/slices/common/initialState.ts +9 -0
- package/src/store/user/slices/modelList/action.test.ts +363 -0
- package/src/store/user/slices/{settings/actions/llm.ts → modelList/action.ts} +66 -60
- package/src/store/user/slices/modelList/initialState.ts +15 -0
- package/src/store/user/slices/modelList/selectors/index.ts +2 -0
- package/src/store/user/slices/{settings → modelList}/selectors/modelConfig.test.ts +3 -2
- package/src/store/user/slices/{settings → modelList}/selectors/modelConfig.ts +1 -1
- package/src/store/user/slices/{settings → modelList}/selectors/modelProvider.test.ts +7 -7
- package/src/store/user/slices/{settings → modelList}/selectors/modelProvider.ts +2 -4
- package/src/store/user/slices/preference/action.test.ts +0 -52
- package/src/store/user/slices/preference/action.ts +1 -17
- package/src/store/user/slices/preference/initialState.ts +0 -5
- package/src/store/user/slices/preference/selectors.test.ts +2 -2
- package/src/store/user/slices/preference/selectors.ts +1 -1
- package/src/store/user/slices/settings/{actions/general.ts → action.ts} +5 -5
- package/src/store/user/slices/settings/initialState.ts +0 -12
- package/src/store/user/slices/settings/selectors/index.ts +0 -3
- package/src/store/user/slices/sync/action.test.ts +19 -5
- package/src/store/user/slices/sync/action.ts +9 -6
- package/src/store/user/slices/{settings/selectors/sync.ts → sync/selectors.ts} +2 -2
- package/src/store/user/store.ts +5 -2
- package/src/styles/antdOverride.ts +6 -0
- package/src/types/serverConfig.ts +3 -1
- package/src/types/user/index.ts +13 -0
- package/src/utils/parseModels.test.ts +121 -1
- package/src/utils/parseModels.ts +9 -4
- package/src/store/user/slices/settings/actions/index.ts +0 -18
- package/src/store/user/slices/settings/actions/llm.test.ts +0 -136
- /package/src/app/(main)/settings/llm/components/ProviderModelList/{MaxTokenSlider.tsx → ModelConfigModal/MaxTokenSlider.tsx} +0 -0
- /package/src/store/user/slices/{settings → modelList}/reducers/customModelCard.test.ts +0 -0
- /package/src/store/user/slices/{settings → modelList}/reducers/customModelCard.ts +0 -0
- /package/src/store/user/slices/settings/{actions/general.test.ts → action.test.ts} +0 -0
- /package/src/store/user/slices/settings/selectors/__snapshots__/{selectors.test.ts.snap → settings.test.ts.snap} +0 -0
- /package/src/store/user/slices/settings/selectors/{selectors.test.ts → settings.test.ts} +0 -0
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { act, renderHook } from '@testing-library/react';
|
|
2
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
-
|
|
4
|
-
import { userService } from '@/services/user';
|
|
5
|
-
import { useUserStore } from '@/store/user';
|
|
6
|
-
import { GeneralModelProviderConfig } from '@/types/settings';
|
|
7
|
-
|
|
8
|
-
import { CustomModelCardDispatch } from '../reducers/customModelCard';
|
|
9
|
-
import { modelProviderSelectors, settingsSelectors } from '../selectors';
|
|
10
|
-
|
|
11
|
-
// Mock userService
|
|
12
|
-
vi.mock('@/services/user', () => ({
|
|
13
|
-
userService: {
|
|
14
|
-
updateUserSettings: vi.fn(),
|
|
15
|
-
resetUserSettings: vi.fn(),
|
|
16
|
-
},
|
|
17
|
-
}));
|
|
18
|
-
|
|
19
|
-
describe('LLMSettingsSliceAction', () => {
|
|
20
|
-
describe('setModelProviderConfig', () => {
|
|
21
|
-
it('should set OpenAI configuration', async () => {
|
|
22
|
-
const { result } = renderHook(() => useUserStore());
|
|
23
|
-
const openAIConfig: Partial<GeneralModelProviderConfig> = { apiKey: 'test-key' };
|
|
24
|
-
|
|
25
|
-
// Perform the action
|
|
26
|
-
await act(async () => {
|
|
27
|
-
await result.current.setModelProviderConfig('openai', openAIConfig);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Assert that updateUserSettings was called with the correct OpenAI configuration
|
|
31
|
-
expect(userService.updateUserSettings).toHaveBeenCalledWith({
|
|
32
|
-
languageModel: {
|
|
33
|
-
openai: openAIConfig,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('dispatchCustomModelCards', () => {
|
|
40
|
-
it('should return early when prevState does not exist', async () => {
|
|
41
|
-
const { result } = renderHook(() => useUserStore());
|
|
42
|
-
const provider = 'openai';
|
|
43
|
-
const payload: CustomModelCardDispatch = { type: 'add', modelCard: { id: 'test-id' } };
|
|
44
|
-
|
|
45
|
-
// Mock the selector to return undefined
|
|
46
|
-
vi.spyOn(settingsSelectors, 'providerConfig').mockReturnValue(() => undefined);
|
|
47
|
-
vi.spyOn(result.current, 'setModelProviderConfig');
|
|
48
|
-
|
|
49
|
-
await act(async () => {
|
|
50
|
-
await result.current.dispatchCustomModelCards(provider, payload);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Assert that setModelProviderConfig was not called
|
|
54
|
-
expect(result.current.setModelProviderConfig).not.toHaveBeenCalled();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('refreshDefaultModelProviderList', () => {
|
|
59
|
-
it('default', async () => {
|
|
60
|
-
const { result } = renderHook(() => useUserStore());
|
|
61
|
-
|
|
62
|
-
act(() => {
|
|
63
|
-
useUserStore.setState({
|
|
64
|
-
serverConfig: {
|
|
65
|
-
languageModel: {
|
|
66
|
-
azure: { serverModelCards: [{ id: 'abc', deploymentName: 'abc' }] },
|
|
67
|
-
},
|
|
68
|
-
telemetry: {},
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
act(() => {
|
|
74
|
-
result.current.refreshDefaultModelProviderList();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
// Assert that setModelProviderConfig was not called
|
|
78
|
-
const azure = result.current.defaultModelProviderList.find((m) => m.id === 'azure');
|
|
79
|
-
expect(azure?.chatModels).toEqual([{ id: 'abc', deploymentName: 'abc' }]);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe('refreshModelProviderList', () => {
|
|
84
|
-
it('visible', async () => {
|
|
85
|
-
const { result } = renderHook(() => useUserStore());
|
|
86
|
-
act(() => {
|
|
87
|
-
useUserStore.setState({
|
|
88
|
-
settings: {
|
|
89
|
-
languageModel: {
|
|
90
|
-
ollama: { enabledModels: ['llava'] },
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
act(() => {
|
|
97
|
-
result.current.refreshModelProviderList();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const ollamaList = result.current.modelProviderList.find((r) => r.id === 'ollama');
|
|
101
|
-
// Assert that setModelProviderConfig was not called
|
|
102
|
-
expect(ollamaList?.chatModels.find((c) => c.id === 'llava')).toEqual({
|
|
103
|
-
displayName: 'LLaVA 7B',
|
|
104
|
-
enabled: true,
|
|
105
|
-
id: 'llava',
|
|
106
|
-
tokens: 4096,
|
|
107
|
-
vision: true,
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('modelProviderListForModelSelect should return only enabled providers', () => {
|
|
112
|
-
const { result } = renderHook(() => useUserStore());
|
|
113
|
-
|
|
114
|
-
act(() => {
|
|
115
|
-
useUserStore.setState({
|
|
116
|
-
settings: {
|
|
117
|
-
languageModel: {
|
|
118
|
-
perplexity: { enabled: true },
|
|
119
|
-
azure: { enabled: false },
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
act(() => {
|
|
126
|
-
result.current.refreshModelProviderList();
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
const enabledProviders = modelProviderSelectors.modelProviderListForModelSelect(
|
|
130
|
-
result.current,
|
|
131
|
-
);
|
|
132
|
-
expect(enabledProviders).toHaveLength(3);
|
|
133
|
-
expect(enabledProviders.at(-1)!.id).toBe('perplexity');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|