@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
@@ -11,25 +11,24 @@ import {
11
11
  TraceNameMap,
12
12
  UIChatMessage,
13
13
  } from '@lobechat/types';
14
+ import isEqual from 'fast-deep-equal';
14
15
  import { t } from 'i18next';
15
16
  import { produce } from 'immer';
17
+ import { throttle } from 'lodash-es';
16
18
  import { StateCreator } from 'zustand/vanilla';
17
19
 
18
20
  import { chatService } from '@/services/chat';
19
21
  import { messageService } from '@/services/message';
20
- import { useAgentStore } from '@/store/agent';
21
22
  import { agentChatConfigSelectors, agentSelectors } from '@/store/agent/selectors';
22
23
  import { getAgentStoreState } from '@/store/agent/store';
23
24
  import { aiModelSelectors, aiProviderSelectors } from '@/store/aiInfra';
24
25
  import { getAiInfraStoreState } from '@/store/aiInfra/store';
25
26
  import { ChatStore } from '@/store/chat/store';
26
- import { messageMapKey } from '@/store/chat/utils/messageMapKey';
27
27
  import { getFileStoreState } from '@/store/file/store';
28
- import { useSessionStore } from '@/store/session';
29
28
  import { WebBrowsingManifest } from '@/tools/web-browsing';
30
29
  import { Action, setNamespace } from '@/utils/storeDebug';
31
30
 
32
- import { chatSelectors, topicSelectors } from '../../../selectors';
31
+ import { chatSelectors, messageStateSelectors, topicSelectors } from '../../../selectors';
33
32
 
34
33
  const n = setNamespace('ai');
35
34
 
@@ -158,13 +157,7 @@ export const generateAIChat: StateCreator<
158
157
  },
159
158
 
