@lobehub/lobehub 2.0.0-next.2 → 2.0.0-next.20

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 (591) hide show
  1. package/.env.desktop +1 -2
  2. package/.env.example +0 -3
  3. package/.env.example.development +0 -2
  4. package/.github/workflows/desktop-pr-build.yml +18 -16
  5. package/.github/workflows/docker.yml +25 -20
  6. package/.github/workflows/e2e.yml +17 -3
  7. package/.github/workflows/release-desktop-beta.yml +12 -12
  8. package/.github/workflows/release.yml +2 -4
  9. package/.github/workflows/test.yml +8 -10
  10. package/.nvmrc +1 -1
  11. package/CHANGELOG.md +459 -0
  12. package/Dockerfile +1 -3
  13. package/README.md +2 -45
  14. package/README.zh-CN.md +2 -45
  15. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  16. package/apps/desktop/tsconfig.json +0 -1
  17. package/changelog/v1.json +150 -0
  18. package/docs/development/database-schema.dbml +11 -1
  19. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  20. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  21. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  22. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  23. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  32. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  35. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  36. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  39. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  40. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth.mdx +32 -21
  45. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  46. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  47. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  48. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  49. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  50. package/e2e/src/features/discover/smoke.feature +34 -1
  51. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  52. package/e2e/tsconfig.json +0 -1
  53. package/locales/ar/models.json +15 -6
  54. package/locales/ar/oauth.json +1 -0
  55. package/locales/bg-BG/models.json +15 -6
  56. package/locales/bg-BG/oauth.json +1 -0
  57. package/locales/de-DE/models.json +15 -6
  58. package/locales/de-DE/oauth.json +1 -0
  59. package/locales/en-US/models.json +15 -6
  60. package/locales/en-US/oauth.json +1 -0
  61. package/locales/es-ES/models.json +15 -6
  62. package/locales/es-ES/oauth.json +1 -0
  63. package/locales/fa-IR/models.json +15 -6
  64. package/locales/fa-IR/oauth.json +1 -0
  65. package/locales/fr-FR/models.json +15 -6
  66. package/locales/fr-FR/oauth.json +1 -0
  67. package/locales/it-IT/models.json +15 -6
  68. package/locales/it-IT/oauth.json +1 -0
  69. package/locales/ja-JP/models.json +15 -6
  70. package/locales/ja-JP/oauth.json +1 -0
  71. package/locales/ko-KR/models.json +21 -12
  72. package/locales/ko-KR/oauth.json +1 -0
  73. package/locales/nl-NL/models.json +15 -6
  74. package/locales/nl-NL/oauth.json +1 -0
  75. package/locales/pl-PL/models.json +15 -6
  76. package/locales/pl-PL/oauth.json +1 -0
  77. package/locales/pt-BR/models.json +15 -6
  78. package/locales/pt-BR/oauth.json +1 -0
  79. package/locales/ru-RU/models.json +15 -6
  80. package/locales/ru-RU/oauth.json +1 -0
  81. package/locales/tr-TR/models.json +15 -6
  82. package/locales/tr-TR/oauth.json +1 -0
  83. package/locales/vi-VN/models.json +15 -6
  84. package/locales/vi-VN/oauth.json +1 -0
  85. package/locales/zh-CN/models.json +15 -6
  86. package/locales/zh-CN/oauth.json +1 -0
  87. package/locales/zh-TW/models.json +15 -6
  88. package/locales/zh-TW/oauth.json +1 -0
  89. package/next.config.ts +2 -3
  90. package/package.json +74 -80
  91. package/packages/const/src/index.ts +0 -1
  92. package/packages/const/src/models.ts +13 -0
  93. package/packages/const/src/url.ts +1 -4
  94. package/packages/const/src/version.ts +3 -3
  95. package/packages/context-engine/src/index.ts +1 -6
  96. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  97. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  98. package/packages/context-engine/src/providers/index.ts +0 -2
  99. package/packages/database/migrations/0041_improve_index.sql +10 -0
  100. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  101. package/packages/database/migrations/meta/_journal.json +7 -0
  102. package/packages/database/package.json +1 -1
  103. package/packages/database/src/core/migrations.json +17 -0
  104. package/packages/database/src/core/web-server.ts +2 -1
  105. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  106. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  107. package/packages/database/src/models/message.ts +62 -24
  108. package/packages/database/src/models/session.ts +60 -19
  109. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  110. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  111. package/packages/database/src/schemas/agent.ts +10 -11
  112. package/packages/database/src/schemas/message.ts +5 -1
  113. package/packages/database/src/schemas/relations.ts +6 -4
  114. package/packages/database/src/schemas/session.ts +2 -0
  115. package/packages/database/src/schemas/topic.ts +6 -1
  116. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  117. package/packages/database/src/utils/groupMessages.ts +7 -5
  118. package/packages/electron-client-ipc/package.json +4 -1
  119. package/packages/file-loaders/package.json +1 -0
  120. package/packages/memory-extract/package.json +1 -1
  121. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  122. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  123. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  124. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  125. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  126. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  127. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  128. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  129. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  130. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  131. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  132. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  133. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  134. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  135. package/packages/types/src/message/common/base.ts +13 -0
  136. package/packages/types/src/message/common/image.ts +8 -0
  137. package/packages/types/src/message/common/metadata.ts +39 -0
  138. package/packages/types/src/message/common/tools.ts +10 -0
  139. package/packages/types/src/message/db/params.ts +47 -1
  140. package/packages/types/src/message/ui/chat.ts +4 -1
  141. package/packages/types/src/message/ui/params.ts +98 -4
  142. package/packages/types/src/search.ts +16 -0
  143. package/packages/types/src/serverConfig.ts +2 -6
  144. package/packages/types/src/user/index.ts +13 -1
  145. package/packages/types/src/user/settings/index.ts +22 -0
  146. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  147. package/packages/web-crawler/tsconfig.json +0 -1
  148. package/scripts/migrateServerDB/errorHint.js +1 -7
  149. package/scripts/migrateServerDB/index.ts +2 -1
  150. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  151. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  152. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  153. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  154. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  155. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  156. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  157. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  158. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  159. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  160. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  161. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  162. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  163. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  164. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  165. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  166. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  167. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  168. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  169. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  170. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  171. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  172. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  173. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  174. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  175. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  176. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  177. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  178. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  179. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  180. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  181. package/src/app/[variants]/layout.tsx +1 -0
  182. package/src/app/[variants]/loading/index.tsx +1 -10
  183. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  184. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  185. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  186. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  187. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  188. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  189. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +9 -1
  190. package/src/app/sitemap.tsx +7 -1
  191. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  192. package/src/components/Link.tsx +12 -0
  193. package/src/components/Thinking/index.tsx +4 -3
  194. package/src/config/db.ts +0 -5
  195. package/src/config/featureFlags/schema.test.ts +0 -2
  196. package/src/config/featureFlags/schema.ts +0 -6
  197. package/src/config/modelProviders/ai21.ts +1 -16
  198. package/src/config/modelProviders/ai302.ts +1 -128
  199. package/src/config/modelProviders/ai360.ts +1 -32
  200. package/src/config/modelProviders/anthropic.ts +1 -94
  201. package/src/config/modelProviders/azure.ts +1 -51
  202. package/src/config/modelProviders/baichuan.ts +1 -57
  203. package/src/config/modelProviders/bedrock.ts +1 -276
  204. package/src/config/modelProviders/cloudflare.ts +1 -64
  205. package/src/config/modelProviders/deepseek.ts +1 -19
  206. package/src/config/modelProviders/fireworksai.ts +1 -174
  207. package/src/config/modelProviders/giteeai.ts +1 -135
  208. package/src/config/modelProviders/github.ts +1 -254
  209. package/src/config/modelProviders/google.ts +1 -130
  210. package/src/config/modelProviders/groq.ts +1 -119
  211. package/src/config/modelProviders/higress.ts +1 -1736
  212. package/src/config/modelProviders/huggingface.ts +1 -54
  213. package/src/config/modelProviders/hunyuan.ts +1 -83
  214. package/src/config/modelProviders/infiniai.ts +1 -74
  215. package/src/config/modelProviders/internlm.ts +1 -20
  216. package/src/config/modelProviders/minimax.ts +1 -1
  217. package/src/config/modelProviders/mistral.ts +1 -95
  218. package/src/config/modelProviders/modelscope.ts +1 -27
  219. package/src/config/modelProviders/moonshot.ts +1 -29
  220. package/src/config/modelProviders/novita.ts +1 -105
  221. package/src/config/modelProviders/ollama.ts +1 -325
  222. package/src/config/modelProviders/openai.ts +1 -242
  223. package/src/config/modelProviders/openrouter.ts +1 -240
  224. package/src/config/modelProviders/perplexity.ts +1 -45
  225. package/src/config/modelProviders/ppio.ts +1 -152
  226. package/src/config/modelProviders/qiniu.ts +2 -19
  227. package/src/config/modelProviders/qwen.ts +1 -245
  228. package/src/config/modelProviders/search1api.ts +1 -34
  229. package/src/config/modelProviders/sensenova.ts +1 -69
  230. package/src/config/modelProviders/siliconcloud.ts +1 -417
  231. package/src/config/modelProviders/spark.ts +1 -59
  232. package/src/config/modelProviders/stepfun.ts +1 -98
  233. package/src/config/modelProviders/taichu.ts +1 -18
  234. package/src/config/modelProviders/togetherai.ts +1 -274
  235. package/src/config/modelProviders/upstage.ts +1 -28
  236. package/src/config/modelProviders/wenxin.ts +1 -140
  237. package/src/config/modelProviders/xai.ts +1 -38
  238. package/src/config/modelProviders/zeroone.ts +1 -81
  239. package/src/config/modelProviders/zhipu.ts +1 -108
  240. package/src/envs/app.ts +5 -8
  241. package/src/envs/auth.ts +0 -179
  242. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  243. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  244. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  245. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  246. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  247. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  248. package/src/features/Conversation/Error/index.tsx +15 -5
  249. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  250. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  251. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  252. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  253. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  254. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  255. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  256. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  257. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  258. package/src/features/Conversation/Messages/Default.tsx +2 -2
  259. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  260. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  261. package/src/features/Conversation/Messages/index.tsx +3 -3
  262. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  263. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  264. package/src/features/DataImporter/index.tsx +15 -60
  265. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  266. package/src/features/PluginTag/index.tsx +1 -3
  267. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  268. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  269. package/src/helpers/isCanUseFC.ts +0 -8
  270. package/src/hooks/useEnabledChatModels.ts +0 -8
  271. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  272. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  273. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  274. package/src/hooks/useModelSupportFiles.ts +1 -11
  275. package/src/hooks/useModelSupportReasoning.ts +1 -11
  276. package/src/hooks/useModelSupportToolUse.ts +1 -11
  277. package/src/hooks/useModelSupportVision.ts +1 -11
  278. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  279. package/src/libs/next-auth/auth.config.ts +3 -6
  280. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  281. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  282. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  283. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  284. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  285. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  286. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  287. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  288. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  289. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  290. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  291. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  292. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  293. package/src/libs/oidc-provider/provider.ts +1 -1
  294. package/src/libs/trpc/client/index.ts +0 -1
  295. package/src/libs/trpc/client/lambda.ts +8 -5
  296. package/src/libs/trpc/lambda/context.ts +4 -1
  297. package/src/locales/default/oauth.ts +1 -0
  298. package/src/server/globalConfig/index.ts +0 -23
  299. package/src/server/modules/AssistantStore/index.ts +1 -1
  300. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  301. package/src/server/routers/desktop/mcp.ts +1 -3
  302. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  303. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  304. package/src/server/routers/lambda/config/index.test.ts +38 -30
  305. package/src/server/routers/lambda/message.ts +17 -13
  306. package/src/server/routers/lambda/session.ts +8 -5
  307. package/src/server/routers/lambda/user.ts +24 -25
  308. package/src/server/routers/tools/mcp.ts +2 -3
  309. package/src/server/routers/tools/search.test.ts +1 -7
  310. package/src/server/routers/tools/search.ts +1 -4
  311. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  312. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  313. package/src/services/__tests__/tool.test.ts +0 -3
  314. package/src/services/aiModel/index.test.ts +0 -3
  315. package/src/services/aiModel/index.ts +1 -7
  316. package/src/services/aiProvider/index.test.ts +0 -3
  317. package/src/services/aiProvider/index.ts +1 -7
  318. package/src/services/chat/chat.test.ts +13 -40
  319. package/src/services/chat/contextEngineering.test.ts +0 -30
  320. package/src/services/chat/contextEngineering.ts +1 -12
  321. package/src/services/chat/helper.ts +7 -31
  322. package/src/services/chat/index.ts +2 -7
  323. package/src/services/chat/types.ts +1 -1
  324. package/src/services/chatGroup/index.ts +1 -10
  325. package/src/services/config.ts +1 -65
  326. package/src/services/export/index.ts +1 -4
  327. package/src/services/file/index.ts +1 -11
  328. package/src/services/import/index.ts +1 -7
  329. package/src/services/message/index.ts +1 -11
  330. package/src/services/message/server.ts +7 -6
  331. package/src/services/message/type.ts +6 -3
  332. package/src/services/models.ts +2 -11
  333. package/src/services/plugin/index.ts +1 -11
  334. package/src/services/session/index.ts +1 -11
  335. package/src/services/tableViewer/client.ts +12 -15
  336. package/src/services/thread/index.ts +1 -7
  337. package/src/services/topic/index.ts +1 -11
  338. package/src/services/user/index.ts +1 -13
  339. package/src/store/chat/helpers.test.ts +99 -0
  340. package/src/store/chat/helpers.ts +21 -2
  341. package/src/store/chat/selectors.ts +1 -1
  342. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  343. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  344. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  345. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  346. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  347. package/src/store/chat/slices/message/action.test.ts +5 -1
  348. package/src/store/chat/slices/message/action.ts +102 -14
  349. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  350. package/src/store/chat/slices/message/reducer.ts +87 -3
  351. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  352. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  353. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  354. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  355. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  356. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  357. package/src/store/chat/slices/plugin/action.ts +1 -44
  358. package/src/store/global/store.ts +1 -7
  359. package/src/store/tool/selectors/tool.test.ts +1 -1
  360. package/src/store/tool/selectors/tool.ts +6 -8
  361. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  362. package/src/store/tool/slices/builtin/action.ts +0 -9
  363. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  364. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  365. package/src/store/user/initialState.ts +1 -7
  366. package/src/store/user/selectors.ts +1 -5
  367. package/src/store/user/slices/common/action.test.ts +1 -4
  368. package/src/store/user/slices/common/action.ts +5 -4
  369. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  370. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  371. package/src/store/user/store.ts +0 -3
  372. package/src/tools/index.ts +0 -6
  373. package/src/tools/renders.ts +0 -3
  374. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  375. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  376. package/tsconfig.json +9 -3
  377. package/packages/const/src/guide.ts +0 -89
  378. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  379. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  380. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  381. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  382. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  383. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  384. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  385. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  386. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  387. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  388. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  389. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  390. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  391. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  392. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  393. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  394. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  395. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  396. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  397. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  398. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  399. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  400. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  401. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  402. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  403. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  404. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  405. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  406. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  407. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  408. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  409. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  410. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  411. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  412. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  413. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  414. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  415. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  416. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  417. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  418. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  419. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  420. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  421. package/src/components/InnerLink.tsx +0 -20
  422. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  423. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  424. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  425. package/src/database/_deprecated/core/db.ts +0 -246
  426. package/src/database/_deprecated/core/index.ts +0 -2
  427. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  428. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  429. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  430. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  431. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  432. package/src/database/_deprecated/core/model.ts +0 -218
  433. package/src/database/_deprecated/core/schemas.ts +0 -88
  434. package/src/database/_deprecated/core/types/db.ts +0 -15
  435. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  436. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  437. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  438. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  439. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  440. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  441. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  442. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  443. package/src/database/_deprecated/models/file.ts +0 -51
  444. package/src/database/_deprecated/models/message.ts +0 -277
  445. package/src/database/_deprecated/models/plugin.ts +0 -62
  446. package/src/database/_deprecated/models/session.ts +0 -271
  447. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  448. package/src/database/_deprecated/models/topic.ts +0 -250
  449. package/src/database/_deprecated/models/user.ts +0 -69
  450. package/src/database/_deprecated/schemas/files.ts +0 -39
  451. package/src/database/_deprecated/schemas/message.ts +0 -50
  452. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  453. package/src/database/_deprecated/schemas/session.ts +0 -54
  454. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  455. package/src/database/_deprecated/schemas/topic.ts +0 -12
  456. package/src/database/_deprecated/schemas/user.ts +0 -40
  457. package/src/envs/__tests__/auth.test.ts +0 -200
  458. package/src/features/DataImporter/_deprecated.ts +0 -43
  459. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  460. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  461. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  462. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  463. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  464. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  465. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  466. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  467. package/src/features/InitClientDB/index.tsx +0 -37
  468. package/src/hooks/_header.ts +0 -23
  469. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  470. package/src/libs/trpc/client/edge.ts +0 -26
  471. package/src/libs/trpc/edge/context.ts +0 -71
  472. package/src/libs/trpc/edge/index.ts +0 -45
  473. package/src/libs/trpc/edge/init.ts +0 -26
  474. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  475. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  476. package/src/migrations/FromV0ToV1.ts +0 -10
  477. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  478. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  479. package/src/migrations/FromV1ToV2/index.ts +0 -82
  480. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  481. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  482. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  483. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  484. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  485. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  486. package/src/migrations/FromV2ToV3/index.ts +0 -30
  487. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  488. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  489. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  490. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  491. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  492. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  493. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  494. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  495. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  496. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  497. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  498. package/src/migrations/FromV3ToV4/index.ts +0 -102
  499. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  500. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  501. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  502. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  503. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  504. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  505. package/src/migrations/FromV4ToV5/index.ts +0 -58
  506. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  507. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  508. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  509. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  510. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  511. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  512. package/src/migrations/FromV5ToV6/index.ts +0 -61
  513. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  514. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  515. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  516. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  517. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  518. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  519. package/src/migrations/FromV6ToV7/index.ts +0 -101
  520. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  521. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  522. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  523. package/src/migrations/VersionController.test.ts +0 -88
  524. package/src/migrations/VersionController.ts +0 -67
  525. package/src/migrations/index.ts +0 -61
  526. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  527. package/src/server/globalConfig/_deprecated.ts +0 -41
  528. package/src/server/routers/edge/appStatus.ts +0 -3
  529. package/src/server/routers/edge/index.ts +0 -14
  530. package/src/server/routers/edge/upload.ts +0 -16
  531. package/src/services/aiModel/client.ts +0 -70
  532. package/src/services/aiProvider/client.ts +0 -58
  533. package/src/services/baseClientService/index.ts +0 -9
  534. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  535. package/src/services/chatGroup/client.ts +0 -63
  536. package/src/services/export/_deprecated.ts +0 -155
  537. package/src/services/export/client.ts +0 -15
  538. package/src/services/file/_deprecated.test.ts +0 -119
  539. package/src/services/file/_deprecated.ts +0 -80
  540. package/src/services/file/client.test.ts +0 -199
  541. package/src/services/file/client.ts +0 -85
  542. package/src/services/import/_deprecated.ts +0 -115
  543. package/src/services/import/client.test.ts +0 -1015
  544. package/src/services/import/client.ts +0 -64
  545. package/src/services/message/_deprecated.test.ts +0 -398
  546. package/src/services/message/_deprecated.ts +0 -168
  547. package/src/services/message/client.test.ts +0 -410
  548. package/src/services/message/client.ts +0 -186
  549. package/src/services/plugin/_deprecated.test.ts +0 -162
  550. package/src/services/plugin/_deprecated.ts +0 -42
  551. package/src/services/plugin/client.test.ts +0 -177
  552. package/src/services/plugin/client.ts +0 -46
  553. package/src/services/session/_deprecated.test.ts +0 -440
  554. package/src/services/session/_deprecated.ts +0 -190
  555. package/src/services/session/client.test.ts +0 -413
  556. package/src/services/session/client.ts +0 -193
  557. package/src/services/thread/client.ts +0 -51
  558. package/src/services/topic/_deprecated.test.ts +0 -245
  559. package/src/services/topic/_deprecated.ts +0 -75
  560. package/src/services/topic/client.ts +0 -89
  561. package/src/services/topic/pglite.test.ts +0 -212
  562. package/src/services/user/_deprecated.test.ts +0 -101
  563. package/src/services/user/_deprecated.ts +0 -70
  564. package/src/services/user/client.test.ts +0 -108
  565. package/src/services/user/client.ts +0 -104
  566. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  567. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  568. package/src/store/global/actions/clientDb.ts +0 -67
  569. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  570. package/src/store/user/slices/modelList/action.test.ts +0 -359
  571. package/src/store/user/slices/modelList/action.ts +0 -223
  572. package/src/store/user/slices/modelList/initialState.ts +0 -15
  573. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  574. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  575. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  576. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  577. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  578. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  579. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  580. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  581. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  582. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  583. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  584. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  585. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  586. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  587. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  588. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  589. package/src/tools/dalle/Render/index.tsx +0 -52
  590. package/src/tools/dalle/index.ts +0 -92
  591. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -1,219 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import { UserStore } from '@/store/user';
