@lobehub/chat 1.43.6 → 1.44.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.
Files changed (301) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/docs/self-hosting/server-database/docker-compose.mdx +2 -2
  4. package/locales/ar/common.json +1 -0
  5. package/locales/ar/modelProvider.json +176 -0
  6. package/locales/ar/setting.json +1 -0
  7. package/locales/bg-BG/common.json +1 -0
  8. package/locales/bg-BG/modelProvider.json +176 -0
  9. package/locales/bg-BG/setting.json +1 -0
  10. package/locales/de-DE/common.json +1 -0
  11. package/locales/de-DE/modelProvider.json +176 -0
  12. package/locales/de-DE/setting.json +1 -0
  13. package/locales/en-US/common.json +1 -0
  14. package/locales/en-US/modelProvider.json +176 -0
  15. package/locales/en-US/setting.json +1 -0
  16. package/locales/es-ES/common.json +1 -0
  17. package/locales/es-ES/modelProvider.json +176 -0
  18. package/locales/es-ES/setting.json +1 -0
  19. package/locales/fa-IR/common.json +1 -0
  20. package/locales/fa-IR/modelProvider.json +176 -0
  21. package/locales/fa-IR/setting.json +1 -0
  22. package/locales/fr-FR/common.json +1 -0
  23. package/locales/fr-FR/modelProvider.json +176 -0
  24. package/locales/fr-FR/setting.json +1 -0
  25. package/locales/it-IT/common.json +1 -0
  26. package/locales/it-IT/modelProvider.json +176 -0
  27. package/locales/it-IT/setting.json +1 -0
  28. package/locales/ja-JP/common.json +1 -0
  29. package/locales/ja-JP/modelProvider.json +176 -0
  30. package/locales/ja-JP/setting.json +1 -0
  31. package/locales/ko-KR/common.json +1 -0
  32. package/locales/ko-KR/modelProvider.json +176 -0
  33. package/locales/ko-KR/setting.json +1 -0
  34. package/locales/nl-NL/common.json +1 -0
  35. package/locales/nl-NL/modelProvider.json +176 -0
  36. package/locales/nl-NL/setting.json +1 -0
  37. package/locales/pl-PL/common.json +1 -0
  38. package/locales/pl-PL/modelProvider.json +176 -0
  39. package/locales/pl-PL/setting.json +1 -0
  40. package/locales/pt-BR/common.json +1 -0
  41. package/locales/pt-BR/modelProvider.json +176 -0
  42. package/locales/pt-BR/setting.json +1 -0
  43. package/locales/ru-RU/common.json +1 -0
  44. package/locales/ru-RU/modelProvider.json +176 -0
  45. package/locales/ru-RU/setting.json +1 -0
  46. package/locales/tr-TR/common.json +1 -0
  47. package/locales/tr-TR/modelProvider.json +176 -0
  48. package/locales/tr-TR/setting.json +1 -0
  49. package/locales/vi-VN/common.json +1 -0
  50. package/locales/vi-VN/modelProvider.json +176 -0
  51. package/locales/vi-VN/setting.json +1 -0
  52. package/locales/zh-CN/common.json +1 -0
  53. package/locales/zh-CN/modelProvider.json +176 -0
  54. package/locales/zh-CN/setting.json +1 -0
  55. package/locales/zh-TW/common.json +1 -0
  56. package/locales/zh-TW/modelProvider.json +176 -0
  57. package/locales/zh-TW/setting.json +1 -0
  58. package/next.config.ts +1 -1
  59. package/package.json +4 -4
  60. package/src/app/(main)/(mobile)/me/settings/features/Category.tsx +1 -1
  61. package/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx +12 -5
  62. package/src/app/(main)/changelog/features/VersionTag.tsx +1 -2
  63. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/Thread.tsx +1 -1
  64. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/ThreadItem.tsx +1 -2
  65. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/index.tsx +0 -1
  66. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/InboxWelcome/AgentsSuggest.tsx +1 -1
  67. package/src/app/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/InboxWelcome/QuestionSuggest.tsx +1 -1
  68. package/src/app/(main)/chat/(workspace)/@conversation/features/ZenModeToast/Toast.tsx +1 -1
  69. package/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadItem/index.tsx +0 -2
  70. package/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/index.tsx +0 -1
  71. package/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx +2 -3
  72. package/src/app/(main)/chat/@session/features/SessionListContent/CollapseGroup/index.tsx +1 -1
  73. package/src/app/(main)/chat/features/Migration/Start.tsx +1 -1
  74. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/TopicList.tsx +4 -3
  75. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Header.tsx +1 -1
  76. package/src/app/(main)/discover/(detail)/features/ShareButton.tsx +2 -1
  77. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Header.tsx +1 -1
  78. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Header.tsx +1 -1
  79. package/src/app/(main)/discover/(detail)/provider/[slug]/features/Header.tsx +1 -1
  80. package/src/app/(main)/discover/(list)/_layout/Desktop/Nav.tsx +0 -1
  81. package/src/app/(main)/discover/(list)/assistants/features/Card.tsx +1 -1
  82. package/src/app/(main)/discover/(list)/models/features/Card.tsx +1 -1
  83. package/src/app/(main)/discover/(list)/plugins/features/Card.tsx +1 -1
  84. package/src/app/(main)/discover/(list)/providers/features/Card.tsx +1 -1
  85. package/src/app/(main)/discover/components/GridLoadingCard.tsx +2 -1
  86. package/src/app/(main)/discover/components/Title.tsx +1 -1
  87. package/src/app/(main)/files/(content)/@menu/features/KnowledgeBase/EmptyStatus.tsx +1 -1
  88. package/src/app/(main)/files/(content)/@menu/features/KnowledgeBase/Item/index.tsx +0 -1
  89. package/src/app/(main)/files/(content)/@modal/(.)[id]/FullscreenModal.tsx +2 -2
  90. package/src/app/(main)/files/(content)/NotSupportClient.tsx +2 -2
  91. package/src/app/(main)/profile/_layout/Desktop/SideBar.tsx +1 -1
  92. package/src/app/(main)/profile/stats/features/ShareButton/Preview.tsx +5 -5
  93. package/src/app/(main)/repos/[id]/evals/components/Container.tsx +1 -1
  94. package/src/app/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx +0 -1
  95. package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +1 -1
  96. package/src/app/(main)/settings/about/features/ItemCard.tsx +3 -3
  97. package/src/app/(main)/settings/about/features/Version.tsx +1 -1
  98. package/src/app/(main)/settings/hooks/useCategory.tsx +22 -9
  99. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +2 -1
  100. package/src/app/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -1
  101. package/src/app/(main)/settings/provider/(detail)/[id]/index.tsx +19 -0
  102. package/src/app/(main)/settings/provider/(detail)/[id]/page.tsx +95 -0
  103. package/src/app/(main)/settings/provider/(detail)/azure/page.tsx +119 -0
  104. package/src/app/(main)/settings/provider/(detail)/bedrock/page.tsx +91 -0
  105. package/src/app/(main)/settings/provider/(detail)/cloudflare/page.tsx +58 -0
  106. package/src/app/(main)/settings/provider/(detail)/github/page.tsx +67 -0
  107. package/src/app/(main)/settings/provider/(detail)/huggingface/page.tsx +67 -0
  108. package/src/app/(main)/settings/provider/(detail)/ollama/Checker.tsx +73 -0
  109. package/src/app/(main)/settings/provider/(detail)/ollama/page.tsx +34 -0
  110. package/src/app/(main)/settings/provider/(detail)/openai/page.tsx +23 -0
  111. package/src/app/(main)/settings/provider/(detail)/wenxin/page.tsx +61 -0
  112. package/src/app/(main)/settings/provider/(list)/Footer.tsx +36 -0
  113. package/src/app/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +134 -0
  114. package/src/app/(main)/settings/provider/(list)/ProviderGrid/index.tsx +91 -0
  115. package/src/app/(main)/settings/provider/(list)/index.tsx +19 -0
  116. package/src/app/(main)/settings/provider/ProviderMenu/AddNew.tsx +28 -0
  117. package/src/app/(main)/settings/provider/ProviderMenu/All.tsx +29 -0
  118. package/src/app/(main)/settings/provider/ProviderMenu/Item.tsx +69 -0
  119. package/src/app/(main)/settings/provider/ProviderMenu/List.tsx +76 -0
  120. package/src/app/(main)/settings/provider/ProviderMenu/SearchResult.tsx +43 -0
  121. package/src/app/(main)/settings/provider/ProviderMenu/SkeletonList.tsx +60 -0
  122. package/src/app/(main)/settings/provider/ProviderMenu/SortProviderModal/GroupItem.tsx +30 -0
  123. package/src/app/(main)/settings/provider/ProviderMenu/SortProviderModal/index.tsx +91 -0
  124. package/src/app/(main)/settings/provider/ProviderMenu/index.tsx +80 -0
  125. package/src/app/(main)/settings/provider/_layout/Desktop.tsx +37 -0
  126. package/src/app/(main)/settings/provider/_layout/Mobile.tsx +14 -0
  127. package/src/app/(main)/settings/provider/const.ts +20 -0
  128. package/src/app/(main)/settings/provider/features/CreateNewProvider/index.tsx +146 -0
  129. package/src/app/(main)/settings/provider/features/ModelList/CreateNewModelModal/Form.tsx +105 -0
  130. package/src/app/(main)/settings/provider/features/ModelList/CreateNewModelModal/index.tsx +69 -0
  131. package/src/app/(main)/settings/provider/features/ModelList/DisabledModels.tsx +29 -0
  132. package/src/app/(main)/settings/provider/features/ModelList/EmptyModels.tsx +101 -0
  133. package/src/app/(main)/settings/provider/features/ModelList/EnabledModelList/index.tsx +85 -0
  134. package/src/app/(main)/settings/provider/features/ModelList/ModelConfigModal/Form.tsx +109 -0
  135. package/src/app/(main)/settings/provider/features/ModelList/ModelConfigModal/index.tsx +76 -0
  136. package/src/app/(main)/settings/provider/features/ModelList/ModelItem.tsx +346 -0
  137. package/src/app/(main)/settings/provider/features/ModelList/ModelTitle/Search.tsx +37 -0
  138. package/src/app/(main)/settings/provider/features/ModelList/ModelTitle/index.tsx +145 -0
  139. package/src/app/(main)/settings/provider/features/ModelList/SearchResult.tsx +67 -0
  140. package/src/app/(main)/settings/provider/features/ModelList/SkeletonList.tsx +63 -0
  141. package/src/app/(main)/settings/provider/features/ModelList/SortModelModal/ListItem.tsx +20 -0
  142. package/src/app/(main)/settings/provider/features/ModelList/SortModelModal/index.tsx +96 -0
  143. package/src/app/(main)/settings/provider/features/ModelList/index.tsx +59 -0
  144. package/src/app/(main)/settings/provider/features/ProviderConfig/Checker.tsx +120 -0
  145. package/src/app/(main)/settings/provider/features/ProviderConfig/SkeletonInput.tsx +5 -0
  146. package/src/app/(main)/settings/provider/features/ProviderConfig/UpdateProviderInfo/SettingModal.tsx +137 -0
  147. package/src/app/(main)/settings/provider/features/ProviderConfig/UpdateProviderInfo/index.tsx +49 -0
  148. package/src/app/(main)/settings/provider/features/ProviderConfig/index.tsx +343 -0
  149. package/src/app/(main)/settings/provider/layout.tsx +21 -0
  150. package/src/app/(main)/settings/provider/page.tsx +17 -0
  151. package/src/app/(main)/settings/provider/type.ts +5 -0
  152. package/src/app/(main)/settings/sync/features/DeviceInfo/Card.tsx +1 -1
  153. package/src/app/(main)/settings/sync/features/DeviceInfo/index.tsx +1 -1
  154. package/src/app/@modal/(.)changelog/modal/features/ReadDetail.tsx +1 -1
  155. package/src/app/@modal/(.)changelog/modal/features/VersionTag.tsx +1 -2
  156. package/src/app/@modal/(.)changelog/modal/layout.tsx +1 -1
  157. package/src/components/Cell/index.tsx +1 -1
  158. package/src/components/DragUpload/index.tsx +2 -3
  159. package/src/components/FeatureList/index.tsx +1 -1
  160. package/src/components/FileParsingStatus/EmbeddingStatus.tsx +1 -1
  161. package/src/components/FileParsingStatus/index.tsx +1 -1
  162. package/src/components/FunctionModal/style.tsx +2 -2
  163. package/src/components/GoBack/index.tsx +1 -2
  164. package/src/components/HotKeys/index.tsx +1 -1
  165. package/src/components/InstantSwitch/index.tsx +28 -0
  166. package/src/components/Menu/index.tsx +1 -1
  167. package/src/components/ModelSelect/index.tsx +20 -10
  168. package/src/components/Notification/index.tsx +2 -1
  169. package/src/components/StatisticCard/index.tsx +5 -6
  170. package/src/config/aiModels/ai21.ts +38 -0
  171. package/src/config/aiModels/ai360.ts +71 -0
  172. package/src/config/aiModels/anthropic.ts +152 -0
  173. package/src/config/aiModels/azure.ts +86 -0
  174. package/src/config/aiModels/baichuan.ts +107 -0
  175. package/src/config/aiModels/bedrock.ts +315 -0
  176. package/src/config/aiModels/cloudflare.ts +88 -0
  177. package/src/config/aiModels/deepseek.ts +27 -0
  178. package/src/config/aiModels/fireworksai.ts +232 -0
  179. package/src/config/aiModels/giteeai.ts +137 -0
  180. package/src/config/aiModels/github.ts +273 -0
  181. package/src/config/aiModels/google.ts +317 -0
  182. package/src/config/aiModels/groq.ts +202 -0
  183. package/src/config/aiModels/higress.ts +2828 -0
  184. package/src/config/aiModels/huggingface.ts +56 -0
  185. package/src/config/aiModels/hunyuan.ts +151 -0
  186. package/src/config/aiModels/index.ts +98 -0
  187. package/src/config/aiModels/internlm.ts +40 -0
  188. package/src/config/aiModels/minimax.ts +55 -0
  189. package/src/config/aiModels/mistral.ts +172 -0
  190. package/src/config/aiModels/moonshot.ts +44 -0
  191. package/src/config/aiModels/novita.ts +124 -0
  192. package/src/config/aiModels/ollama.ts +412 -0
  193. package/src/config/aiModels/openai.ts +537 -0
  194. package/src/config/aiModels/openrouter.ts +252 -0
  195. package/src/config/aiModels/perplexity.ts +67 -0
  196. package/src/config/aiModels/qwen.ts +302 -0
  197. package/src/config/aiModels/sensenova.ts +114 -0
  198. package/src/config/aiModels/siliconcloud.ts +679 -0
  199. package/src/config/aiModels/spark.ts +68 -0
  200. package/src/config/aiModels/stepfun.ts +153 -0
  201. package/src/config/aiModels/taichu.ts +19 -0
  202. package/src/config/aiModels/togetherai.ts +334 -0
  203. package/src/config/aiModels/upstage.ts +37 -0
  204. package/src/config/aiModels/wenxin.ts +171 -0
  205. package/src/config/aiModels/xai.ts +72 -0
  206. package/src/config/aiModels/zeroone.ts +156 -0
  207. package/src/config/aiModels/zhipu.ts +235 -0
  208. package/src/config/featureFlags/schema.ts +3 -0
  209. package/src/config/modelProviders/anthropic.ts +1 -0
  210. package/src/config/modelProviders/github.ts +0 -1
  211. package/src/config/modelProviders/google.ts +1 -0
  212. package/src/config/modelProviders/stepfun.ts +2 -0
  213. package/src/database/migrations/0013_add_ai_infra.sql +44 -0
  214. package/src/database/migrations/meta/0013_snapshot.json +3598 -0
  215. package/src/database/migrations/meta/_journal.json +7 -0
  216. package/src/database/repositories/aiInfra/index.ts +117 -0
  217. package/src/database/schemas/aiInfra.ts +69 -0
  218. package/src/database/schemas/index.ts +1 -0
  219. package/src/database/server/models/__tests__/aiModel.test.ts +318 -0
  220. package/src/database/server/models/__tests__/aiProvider.test.ts +373 -0
  221. package/src/database/server/models/aiModel.ts +251 -0
  222. package/src/database/server/models/aiProvider.ts +234 -0
  223. package/src/features/AgentSetting/AgentPrompt/index.tsx +2 -2
  224. package/src/features/ChatInput/ActionBar/Token/TokenTag.tsx +2 -1
  225. package/src/features/ChatInput/ActionBar/Tools/index.tsx +2 -3
  226. package/src/features/ChatInput/ActionBar/Upload/ServerMode.tsx +2 -3
  227. package/src/features/ChatInput/Desktop/FilePreview/FileItem/index.tsx +3 -2
  228. package/src/features/ChatInput/Desktop/FilePreview/FileList.tsx +2 -2
  229. package/src/features/ChatInput/Mobile/Files/FileItem/File.tsx +2 -2
  230. package/src/features/ChatInput/Mobile/InputArea/index.tsx +1 -1
  231. package/src/features/ChatInput/STT/common.tsx +1 -1
  232. package/src/features/Conversation/Error/style.tsx +2 -2
  233. package/src/features/Conversation/Messages/Assistant/FileChunks/Item/style.ts +2 -2
  234. package/src/features/Conversation/Messages/Assistant/FileChunks/index.tsx +1 -1
  235. package/src/features/Conversation/Messages/Assistant/ToolCallItem/Inspector/style.ts +2 -3
  236. package/src/features/Conversation/Messages/Assistant/ToolCallItem/style.ts +2 -3
  237. package/src/features/Conversation/Messages/User/FileListViewer/Item.tsx +0 -1
  238. package/src/features/Conversation/components/BackBottom/style.ts +2 -2
  239. package/src/features/Conversation/components/MarkdownElements/LobeArtifact/Render/Icon.tsx +2 -3
  240. package/src/features/Conversation/components/MarkdownElements/LobeArtifact/Render/index.tsx +3 -3
  241. package/src/features/Conversation/components/MarkdownElements/LobeThinking/Render.tsx +1 -1
  242. package/src/features/Conversation/components/OTPInput.tsx +2 -2
  243. package/src/features/DataImporter/Loading.tsx +1 -1
  244. package/src/features/FileManager/FileList/EmptyStatus.tsx +1 -1
  245. package/src/features/FileManager/FileList/index.tsx +1 -1
  246. package/src/features/FileManager/UploadDock/Item.tsx +1 -1
  247. package/src/features/FileManager/UploadDock/index.tsx +4 -4
  248. package/src/features/FileViewer/NotSupport/index.tsx +1 -1
  249. package/src/features/FileViewer/Renderer/MSDoc/index.tsx +0 -1
  250. package/src/features/FileViewer/Renderer/TXT/index.tsx +1 -1
  251. package/src/features/InitClientDB/EnableModal.tsx +1 -1
  252. package/src/features/InitClientDB/ErrorResult.tsx +1 -1
  253. package/src/features/InitClientDB/InitIndicator.tsx +1 -1
  254. package/src/features/KnowledgeBaseModal/AddFilesToKnowledgeBase/SelectForm.tsx +0 -1
  255. package/src/features/ModelSelect/index.tsx +8 -1
  256. package/src/features/ModelSwitchPanel/index.tsx +10 -3
  257. package/src/features/PluginsUI/Render/Loading.tsx +0 -1
  258. package/src/features/Portal/Home/Body/Files/FileList/Item.tsx +1 -1
  259. package/src/features/Portal/Home/Body/Plugins/ArtifactList/Item/style.ts +1 -2
  260. package/src/features/Setting/SettingContainer.tsx +8 -1
  261. package/src/features/ShareModal/ShareImage/style.ts +2 -2
  262. package/src/features/ShareModal/style.ts +2 -2
  263. package/src/features/User/DataStatistics.tsx +1 -1
  264. package/src/hooks/useEnabledChatModels.ts +10 -1
  265. package/src/hooks/useModelSupportToolUse.ts +15 -0
  266. package/src/hooks/useModelSupportVision.ts +15 -0
  267. package/src/layout/AuthProvider/Clerk/useAppearance.ts +3 -3
  268. package/src/layout/GlobalProvider/AppTheme.tsx +1 -1
  269. package/src/layout/GlobalProvider/StoreInitialization.tsx +5 -0
  270. package/src/locales/default/common.ts +1 -0
  271. package/src/locales/default/modelProvider.ts +178 -0
  272. package/src/locales/default/setting.ts +1 -0
  273. package/src/server/modules/KeyVaultsEncrypt/index.ts +1 -1
  274. package/src/server/routers/lambda/aiModel.ts +128 -0
  275. package/src/server/routers/lambda/aiProvider.ts +127 -0
  276. package/src/server/routers/lambda/index.ts +4 -0
  277. package/src/services/__tests__/_auth.test.ts +16 -49
  278. package/src/services/__tests__/chat.test.ts +2 -0
  279. package/src/services/_auth.ts +42 -25
  280. package/src/services/aiModel.ts +52 -0
  281. package/src/services/aiProvider.ts +47 -0
  282. package/src/services/chat.ts +62 -18
  283. package/src/store/aiInfra/index.ts +2 -0
  284. package/src/store/aiInfra/initialState.ts +11 -0
  285. package/src/store/aiInfra/selectors.ts +2 -0
  286. package/src/store/aiInfra/slices/aiModel/action.ts +146 -0
  287. package/src/store/aiInfra/slices/aiModel/index.ts +3 -0
  288. package/src/store/aiInfra/slices/aiModel/initialState.ts +14 -0
  289. package/src/store/aiInfra/slices/aiModel/selectors.ts +63 -0
  290. package/src/store/aiInfra/slices/aiProvider/action.ts +208 -0
  291. package/src/store/aiInfra/slices/aiProvider/index.ts +3 -0
  292. package/src/store/aiInfra/slices/aiProvider/initialState.ts +32 -0
  293. package/src/store/aiInfra/slices/aiProvider/selectors.ts +99 -0
  294. package/src/store/aiInfra/store.ts +25 -0
  295. package/src/store/global/initialState.ts +1 -0
  296. package/src/store/serverConfig/selectors.test.ts +1 -0
  297. package/src/store/user/slices/modelList/selectors/modelProvider.ts +1 -0
  298. package/src/styles/global.ts +1 -1
  299. package/src/types/aiModel.ts +36 -6
  300. package/src/types/aiProvider.ts +14 -5
  301. package/src/utils/fetch/fetchSSE.ts +3 -1
