@lobehub/chat 1.98.2 → 1.99.0

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 (456) hide show
  1. package/.cursor/rules/backend-architecture.mdc +93 -17
  2. package/.cursor/rules/cursor-ux.mdc +45 -35
  3. package/.cursor/rules/project-introduce.mdc +72 -6
  4. package/.cursor/rules/rules-attach.mdc +16 -7
  5. package/.eslintrc.js +10 -0
  6. package/CHANGELOG.md +27 -0
  7. package/apps/desktop/README.md +7 -0
  8. package/apps/desktop/electron-builder.js +5 -0
  9. package/apps/desktop/package.json +2 -1
  10. package/apps/desktop/src/main/const/dir.ts +3 -0
  11. package/apps/desktop/src/main/controllers/UploadFileCtr.ts +13 -8
  12. package/apps/desktop/src/main/core/App.ts +8 -0
  13. package/apps/desktop/src/main/core/StaticFileServerManager.ts +221 -0
  14. package/apps/desktop/src/main/services/fileSrv.ts +231 -44
  15. package/apps/desktop/src/main/utils/next-electron-rsc.ts +36 -5
  16. package/changelog/v1.json +9 -0
  17. package/docs/development/database-schema.dbml +70 -0
  18. package/locales/ar/common.json +2 -0
  19. package/locales/ar/components.json +35 -0
  20. package/locales/ar/error.json +2 -0
  21. package/locales/ar/image.json +100 -0
  22. package/locales/ar/metadata.json +4 -0
  23. package/locales/ar/modelProvider.json +1 -0
  24. package/locales/ar/models.json +15 -0
  25. package/locales/ar/plugin.json +22 -0
  26. package/locales/ar/providers.json +3 -0
  27. package/locales/ar/setting.json +5 -0
  28. package/locales/bg-BG/common.json +2 -0
  29. package/locales/bg-BG/components.json +35 -0
  30. package/locales/bg-BG/error.json +2 -0
  31. package/locales/bg-BG/image.json +100 -0
  32. package/locales/bg-BG/metadata.json +4 -0
  33. package/locales/bg-BG/modelProvider.json +1 -0
  34. package/locales/bg-BG/models.json +15 -0
  35. package/locales/bg-BG/plugin.json +22 -0
  36. package/locales/bg-BG/providers.json +3 -0
  37. package/locales/bg-BG/setting.json +5 -0
  38. package/locales/de-DE/common.json +2 -0
  39. package/locales/de-DE/components.json +35 -0
  40. package/locales/de-DE/error.json +2 -0
  41. package/locales/de-DE/image.json +100 -0
  42. package/locales/de-DE/metadata.json +4 -0
  43. package/locales/de-DE/modelProvider.json +1 -0
  44. package/locales/de-DE/models.json +15 -0
  45. package/locales/de-DE/plugin.json +22 -0
  46. package/locales/de-DE/providers.json +3 -0
  47. package/locales/de-DE/setting.json +5 -0
  48. package/locales/en-US/common.json +2 -0
  49. package/locales/en-US/components.json +35 -0
  50. package/locales/en-US/error.json +2 -0
  51. package/locales/en-US/image.json +100 -0
  52. package/locales/en-US/metadata.json +4 -0
  53. package/locales/en-US/modelProvider.json +1 -0
  54. package/locales/en-US/models.json +15 -0
  55. package/locales/en-US/plugin.json +22 -0
  56. package/locales/en-US/providers.json +3 -0
  57. package/locales/en-US/setting.json +5 -0
  58. package/locales/es-ES/common.json +2 -0
  59. package/locales/es-ES/components.json +35 -0
  60. package/locales/es-ES/error.json +2 -0
  61. package/locales/es-ES/image.json +100 -0
  62. package/locales/es-ES/metadata.json +4 -0
  63. package/locales/es-ES/modelProvider.json +1 -0
  64. package/locales/es-ES/models.json +15 -0
  65. package/locales/es-ES/plugin.json +22 -0
  66. package/locales/es-ES/providers.json +3 -0
  67. package/locales/es-ES/setting.json +5 -0
  68. package/locales/fa-IR/common.json +2 -0
  69. package/locales/fa-IR/components.json +35 -0
  70. package/locales/fa-IR/error.json +2 -0
  71. package/locales/fa-IR/image.json +100 -0
  72. package/locales/fa-IR/metadata.json +4 -0
  73. package/locales/fa-IR/modelProvider.json +1 -0
  74. package/locales/fa-IR/models.json +15 -0
  75. package/locales/fa-IR/plugin.json +22 -0
  76. package/locales/fa-IR/providers.json +3 -0
  77. package/locales/fa-IR/setting.json +5 -0
  78. package/locales/fr-FR/common.json +2 -0
  79. package/locales/fr-FR/components.json +35 -0
  80. package/locales/fr-FR/error.json +2 -0
  81. package/locales/fr-FR/image.json +100 -0
  82. package/locales/fr-FR/metadata.json +4 -0
  83. package/locales/fr-FR/modelProvider.json +1 -0
  84. package/locales/fr-FR/models.json +15 -0
  85. package/locales/fr-FR/plugin.json +22 -0
  86. package/locales/fr-FR/providers.json +3 -0
  87. package/locales/fr-FR/setting.json +5 -0
  88. package/locales/it-IT/common.json +2 -0
  89. package/locales/it-IT/components.json +35 -0
  90. package/locales/it-IT/error.json +2 -0
  91. package/locales/it-IT/image.json +100 -0
  92. package/locales/it-IT/metadata.json +4 -0
  93. package/locales/it-IT/modelProvider.json +1 -0
  94. package/locales/it-IT/models.json +15 -0
  95. package/locales/it-IT/plugin.json +22 -0
  96. package/locales/it-IT/providers.json +3 -0
  97. package/locales/it-IT/setting.json +5 -0
  98. package/locales/ja-JP/common.json +2 -0
  99. package/locales/ja-JP/components.json +35 -0
  100. package/locales/ja-JP/error.json +2 -0
  101. package/locales/ja-JP/image.json +100 -0
  102. package/locales/ja-JP/metadata.json +4 -0
  103. package/locales/ja-JP/modelProvider.json +1 -0
  104. package/locales/ja-JP/models.json +15 -0
  105. package/locales/ja-JP/plugin.json +22 -0
  106. package/locales/ja-JP/providers.json +3 -0
  107. package/locales/ja-JP/setting.json +5 -0
  108. package/locales/ko-KR/common.json +2 -0
  109. package/locales/ko-KR/components.json +35 -0
  110. package/locales/ko-KR/error.json +2 -0
  111. package/locales/ko-KR/image.json +100 -0
  112. package/locales/ko-KR/metadata.json +4 -0
  113. package/locales/ko-KR/modelProvider.json +1 -0
  114. package/locales/ko-KR/models.json +15 -0
  115. package/locales/ko-KR/plugin.json +22 -0
  116. package/locales/ko-KR/providers.json +3 -0
  117. package/locales/ko-KR/setting.json +5 -0
  118. package/locales/nl-NL/common.json +2 -0
  119. package/locales/nl-NL/components.json +35 -0
  120. package/locales/nl-NL/error.json +2 -0
  121. package/locales/nl-NL/image.json +100 -0
  122. package/locales/nl-NL/metadata.json +4 -0
  123. package/locales/nl-NL/modelProvider.json +1 -0
  124. package/locales/nl-NL/models.json +15 -0
  125. package/locales/nl-NL/plugin.json +22 -0
  126. package/locales/nl-NL/providers.json +3 -0
  127. package/locales/nl-NL/setting.json +5 -0
  128. package/locales/pl-PL/common.json +2 -0
  129. package/locales/pl-PL/components.json +35 -0
  130. package/locales/pl-PL/error.json +2 -0
  131. package/locales/pl-PL/image.json +100 -0
  132. package/locales/pl-PL/metadata.json +4 -0
  133. package/locales/pl-PL/modelProvider.json +1 -0
  134. package/locales/pl-PL/models.json +15 -0
  135. package/locales/pl-PL/plugin.json +22 -0
  136. package/locales/pl-PL/providers.json +3 -0
  137. package/locales/pl-PL/setting.json +5 -0
  138. package/locales/pt-BR/common.json +2 -0
  139. package/locales/pt-BR/components.json +35 -0
  140. package/locales/pt-BR/error.json +2 -0
  141. package/locales/pt-BR/image.json +100 -0
  142. package/locales/pt-BR/metadata.json +4 -0
  143. package/locales/pt-BR/modelProvider.json +1 -0
  144. package/locales/pt-BR/models.json +15 -0
  145. package/locales/pt-BR/plugin.json +22 -0
  146. package/locales/pt-BR/providers.json +3 -0
  147. package/locales/pt-BR/setting.json +5 -0
  148. package/locales/ru-RU/common.json +2 -0
  149. package/locales/ru-RU/components.json +35 -0
  150. package/locales/ru-RU/error.json +2 -0
  151. package/locales/ru-RU/image.json +100 -0
  152. package/locales/ru-RU/metadata.json +4 -0
  153. package/locales/ru-RU/modelProvider.json +1 -0
  154. package/locales/ru-RU/models.json +15 -0
  155. package/locales/ru-RU/plugin.json +22 -0
  156. package/locales/ru-RU/providers.json +3 -0
  157. package/locales/ru-RU/setting.json +5 -0
  158. package/locales/tr-TR/common.json +2 -0
  159. package/locales/tr-TR/components.json +35 -0
  160. package/locales/tr-TR/error.json +2 -0
  161. package/locales/tr-TR/image.json +100 -0
  162. package/locales/tr-TR/metadata.json +4 -0
  163. package/locales/tr-TR/modelProvider.json +1 -0
  164. package/locales/tr-TR/models.json +15 -0
  165. package/locales/tr-TR/plugin.json +22 -0
  166. package/locales/tr-TR/providers.json +3 -0
  167. package/locales/tr-TR/setting.json +5 -0
  168. package/locales/vi-VN/common.json +2 -0
  169. package/locales/vi-VN/components.json +35 -0
  170. package/locales/vi-VN/error.json +2 -0
  171. package/locales/vi-VN/image.json +100 -0
  172. package/locales/vi-VN/metadata.json +4 -0
  173. package/locales/vi-VN/modelProvider.json +1 -0
  174. package/locales/vi-VN/models.json +15 -0
  175. package/locales/vi-VN/plugin.json +22 -0
  176. package/locales/vi-VN/providers.json +3 -0
  177. package/locales/vi-VN/setting.json +5 -0
  178. package/locales/zh-CN/common.json +2 -0
  179. package/locales/zh-CN/components.json +35 -0
  180. package/locales/zh-CN/error.json +2 -0
  181. package/locales/zh-CN/image.json +100 -0
  182. package/locales/zh-CN/metadata.json +4 -0
  183. package/locales/zh-CN/modelProvider.json +1 -0
  184. package/locales/zh-CN/models.json +15 -0
  185. package/locales/zh-CN/plugin.json +22 -0
  186. package/locales/zh-CN/providers.json +3 -0
  187. package/locales/zh-CN/setting.json +5 -0
  188. package/locales/zh-TW/common.json +2 -0
  189. package/locales/zh-TW/components.json +35 -0
  190. package/locales/zh-TW/error.json +2 -0
  191. package/locales/zh-TW/image.json +100 -0
  192. package/locales/zh-TW/metadata.json +4 -0
  193. package/locales/zh-TW/modelProvider.json +1 -0
  194. package/locales/zh-TW/models.json +15 -0
  195. package/locales/zh-TW/plugin.json +22 -0
  196. package/locales/zh-TW/providers.json +3 -0
  197. package/locales/zh-TW/setting.json +5 -0
  198. package/package.json +11 -4
  199. package/packages/electron-server-ipc/src/events/file.ts +3 -1
  200. package/packages/electron-server-ipc/src/types/file.ts +15 -0
  201. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +11 -1
  202. package/src/app/[variants]/(main)/image/@menu/components/AspectRatioSelect/index.tsx +73 -0
  203. package/src/app/[variants]/(main)/image/@menu/components/SeedNumberInput/index.tsx +39 -0
  204. package/src/app/[variants]/(main)/image/@menu/components/SizeSelect/index.tsx +89 -0
  205. package/src/app/[variants]/(main)/image/@menu/default.tsx +11 -0
  206. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/AspectRatioSelect.tsx +24 -0
  207. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/DimensionControlGroup.tsx +107 -0
  208. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ImageNum.tsx +290 -0
  209. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ImageUpload.tsx +504 -0
  210. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ImageUrl.tsx +18 -0
  211. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ImageUrlsUpload.tsx +19 -0
  212. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ModelSelect.tsx +155 -0
  213. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/MultiImagesUpload/ImageManageModal.tsx +415 -0
  214. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/MultiImagesUpload/index.tsx +732 -0
  215. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/SeedNumberInput.tsx +24 -0
  216. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/SizeSelect.tsx +17 -0
  217. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/SizeSliderInput.tsx +15 -0
  218. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/StepsSliderInput.tsx +11 -0
  219. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/constants.ts +1 -0
  220. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/index.tsx +93 -0
  221. package/src/app/[variants]/(main)/image/@topic/default.tsx +17 -0
  222. package/src/app/[variants]/(main)/image/@topic/features/Topics/NewTopicButton.tsx +64 -0
  223. package/src/app/[variants]/(main)/image/@topic/features/Topics/SkeletonList.tsx +34 -0
  224. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicItem.tsx +136 -0
  225. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicItemContainer.tsx +91 -0
  226. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +57 -0
  227. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicUrlSync.tsx +37 -0
  228. package/src/app/[variants]/(main)/image/@topic/features/Topics/index.tsx +19 -0
  229. package/src/app/[variants]/(main)/image/NotSupportClient.tsx +153 -0
  230. package/src/app/[variants]/(main)/image/_layout/Desktop/Container.tsx +35 -0
  231. package/src/app/[variants]/(main)/image/_layout/Desktop/RegisterHotkeys.tsx +10 -0
  232. package/src/app/[variants]/(main)/image/_layout/Desktop/index.tsx +30 -0
  233. package/src/app/[variants]/(main)/image/_layout/Mobile/index.tsx +14 -0
  234. package/src/app/[variants]/(main)/image/_layout/type.ts +7 -0
  235. package/src/app/[variants]/(main)/image/features/GenerationFeed/BatchItem.tsx +196 -0
  236. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/ActionButtons.tsx +60 -0
  237. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/ElapsedTime.tsx +90 -0
  238. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/ErrorState.tsx +65 -0
  239. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/LoadingState.tsx +43 -0
  240. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/SuccessState.tsx +49 -0
  241. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/index.tsx +156 -0
  242. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/styles.ts +51 -0
  243. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/types.ts +39 -0
  244. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/utils.ts +11 -0
  245. package/src/app/[variants]/(main)/image/features/GenerationFeed/index.tsx +97 -0
  246. package/src/app/[variants]/(main)/image/features/ImageWorkspace/Content.tsx +48 -0
  247. package/src/app/[variants]/(main)/image/features/ImageWorkspace/EmptyState.tsx +37 -0
  248. package/src/app/[variants]/(main)/image/features/ImageWorkspace/SkeletonList.tsx +50 -0
  249. package/src/app/[variants]/(main)/image/features/ImageWorkspace/index.tsx +23 -0
  250. package/src/app/[variants]/(main)/image/features/PromptInput/Title.tsx +38 -0
  251. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +114 -0
  252. package/src/app/[variants]/(main)/image/layout.tsx +19 -0
  253. package/src/app/[variants]/(main)/image/loading.tsx +3 -0
  254. package/src/app/[variants]/(main)/image/page.tsx +47 -0
  255. package/src/app/[variants]/(main)/settings/system-agent/index.tsx +2 -1
  256. package/src/chains/summaryGenerationTitle.ts +25 -0
  257. package/src/components/ImageItem/index.tsx +9 -6
  258. package/src/{features/Conversation/Error → components/InvalidAPIKey}/APIKeyForm/Bedrock.tsx +3 -4
  259. package/src/{features/Conversation/Error → components/InvalidAPIKey}/APIKeyForm/ProviderApiKeyForm.tsx +5 -4
  260. package/src/components/InvalidAPIKey/APIKeyForm/index.tsx +108 -0
  261. package/src/{features/Conversation/Error → components/InvalidAPIKey}/APIKeyForm/useApiKey.ts +2 -1
  262. package/src/components/InvalidAPIKey/index.tsx +30 -0
  263. package/src/components/KeyValueEditor/index.tsx +203 -0
  264. package/src/components/KeyValueEditor/utils.ts +42 -0
  265. package/src/config/aiModels/fal.ts +52 -0
  266. package/src/config/aiModels/index.ts +3 -0
  267. package/src/config/aiModels/openai.ts +20 -6
  268. package/src/config/llm.ts +6 -0
  269. package/src/config/modelProviders/fal.ts +21 -0
  270. package/src/config/modelProviders/index.ts +3 -0
  271. package/src/config/paramsSchemas/fal/flux-kontext-dev.ts +8 -0
  272. package/src/config/paramsSchemas/fal/flux-pro-kontext.ts +11 -0
  273. package/src/config/paramsSchemas/fal/flux-schnell.ts +9 -0
  274. package/src/config/paramsSchemas/fal/imagen4.ts +10 -0
  275. package/src/config/paramsSchemas/openai/gpt-image-1.ts +10 -0
  276. package/src/const/hotkeys.ts +2 -2
  277. package/src/const/image.ts +6 -0
  278. package/src/const/settings/systemAgent.ts +1 -0
  279. package/src/database/client/migrations.json +27 -0
  280. package/src/database/migrations/0026_add_autovacuum_tuning.sql +2 -0
  281. package/src/database/migrations/0027_ai_image.sql +47 -0
  282. package/src/database/migrations/meta/0027_snapshot.json +6003 -0
  283. package/src/database/migrations/meta/_journal.json +7 -0
  284. package/src/database/models/__tests__/asyncTask.test.ts +7 -5
  285. package/src/database/models/__tests__/file.test.ts +287 -0
  286. package/src/database/models/__tests__/generation.test.ts +786 -0
  287. package/src/database/models/__tests__/generationBatch.test.ts +614 -0
  288. package/src/database/models/__tests__/generationTopic.test.ts +411 -0
  289. package/src/database/models/aiModel.ts +2 -0
  290. package/src/database/models/asyncTask.ts +1 -1
  291. package/src/database/models/file.ts +28 -20
  292. package/src/database/models/generation.ts +197 -0
  293. package/src/database/models/generationBatch.ts +212 -0
  294. package/src/database/models/generationTopic.ts +131 -0
  295. package/src/database/repositories/aiInfra/index.test.ts +151 -1
  296. package/src/database/repositories/aiInfra/index.ts +28 -19
  297. package/src/database/repositories/tableViewer/index.test.ts +1 -1
  298. package/src/database/schemas/file.ts +8 -0
  299. package/src/database/schemas/generation.ts +127 -0
  300. package/src/database/schemas/index.ts +1 -0
  301. package/src/database/schemas/relations.ts +45 -1
  302. package/src/database/type.ts +2 -0
  303. package/src/database/utils/idGenerator.ts +3 -0
  304. package/src/features/Conversation/Error/ChatInvalidApiKey.tsx +39 -0
  305. package/src/features/Conversation/Error/InvalidAccessCode.tsx +2 -2
  306. package/src/features/Conversation/Error/index.tsx +3 -3
  307. package/src/features/ImageSidePanel/index.tsx +83 -0
  308. package/src/features/ImageTopicPanel/index.tsx +79 -0
  309. package/src/features/PluginDevModal/MCPManifestForm/CollapsibleSection.tsx +62 -0
  310. package/src/features/PluginDevModal/MCPManifestForm/QuickImportSection.tsx +158 -0
  311. package/src/features/PluginDevModal/MCPManifestForm/index.tsx +99 -155
  312. package/src/features/PluginStore/McpList/Detail/Settings/index.tsx +5 -2
  313. package/src/hooks/useDownloadImage.ts +31 -0
  314. package/src/hooks/useFetchGenerationTopics.ts +13 -0
  315. package/src/hooks/useHotkeys/imageScope.ts +48 -0
  316. package/src/libs/mcp/client.ts +55 -22
  317. package/src/libs/mcp/types.ts +42 -6
  318. package/src/libs/model-runtime/BaseAI.ts +3 -1
  319. package/src/libs/model-runtime/ModelRuntime.test.ts +80 -0
  320. package/src/libs/model-runtime/ModelRuntime.ts +15 -1
  321. package/src/libs/model-runtime/UniformRuntime/index.ts +4 -1
  322. package/src/libs/model-runtime/fal/index.test.ts +442 -0
  323. package/src/libs/model-runtime/fal/index.ts +88 -0
  324. package/src/libs/model-runtime/openai/index.test.ts +396 -2
  325. package/src/libs/model-runtime/openai/index.ts +129 -3
  326. package/src/libs/model-runtime/runtimeMap.ts +2 -0
  327. package/src/libs/model-runtime/types/image.ts +25 -0
  328. package/src/libs/model-runtime/types/type.ts +1 -0
  329. package/src/libs/model-runtime/utils/openaiCompatibleFactory/index.ts +10 -0
  330. package/src/libs/standard-parameters/index.ts +1 -0
  331. package/src/libs/standard-parameters/meta-schema.test.ts +214 -0
  332. package/src/libs/standard-parameters/meta-schema.ts +147 -0
  333. package/src/libs/swr/index.ts +1 -0
  334. package/src/libs/trpc/async/asyncAuth.ts +29 -8
  335. package/src/libs/trpc/async/context.ts +42 -4
  336. package/src/libs/trpc/async/index.ts +17 -4
  337. package/src/libs/trpc/async/init.ts +8 -0
  338. package/src/libs/trpc/client/lambda.ts +19 -2
  339. package/src/locales/default/common.ts +2 -0
  340. package/src/locales/default/components.ts +35 -0
  341. package/src/locales/default/error.ts +2 -0
  342. package/src/locales/default/image.ts +100 -0
  343. package/src/locales/default/index.ts +2 -0
  344. package/src/locales/default/metadata.ts +4 -0
  345. package/src/locales/default/modelProvider.ts +2 -0
  346. package/src/locales/default/plugin.ts +22 -0
  347. package/src/locales/default/setting.ts +5 -0
  348. package/src/middleware.ts +1 -0
  349. package/src/server/modules/ElectronIPCClient/index.ts +9 -1
  350. package/src/server/modules/S3/index.ts +15 -0
  351. package/src/server/routers/async/caller.ts +9 -1
  352. package/src/server/routers/async/image.ts +253 -0
  353. package/src/server/routers/async/index.ts +2 -0
  354. package/src/server/routers/lambda/aiProvider.test.ts +1 -0
  355. package/src/server/routers/lambda/generation.test.ts +267 -0
  356. package/src/server/routers/lambda/generation.ts +86 -0
  357. package/src/server/routers/lambda/generationBatch.test.ts +376 -0
  358. package/src/server/routers/lambda/generationBatch.ts +56 -0
  359. package/src/server/routers/lambda/generationTopic.test.ts +508 -0
  360. package/src/server/routers/lambda/generationTopic.ts +93 -0
  361. package/src/server/routers/lambda/image.ts +248 -0
  362. package/src/server/routers/lambda/index.ts +8 -0
  363. package/src/server/routers/tools/mcp.ts +15 -0
  364. package/src/server/services/file/__tests__/index.test.ts +135 -0
  365. package/src/server/services/file/impls/local.test.ts +153 -52
  366. package/src/server/services/file/impls/local.ts +70 -46
  367. package/src/server/services/file/impls/s3.test.ts +114 -0
  368. package/src/server/services/file/impls/s3.ts +40 -0
  369. package/src/server/services/file/impls/type.ts +10 -0
  370. package/src/server/services/file/index.ts +14 -0
  371. package/src/server/services/generation/index.ts +239 -0
  372. package/src/server/services/mcp/index.ts +20 -2
  373. package/src/services/__tests__/generation.test.ts +40 -0
  374. package/src/services/__tests__/generationBatch.test.ts +36 -0
  375. package/src/services/__tests__/generationTopic.test.ts +72 -0
  376. package/src/services/electron/file.ts +3 -1
  377. package/src/services/generation.ts +16 -0
  378. package/src/services/generationBatch.ts +25 -0
  379. package/src/services/generationTopic.ts +28 -0
  380. package/src/services/image.ts +33 -0
  381. package/src/services/mcp.ts +12 -7
  382. package/src/services/upload.ts +43 -9
  383. package/src/store/aiInfra/slices/aiProvider/action.ts +25 -5
  384. package/src/store/aiInfra/slices/aiProvider/initialState.ts +1 -0
  385. package/src/store/aiInfra/slices/aiProvider/selectors.ts +3 -0
  386. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +5 -5
  387. package/src/store/chat/slices/message/action.ts +2 -2
  388. package/src/store/chat/slices/translate/action.ts +1 -1
  389. package/src/store/global/initialState.ts +9 -0
  390. package/src/store/global/selectors/systemStatus.ts +8 -0
  391. package/src/store/image/index.ts +2 -0
  392. package/src/store/image/initialState.ts +25 -0
  393. package/src/store/image/selectors.ts +4 -0
  394. package/src/store/image/slices/createImage/action.test.ts +330 -0
  395. package/src/store/image/slices/createImage/action.ts +134 -0
  396. package/src/store/image/slices/createImage/initialState.ts +9 -0
  397. package/src/store/image/slices/createImage/selectors.test.ts +114 -0
  398. package/src/store/image/slices/createImage/selectors.ts +9 -0
  399. package/src/store/image/slices/generationBatch/action.test.ts +495 -0
  400. package/src/store/image/slices/generationBatch/action.ts +303 -0
  401. package/src/store/image/slices/generationBatch/initialState.ts +13 -0
  402. package/src/store/image/slices/generationBatch/reducer.test.ts +568 -0
  403. package/src/store/image/slices/generationBatch/reducer.ts +101 -0
  404. package/src/store/image/slices/generationBatch/selectors.test.ts +307 -0
  405. package/src/store/image/slices/generationBatch/selectors.ts +36 -0
  406. package/src/store/image/slices/generationConfig/action.test.ts +351 -0
  407. package/src/store/image/slices/generationConfig/action.ts +295 -0
  408. package/src/store/image/slices/generationConfig/hooks.test.ts +304 -0
  409. package/src/store/image/slices/generationConfig/hooks.ts +118 -0
  410. package/src/store/image/slices/generationConfig/index.ts +1 -0
  411. package/src/store/image/slices/generationConfig/initialState.ts +37 -0
  412. package/src/store/image/slices/generationConfig/selectors.test.ts +204 -0
  413. package/src/store/image/slices/generationConfig/selectors.ts +25 -0
  414. package/src/store/image/slices/generationTopic/action.test.ts +687 -0
  415. package/src/store/image/slices/generationTopic/action.ts +319 -0
  416. package/src/store/image/slices/generationTopic/index.ts +2 -0
  417. package/src/store/image/slices/generationTopic/initialState.ts +14 -0
  418. package/src/store/image/slices/generationTopic/reducer.test.ts +198 -0
  419. package/src/store/image/slices/generationTopic/reducer.ts +66 -0
  420. package/src/store/image/slices/generationTopic/selectors.test.ts +103 -0
  421. package/src/store/image/slices/generationTopic/selectors.ts +15 -0
  422. package/src/store/image/store.ts +42 -0
  423. package/src/store/image/utils/size.ts +51 -0
  424. package/src/store/tool/slices/customPlugin/action.ts +10 -1
  425. package/src/store/tool/slices/mcpStore/action.ts +6 -4
  426. package/src/store/user/slices/settings/selectors/__snapshots__/settings.test.ts.snap +4 -0
  427. package/src/store/user/slices/settings/selectors/systemAgent.ts +2 -0
  428. package/src/types/aiModel.ts +8 -3
  429. package/src/types/aiProvider.ts +1 -0
  430. package/src/types/asyncTask.ts +2 -0
  431. package/src/types/files/index.ts +5 -0
  432. package/src/types/generation/index.ts +80 -0
  433. package/src/types/hotkey.ts +2 -0
  434. package/src/types/plugins/mcp.ts +2 -6
  435. package/src/types/tool/plugin.ts +8 -0
  436. package/src/types/user/settings/keyVaults.ts +5 -0
  437. package/src/types/user/settings/systemAgent.ts +1 -0
  438. package/src/utils/client/downloadFile.ts +33 -4
  439. package/src/utils/number.test.ts +105 -0
  440. package/src/utils/number.ts +25 -0
  441. package/src/utils/server/__tests__/geo.test.ts +6 -3
  442. package/src/utils/storeDebug.test.ts +152 -0
  443. package/src/utils/storeDebug.ts +16 -7
  444. package/src/utils/time.test.ts +259 -0
  445. package/src/utils/time.ts +18 -0
  446. package/src/utils/units.ts +61 -0
  447. package/src/utils/url.test.ts +358 -9
  448. package/src/utils/url.ts +105 -3
  449. package/{vitest.server.config.ts → vitest.config.server.ts} +3 -0
  450. package/.cursor/rules/i18n/i18n-auto-attached.mdc +0 -6
  451. package/src/features/Conversation/Error/APIKeyForm/index.tsx +0 -105
  452. package/src/features/Conversation/Error/InvalidAPIKey.tsx +0 -16
  453. package/src/features/PluginDevModal/MCPManifestForm/EnvEditor.tsx +0 -227
  454. /package/.cursor/rules/{i18n/i18n.mdc → i18n.mdc} +0 -0
  455. /package/src/app/[variants]/(main)/settings/system-agent/features/{createForm.tsx → SystemAgentForm.tsx} +0 -0
  456. /package/src/{features/Conversation/Error → components/InvalidAPIKey}/APIKeyForm/LoadingContext.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  // copy from https://github.com/kirill-konshin/next-electron-rsc