160
159
  sendMessage: async ({ message, files, onlyAddUserMessage, isWelcomeQuestion }) => {
161
- const {
162
- internal_coreProcessMessage,
163
- activeTopicId,
164
- activeId,
165
- activeThreadId,
166
- sendMessageInServer,
167
- } = get();
160
+ const { activeId, sendMessageInServer } = get();
168
161
  if (!activeId) return;
169
162
 
170
163
  const fileIdList = files?.map((f) => f.id);
@@ -177,134 +170,6 @@ export const generateAIChat: StateCreator<
177
170
  // router to server mode send message
178
171
  if (isServerMode)
179
172
  return sendMessageInServer({ message, files, onlyAddUserMessage, isWelcomeQuestion });
180
-
181
- set({ isCreatingMessage: true }, false, n('creatingMessage/start'));
182
-
183
- const newMessage: CreateMessageParams = {
184
- content: message,
185
- // if message has attached with files, then add files to message and the agent
186
- files: fileIdList,
187
- role: 'user',
188
- sessionId: activeId,
189
- // if there is activeTopicId,then add topicId to message
190
- topicId: activeTopicId,
191
- threadId: activeThreadId,
192
- };
193
-
194
- const agentConfig = agentChatConfigSelectors.currentChatConfig(getAgentStoreState());
195
-
196
- let tempMessageId: string | undefined = undefined;
197
- let newTopicId: string | undefined = undefined;
198
-
199
- // it should be the default topic, then
200
- // if autoCreateTopic is enabled, check to whether we need to create a topic
201
- if (!onlyAddUserMessage && !activeTopicId && agentConfig.enableAutoCreateTopic) {
202
- // check activeTopic and then auto create topic
203
- const chats = chatSelectors.activeBaseChats(get());
204
-
205
- // we will add two messages (user and assistant), so the finial length should +2
206
- const featureLength = chats.length + 2;
207
-
208
- // if there is no activeTopicId and the feature length is greater than the threshold
209
- // then create a new topic and active it
210
- if (!activeTopicId && featureLength >= agentConfig.autoCreateTopicThreshold) {
211
- // we need to create a temp message for optimistic update
212
- tempMessageId = get().internal_createTmpMessage(newMessage);
213
- get().internal_toggleMessageLoading(true, tempMessageId);
214
-
215
- const topicId = await get().createTopic();
216
-
217
- if (topicId) {
218
- newTopicId = topicId;
219
- newMessage.topicId = topicId;
220
-
221
- // we need to copy the messages to the new topic or the message will disappear
222
- const mapKey = chatSelectors.currentChatKey(get());
223
- const newMaps = {
224
- ...get().messagesMap,
225
- [messageMapKey(activeId, topicId)]: get().messagesMap[mapKey],
226
- };
227
- set({ messagesMap: newMaps }, false, n('moveMessagesToNewTopic'));
228
-
229
- // make the topic loading
230
- get().internal_updateTopicLoading(topicId, true);
231
- }
232
- }
233
- }
234
- // update assistant update to make it rerank
235
- useSessionStore.getState().triggerSessionUpdate(get().activeId);
236
-
237
- const id = await get().internal_createMessage(newMessage, {
238
- tempMessageId,
239
- skipRefresh: !onlyAddUserMessage && newMessage.fileList?.length === 0,
240
- });
241
-
242
- if (!id) {
243
- set({ isCreatingMessage: false }, false, n('creatingMessage/start'));
244
- if (!!newTopicId) get().internal_updateTopicLoading(newTopicId, false);
245
- return;
246
- }
247
-
248
- if (tempMessageId) get().internal_toggleMessageLoading(false, tempMessageId);
249
-
250
- // switch to the new topic if create the new topic
251
- if (!!newTopicId) {
252
- await get().switchTopic(newTopicId, true);
253
- await get().internal_fetchMessages();
254
-
255
- // delete previous messages
256
- // remove the temp message map
257
- const newMaps = { ...get().messagesMap, [messageMapKey(activeId, null)]: [] };
258
- set({ messagesMap: newMaps }, false, 'internal_copyMessages');
259
- }
260
-
261
- // if only add user message, then stop
262
- if (onlyAddUserMessage) {
263
- set({ isCreatingMessage: false }, false, 'creatingMessage/start');
264
- return;
265
- }
266
-
267
- // Get the current messages to generate AI response
268
- const messages = chatSelectors.activeBaseChats(get());
269
- const userFiles = chatSelectors.currentUserFiles(get()).map((f) => f.id);
270
-
271
- await internal_coreProcessMessage(messages, id, {
272
- isWelcomeQuestion,
273
- ragQuery: get().internal_shouldUseRAG() ? message : undefined,
274
- threadId: activeThreadId,
275
- });
276
-
277
- set({ isCreatingMessage: false }, false, n('creatingMessage/stop'));
278
-
279
- const summaryTitle = async () => {
280
- // if autoCreateTopic is false, then stop
281
- if (!agentConfig.enableAutoCreateTopic) return;
282
-
283
- // check activeTopic and then auto update topic title
284
- if (newTopicId) {
285
- const chats = chatSelectors.getBaseChatsByKey(messageMapKey(activeId, newTopicId))(get());
286
- await get().summaryTopicTitle(newTopicId, chats);
287
- return;
288
- }
289
-
290
- if (!activeTopicId) return;
291
- const topic = topicSelectors.getTopicById(activeTopicId)(get());
292
-
293
- if (topic && !topic.title) {
294
- const chats = chatSelectors.getBaseChatsByKey(messageMapKey(activeId, topic.id))(get());
295
- await get().summaryTopicTitle(topic.id, chats);
296
- }
297
- };
298
-
299
- // if there is relative files, then add files to agent
300
- // only available in server mode
301
- const addFilesToAgent = async () => {
302
- if (userFiles.length === 0 || !isServerMode) return;
303
-
304
- await useAgentStore.getState().addFilesToAgent(userFiles, false);
305
- };
306
-
307
- await Promise.all([summaryTitle(), addFilesToAgent()]);
308
173
  },