4
- import { merge } from '@/utils/merge';
5
-
6
- import { UserState } from '../../../initialState';
7
- import { UserSettingsState, initialSettingsState } from '../../settings/initialState';
8
- import { modelConfigSelectors } from './modelConfig';
9
-
10
- describe('modelConfigSelectors', () => {
11
- describe('isProviderEnabled', () => {
12
- it('should return true if provider is enabled', () => {
13
- const s = merge(initialSettingsState, {
14
- settings: {
15
- languageModel: {
16
- ollama: { enabled: true },
17
- },
18
- },
19
- } as UserSettingsState) as unknown as UserStore;
20
-
21
- expect(modelConfigSelectors.isProviderEnabled('ollama')(s)).toBe(true);
22
- });
23
-
24
- it('should return false if provider is not enabled', () => {
25
- const s = merge(initialSettingsState, {
26
- settings: {
27
- languageModel: {
28
- perplexity: { enabled: false },
29
- },
30
- },
31
- } as UserSettingsState) as unknown as UserStore;
32
-
33
- expect(modelConfigSelectors.isProviderEnabled('perplexity')(s)).toBe(false);
34
- });
35
-
36
- it('should follow the user settings if provider is in the whitelist', () => {
37
- const s = merge(initialSettingsState, {
38
- settings: {
39
- languageModel: {
40
- ollama: { enabled: false },
41
- },
42
- },
43
- } as UserSettingsState) as unknown as UserStore;
44
-
45
- expect(modelConfigSelectors.isProviderEnabled('ollama')(s)).toBe(false);
46
- });
47
-
48
- it('ollama should be enabled by default', () => {
49
- const s = merge(initialSettingsState, {
50
- settings: {
51
- languageModel: {},
52
- },
53
- } as UserSettingsState) as unknown as UserStore;
54
- expect(modelConfigSelectors.isProviderEnabled('ollama')(s)).toBe(true);
55
- });
56
- });
57
-
58
- describe('isProviderFetchOnClient', () => {
59
- // The next 4 case are base on the rules on https://github.com/lobehub/lobe-chat/pull/2753
60
- it('client fetch should disabled on default', () => {
61
- const s = merge(initialSettingsState, {
62
- settings: {
63
- keyVaults: {
64
- azure: {
65
- endpoint: 'endpoint',
66
- apiKey: 'apikey',
67
- },
68
- },
69
- },
70
- } as UserSettingsState) as unknown as UserStore;
71
- expect(modelConfigSelectors.isProviderFetchOnClient('azure')(s)).toBe(false);
72
- });
73
-
74
- it('client fetch should disabled if no apikey or endpoint provided even user set it enabled', () => {
75
- const s = merge(initialSettingsState, {
76
- settings: {
77
- languageModel: {
78
- azure: { fetchOnClient: true },
79
- },
80
- },
81
- } as UserSettingsState) as unknown as UserStore;
82
- expect(modelConfigSelectors.isProviderFetchOnClient('azure')(s)).toBe(false);
83
- });
84
-
85
- it('client fetch should enable if only endpoint provided', () => {
86
- const s = merge(initialSettingsState, {
87
- settings: {
88
- languageModel: {
89
- azure: { fetchOnClient: false },
90
- },
91
- keyVaults: {
92
- azure: { endpoint: 'https://example.com' },
93
- },
94
- },
95
- } as UserSettingsState) as unknown as UserStore;
96
- expect(modelConfigSelectors.isProviderFetchOnClient('azure')(s)).toBe(true);
97
- });
98
-
99
- it('client fetch should control by user when a apikey or endpoint provided', () => {
100
- const s = merge(initialSettingsState, {
101
- settings: {
102
- languageModel: {
103
- azure: { fetchOnClient: true },
104
- },
105
- keyVaults: {
106
- azure: { apiKey: 'some-key' },
107
- },
108
- },
109
- } as UserSettingsState) as unknown as UserStore;
110
- expect(modelConfigSelectors.isProviderFetchOnClient('azure')(s)).toBe(true);
111
- });
112
-
113
- // Qwen provider not work in browser request. Please skip this case if it work in future.
114
- // Issue: https://github.com/lobehub/lobe-chat/issues/3108
115
- // PR: https://github.com/lobehub/lobe-chat/pull/3133
116
- it('client fecth should be disabled if provider is disable browser request', () => {
117
- const s = merge(initialSettingsState, {
118
- settings: {
119
- languageModel: {
120
- qwen: { fetchOnClient: true },
121
- },
122
- keyVaults: {
123
- qwen: {
124
- apiKey: 'apikey',
125
- },
126
- },
127
- },
128
- } as UserSettingsState) as unknown as UserStore;
129
- expect(modelConfigSelectors.isAutoFetchModelsEnabled('qwen')(s)).toBe(false);
130
- });
131
- });
132
-
133
- describe('getCustomModelCardById', () => {
134
- it('should return the custom model card with the given id and provider', () => {
135
- const s = merge(initialSettingsState, {
136
- settings: {
137
- languageModel: {
138
- perplexity: {
139
- customModelCards: [
140
- { id: 'custom-model-1', displayName: 'Custom Model 1' },
141
- { id: 'custom-model-2', displayName: 'Custom Model 2' },
142
- ],
143
- },
144
- },
145
- },
146
- } as UserSettingsState) as unknown as UserStore;
147
-
148
- const customModelCard = modelConfigSelectors.getCustomModelCard({
149
- id: 'custom-model-2',
150
- provider: 'perplexity',
151
- })(s);
152
-
153
- expect(customModelCard).toEqual({ id: 'custom-model-2', displayName: 'Custom Model 2' });
154
- });
155
-
156
- it('should return undefined if no custom model card is found with the given id and provider', () => {
157
- const s = merge(initialSettingsState, {
158
- settings: {
159
- languageModel: {
160
- perplexity: {
161
- customModelCards: [{ id: 'custom-model-1', displayName: 'Custom Model 1' }],
162
- },
163
- },
164
- },
165
- } as UserSettingsState) as unknown as UserStore;
166
-
167
- const customModelCard = modelConfigSelectors.getCustomModelCard({
168
- id: 'nonexistent-model',
169
- provider: 'perplexity',
170
- })(s);
171
-
172
- expect(customModelCard).toBeUndefined();
173
- });
174
- });
175
-
176
- describe('currentEditingCustomModelCard', () => {
177
- it('should return the custom model card that is currently being edited', () => {
178
- const s = merge(initialSettingsState, {
179
- settings: {
180
- languageModel: {
181
- perplexity: {
182
- customModelCards: [
183
- { id: 'custom-model-1', displayName: 'Custom Model 1' },
184
- { id: 'custom-model-2', displayName: 'Custom Model 2' },
185
- ],
186
- },
187
- },
188
- },
189
- editingCustomCardModel: {
190
- id: 'custom-model-2',
191
- provider: 'perplexity',
192
- },
193
- } as UserState) as unknown as UserStore;
194
-
195
- const currentEditingModelCard = modelConfigSelectors.currentEditingCustomModelCard(s);
196
-
197
- expect(currentEditingModelCard).toEqual({
198
- id: 'custom-model-2',
199
- displayName: 'Custom Model 2',
200
- });
201
- });
202
-
203
- it('should return undefined if no custom model card is currently being edited', () => {
204
- const s = merge(initialSettingsState, {
205
- settings: {
206
- languageModel: {
207
- perplexity: {
208
- customModelCards: [{ id: 'custom-model-1', displayName: 'Custom Model 1' }],
209
- },
210
- },
211
- },
212
- } as UserSettingsState) as unknown as UserStore;
213
-
214
- const currentEditingModelCard = modelConfigSelectors.currentEditingCustomModelCard(s);
215
-
216
- expect(currentEditingModelCard).toBeUndefined();
217
- });
218
- });
219
- });
@@ -1,95 +0,0 @@
1
- import { isProviderDisableBrowserRequest } from '@/config/modelProviders';
2
- import { isDesktop } from '@/const/version';
3
- import { UserStore } from '@/store/user';
4
- import { GlobalLLMProviderKey } from '@/types/user/settings';
5
-
6
- import { currentLLMSettings, getProviderConfigById } from '../../settings/selectors/settings';
7
- import { keyVaultsConfigSelectors } from './keyVaults';
8
-
9
- const isProviderEnabled = (provider: GlobalLLMProviderKey) => (s: UserStore) =>
10
- getProviderConfigById(provider)(s)?.enabled || false;
11
-
12
- const providerWhitelist = new Set(['ollama', 'lmstudio']);
13
- /**
14
- * @description The conditions to enable client fetch
15
- * 1. If no baseUrl and apikey input, force on Server.
16
- * 2. If only contains baseUrl, force on Client
17
- * 3. Follow the user settings.
18
- * 4. On Server, by default.
19
- */
20
- const isProviderFetchOnClient = (provider: GlobalLLMProviderKey | string) => (s: UserStore) => {
21
- const config = getProviderConfigById(provider)(s);
22
-
23
- // if is desktop, force on Server.
24
- if (isDesktop) return false;
25
-
26
- // If the provider already disable browser request in model config, force on Server.
27
- if (isProviderDisableBrowserRequest(provider)) return false;
28
-
29
- // If the provider in the whitelist, follow the user settings
30
- if (providerWhitelist.has(provider) && typeof config?.fetchOnClient !== 'undefined')
31
- return config?.fetchOnClient;
32
-
33
- // 1. If no baseUrl and apikey input, force on Server.
34
- const isProviderEndpointNotEmpty =
35
- keyVaultsConfigSelectors.isProviderEndpointNotEmpty(provider)(s);
36
- const isProviderApiKeyNotEmpty = keyVaultsConfigSelectors.isProviderApiKeyNotEmpty(provider)(s);
37
- if (!isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return false;
38
-
39
- // 2. If only contains baseUrl, force on Client
40
- if (isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return true;
41
-
42
- // 3. Follow the user settings.
43
- if (typeof config?.fetchOnClient !== 'undefined') return config?.fetchOnClient;
44
-
45
- // 4. On Server, by default.
46
- return false;
47
- };
48
-
49
- const getCustomModelCard =
50
- ({ id, provider }: { id?: string; provider?: string }) =>
51
- (s: UserStore) => {
52
- if (!provider) return;
53
-
54
- const config = getProviderConfigById(provider)(s);
55
-
56
- return config?.customModelCards?.find((m) => m.id === id);
57
- };
58
-
59
- const currentEditingCustomModelCard = (s: UserStore) => {
60
- if (!s.editingCustomCardModel) return;
61
- const { id, provider } = s.editingCustomCardModel;
62
-
63
- return getCustomModelCard({ id, provider })(s);
64
- };
65
-
66
- const isAutoFetchModelsEnabled =
67
- (provider: GlobalLLMProviderKey) =>
68
- (s: UserStore): boolean => {
69
- return getProviderConfigById(provider)(s)?.autoFetchModelLists || false;
70
- };
71
-
72
- const openAIConfig = (s: UserStore) => currentLLMSettings(s).openai;
73
- const bedrockConfig = (s: UserStore) => currentLLMSettings(s).bedrock;
74
- const ollamaConfig = (s: UserStore) => currentLLMSettings(s).ollama;
75
- const azureConfig = (s: UserStore) => currentLLMSettings(s).azure;
76
- const cloudflareConfig = (s: UserStore) => currentLLMSettings(s).cloudflare;
77
-
78
- const isAzureEnabled = (s: UserStore) => currentLLMSettings(s).azure.enabled;
79
-
80
- export const modelConfigSelectors = {
81
- azureConfig,
82
- bedrockConfig,
83
- cloudflareConfig,
84
-
85
- currentEditingCustomModelCard,
86
- getCustomModelCard,
87
-
88
- isAutoFetchModelsEnabled,
89
- isAzureEnabled,
90
- isProviderEnabled,
91
- isProviderFetchOnClient,
92
-
93
- ollamaConfig,
94
- openAIConfig,
95
- };
@@ -1,138 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import { merge } from '@/utils/merge';
4
-
5
- import { UserState, initialState } from '../../../initialState';
6
- import { UserStore, useUserStore } from '../../../store';
7
- import { getDefaultModeProviderById, modelProviderSelectors } from './modelProvider';
8
-
9
- describe('modelProviderSelectors', () => {
10
- describe('getDefaultModeProviderById', () => {
11
- it('should return the correct ModelProviderCard when provider ID matches', () => {
12
- const s = merge(initialState, {}) as unknown as UserStore;
13
-
14
- const result = getDefaultModeProviderById('openai')(s);
15
- expect(result).not.toBeUndefined();
16
- });
17
-
18
- it('should return undefined when provider ID does not exist', () => {
19
- const s = merge(initialState, {}) as unknown as UserStore;
20
- const result = getDefaultModeProviderById('nonExistingProvider')(s);
21
- expect(result).toBeUndefined();
22
- });
23
- });
24
-
25
- describe('getModelCardsById', () => {
26
- it('should return model cards including custom model cards', () => {
27
- const s = merge(initialState, {
28
- settings: {
29
- languageModel: {
30
- perplexity: {
31
- customModelCards: [{ id: 'custom-model', displayName: 'Custom Model' }],
32
- },
33
- },
34
- },
35
- } as UserState) as unknown as UserStore;
36
-
37
- const modelCards = modelProviderSelectors.getModelCardsById('perplexity')(s);
38
-
39
- expect(modelCards).toContainEqual({
40
- id: 'custom-model',
41
- displayName: 'Custom Model',
42
- isCustom: true,
43
- });
44
- });
45
- });
46
-
47
- describe('defaultEnabledProviderModels', () => {
48
- it('should return undefined for a non-existing provider', () => {
49
- const s = merge(initialState, {}) as unknown as UserStore;
50
-
51
- const result = modelProviderSelectors.getDefaultEnabledModelsById('nonExistingProvider')(s);
52
- expect(result).toBeUndefined();
53
- });
54
- });
55
- describe('modelEnabledVision', () => {
56
- it('should return true if the model has vision ability', () => {
57
- const hasAbility = modelProviderSelectors.isModelEnabledVision('gpt-4-vision-preview')(
58
- useUserStore.getState(),
59
- );
60
- expect(hasAbility).toBeTruthy();
61
- });
62
-
63
- it('should return false if the model does not have vision ability', () => {
64
- const hasAbility = modelProviderSelectors.isModelEnabledVision('some-other-model')(
65
- useUserStore.getState(),
66
- );
67
-
68
- expect(hasAbility).toBeFalsy();
69
- });
70
-
71
- it('should return false if the model include vision in id', () => {
72
- const hasAbility = modelProviderSelectors.isModelEnabledVision('some-other-model-vision')(
73
- useUserStore.getState(),
74
- );
75
-
76
- expect(hasAbility).toBeTruthy();
77
- });
78
- });
79
-
80
- describe('modelEnabledFiles', () => {
81
- it('should return false if the model does not have file ability', () => {
82
- const enabledFiles = modelProviderSelectors.isModelEnabledFiles('gpt-4-vision-preview')(
83
- useUserStore.getState(),
84
- );
85
- expect(enabledFiles).toBeFalsy();
86
- });
87
-
88
- it.skip('should return true if the model has file ability', () => {
89
- const enabledFiles = modelProviderSelectors.isModelEnabledFiles('gpt-4-all')(
90
- useUserStore.getState(),
91
- );
92
- expect(enabledFiles).toBeTruthy();
93
- });
94
- });
95
-
96
- describe('modelHasMaxToken', () => {
97
- it('should return true if the model is in the list of models that show tokens', () => {
98
- const show = modelProviderSelectors.isModelHasMaxToken('gpt-3.5-turbo')(
99
- useUserStore.getState(),
100
- );
101
- expect(show).toBeTruthy();
102
- });
103
-
104
- it('should return false if the model is not in the list of models that show tokens', () => {
105
- const show = modelProviderSelectors.isModelHasMaxToken('some-other-model')(
106
- useUserStore.getState(),
107
- );
108
- expect(show).toBe(false);
109
- });
110
- });
111
-
112
- describe('modelMaxToken', () => {
113
- it('should return the correct token count for a model with specified tokens', () => {
114
- const model1Tokens = modelProviderSelectors.modelMaxToken('gpt-3.5-turbo')(
115
- useUserStore.getState(),
116
- );
117
-
118
- expect(model1Tokens).toEqual(16385);
119
- });
120
-
121
- it('should return 0 for a model without a specified token count', () => {
122
- // 测试未指定tokens属性的模型的tokens值,期望为0
123
- const tokens = modelProviderSelectors.modelMaxToken('chat-bison-001')(
124
- useUserStore.getState(),
125
- );
126
- expect(tokens).toEqual(0);
127
- });
128
-
129
- it('should return 0 for a non-existing model', () => {
130
- // 测试一个不存在的模型的tokens值,期望为0
131
- const tokens = modelProviderSelectors.modelMaxToken('nonExistingModel')(
132
- useUserStore.getState(),
133
- );
134
-
135
- expect(tokens).toEqual(0);
136
- });
137
- });
138
- });
@@ -1,170 +0,0 @@
1
- import type {
2
- ChatModelCard,
3
- EnabledProviderWithModels,
4
- GlobalLLMProviderKey,
5
- ModelProviderCard,
6
- } from '@lobechat/types';
7
- import { ServerModelProviderConfig } from '@lobechat/types';
8
- import { uniqBy } from 'lodash-es';
9
-
10
- import { filterEnabledModels } from '@/config/modelProviders';
11
- import type { UserStore } from '@/store/user';
12
-
13
- import { currentSettings, getProviderConfigById } from '../../settings/selectors/settings';
14
-
15
- /**
16
- * get the server side model cards
17
- */
18
- const serverProviderModelCards =
19
- (provider: GlobalLLMProviderKey) =>
20
- (s: UserStore): ChatModelCard[] | undefined => {
21
- const config = s.serverLanguageModel?.[provider] as ServerModelProviderConfig | undefined;
22
-
23
- if (!config) return;
24
-
25
- return config.serverModelCards;
26
- };
27
-
28
- const remoteProviderModelCards =
29
- (provider: GlobalLLMProviderKey) =>
30
- (s: UserStore): ChatModelCard[] | undefined => {
31
- const cards = currentSettings(s).languageModel?.[provider]?.remoteModelCards as
32
- | ChatModelCard[]
33
- | undefined;
34
-
35
- if (!cards) return;
36
-
37
- return cards;
38
- };
39
-
40
- const isProviderEnabled = (provider: GlobalLLMProviderKey) => (s: UserStore) =>
41
- getProviderConfigById(provider)(s)?.enabled || false;
42
-
43
- // Default Model Provider List
44
-
45
- /**
46
- * define all the model list of providers
47
- */
48
- const defaultModelProviderList = (s: UserStore): ModelProviderCard[] => s.defaultModelProviderList;
49
-
50
- export const getDefaultModeProviderById = (provider: string) => (s: UserStore) =>
51
- defaultModelProviderList(s).find((s) => s.id === provider);
52
-
53
- /**
54
- * get the default enabled models for a provider
55
- * it's a default enabled model list by Lobe Chat
56
- * e.g. openai is ['gpt-4o-mini','gpt-4o','gpt-4-turbo']
57
- */
58
- const getDefaultEnabledModelsById = (provider: string) => (s: UserStore) => {
59
- const modelProvider = getDefaultModeProviderById(provider)(s);
60
-
61
- if (modelProvider) return filterEnabledModels(modelProvider);
62
-
63
- return undefined;
64
- };
65
-
66
- const getDefaultModelCardById = (id: string) => (s: UserStore) => {
67
- const list = defaultModelProviderList(s);
68
-
69
- return list.flatMap((i) => i.chatModels).find((m) => m.id === id);
70
- };
71
-
72
- // Model Provider List
73
-
74
- const getModelCardsById =
75
- (provider: string) =>
76
- (s: UserStore): ChatModelCard[] => {
77
- const builtinCards = getDefaultModeProviderById(provider)(s)?.chatModels || [];
78
-
79
- const userCards = (getProviderConfigById(provider)(s)?.customModelCards || []).map((model) => ({
80
- ...model,
81
- isCustom: true,
82
- }));
83
-
84
- return uniqBy([...userCards, ...builtinCards], 'id');
85
- };
86
-
87
- const getEnableModelsById = (provider: string) => (s: UserStore) => {
88
- if (!getProviderConfigById(provider)(s)?.enabledModels) return;
89
-
90
- return getProviderConfigById(provider)(s)?.enabledModels?.filter(Boolean);
91
- };
92
-
93
- const modelProviderList = (s: UserStore): ModelProviderCard[] => s.modelProviderList;
94
-
95
- const modelProviderListForModelSelect = (s: UserStore): EnabledProviderWithModels[] =>
96
- modelProviderList(s)
97
- .filter((s) => s.enabled)
98
- .map((provider) => ({
99
- ...provider,
100
- children: provider.chatModels
101
- .filter((model) => model.enabled)
102
- .map((m) => ({
103
- abilities: {
104
- functionCall: m.functionCall,
105
- vision: m.vision,
106
- },
107
- contextWindowTokens: m.contextWindowTokens,
108
- displayName: m.displayName,
109
- id: m.id,
110
- })),
111
- source: 'builtin',
112
- }));
113
-
114
- const getModelCardById = (id: string, provider?: GlobalLLMProviderKey) => (s: UserStore) => {
115
- const list = modelProviderList(s);
116
-
117
- return list
118
- .filter((i) => !provider || i.id === provider)
119
- .flatMap((i) => i.chatModels)
120
- .find((m) => m.id === id);
121
- };
122
-
123
- const isModelEnabledFunctionCall = (id: string) => (s: UserStore) =>
124
- getModelCardById(id)(s)?.functionCall || false;
125
-
126
- // vision model white list, these models will change the content from string to array
127
- // refs: https://github.com/lobehub/lobe-chat/issues/790
128
- const isModelEnabledVision = (id: string) => (s: UserStore) =>
129
- getModelCardById(id)(s)?.vision || id.includes('vision');
130
-
131
- const isModelEnabledReasoning = (id: string) => (s: UserStore) =>
132
- getModelCardById(id)(s)?.reasoning || false;
133
-
134
- const isModelEnabledFiles = (id: string) => (s: UserStore) => getModelCardById(id)(s)?.files;
135
-
136
- const isModelEnabledUpload = (id: string) => (s: UserStore) =>
137
- isModelEnabledVision(id)(s) || isModelEnabledFiles(id)(s);
138
-
139
- const isModelHasMaxToken = (id: string) => (s: UserStore) =>
140
- typeof getModelCardById(id)(s)?.contextWindowTokens !== 'undefined';
141
-
142
- const modelMaxToken = (id: string) => (s: UserStore) =>
143
- getModelCardById(id)(s)?.contextWindowTokens || 0;
144
-
145
- export const modelProviderSelectors = {
146
- defaultModelProviderList,
147
- getDefaultEnabledModelsById,
148
- getDefaultModelCardById,
149
-
150
- getEnableModelsById,
151
- getModelCardById,
152
-
153
- getModelCardsById,
154
- isModelEnabledFiles,
155
- isModelEnabledFunctionCall,
156
- isModelEnabledReasoning,
157
- isModelEnabledUpload,
158
- isModelEnabledVision,
159
- isModelHasMaxToken,
160
-
161
- isProviderEnabled,
162
-
163
- modelMaxToken,
164
- modelProviderList,
165
-
166
- modelProviderListForModelSelect,
167
-
168
- remoteProviderModelCards,
169
- serverProviderModelCards,
170
- };
@@ -1,60 +0,0 @@
1
- import { useResponsive } from 'antd-style';
2
- import { ReactNode, memo, useMemo } from 'react';
3
- import { Flexbox } from 'react-layout-kit';
4
-
5
- import Grid from '@/components/GalleyGrid/Grid';
6
-
7
- const MAX_SIZE_DESKTOP = 640;
8
- const MAX_SIZE_MOBILE = 280;
9
-
10
- interface GalleyGridProps<T = any> {
11
- items: T[];
12
- renderItem: (props: T) => ReactNode;
13
- }
14
-
15
- const GalleyGrid = memo<GalleyGridProps>(({ items, renderItem: Render }) => {
16
- const { mobile } = useResponsive();
17
-
18
- const { firstRow, lastRow } = useMemo(() => {
19
- if (items.length === 4) {
20
- return {
21
- firstRow: items.slice(0, 2),
22
- lastRow: items.slice(2, 4),
23
- };
24
- }
25
-
26
- const firstCol = items.length % 3 === 0 ? 3 : items.length % 3;
27
-
28
- return {
29
- firstRow: items.slice(0, firstCol),
30
- lastRow: items.slice(firstCol, items.length),
31
- };
32
- }, [items]);
33
-
34
- const { gap, max } = useMemo(
35
- () => ({
36
- gap: mobile ? 4 : 6,
37
- max: (mobile ? MAX_SIZE_MOBILE : MAX_SIZE_DESKTOP) * firstRow.length,
38
- }),
39
- [mobile],
40
- );
41
-
42
- return (
43
- <Flexbox gap={gap}>
44
- <Grid col={firstRow.length} gap={gap} max={max}>
45
- {firstRow.map((i, index) => (
46
- <Render {...i} index={index} key={index} />
47
- ))}
48
- </Grid>
49
- {lastRow.length > 0 && (
50
- <Grid col={lastRow.length > 2 ? 3 : lastRow.length} gap={gap} max={max}>
51
- {lastRow.map((i, index) => (
52
- <Render {...i} index={index} key={index} />
53
- ))}
54
- </Grid>
55
- )}
56
- </Flexbox>
57
- );
58
- });
59
-
60
- export default GalleyGrid;