2
2
  import { serialize as serializeCookie } from 'cookie';
3
- import type { Protocol, Session } from 'electron';
3
+ import { type Protocol, type Session, protocol } from 'electron';
4
4
  import type { NextConfig } from 'next';
5
5
  import type NextNodeServer from 'next/dist/server/next-server';
6
6
  import assert from 'node:assert';
@@ -11,6 +11,7 @@ import { parse } from 'node:url';
11
11
  import resolve from 'resolve';
12
12
  import { parse as parseCookie, splitCookiesString } from 'set-cookie-parser';
13
13
 
14
+ import { LOCAL_STORAGE_URL_PREFIX } from '@/const/dir';
14
15
  import { isDev } from '@/const/env';
15
16
  import { createLogger } from '@/utils/logger';
16
17
 
@@ -178,7 +179,9 @@ export function createHandler({
178
179
  }
179
180
  };
180
181
  }
182
+
181
183
  let registerProtocolHandle = false;
184
+ let interceptorCount = 0; // 追踪活跃的拦截器数量
182
185
 
183
186
  protocol.registerSchemesAsPrivileged([
184
187
  {
@@ -224,6 +227,14 @@ export function createHandler({
224
227
  socket: Socket,
225
228
  ): Promise<Response> => {
226
229
  try {
230
+ // 检查是否是本地文件服务请求,如果是则跳过处理
231
+ const url = new URL(request.url);
232
+ if (url.pathname.startsWith(LOCAL_STORAGE_URL_PREFIX + '/')) {
233
+ if (debug) logger.debug(`Skipping local file service request: ${request.url}`);
234
+ // 直接使用 fetch 转发请求到本地文件服务
235
+ return fetch(request);
236
+ }
237
+
227
238
  // 先尝试使用自定义处理器处理请求
228
239
  for (const customHandler of customHandlers) {
229
240
  try {
@@ -354,19 +365,32 @@ export function createHandler({
354
365
  );
355
366
 
356
367
  const socket = new Socket();
368
+ interceptorCount++; // 增加拦截器计数
357
369
 
358
370
  const closeSocket = () => socket.end();
359
371
 
360
372
  process.on('SIGTERM', () => closeSocket);
361
373
  process.on('SIGINT', () => closeSocket);
362
374
 
363
- if (!isDev && !registerProtocolHandle) {
375
+ if (!registerProtocolHandle) {
364
376
  logger.debug(
365
377
  `Registering HTTP protocol handler in ${isDev ? 'development' : 'production'} mode`,
366
378
  );
367
379
  protocol.handle('http', async (request) => {
368
380
  if (!isDev) {
369
- assert(request.url.startsWith(localhostUrl), 'External HTTP not supported, use HTTPS');
381
+ // 检查是否是本地文件服务请求,如果是则允许通过
382
+ const isLocalhost = request.url.startsWith(localhostUrl);
383
+
384
+ const url = new URL(request.url);
385
+ const isLocalIP =
386
+ request.url.startsWith('http://127.0.0.1:') ||
387
+ request.url.startsWith('http://localhost:');
388
+ const isLocalFileService = url.pathname.startsWith(LOCAL_STORAGE_URL_PREFIX + '/');
389
+
390
+ const valid = isLocalhost || (isLocalIP && isLocalFileService);
391
+ if (!valid) {
392
+ throw new Error('External HTTP not supported, use HTTPS');
393
+ }
370
394
  }
371
395
 
372
396
  return handleRequest(request, session, socket);
@@ -374,12 +398,19 @@ export function createHandler({
374
398
  registerProtocolHandle = true;
375
399
  }
376
400
 
401
+ logger.debug(`Active interceptors count: ${interceptorCount}`);
402
+
377
403
  return function stopIntercept() {
378
- if (registerProtocolHandle) {
379
- logger.debug('Unregistering HTTP protocol handler');
404
+ interceptorCount--; // 减少拦截器计数
405
+ logger.debug(`Stopping interceptor, remaining count: ${interceptorCount}`);
406
+
407
+ // 只有当没有活跃的拦截器时才取消注册协议处理器
408
+ if (registerProtocolHandle && interceptorCount === 0) {
409
+ logger.debug('Unregistering HTTP protocol handler (no active interceptors)');
380
410
  protocol.unhandle('http');
381
411
  registerProtocolHandle = false;
382
412
  }
413
+
383
414
  process.off('SIGTERM', () => closeSocket);
384
415
  process.off('SIGINT', () => closeSocket);
385
416
  closeSocket();
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "features": [
5
+ "support AI Image."
6
+ ]
7
+ },
8
+ "date": "2025-07-14",
9
+ "version": "1.99.0"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "improvements": [
@@ -163,6 +163,7 @@ table files {
163
163
  name text [not null]
164
164
  size integer [not null]
165
165
  url text [not null]
166
+ source text
166
167
  client_id text
167
168
  metadata jsonb
168
169
  chunk_task_id uuid
@@ -218,6 +219,45 @@ table knowledge_bases {
218
219
  }
219
220
  }
220
221
 
222
+ table generation_batches {
223
+ id text [pk, not null]
224
+ user_id text [not null]
225
+ generation_topic_id text [not null]
226
+ provider text [not null]
227
+ model text [not null]
228
+ prompt text [not null]
229
+ width integer
230
+ height integer
231
+ ratio varchar(64)
232
+ config jsonb
233
+ accessed_at "timestamp with time zone" [not null, default: `now()`]
234
+ created_at "timestamp with time zone" [not null, default: `now()`]
235
+ updated_at "timestamp with time zone" [not null, default: `now()`]
236
+ }
237
+
238
+ table generation_topics {
239
+ id text [pk, not null]
240
+ user_id text [not null]
241
+ title text
242
+ cover_url text
243
+ accessed_at "timestamp with time zone" [not null, default: `now()`]
244
+ created_at "timestamp with time zone" [not null, default: `now()`]
245
+ updated_at "timestamp with time zone" [not null, default: `now()`]
246
+ }
247
+
248
+ table generations {
249
+ id text [pk, not null]
250
+ user_id text [not null]
251
+ generation_batch_id varchar(64) [not null]
252
+ async_task_id uuid
253
+ file_id text
254
+ seed integer
255
+ asset jsonb
256
+ accessed_at "timestamp with time zone" [not null, default: `now()`]
257
+ created_at "timestamp with time zone" [not null, default: `now()`]
258
+ updated_at "timestamp with time zone" [not null, default: `now()`]
259
+ }
260
+
221
261
  table message_chunks {
222
262
  message_id text
223
263
  chunk_id uuid
@@ -834,6 +874,10 @@ table users {
834
874
  updated_at "timestamp with time zone" [not null, default: `now()`]
835
875
  }
836
876
 
877
+ ref: agents_files.file_id > files.id
878
+
879
+ ref: agents_files.agent_id > agents.id
880
+
837
881
  ref: agents_knowledge_bases.knowledge_base_id - knowledge_bases.id
838
882
 
839
883
  ref: agents_knowledge_bases.agent_id > agents.id
@@ -848,8 +892,34 @@ ref: document_chunks.document_id > documents.id
848
892
 
849
893
  ref: documents.file_id > files.id
850
894
 
895
+ ref: file_chunks.file_id - files.id
896
+
897
+ ref: file_chunks.chunk_id - chunks.id
898
+
899
+ ref: generations.file_id - files.id
900
+
851
901
  ref: files.embedding_task_id - async_tasks.id
852
902
 
903
+ ref: files_to_sessions.file_id > files.id
904
+
905
+ ref: files_to_sessions.session_id > sessions.id
906
+
907
+ ref: generation_batches.user_id - users.id
908
+
909
+ ref: generation_batches.generation_topic_id > generation_topics.id
910
+
911
+ ref: generation_topics.user_id - users.id
912
+
913
+ ref: generations.user_id - users.id
914
+
915
+ ref: generations.generation_batch_id > generation_batches.id
916
+
917
+ ref: generations.async_task_id - async_tasks.id
918
+
919
+ ref: messages_files.file_id > files.id
920
+
921
+ ref: messages_files.message_id > messages.id
922
+
853
923
  ref: messages.session_id - sessions.id
854
924
 
855
925
  ref: messages.parent_id - messages.id
@@ -183,6 +183,7 @@
183
183
  },
184
184
  "fullscreen": "وضع كامل الشاشة",
185
185
  "historyRange": "نطاق التاريخ",
186
+ "import": "استيراد",
186
187
  "importData": "استيراد البيانات",
187
188
  "importModal": {
188
189
  "error": {
@@ -324,6 +325,7 @@
324
325
  }
325
326
  },
326
327
  "tab": {
328
+ "aiImage": "الرسم بالذكاء الاصطناعي",
327
329
  "chat": "الدردشة",
328
330
  "discover": "اكتشاف",
329
331
  "files": "ملفات",
@@ -68,6 +68,22 @@
68
68
  "GoBack": {
69
69
  "back": "عودة"
70
70
  },
71
+ "ImageUpload": {
72
+ "actions": {
73
+ "changeImage": "انقر لتغيير الصورة"
74
+ },
75
+ "placeholder": {
76
+ "primary": "إضافة صورة",
77
+ "secondary": "انقر للتحميل"
78
+ }
79
+ },
80
+ "KeyValueEditor": {
81
+ "addButton": "إضافة صف جديد",
82
+ "deleteTooltip": "حذف",
83
+ "duplicateKeyError": "يجب أن يكون اسم المفتاح فريدًا",
84
+ "keyPlaceholder": "المفتاح",
85
+ "valuePlaceholder": "القيمة"
86
+ },
71
87
  "MaxTokenSlider": {
72
88
  "unlimited": "غير محدود"
73
89
  },
@@ -91,6 +107,25 @@
91
107
  "provider": "مزود",
92
108
  "title": "نموذج"
93
109
  },
110
+ "MultiImagesUpload": {
111
+ "actions": {
112
+ "uploadMore": "انقر لتحميل المزيد"
113
+ },
114
+ "modal": {
115
+ "complete": "اكتمل",
116
+ "newFileIndicator": "جديد",
117
+ "selectImageToPreview": "يرجى اختيار صورة للمعاينة",
118
+ "title": "إدارة الصور ({{count}})",
119
+ "upload": "تحميل الصور"
120
+ },
121
+ "placeholder": {
122
+ "primary": "انقر لتحميل الصور",
123
+ "secondary": "يدعم اختيار عدة صور"
124
+ },
125
+ "progress": {
126
+ "uploadingWithCount": "تم تحميل {{completed}} من أصل {{total}}"
127
+ }
128
+ },
94
129
  "OllamaSetupGuide": {
95
130
  "action": {
96
131
  "close": "إغلاق الإشعار",
@@ -123,6 +123,7 @@
123
123
  "stt": {
124
124
  "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
125
125
  },
126
+ "testConnectionFailed": "فشل اختبار الاتصال: {{error}}",
126
127
  "tts": {
127
128
  "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
128
129
  },
@@ -130,6 +131,7 @@
130
131
  "addProxyUrl": "إضافة عنوان وكيل OpenAI (اختياري)",
131
132
  "apiKey": {
132
133
  "description": "يمكنك بدء الجلسة عن طريق إدخال مفتاح API {{name}} الخاص بك",
134
+ "imageGenerationDescription": "أدخل مفتاح API الخاص بـ {{name}} للبدء في التوليد",
133
135
  "title": "استخدام مفتاح API {{name}} المخصص"
134
136
  },
135
137
  "closeMessage": "إغلاق الرسالة",
@@ -0,0 +1,100 @@
1
+ {
2
+ "config": {
3
+ "aspectRatio": {
4
+ "label": "النسبة",
5
+ "lock": "قفل نسبة العرض إلى الارتفاع",
6
+ "unlock": "إلغاء قفل نسبة العرض إلى الارتفاع"
7
+ },
8
+ "header": {
9
+ "desc": "وصف بسيط، ابتكر فورًا",
10
+ "title": "الرسم"
11
+ },
12
+ "height": {
13
+ "label": "الارتفاع"
14
+ },
15
+ "imageNum": {
16
+ "label": "عدد الصور"
17
+ },
18
+ "imageUrl": {
19
+ "label": "صورة مرجعية"
20
+ },
21
+ "imageUrls": {
22
+ "label": "صور مرجعية"
23
+ },
24
+ "model": {
25
+ "label": "النموذج"
26
+ },
27
+ "prompt": {
28
+ "placeholder": "وصف المحتوى الذي ترغب في إنشائه"
29
+ },
30
+ "seed": {
31
+ "label": "البذرة",
32
+ "random": "بذرة عشوائية"
33
+ },
34
+ "size": {
35
+ "label": "الحجم"
36
+ },
37
+ "steps": {
38
+ "label": "عدد الخطوات"
39
+ },
40
+ "title": "الرسم بالذكاء الاصطناعي",
41
+ "width": {
42
+ "label": "العرض"
43
+ }
44
+ },
45
+ "generation": {
46
+ "actions": {
47
+ "applySeed": "تطبيق البذرة",
48
+ "copyError": "نسخ رسالة الخطأ",
49
+ "copyPrompt": "نسخ العبارة التحفيزية",
50
+ "copySeed": "نسخ البذرة",
51
+ "delete": "حذف",
52
+ "deleteBatch": "حذف الدفعة",
53
+ "download": "تنزيل",
54
+ "downloadFailed": "فشل تنزيل الصورة",
55
+ "errorCopied": "تم نسخ رسالة الخطأ إلى الحافظة",
56
+ "errorCopyFailed": "فشل نسخ رسالة الخطأ",
57
+ "generate": "إنشاء",
58
+ "promptCopied": "تم نسخ النص التوجيهي إلى الحافظة",
59
+ "promptCopyFailed": "فشل نسخ النص التوجيهي",
60
+ "reuseSettings": "إعادة استخدام الإعدادات",
61
+ "seedApplied": "تم تطبيق البذرة على الإعدادات",
62
+ "seedApplyFailed": "فشل في تطبيق البذرة",
63
+ "seedCopied": "تم نسخ البذرة إلى الحافظة",
64
+ "seedCopyFailed": "فشل نسخ البذرة"
65
+ },
66
+ "metadata": {
67
+ "count": "{{count}} صورة"
68
+ },
69
+ "status": {
70
+ "failed": "فشل في الإنشاء",
71
+ "generating": "جارٍ الإنشاء..."
72
+ }
73
+ },
74
+ "notSupportGuide": {
75
+ "desc": "الوحدة الحالية تعمل بنمط قاعدة بيانات العميل، ولا تدعم ميزة إنشاء الصور بالذكاء الاصطناعي. يرجى التبديل إلى <1>نمط نشر قاعدة بيانات الخادم</1>، أو استخدام <3>سحابة LobeChat</3> مباشرةً",
76
+ "features": {
77
+ "fileIntegration": {
78
+ "desc": "تكامل عميق مع نظام إدارة الملفات، حيث تُحفظ الصور المُنشأة تلقائيًا في نظام الملفات، مع دعم الإدارة والتنظيم الموحد",
79
+ "title": "تكامل نظام الملفات"
80
+ },
81
+ "llmAssisted": {
82
+ "desc": "يجمع بين قدرات نماذج اللغة الكبيرة لتحسين وتوسيع النصوص التوجيهية بذكاء، مما يعزز جودة إنشاء الصور (قريبًا)",
83
+ "title": "مساعدة نموذج اللغة الكبير"
84
+ },
85
+ "multiProviders": {
86
+ "desc": "يدعم عدة مزودي خدمات رسم بالذكاء الاصطناعي، بما في ذلك OpenAI gpt-image-1، Google Imagen، FAL.ai وغيرها، لتوفير خيارات نماذج متنوعة",
87
+ "title": "دعم مزودين متعددين"
88
+ }
89
+ },
90
+ "title": "نمط النشر الحالي لا يدعم الرسم بالذكاء الاصطناعي"
91
+ },
92
+ "topic": {
93
+ "createNew": "إنشاء موضوع جديد",
94
+ "deleteConfirm": "تأكيد حذف الموضوع",
95
+ "deleteConfirmDesc": "سيتم حذف هذا الموضوع نهائيًا ولن يمكن استعادته، يرجى توخي الحذر.",
96
+ "empty": "لا توجد مواضيع تم إنشاؤها",
97
+ "title": "موضوع الرسم",
98
+ "untitled": "الموضوع الافتراضي"
99
+ }
100
+ }
@@ -32,6 +32,10 @@
32
32
  "search": "بحث",
33
33
  "title": "اكتشاف"
34
34
  },
35
+ "image": {
36
+ "description": "{{appName}} يقدم لك أفضل تجربة استخدام لـ GPT Image و Flux و Midjourney و Stable Diffusion",
37
+ "title": "الرسم بالذكاء الاصطناعي"
38
+ },
35
39
  "plugins": {
36
40
  "description": "البحث، توليد الرسوم البيانية، الأكاديميات، توليد الصور، توليد الفيديو، توليد الصوت، سير العمل الآلي، خصص قدرات ToolCall الخاصة بـ ChatGPT / Claude",
37
41
  "title": "سوق الإضافات"
@@ -66,6 +66,7 @@
66
66
  "customRegion": "منطقة خدمة مخصصة",
67
67
  "customSessionToken": "رمز الجلسة المخصص",
68
68
  "description": "أدخل معرف الوصول / مفتاح الوصول السري الخاص بك في AWS لبدء الجلسة. لن يتم تسجيل تكوين المصادقة الخاص بك من قبل التطبيق",
69
+ "imageGenerationDescription": "أدخل AWS AccessKeyId / SecretAccessKey الخاص بك للبدء في التوليد. التطبيق لن يقوم بتسجيل إعدادات المصادقة الخاصة بك",
69
70
  "title": "استخدام معلومات المصادقة الخاصة بـ Bedrock المخصصة"
70
71
  }
71
72
  },
@@ -1019,6 +1019,15 @@
1019
1019
  "ernie-x1-turbo-32k": {
1020
1020
  "description": "يتميز هذا النموذج بأداء أفضل مقارنةً بـ ERNIE-X1-32K."
1021
1021
  },
1022
+ "flux-kontext/dev": {
1023
+ "description": "نموذج تحرير الصور Frontier."
1024
+ },
1025
+ "flux-pro/kontext": {
1026
+ "description": "FLUX.1 Kontext [pro] قادر على معالجة النصوص والصور المرجعية كمدخلات، مما يتيح تحريرًا محليًا مستهدفًا وتحولات معقدة للمشهد الكلي بسلاسة."
1027
+ },
1028
+ "flux/schnell": {
1029
+ "description": "FLUX.1 [schnell] هو نموذج محول متدفق يحتوي على 12 مليار معلمة، قادر على توليد صور عالية الجودة من النص في 1 إلى 4 خطوات، مناسب للاستخدام الشخصي والتجاري."
1030
+ },
1022
1031
  "gemini-1.0-pro-001": {
1023
1032
  "description": "Gemini 1.0 Pro 001 (تعديل) يوفر أداءً مستقرًا وقابلًا للتعديل، وهو الخيار المثالي لحلول المهام المعقدة."
1024
1033
  },
@@ -1364,6 +1373,9 @@
1364
1373
  "gpt-4o-transcribe": {
1365
1374
  "description": "GPT-4o Transcribe هو نموذج تحويل الصوت إلى نص يستخدم GPT-4o لتفريغ الصوت. مقارنةً بنموذج Whisper الأصلي، يحسن معدل الخطأ في الكلمات ويعزز التعرف على اللغة والدقة. استخدمه للحصول على تفريغ أكثر دقة."
1366
1375
  },
1376
+ "gpt-image-1": {
1377
+ "description": "نموذج توليد الصور متعدد الوسائط الأصلي من ChatGPT"
1378
+ },
1367
1379
  "grok-2-1212": {
1368
1380
  "description": "لقد تم تحسين هذا النموذج في الدقة، والامتثال للتعليمات، والقدرة على التعامل مع لغات متعددة."
1369
1381
  },
@@ -1484,6 +1496,9 @@
1484
1496
  "hunyuan-vision": {
1485
1497
  "description": "نموذج Hunyuan الأحدث متعدد الوسائط، يدعم إدخال الصور والنصوص لتوليد محتوى نصي."
1486
1498
  },
1499
+ "imagen4/preview": {
1500
+ "description": "نموذج توليد الصور الأعلى جودة من Google"
1501
+ },
1487
1502
  "internlm/internlm2_5-7b-chat": {
1488
1503
  "description": "InternLM2.5 يوفر حلول حوار ذكية في عدة سيناريوهات."
1489
1504
  },
@@ -57,12 +57,28 @@
57
57
  }
58
58
  },
59
59
  "mcp": {
60
+ "advanced": {
61
+ "title": "الإعدادات المتقدمة"
62
+ },
60
63
  "args": {
61
64
  "desc": "قائمة المعلمات المرسلة إلى الأمر المنفذ، عادةً ما يتم إدخال اسم خادم MCP هنا، أو مسار البرنامج النصي للتشغيل",
62
65
  "label": "معلمات الأمر",
63
66
  "placeholder": "على سبيل المثال: --port 8080 --debug",
64
67
  "required": "يرجى إدخال معلمات التشغيل"
65
68
  },
69
+ "auth": {
70
+ "bear": "مفتاح API",
71
+ "desc": "اختر طريقة التوثيق لخادم MCP",
72
+ "label": "نوع التوثيق",
73
+ "none": "لا حاجة للتوثيق",
74
+ "placeholder": "يرجى اختيار نوع التوثيق",
75
+ "token": {
76
+ "desc": "أدخل مفتاح API أو رمز الحامل الخاص بك",
77
+ "label": "مفتاح API",
78
+ "placeholder": "sk-xxxxx",
79
+ "required": "يرجى إدخال رمز التوثيق"
80
+ }
81
+ },
66
82
  "avatar": {
67
83
  "label": "أيقونة الإضافة"
68
84
  },
@@ -90,6 +106,11 @@
90
106
  "label": "متغيرات البيئة لخادم MCP",
91
107
  "stringifyError": "تعذر تسلسل المعلمات، يرجى التحقق من تنسيق المعلمات"
92
108
  },
109
+ "headers": {
110
+ "add": "أضف صفًا جديدًا",
111
+ "desc": "أدخل رؤوس الطلب",
112
+ "label": "رؤوس HTTP"
113
+ },
93
114
  "identifier": {
94
115
  "desc": "حدد اسمًا لملحق MCP الخاص بك، يجب أن يكون باستخدام أحرف إنجليزية",
95
116
  "invalid": "يمكنك إدخال أحرف إنجليزية، أرقام، والرمزين - و _ فقط",
@@ -269,6 +290,7 @@
269
290
  "showDetails": "عرض التفاصيل"
270
291
  },
271
292
  "errorTypes": {
293
+ "AUTHORIZATION_ERROR": "خطأ في التحقق من التفويض",
272
294
  "CONNECTION_FAILED": "فشل الاتصال",
273
295
  "INITIALIZATION_TIMEOUT": "انتهت مهلة التهيئة",
274
296
  "PROCESS_SPAWN_ERROR": "فشل بدء العملية",
@@ -29,6 +29,9 @@
29
29
  "deepseek": {
30
30
  "description": "DeepSeek هي شركة تركز على أبحاث وتطبيقات تقنيات الذكاء الاصطناعي، حيث يجمع نموذجها الأحدث DeepSeek-V2.5 بين قدرات الحوار العامة ومعالجة الشيفرات، وقد حقق تحسينات ملحوظة في محاذاة تفضيلات البشر، ومهام الكتابة، واتباع التعليمات."
31
31
  },
32
+ "fal": {
33
+ "description": "منصة وسائط توليدية موجهة للمطورين"
34
+ },
32
35
  "fireworksai": {
33
36
  "description": "Fireworks AI هي شركة رائدة في تقديم خدمات نماذج اللغة المتقدمة، تركز على استدعاء الوظائف والمعالجة متعددة الوسائط. نموذجها الأحدث Firefunction V2 مبني على Llama-3، مُحسّن لاستدعاء الوظائف، والحوار، واتباع التعليمات. يدعم نموذج اللغة البصرية FireLLaVA-13B إدخال الصور والنصوص المختلطة. تشمل النماذج البارزة الأخرى سلسلة Llama وسلسلة Mixtral، مما يوفر دعمًا فعالًا لاتباع التعليمات وتوليدها بلغات متعددة."
34
37
  },
@@ -484,6 +484,11 @@
484
484
  "placeholder": "أدخل كلمة الموجه المخصصة",
485
485
  "title": "كلمة الموجه المخصصة"
486
486
  },
487
+ "generationTopic": {
488
+ "label": "نموذج تسمية موضوع الرسم بالذكاء الاصطناعي",
489
+ "modelDesc": "نموذج مخصص لتسمية موضوعات الرسم بالذكاء الاصطناعي تلقائيًا",
490
+ "title": "تسمية موضوعات الرسم بالذكاء الاصطناعي تلقائيًا"
491
+ },
487
492
  "helpInfo": "عند إنشاء مساعد جديد، سيتم استخدام إعدادات المساعد الافتراضية كقيم افتراضية.",
488
493
  "historyCompress": {
489
494
  "label": "نموذج تاريخ المحادثة",
@@ -183,6 +183,7 @@
183
183
  },
184
184
  "fullscreen": "Цял екран",
185
185
  "historyRange": "Диапазон на историята",
186
+ "import": "Импортиране",
186
187
  "importData": "Импорт на данни",
187
188
  "importModal": {
188
189
  "error": {
@@ -324,6 +325,7 @@
324
325
  }
325
326
  },
326
327
  "tab": {
328
+ "aiImage": "AI рисуване",
327
329
  "chat": "Чат",
328
330
  "discover": "Открий",
329
331
  "files": "Файлове",
@@ -68,6 +68,22 @@
68
68
  "GoBack": {
69
69
  "back": "Назад"
70
70
  },
71
+ "ImageUpload": {
72
+ "actions": {
73
+ "changeImage": "Кликнете, за да смените изображението"
74
+ },
75
+ "placeholder": {
76
+ "primary": "Добавяне на изображение",
77
+ "secondary": "Кликнете, за да качите"
78
+ }
79
+ },
80
+ "KeyValueEditor": {
81
+ "addButton": "Добавяне на ред",
82
+ "deleteTooltip": "Изтриване",
83
+ "duplicateKeyError": "Името на ключа трябва да е уникално",
84
+ "keyPlaceholder": "Ключ",
85
+ "valuePlaceholder": "Стойност"
86
+ },
71
87
  "MaxTokenSlider": {
72
88
  "unlimited": "Неограничено"
73
89
  },
@@ -91,6 +107,25 @@
91
107
  "provider": "Доставчик",
92
108
  "title": "Модел"
93
109
  },
110
+ "MultiImagesUpload": {
111
+ "actions": {
112
+ "uploadMore": "Кликнете, за да качите още"
113
+ },
114
+ "modal": {
115
+ "complete": "Готово",
116
+ "newFileIndicator": "Нов",
117
+ "selectImageToPreview": "Моля, изберете изображение за преглед",
118
+ "title": "Управление на изображенията ({{count}})",
119
+ "upload": "Качване на изображение"
120
+ },
121
+ "placeholder": {
122
+ "primary": "Кликнете, за да качите изображение",
123
+ "secondary": "Поддържа избор на няколко изображения"
124
+ },
125
+ "progress": {
126
+ "uploadingWithCount": "{{completed}}/{{total}} качени"
127
+ }
128
+ },
94
129
  "OllamaSetupGuide": {
95
130
  "action": {
96
131
  "close": "Затвори提示",
@@ -123,6 +123,7 @@
123
123
  "stt": {
124
124
  "responseError": "Заявката за услуга е неуспешна, моля, проверете конфигурацията или опитайте отново"
125
125
  },
126
+ "testConnectionFailed": "Неуспешно свързване: {{error}}",
126
127
  "tts": {
127
128
  "responseError": "Заявката за услуга е неуспешна, моля, проверете конфигурацията или опитайте отново"
128
129
  },
@@ -130,6 +131,7 @@
130
131
  "addProxyUrl": "Добавете URL адрес на OpenAI прокси (по избор)",
131
132
  "apiKey": {
132
133
  "description": "Въведете вашия {{name}} API ключ, за да започнете сесия",
134
+ "imageGenerationDescription": "Въведете своя {{name}} API ключ, за да започнете генерирането",
133
135
  "title": "Използване на персонализиран {{name}} API ключ"
134
136
  },
135
137
  "closeMessage": "Затвори съобщението",