@@ -0,0 +1,99 @@
1
+ import { isProviderDisableBroswerRequest } from '@/config/modelProviders';
2
+ import { AIProviderStoreState } from '@/store/aiInfra/initialState';
3
+ import { AiProviderRuntimeConfig } from '@/types/aiProvider';
4
+ import { GlobalLLMProviderKey } from '@/types/user/settings';
5
+
6
+ // List
7
+ const enabledAiProviderList = (s: AIProviderStoreState) =>
8
+ s.aiProviderList.filter((item) => item.enabled).sort((a, b) => a.sort! - b.sort!);
9
+
10
+ const disabledAiProviderList = (s: AIProviderStoreState) =>
11
+ s.aiProviderList.filter((item) => !item.enabled);
12
+
13
+ const isProviderEnabled = (id: string) => (s: AIProviderStoreState) =>
14
+ enabledAiProviderList(s).some((i) => i.id === id);
15
+
16
+ const isProviderLoading = (id: string) => (s: AIProviderStoreState) =>
17
+ s.aiProviderLoadingIds.includes(id);
18
+
19
+ const activeProviderConfig = (s: AIProviderStoreState) => s.aiProviderDetail;
20
+
21
+ // Detail
22
+
23
+ const isAiProviderConfigLoading = (id: string) => (s: AIProviderStoreState) =>
24
+ s.activeAiProvider !== id;
25
+
26
+ const providerWhitelist = new Set(['ollama']);
27
+
28
+ const activeProviderKeyVaults = (s: AIProviderStoreState) => activeProviderConfig(s)?.keyVaults;
29
+
30
+ const isActiveProviderEndpointNotEmpty = (s: AIProviderStoreState) => {
31
+ const vault = activeProviderKeyVaults(s);
32
+ return !!vault?.baseURL || !!vault?.endpoint;
33
+ };
34
+
35
+ const isActiveProviderApiKeyNotEmpty = (s: AIProviderStoreState) => {
36
+ const vault = activeProviderKeyVaults(s);
37
+ return !!vault?.apiKey || !!vault?.accessKeyId || !!vault?.secretAccessKey;
38
+ };
39
+
40
+ /**
41
+ * @description The conditions to enable client fetch
42
+ * 1. If no baseUrl and apikey input, force on Server.
43
+ * 2. If only contains baseUrl, force on Client
44
+ * 3. Follow the user settings.
45
+ * 4. On Server, by default.
46
+ */
47
+ const isProviderFetchOnClient =
48
+ (provider: GlobalLLMProviderKey | string) => (s: AIProviderStoreState) => {
49
+ const config = activeProviderConfig(s);
50
+
51
+ // If the provider already disable broswer request in model config, force on Server.
52
+ if (isProviderDisableBroswerRequest(provider)) return false;
53
+
54
+ // If the provider in the whitelist, follow the user settings
55
+ if (providerWhitelist.has(provider) && typeof config?.fetchOnClient !== 'undefined')
56
+ return config?.fetchOnClient;
57
+
58
+ // 1. If no baseUrl and apikey input, force on Server.
59
+ const isProviderEndpointNotEmpty = isActiveProviderEndpointNotEmpty(s);
60
+ const isProviderApiKeyNotEmpty = isActiveProviderApiKeyNotEmpty(s);
61
+ if (!isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return false;
62
+
63
+ // 2. If only contains baseUrl, force on Client
64
+ if (isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return true;
65
+
66
+ // 3. Follow the user settings.
67
+ if (typeof config?.fetchOnClient !== 'undefined') return config?.fetchOnClient;
68
+
69
+ // 4. On Server, by default.
70
+ return false;
71
+ };
72
+
73
+ const providerKeyVaults = (provider: string | undefined) => (s: AIProviderStoreState) => {
74
+ if (!provider) return undefined;
75
+
76
+ return s.aiProviderRuntimeConfig?.[provider]?.keyVaults;
77
+ };
78
+
79
+ const providerConfigById =
80
+ (id: string) =>
81
+ (s: AIProviderStoreState): AiProviderRuntimeConfig | undefined => {
82
+ if (!id) return undefined;
83
+
84
+ return s.aiProviderRuntimeConfig?.[id];
85
+ };
86
+
87
+ export const aiProviderSelectors = {
88
+ activeProviderConfig,
89
+ disabledAiProviderList,
90
+ enabledAiProviderList,
91
+ isActiveProviderApiKeyNotEmpty,
92
+ isActiveProviderEndpointNotEmpty,
93
+ isAiProviderConfigLoading,
94
+ isProviderEnabled,
95
+ isProviderFetchOnClient,
96
+ isProviderLoading,
97
+ providerConfigById,
98
+ providerKeyVaults,
99
+ };
@@ -0,0 +1,25 @@
1
+ import { shallow } from 'zustand/shallow';
2
+ import { createWithEqualityFn } from 'zustand/traditional';
3
+ import { StateCreator } from 'zustand/vanilla';
4
+
5
+ import { createDevtools } from '../middleware/createDevtools';
6
+ import { AIProviderStoreState, initialState } from './initialState';
7
+ import { AiModelAction, createAiModelSlice } from './slices/aiModel';
8
+ import { AiProviderAction, createAiProviderSlice } from './slices/aiProvider';
9
+
10
+ // =============== 聚合 createStoreFn ============ //
11
+
12
+ export interface AiInfraStore extends AIProviderStoreState, AiProviderAction, AiModelAction {
13
+ /* empty */
14
+ }
15
+
16
+ const createStore: StateCreator<AiInfraStore, [['zustand/devtools', never]]> = (...parameters) => ({
17
+ ...initialState,
18
+ ...createAiModelSlice(...parameters),
19
+ ...createAiProviderSlice(...parameters),
20
+ });
21
+
22
+ // =============== 实装 useStore ============ //
23
+ const devtools = createDevtools('aiInfra');
24
+
25
+ export const useAiInfraStore = createWithEqualityFn<AiInfraStore>()(devtools(createStore), shallow);
@@ -26,6 +26,7 @@ export enum SettingsTabs {
26
26
  Agent = 'agent',
27
27
  Common = 'common',
28
28
  LLM = 'llm',
29
+ Provider = 'provider',
29
30
  Sync = 'sync',
30
31
  SystemAgent = 'system-agent',
31
32
  TTS = 'tts',
@@ -34,6 +34,7 @@ describe('featureFlagsSelectors', () => {
34
34
  enableCheckUpdates: true,
35
35
  showWelcomeSuggest: true,
36
36
  enableClerkSignUp: true,
37
+ showProvider: true,
37
38
  showMarket: true,
38
39
  showPinList: false,
39
40
  enableSTT: true,
@@ -105,6 +105,7 @@ const modelProviderListForModelSelect = (s: UserStore): EnabledProviderWithModel
105
105
  displayName: m.displayName,
106
106
  id: m.id,
107
107
  })),
108
+ source: 'builtin',
108
109
  }));
