@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.
Files changed (74) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/docs/self-hosting/advanced/feature-flags.mdx +45 -0
  3. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +42 -0
  4. package/docs/self-hosting/environment-variables/basic.mdx +11 -2
  5. package/docs/self-hosting/environment-variables/basic.zh-CN.mdx +11 -2
  6. package/package.json +1 -1
  7. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/DragUpload.tsx +92 -42
  8. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/index.tsx +2 -2
  9. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/Files.tsx +4 -3
  10. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +5 -2
  11. package/src/app/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +6 -7
  12. package/src/app/(main)/settings/llm/components/ProviderModelList/{ModelConfigModal.tsx → ModelConfigModal/Form.tsx} +19 -63
  13. package/src/app/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +78 -0
  14. package/src/app/(main)/settings/llm/components/ProviderModelList/Option.tsx +35 -11
  15. package/src/app/(main)/settings/llm/components/ProviderModelList/index.tsx +15 -18
  16. package/src/app/(main)/settings/system-agent/features/Translation.tsx +0 -2
  17. package/src/components/FileList/ImageFileItem.tsx +1 -1
  18. package/src/components/ModelProviderIcon/index.tsx +2 -2
  19. package/src/components/ModelSelect/index.tsx +5 -14
  20. package/src/const/meta.ts +1 -2
  21. package/src/features/User/UserPanel/PanelContent.tsx +1 -1
  22. package/src/hooks/useSyncData.ts +3 -1
  23. package/src/layout/AuthProvider/Clerk/useAppearance.ts +1 -1
  24. package/src/layout/GlobalProvider/StoreInitialization.tsx +17 -9
  25. package/src/layout/GlobalProvider/index.tsx +1 -1
  26. package/src/locales/default/components.ts +1 -0
  27. package/src/services/message/client.test.ts +0 -24
  28. package/src/services/message/client.ts +0 -5
  29. package/src/services/message/type.ts +0 -1
  30. package/src/services/user/client.test.ts +100 -0
  31. package/src/services/user/client.ts +16 -14
  32. package/src/services/user/index.ts +0 -2
  33. package/src/services/user/type.ts +2 -4
  34. package/src/store/user/initialState.ts +10 -1
  35. package/src/store/user/selectors.ts +3 -7
  36. package/src/store/user/slices/auth/action.test.ts +5 -87
  37. package/src/store/user/slices/auth/action.ts +3 -58
  38. package/src/store/user/slices/auth/initialState.ts +2 -1
  39. package/src/store/user/slices/common/action.test.ts +196 -20
  40. package/src/store/user/slices/common/action.ts +55 -26
  41. package/src/store/user/slices/common/initialState.ts +9 -0
  42. package/src/store/user/slices/modelList/action.test.ts +363 -0
  43. package/src/store/user/slices/{settings/actions/llm.ts → modelList/action.ts} +66 -60
  44. package/src/store/user/slices/modelList/initialState.ts +15 -0
  45. package/src/store/user/slices/modelList/selectors/index.ts +2 -0
  46. package/src/store/user/slices/{settings → modelList}/selectors/modelConfig.test.ts +3 -2
  47. package/src/store/user/slices/{settings → modelList}/selectors/modelConfig.ts +1 -1
  48. package/src/store/user/slices/{settings → modelList}/selectors/modelProvider.test.ts +7 -7
  49. package/src/store/user/slices/{settings → modelList}/selectors/modelProvider.ts +2 -4
  50. package/src/store/user/slices/preference/action.test.ts +0 -52
  51. package/src/store/user/slices/preference/action.ts +1 -17
  52. package/src/store/user/slices/preference/initialState.ts +0 -5
  53. package/src/store/user/slices/preference/selectors.test.ts +2 -2
  54. package/src/store/user/slices/preference/selectors.ts +1 -1
  55. package/src/store/user/slices/settings/{actions/general.ts → action.ts} +5 -5
  56. package/src/store/user/slices/settings/initialState.ts +0 -12
  57. package/src/store/user/slices/settings/selectors/index.ts +0 -3
  58. package/src/store/user/slices/sync/action.test.ts +19 -5
  59. package/src/store/user/slices/sync/action.ts +9 -6
  60. package/src/store/user/slices/{settings/selectors/sync.ts → sync/selectors.ts} +2 -2
  61. package/src/store/user/store.ts +5 -2
  62. package/src/styles/antdOverride.ts +6 -0
  63. package/src/types/serverConfig.ts +3 -1
  64. package/src/types/user/index.ts +13 -0
  65. package/src/utils/parseModels.test.ts +121 -1
  66. package/src/utils/parseModels.ts +9 -4
  67. package/src/store/user/slices/settings/actions/index.ts +0 -18
  68. package/src/store/user/slices/settings/actions/llm.test.ts +0 -136
  69. /package/src/app/(main)/settings/llm/components/ProviderModelList/{MaxTokenSlider.tsx → ModelConfigModal/MaxTokenSlider.tsx} +0 -0
  70. /package/src/store/user/slices/{settings → modelList}/reducers/customModelCard.test.ts +0 -0
  71. /package/src/store/user/slices/{settings → modelList}/reducers/customModelCard.ts +0 -0
  72. /package/src/store/user/slices/settings/{actions/general.test.ts → action.test.ts} +0 -0
  73. /package/src/store/user/slices/settings/selectors/__snapshots__/{selectors.test.ts.snap → settings.test.ts.snap} +0 -0
  74. /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
- });