309
174
  stopGenerateMessage: () => {
310
175
  const { chatLoadingIdsAbortController, internal_toggleChatLoading } = get();
@@ -579,6 +444,19 @@ export const generateAIChat: StateCreator<
579
444
  // to upload image
580
445
  const uploadTasks: Map<string, Promise<{ id?: string; url?: string }>> = new Map();
581
446
 
447
+ // Throttle tool_calls updates to prevent excessive re-renders (max once per 300ms)
448
+ const throttledUpdateToolCalls = throttle(
449
+ (toolCalls: any[]) => {
450
+ internal_dispatchMessage({
451
+ id: messageId,
452
+ type: 'updateMessage',
453
+ value: { tools: get().internal_transformToolCalls(toolCalls) },
454
+ });
455
+ },
456
+ 300,
457
+ { leading: true, trailing: true },
458
+ );
459
+
582
460
  const historySummary = chatConfig.enableCompressHistory
583
461
  ? topicSelectors.currentActiveTopicSummary(get())
584
462
  : undefined;
@@ -598,7 +476,6 @@ export const generateAIChat: StateCreator<
598
476
  topicId: get().activeTopicId,
599
477
  traceName: TraceNameMap.Conversation,
600
478
  },
601
- isWelcomeQuestion: params?.isWelcomeQuestion,
602
479
  onErrorHandle: async (error) => {
603
480
  await messageService.updateMessageError(messageId, error);
604
481
  await refreshMessages();
@@ -633,6 +510,8 @@ export const generateAIChat: StateCreator<
633
510
 
634
511
  let parsedToolCalls = toolCalls;
635
512
  if (parsedToolCalls && parsedToolCalls.length > 0) {
513
+ // Flush any pending throttled updates before finalizing
514
+ throttledUpdateToolCalls.flush();
636
515
  internal_toggleToolCallingStreaming(messageId, undefined);
637
516
  parsedToolCalls = parsedToolCalls.map((item) => ({
638
517
  ...item,
@@ -644,6 +523,8 @@ export const generateAIChat: StateCreator<
644
523
  isFunctionCall = true;
645
524
  }
646
525
 
526
+ internal_toggleChatReasoning(false, messageId, n('toggleChatReasoning/false') as string);
527
+
647
528
  // update the content after fetch result
648
529
  await internal_updateMessageContent(messageId, content, {
649
530
  toolCalls: parsedToolCalls,
@@ -707,7 +588,8 @@ export const generateAIChat: StateCreator<
707
588
  if (!duration) {
708
589
  duration = Date.now() - thinkingStartAt;
709
590
 
710
- const isInChatReasoning = chatSelectors.isMessageInChatReasoning(messageId)(get());
591
+ const isInChatReasoning =
592
+ messageStateSelectors.isMessageInChatReasoning(messageId)(get());
711
593
  if (isInChatReasoning) {
712
594
  internal_toggleChatReasoning(
713
595
  false,
@@ -752,12 +634,17 @@ export const generateAIChat: StateCreator<
752
634
  // is this message is just a tool call
753
635
  case 'tool_calls': {
754
636
  internal_toggleToolCallingStreaming(messageId, chunk.isAnimationActives);
755
- internal_dispatchMessage({
756
- id: messageId,
757
- type: 'updateMessage',
758
- value: { tools: get().internal_transformToolCalls(chunk.tool_calls) },
759
- });
637
+ throttledUpdateToolCalls(chunk.tool_calls);
760
638
  isFunctionCall = true;
639
+ const isInChatReasoning =
640
+ messageStateSelectors.isMessageInChatReasoning(messageId)(get());
641
+ if (isInChatReasoning) {
642
+ internal_toggleChatReasoning(
643
+ false,
644
+ messageId,
645
+ n('toggleChatReasoning/false') as string,
646
+ );
647
+ }
761
648
  }
762
649
  }
763
650
  },
@@ -827,16 +714,19 @@ export const generateAIChat: StateCreator<
827
714
  return get().internal_toggleLoadingArrays('reasoningLoadingIds', loading, id, action);
828
715
  },
829
716
  internal_toggleToolCallingStreaming: (id, streaming) => {
717
+ const previous = get().toolCallingStreamIds;
718
+ const next = produce(previous, (draft) => {
719
+ if (!!streaming) {
720
+ draft[id] = streaming;
721
+ } else {
722
+ delete draft[id];
723
+ }
724
+ });
725
+
726
+ if (isEqual(previous, next)) return;
727
+
830
728
  set(
831
- {
832
- toolCallingStreamIds: produce(get().toolCallingStreamIds, (draft) => {
833
- if (!!streaming) {
834
- draft[id] = streaming;
835
- } else {
836
- delete draft[id];
837
- }
838
- }),
839
- },
729
+ { toolCallingStreamIds: next },
840
730
 
841
731
  false,
842
732
  `toggleToolCallingStreaming/${!!streaming ? 'start' : 'end'}`,
@@ -2,14 +2,12 @@ import { StateCreator } from 'zustand/vanilla';
2
2
 
3
3
  import { ChatStore } from '@/store/chat/store';
4
4
 
5
- import { ChatDallEAction, dalleSlice } from './dalle';
6
5
  import { ChatCodeInterpreterAction, codeInterpreterSlice } from './interpreter';
7
6
  import { LocalFileAction, localSystemSlice } from './localSystem';
8
7
  import { SearchAction, searchSlice } from './search';
9
8
 
10
9
  export interface ChatBuiltinToolAction
11
- extends ChatDallEAction,
12
- SearchAction,
10
+ extends SearchAction,
13
11
  LocalFileAction,
14
12
  ChatCodeInterpreterAction {}
15
13
 
@@ -19,7 +17,6 @@ export const chatToolSlice: StateCreator<
19
17
  [],
20
18
  ChatBuiltinToolAction
21
19
  > = (...params) => ({
22
- ...dalleSlice(...params),
23
20
  ...searchSlice(...params),
24
21
  ...localSystemSlice(...params),
25
22
  ...codeInterpreterSlice(...params),
@@ -471,7 +471,11 @@ describe('chatMessage actions', () => {
471
471
  await result.current.internal_updateMessageContent(messageId, newContent);
472
472
  });
473
473
 
474
- expect(spy).toHaveBeenCalledWith(messageId, { content: newContent });
474
+ expect(spy).toHaveBeenCalledWith(
475
+ messageId,
476
+ { content: newContent },
477
+ { sessionId: 'session-id', topicId: 'topic-id' },
478
+ );
475
479
  });
476
480
 
477
481
  it('should dispatch message update action', async () => {
@@ -6,6 +6,7 @@ import {
6
6
  ChatMessageError,
7
7
  ChatMessagePluginError,
8
8
  CreateMessageParams,
9
+ CreateNewMessageParams,
9
10
  GroundingSearch,
10
11
  MessageMetadata,
11
12
  MessageToolCall,
@@ -117,6 +118,14 @@ export interface ChatMessageAction {
117
118
  * otherwise the message will be too slow to show
118
119
  */
119
120
  internal_createTmpMessage: (params: CreateMessageParams) => string;
121
+ /**
122
+ * create a new message using createNewMessage API and return full message list
123
+ * used for group message scenarios to reduce network requests
124
+ */
125
+ internal_createNewMessage: (
126
+ params: CreateNewMessageParams,
127
+ context?: { tempMessageId?: string; groupMessageId?: string },
128
+ ) => Promise<{ id: string; messages: UIChatMessage[] } | undefined>;
120
129
  /**
121
130
  * delete the message content with optimistic update
122
131
  */
@@ -374,8 +383,16 @@ export const chatMessage: StateCreator<
374
383
 
375
384
  internal_updateMessageError: async (id, error) => {
376
385
  get().internal_dispatchMessage({ id, type: 'updateMessage', value: { error } });
377
- await messageService.updateMessage(id, { error });
378
- await get().refreshMessages();
386
+ const result = await messageService.updateMessage(
387
+ id,
388
+ { error },
389
+ { topicId: get().activeTopicId, sessionId: get().activeId },
390
+ );
391
+ if (result?.success && result.messages) {
392
+ get().replaceMessages(result.messages);
393
+ } else {
394
+ await get().refreshMessages();
395
+ }
379
396
  },
380
397
 
381
398
  internal_updateMessagePluginError: async (id, error) => {
@@ -384,7 +401,12 @@ export const chatMessage: StateCreator<
384
401
  },
385
402
 
386
403
  internal_updateMessageContent: async (id, content, extra) => {
387
- const { internal_dispatchMessage, refreshMessages, internal_transformToolCalls } = get();
404
+ const {
405
+ internal_dispatchMessage,
406
+ refreshMessages,
407
+ internal_transformToolCalls,
408
+ replaceMessages,
409
+ } = get();
388
410
 
389
411
  // Due to the async update method and refresh need about 100ms
390
412
  // we need to update the message content at the frontend to avoid the update flick
@@ -403,17 +425,26 @@ export const chatMessage: StateCreator<
403
425
  });
404
426
  }
405
427
 
406
- await messageService.updateMessage(id, {
407
- content,
408
- tools: extra?.toolCalls ? internal_transformToolCalls(extra?.toolCalls) : undefined,
409
- reasoning: extra?.reasoning,
410
- search: extra?.search,
411
- metadata: extra?.metadata,
412
- model: extra?.model,
413
- provider: extra?.provider,
414
- imageList: extra?.imageList,
415
- });
416
- await refreshMessages();
428
+ const result = await messageService.updateMessage(
429
+ id,
430
+ {
431
+ content,
432
+ tools: extra?.toolCalls ? internal_transformToolCalls(extra?.toolCalls) : undefined,
433
+ reasoning: extra?.reasoning,
434
+ search: extra?.search,
435
+ metadata: extra?.metadata,
436
+ model: extra?.model,
437
+ provider: extra?.provider,
438
+ imageList: extra?.imageList,
439
+ },
440
+ { topicId: get().activeTopicId, sessionId: get().activeId },
441
+ );
442
+
443
+ if (result && result.success && result.messages) {
444
+ replaceMessages(result.messages);
445
+ } else {
446
+ await refreshMessages();
447
+ }
417
448
  },
418
449
 
419
450
  internal_createMessage: async (message, context) => {
@@ -473,6 +504,63 @@ export const chatMessage: StateCreator<
473
504
 
474
505
  return tempId;
475
506
  },
507
+
508
+ internal_createNewMessage: async (message, context) => {
509
+ const {
510
+ internal_createTmpMessage,
511
+ internal_toggleMessageLoading,
512
+ internal_dispatchMessage,
513
+ replaceMessages,
514
+ } = get();
515
+
516
+ let tempId = context?.tempMessageId;
517
+ if (!tempId) {
518
+ tempId = 'tmp_' + nanoid();
519
+
520
+ // Check if should add as group block (explicitly controlled by caller)
521
+ if (context?.groupMessageId) {
522
+ internal_dispatchMessage({
523
+ type: 'addGroupBlock',
524
+ groupMessageId: context.groupMessageId,
525
+ blockId: tempId,
526
+ value: {
527
+ id: tempId,
528
+ content: message.content,
529
+ },
530
+ });
531
+ internal_toggleMessageLoading(true, tempId);
532
+ } else {
533
+ // Regular message creation at top level
534
+ tempId = internal_createTmpMessage(message as any);
535
+ internal_toggleMessageLoading(true, tempId);
536
+ }
537
+ }
538
+
539
+ try {
540
+ // 使用 createNewMessage API
541
+ const result = await messageService.createNewMessage(message);
542
+
543
+ // 直接用返回的 messages 更新 store(已包含 group 结构)
544
+ replaceMessages(result.messages);
545
+
546
+ internal_toggleMessageLoading(false, tempId);
547
+ return result;
548
+ } catch (e) {
549
+ internal_toggleMessageLoading(false, tempId);
550
+ internal_dispatchMessage({
551
+ id: tempId,
552
+ type: 'updateMessage',
553
+ value: {
554
+ error: {
555
+ type: ChatErrorType.CreateMessageError,
556
+ message: (e as Error).message,
557
+ body: e,
558
+ },
559
+ },
560
+ });
561
+ }
562
+ },
563
+
476
564
  internal_deleteMessage: async (id: string) => {
477
565
  get().internal_dispatchMessage({ type: 'deleteMessage', id });
478
566
  await messageService.removeMessage(id);