109
110
 
110
111
  const getModelCardById = (id: string) => (s: UserStore) => {
@@ -36,9 +36,9 @@ export default ({ token }: { prefixCls: string; token: Theme }) => css`
36
36
  }
37
37
 
38
38
  :hover::-webkit-scrollbar-thumb {
39
+ border: 3px solid transparent;
39
40
  background-color: ${token.colorText};
40
41
  background-clip: content-box;
41
- border: 3px solid transparent;
42
42
  }
43
43
 
44
44
  ::-webkit-scrollbar-track {
@@ -1,5 +1,7 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { AiProviderSourceType } from '@/types/aiProvider';
4
+
3
5
  export type ModelPriceCurrency = 'CNY' | 'USD';
4
6
 
5
7
  export const AiModelSourceEnum = {
@@ -16,7 +18,8 @@ export type AiModelType =
16
18
  | 'stt'
17
19
  | 'image'
18
20
  | 'text2video'
19
- | 'text2music';
21
+ | 'text2music'
22
+ | 'realtime';
20
23
 
21
24
  export interface ModelAbilities {
22
25
  /**
@@ -91,7 +94,7 @@ export interface ChatModelPricing extends BasicModelPricing {
91
94
  writeCacheInput?: number;
92
95
  }
93
96
 
94
- interface AIBaseModelCard {
97
+ export interface AIBaseModelCard {
95
98
  /**
96
99
  * the context window (or input + output tokens limit)
97
100
  */
@@ -115,6 +118,13 @@ interface AIBaseModelCard {
115
118
  releasedAt?: string;
116
119
  }
117
120
 
121
+ export interface AiModelConfig {
122
+ /**
123
+ * used in azure and doubao
124
+ */
125
+ deploymentName?: string;
126
+ }
127
+
118
128
  export interface AIChatModelCard extends AIBaseModelCard {
119
129
  abilities?: {
120
130
  /**
@@ -130,10 +140,7 @@ export interface AIChatModelCard extends AIBaseModelCard {
130
140
  */
131
141
  vision?: boolean;
132
142
  };
133
- /**
134
- * used in azure and doubao
135
- */
136
- deploymentName?: string;
143
+ config?: AiModelConfig;
137
144
  maxOutput?: number;
138
145
  pricing?: ChatModelPricing;
139
146
  type: 'chat';
@@ -221,6 +228,21 @@ export interface AIRealtimeModelCard extends AIBaseModelCard {
221
228
  type: 'realtime';
222
229
  }
223
230
 
231
+ export interface AiFullModelCard extends AIBaseModelCard {
232
+ abilities?: ModelAbilities;
233
+ contextWindowTokens?: number;
234
+ displayName?: string;
235
+ id: string;
236
+ maxDimension?: number;
237
+ pricing?: ChatModelPricing;
238
+ type: AiModelType;
239
+ }
240
+
241
+ export interface LobeDefaultAiModelListItem extends AiFullModelCard {
242
+ abilities: ModelAbilities;
243
+ providerId: string;
244
+ }
245
+
224
246
  // create
225
247
  export const CreateAiModelSchema = z.object({
226
248
  abilities: AiModelAbilitiesSchema.optional(),
@@ -241,6 +263,7 @@ export type CreateAiModelParams = z.infer<typeof CreateAiModelSchema>;
241
263
 
242
264
  export interface AiProviderModelListItem {
243
265
  abilities?: ModelAbilities;
266
+ config?: AiModelConfig;
244
267
  contextWindowTokens?: number;
245
268
  displayName?: string;
246
269
  enabled: boolean;
@@ -254,6 +277,11 @@ export interface AiProviderModelListItem {
254
277
  // Update
255
278
  export const UpdateAiModelSchema = z.object({
256
279
  abilities: AiModelAbilitiesSchema.optional(),
280
+ config: z
281
+ .object({
282
+ deploymentName: z.string().optional(),
283
+ })
284
+ .optional(),
257
285
  contextWindowTokens: z.number().optional(),
258
286
  displayName: z.string().optional(),
259
287
  });
@@ -286,5 +314,7 @@ interface AiModelForSelect {
286
314
  export interface EnabledProviderWithModels {
287
315
  children: AiModelForSelect[];
288
316
  id: string;
317
+ logo?: string;
289
318
  name: string;
319
+ source: AiProviderSourceType;
290
320
  }
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
- import { AiModelSourceType, AiModelType, ModelAbilities } from '@/types/aiModel';
3
+ import { AiModelConfig, AiModelType, ModelAbilities } from '@/types/aiModel';
4
4
  import { SmoothingParams } from '@/types/llm';
5
5
 
6
6
  export const AiProviderSourceEnum = {
@@ -167,7 +167,7 @@ export type UpdateAiProviderParams = z.infer<typeof UpdateAiProviderSchema>;
167
167
 
168
168
  export const UpdateAiProviderConfigSchema = z.object({
169
169
  checkModel: z.string().optional(),
170
- fetchOnClient: z.boolean().optional(),
170
+ fetchOnClient: z.boolean().nullable().optional(),
171
171
  keyVaults: z.object({}).passthrough().optional(),
172
172
  });
173
173
 
@@ -182,21 +182,30 @@ export interface AiProviderSortMap {
182
182
 
183
183
  export interface EnabledProvider {
184
184
  id: string;
185
+ logo?: string;
185
186
  name?: string;
186
- source: AiModelSourceType;
187
+ source: AiProviderSourceType;
187
188
  }
188
189
 
189
190
  export interface EnabledAiModel {
190
191
  abilities: ModelAbilities;
192
+ config?: AiModelConfig;
191
193
  contextWindowTokens?: number;
192
194
  displayName?: string;
193
195
  id: string;
194
196
  providerId: string;
197
+ sort?: number;
195
198
  type: AiModelType;
196
199
  }
197
200
 
198
- export interface AiProviderInitState {
201
+ export interface AiProviderRuntimeConfig {
202
+ fetchOnClient?: boolean;
203
+ keyVaults: Record<string, object>;
204
+ settings: AiProviderSettings;
205
+ }
206
+
207
+ export interface AiProviderRuntimeState {
199
208
  enabledAiModels: EnabledAiModel[];
200
209
  enabledAiProviders: EnabledProvider[];
201
- keyVaults: Record<string, object>;
210
+ runtimeConfig: Record<string, AiProviderRuntimeConfig>;
202
211
  }
@@ -1,3 +1,5 @@
1
+ import { isObject } from 'lodash-es';
2
+
1
3
  import { MESSAGE_CANCEL_FLAT } from '@/const/message';
2
4
  import { LOBE_CHAT_OBSERVATION_ID, LOBE_CHAT_TRACE_ID } from '@/const/trace';
3
5
  import { ChatErrorType } from '@/types/fetch';
@@ -243,7 +245,7 @@ export const fetchSSE = async (url: string, options: RequestInit & FetchSSEOptio
243
245
  const textSmoothing = typeof smoothing === 'boolean' ? smoothing : smoothing?.text;
244
246
  const toolsCallingSmoothing =
245
247
  typeof smoothing === 'boolean' ? smoothing : (smoothing?.toolsCalling ?? true);
246
- const smoothingSpeed = typeof smoothing === 'object' ? smoothing.speed : undefined;
248
+ const smoothingSpeed = isObject(smoothing) ? smoothing.speed : undefined;
247
249
 
248
250
  const textController = createSmoothMessage({
249
251
  onTextUpdate: (delta, text) => {