@lobehub/chat 0.146.2 → 0.147.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 (358) hide show
  1. package/.env.example +3 -5
  2. package/.github/workflows/issue-close-require.yml +1 -1
  3. package/.github/workflows/release.yml +1 -1
  4. package/.github/workflows/test.yml +3 -1
  5. package/.i18nrc.js +13 -8
  6. package/.seorc.cjs +9 -0
  7. package/CHANGELOG.md +73 -0
  8. package/README.md +25 -25
  9. package/README.zh-CN.md +25 -25
  10. package/contributing/Home.md +1 -1
  11. package/docs/self-hosting/advanced/analytics.mdx +12 -0
  12. package/docs/self-hosting/advanced/analytics.zh-CN.mdx +10 -0
  13. package/docs/self-hosting/advanced/authentication.mdx +19 -0
  14. package/docs/self-hosting/advanced/authentication.zh-CN.mdx +15 -0
  15. package/docs/self-hosting/advanced/sso-providers/auth0.mdx +19 -2
  16. package/docs/self-hosting/advanced/sso-providers/auth0.zh-CN.mdx +15 -2
  17. package/docs/self-hosting/advanced/sso-providers/authentik.mdx +18 -3
  18. package/docs/self-hosting/advanced/sso-providers/authentik.zh-CN.mdx +14 -2
  19. package/docs/self-hosting/advanced/sso-providers/github.mdx +13 -0
  20. package/docs/self-hosting/advanced/sso-providers/github.zh-CN.mdx +13 -3
  21. package/docs/self-hosting/advanced/sso-providers/microsoft-entra-id.mdx +18 -2
  22. package/docs/self-hosting/advanced/sso-providers/microsoft-entra-id.zh-CN.mdx +15 -2
  23. package/docs/self-hosting/advanced/sso-providers/zitadel.mdx +17 -2
  24. package/docs/self-hosting/advanced/sso-providers/zitadel.zh-CN.mdx +14 -2
  25. package/docs/self-hosting/advanced/upstream-sync.mdx +13 -0
  26. package/docs/self-hosting/advanced/upstream-sync.zh-CN.mdx +10 -0
  27. package/docs/self-hosting/environment-variables/analytics.mdx +15 -0
  28. package/docs/self-hosting/environment-variables/analytics.zh-CN.mdx +13 -0
  29. package/docs/self-hosting/environment-variables/auth.mdx +14 -0
  30. package/docs/self-hosting/environment-variables/auth.zh-CN.mdx +15 -1
  31. package/docs/self-hosting/environment-variables/basic.mdx +15 -0
  32. package/docs/self-hosting/environment-variables/basic.zh-CN.mdx +11 -0
  33. package/docs/self-hosting/environment-variables/model-provider.mdx +26 -0
  34. package/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx +10 -0
  35. package/docs/self-hosting/environment-variables.mdx +13 -2
  36. package/docs/self-hosting/environment-variables.zh-CN.mdx +9 -0
  37. package/docs/self-hosting/examples/azure-openai.mdx +12 -0
  38. package/docs/self-hosting/examples/azure-openai.zh-CN.mdx +12 -0
  39. package/docs/self-hosting/examples/ollama.mdx +13 -0
  40. package/docs/self-hosting/examples/ollama.zh-CN.mdx +11 -0
  41. package/docs/self-hosting/faq/no-v1-suffix.mdx +12 -0
  42. package/docs/self-hosting/faq/no-v1-suffix.zh-CN.mdx +9 -0
  43. package/docs/self-hosting/faq/proxy-with-unable-to-verify-leaf-signature.mdx +14 -0
  44. package/docs/self-hosting/faq/proxy-with-unable-to-verify-leaf-signature.zh-CN.mdx +11 -0
  45. package/docs/self-hosting/platform/docker-compose.mdx +21 -5
  46. package/docs/self-hosting/platform/docker-compose.zh-CN.mdx +18 -5
  47. package/docs/self-hosting/platform/docker.mdx +26 -8
  48. package/docs/self-hosting/platform/docker.zh-CN.mdx +27 -9
  49. package/docs/self-hosting/platform/netlify.mdx +18 -2
  50. package/docs/self-hosting/platform/netlify.zh-CN.mdx +14 -1
  51. package/docs/self-hosting/platform/railway.mdx +12 -0
  52. package/docs/self-hosting/platform/railway.zh-CN.mdx +11 -0
  53. package/docs/self-hosting/platform/repocloud.mdx +12 -0
  54. package/docs/self-hosting/platform/repocloud.zh-CN.mdx +10 -0
  55. package/docs/self-hosting/platform/sealos.mdx +11 -0
  56. package/docs/self-hosting/platform/sealos.zh-CN.mdx +10 -0
  57. package/docs/self-hosting/platform/vercel.mdx +12 -0
  58. package/docs/self-hosting/platform/vercel.zh-CN.mdx +11 -0
  59. package/docs/self-hosting/platform/zeabur.mdx +11 -0
  60. package/docs/self-hosting/platform/zeabur.zh-CN.mdx +10 -0
  61. package/docs/self-hosting/start.mdx +12 -0
  62. package/docs/self-hosting/start.zh-CN.mdx +13 -0
  63. package/docs/usage/agents/concepts.mdx +13 -0
  64. package/docs/usage/agents/concepts.zh-CN.mdx +10 -0
  65. package/docs/usage/agents/custom-agent.mdx +16 -2
  66. package/docs/usage/agents/custom-agent.zh-CN.mdx +14 -2
  67. package/docs/usage/agents/model.mdx +11 -2
  68. package/docs/usage/agents/model.zh-CN.mdx +12 -0
  69. package/docs/usage/agents/prompt.mdx +15 -0
  70. package/docs/usage/agents/prompt.zh-CN.mdx +10 -0
  71. package/docs/usage/agents/topics.mdx +13 -0
  72. package/docs/usage/agents/topics.zh-CN.mdx +11 -0
  73. package/docs/usage/features/agent-market.mdx +11 -1
  74. package/docs/usage/features/agent-market.zh-CN.mdx +13 -0
  75. package/docs/usage/features/local-llm.mdx +12 -2
  76. package/docs/usage/features/local-llm.zh-CN.mdx +3 -3
  77. package/docs/usage/features/mobile.mdx +10 -1
  78. package/docs/usage/features/mobile.zh-CN.mdx +11 -0
  79. package/docs/usage/features/more.mdx +13 -0
  80. package/docs/usage/features/more.zh-CN.mdx +10 -0
  81. package/docs/usage/features/multi-ai-providers.mdx +14 -1
  82. package/docs/usage/features/multi-ai-providers.zh-CN.mdx +16 -0
  83. package/docs/usage/features/plugin-system.mdx +12 -1
  84. package/docs/usage/features/plugin-system.zh-CN.mdx +9 -0
  85. package/docs/usage/features/pwa.mdx +11 -1
  86. package/docs/usage/features/pwa.zh-CN.mdx +13 -0
  87. package/docs/usage/features/text-to-image.mdx +11 -1
  88. package/docs/usage/features/text-to-image.zh-CN.mdx +13 -0
  89. package/docs/usage/features/theme.mdx +12 -1
  90. package/docs/usage/features/theme.zh-CN.mdx +11 -0
  91. package/docs/usage/features/tts.mdx +14 -1
  92. package/docs/usage/features/tts.zh-CN.mdx +12 -0
  93. package/docs/usage/features/vision.mdx +11 -1
  94. package/docs/usage/features/vision.zh-CN.mdx +10 -0
  95. package/docs/usage/plugins/basic-usage.mdx +12 -0
  96. package/docs/usage/plugins/basic-usage.zh-CN.mdx +10 -0
  97. package/docs/usage/plugins/custom-plugin.mdx +12 -0
  98. package/docs/usage/plugins/custom-plugin.zh-CN.mdx +10 -0
  99. package/docs/usage/plugins/development.mdx +18 -0
  100. package/docs/usage/plugins/development.zh-CN.mdx +12 -0
  101. package/docs/usage/plugins/store.mdx +12 -0
  102. package/docs/usage/plugins/store.zh-CN.mdx +9 -0
  103. package/docs/usage/providers/groq.mdx +14 -2
  104. package/docs/usage/providers/groq.zh-CN.mdx +12 -2
  105. package/docs/usage/providers/ollama/gemma.mdx +13 -3
  106. package/docs/usage/providers/ollama/gemma.zh-CN.mdx +12 -3
  107. package/docs/usage/providers/ollama/qwen.mdx +12 -4
  108. package/docs/usage/providers/ollama/qwen.zh-CN.mdx +10 -3
  109. package/docs/usage/providers/ollama.mdx +19 -9
  110. package/docs/usage/providers/ollama.zh-CN.mdx +20 -9
  111. package/docs/usage/start.mdx +13 -2
  112. package/docs/usage/start.zh-CN.mdx +11 -2
  113. package/locales/ar/common.json +0 -26
  114. package/locales/ar/components.json +15 -0
  115. package/locales/ar/error.json +1 -52
  116. package/locales/ar/modelProvider.json +226 -0
  117. package/locales/ar/setting.json +48 -199
  118. package/locales/bg-BG/common.json +0 -26
  119. package/locales/bg-BG/components.json +15 -0
  120. package/locales/bg-BG/error.json +1 -52
  121. package/locales/bg-BG/modelProvider.json +226 -0
  122. package/locales/bg-BG/setting.json +48 -199
  123. package/locales/de-DE/common.json +0 -26
  124. package/locales/de-DE/components.json +15 -0
  125. package/locales/de-DE/error.json +1 -52
  126. package/locales/de-DE/modelProvider.json +226 -0
  127. package/locales/de-DE/setting.json +48 -199
  128. package/locales/en-US/common.json +0 -26
  129. package/locales/en-US/components.json +15 -0
  130. package/locales/en-US/error.json +1 -52
  131. package/locales/en-US/modelProvider.json +226 -0
  132. package/locales/en-US/setting.json +48 -199
  133. package/locales/es-ES/common.json +0 -26
  134. package/locales/es-ES/components.json +15 -0
  135. package/locales/es-ES/error.json +1 -52
  136. package/locales/es-ES/modelProvider.json +226 -0
  137. package/locales/es-ES/setting.json +48 -199
  138. package/locales/fr-FR/common.json +0 -26
  139. package/locales/fr-FR/components.json +15 -0
  140. package/locales/fr-FR/error.json +1 -52
  141. package/locales/fr-FR/modelProvider.json +226 -0
  142. package/locales/fr-FR/setting.json +48 -199
  143. package/locales/it-IT/common.json +0 -26
  144. package/locales/it-IT/components.json +15 -0
  145. package/locales/it-IT/error.json +1 -52
  146. package/locales/it-IT/modelProvider.json +226 -0
  147. package/locales/it-IT/setting.json +59 -210
  148. package/locales/ja-JP/common.json +0 -26
  149. package/locales/ja-JP/components.json +15 -0
  150. package/locales/ja-JP/error.json +1 -52
  151. package/locales/ja-JP/modelProvider.json +226 -0
  152. package/locales/ja-JP/setting.json +59 -210
  153. package/locales/ko-KR/common.json +0 -26
  154. package/locales/ko-KR/components.json +15 -0
  155. package/locales/ko-KR/error.json +1 -52
  156. package/locales/ko-KR/modelProvider.json +226 -0
  157. package/locales/ko-KR/setting.json +48 -199
  158. package/locales/nl-NL/common.json +0 -26
  159. package/locales/nl-NL/components.json +15 -0
  160. package/locales/nl-NL/error.json +4 -55
  161. package/locales/nl-NL/modelProvider.json +226 -0
  162. package/locales/nl-NL/setting.json +49 -200
  163. package/locales/pl-PL/common.json +0 -26
  164. package/locales/pl-PL/components.json +15 -0
  165. package/locales/pl-PL/error.json +1 -52
  166. package/locales/pl-PL/modelProvider.json +226 -0
  167. package/locales/pl-PL/setting.json +48 -199
  168. package/locales/pt-BR/common.json +0 -26
  169. package/locales/pt-BR/components.json +15 -0
  170. package/locales/pt-BR/error.json +1 -52
  171. package/locales/pt-BR/modelProvider.json +226 -0
  172. package/locales/pt-BR/setting.json +48 -199
  173. package/locales/ru-RU/common.json +0 -26
  174. package/locales/ru-RU/components.json +15 -0
  175. package/locales/ru-RU/error.json +1 -52
  176. package/locales/ru-RU/modelProvider.json +226 -0
  177. package/locales/ru-RU/setting.json +48 -199
  178. package/locales/tr-TR/common.json +0 -26
  179. package/locales/tr-TR/components.json +15 -0
  180. package/locales/tr-TR/error.json +1 -52
  181. package/locales/tr-TR/modelProvider.json +226 -0
  182. package/locales/tr-TR/setting.json +48 -199
  183. package/locales/vi-VN/common.json +0 -26
  184. package/locales/vi-VN/components.json +15 -0
  185. package/locales/vi-VN/error.json +1 -52
  186. package/locales/vi-VN/modelProvider.json +226 -0
  187. package/locales/vi-VN/setting.json +48 -199
  188. package/locales/zh-CN/common.json +0 -26
  189. package/locales/zh-CN/components.json +15 -0
  190. package/locales/zh-CN/error.json +2 -53
  191. package/locales/zh-CN/modelProvider.json +226 -0
  192. package/locales/zh-CN/setting.json +48 -199
  193. package/locales/zh-TW/common.json +0 -26
  194. package/locales/zh-TW/components.json +15 -0
  195. package/locales/zh-TW/error.json +1 -52
  196. package/locales/zh-TW/modelProvider.json +226 -0
  197. package/locales/zh-TW/setting.json +48 -199
  198. package/package.json +120 -116
  199. package/scripts/mdxWorkflow/index.ts +48 -0
  200. package/src/app/api/chat/[provider]/route.test.ts +4 -9
  201. package/src/app/api/chat/[provider]/route.ts +6 -23
  202. package/src/app/api/chat/{[provider]/agentRuntime.test.ts → agentRuntime.test.ts} +12 -12
  203. package/src/app/api/chat/{[provider]/agentRuntime.ts → agentRuntime.ts} +11 -30
  204. package/src/app/api/chat/auth/index.ts +42 -0
  205. package/src/app/api/chat/models/[provider]/route.ts +45 -0
  206. package/src/app/api/config/__snapshots__/route.test.ts.snap +127 -0
  207. package/src/app/api/config/route.test.ts +170 -0
  208. package/src/app/api/config/route.ts +46 -11
  209. package/src/app/api/plugin/gateway/route.ts +1 -1
  210. package/src/app/settings/llm/Azure/index.tsx +36 -43
  211. package/src/app/settings/llm/Bedrock/index.tsx +12 -20
  212. package/src/app/settings/llm/Ollama/index.tsx +2 -2
  213. package/src/app/settings/llm/OpenAI/index.tsx +9 -121
  214. package/src/app/settings/llm/OpenRouter/index.tsx +1 -1
  215. package/src/app/settings/llm/TogetherAI/index.tsx +0 -1
  216. package/src/app/settings/llm/components/ProviderConfig/index.tsx +48 -32
  217. package/src/app/settings/llm/components/ProviderModelList/CustomModelOption.tsx +94 -0
  218. package/src/app/settings/llm/components/ProviderModelList/MaxTokenSlider.tsx +88 -0
  219. package/src/app/settings/llm/components/ProviderModelList/ModelConfigModal.tsx +128 -0
  220. package/src/app/settings/llm/components/ProviderModelList/ModelFetcher.tsx +81 -0
  221. package/src/app/settings/llm/components/ProviderModelList/Option.tsx +38 -0
  222. package/src/app/settings/llm/components/ProviderModelList/index.tsx +142 -0
  223. package/src/app/settings/llm/const.ts +1 -1
  224. package/src/app/settings/llm/index.tsx +7 -6
  225. package/src/app/settings/tts/TTS/index.tsx +1 -1
  226. package/src/components/AntdStaticMethods/index.test.tsx +43 -0
  227. package/src/components/ModelIcon/index.tsx +25 -7
  228. package/src/components/ModelSelect/index.tsx +67 -56
  229. package/src/config/modelProviders/anthropic.ts +6 -1
  230. package/src/config/modelProviders/azure.ts +42 -0
  231. package/src/config/modelProviders/bedrock.ts +4 -1
  232. package/src/config/modelProviders/google.ts +2 -14
  233. package/src/config/modelProviders/groq.ts +3 -0
  234. package/src/config/modelProviders/index.ts +19 -14
  235. package/src/config/modelProviders/mistral.ts +5 -0
  236. package/src/config/modelProviders/moonshot.ts +3 -1
  237. package/src/config/modelProviders/ollama.ts +6 -17
  238. package/src/config/modelProviders/openai.ts +9 -13
  239. package/src/config/modelProviders/openrouter.ts +6 -1
  240. package/src/config/modelProviders/perplexity.ts +2 -0
  241. package/src/config/modelProviders/togetherai.ts +11 -0
  242. package/src/config/modelProviders/zeroone.ts +3 -0
  243. package/src/config/modelProviders/zhipu.ts +3 -0
  244. package/src/config/server/provider.ts +52 -7
  245. package/src/const/auth.ts +0 -1
  246. package/src/const/{settings.ts → settings/index.ts} +31 -4
  247. package/src/const/url.ts +1 -1
  248. package/src/database/core/db.ts +14 -0
  249. package/src/database/schemas/user.ts +1 -25
  250. package/src/features/AgentSetting/AgentConfig/ModelSelect.tsx +7 -11
  251. package/src/features/ChatInput/STT/common.tsx +80 -78
  252. package/src/features/ChatInput/STT/index.tsx +8 -6
  253. package/src/features/Conversation/Error/APIKeyForm/Bedrock.tsx +8 -8
  254. package/src/features/Conversation/Error/APIKeyForm/ProviderApiKeyForm.tsx +73 -0
  255. package/src/features/Conversation/Error/APIKeyForm/ProviderAvatar.tsx +74 -0
  256. package/src/features/Conversation/Error/APIKeyForm/index.tsx +25 -49
  257. package/src/features/ModelSwitchPanel/index.tsx +40 -13
  258. package/src/hooks/_header.ts +5 -20
  259. package/src/libs/agent-runtime/BaseAI.ts +17 -1
  260. package/src/libs/agent-runtime/anthropic/index.ts +3 -7
  261. package/src/libs/agent-runtime/azureOpenai/index.test.ts +166 -0
  262. package/src/libs/agent-runtime/azureOpenai/index.ts +16 -8
  263. package/src/libs/agent-runtime/bedrock/index.test.ts +199 -22
  264. package/src/libs/agent-runtime/bedrock/index.ts +11 -18
  265. package/src/libs/agent-runtime/groq/index.test.ts +350 -0
  266. package/src/libs/agent-runtime/groq/index.ts +14 -77
  267. package/src/libs/agent-runtime/mistral/index.test.ts +25 -19
  268. package/src/libs/agent-runtime/mistral/index.ts +24 -86
  269. package/src/libs/agent-runtime/moonshot/index.test.ts +2 -2
  270. package/src/libs/agent-runtime/moonshot/index.ts +14 -77
  271. package/src/libs/agent-runtime/openai/__snapshots__/index.test.ts.snap +99 -0
  272. package/src/libs/agent-runtime/openai/fixtures/openai-models.json +170 -0
  273. package/src/libs/agent-runtime/openai/index.test.ts +15 -50
  274. package/src/libs/agent-runtime/openai/index.ts +15 -107
  275. package/src/libs/agent-runtime/openrouter/__snapshots__/index.test.ts.snap +82 -0
  276. package/src/libs/agent-runtime/openrouter/fixtures/models.json +62 -0
  277. package/src/libs/agent-runtime/openrouter/index.test.ts +25 -9
  278. package/src/libs/agent-runtime/openrouter/index.ts +42 -84
  279. package/src/libs/agent-runtime/openrouter/type.ts +28 -0
  280. package/src/libs/agent-runtime/togetherai/index.test.ts +12 -9
  281. package/src/libs/agent-runtime/togetherai/index.ts +20 -85
  282. package/src/libs/agent-runtime/utils/anthropicHelpers.test.ts +14 -22
  283. package/src/libs/agent-runtime/utils/anthropicHelpers.ts +4 -10
  284. package/src/libs/agent-runtime/utils/openaiCompatibleFactory/index.ts +147 -0
  285. package/src/libs/agent-runtime/zeroone/index.test.ts +350 -0
  286. package/src/libs/agent-runtime/zeroone/index.ts +14 -77
  287. package/src/locales/default/common.ts +0 -28
  288. package/src/locales/default/components.ts +15 -0
  289. package/src/locales/default/error.ts +2 -54
  290. package/src/locales/default/index.ts +4 -0
  291. package/src/locales/default/modelProvider.ts +229 -0
  292. package/src/locales/default/setting.ts +51 -202
  293. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +79 -0
  294. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +75 -0
  295. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +85 -0
  296. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +86 -0
  297. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +77 -0
  298. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +79 -0
  299. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +82 -0
  300. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +89 -0
  301. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +203 -0
  302. package/src/migrations/FromV3ToV4/index.ts +96 -0
  303. package/src/migrations/FromV3ToV4/migrations.test.ts +195 -0
  304. package/src/migrations/FromV3ToV4/types/v3.ts +59 -0
  305. package/src/migrations/FromV3ToV4/types/v4.ts +37 -0
  306. package/src/migrations/index.ts +11 -3
  307. package/src/services/_auth.test.ts +4 -6
  308. package/src/services/_auth.ts +8 -60
  309. package/src/services/_header.ts +5 -22
  310. package/src/services/_url.ts +1 -0
  311. package/src/services/chat.ts +16 -6
  312. package/src/services/global.ts +1 -1
  313. package/src/services/models.ts +23 -0
  314. package/src/services/ollama.ts +2 -2
  315. package/src/store/chat/slices/share/action.test.ts +113 -0
  316. package/src/store/chat/slices/share/action.ts +1 -1
  317. package/src/store/global/slices/common/action.test.ts +166 -1
  318. package/src/store/global/slices/common/action.ts +2 -1
  319. package/src/store/global/slices/settings/{action.test.ts → actions/general.test.ts} +1 -19
  320. package/src/store/global/slices/settings/{action.ts → actions/general.ts} +4 -19
  321. package/src/store/global/slices/settings/actions/index.ts +18 -0
  322. package/src/store/global/slices/settings/actions/llm.test.ts +60 -0
  323. package/src/store/global/slices/settings/actions/llm.ts +88 -0
  324. package/src/store/global/slices/settings/initialState.ts +3 -1
  325. package/src/store/global/slices/settings/reducers/customModelCard.test.ts +204 -0
  326. package/src/store/global/slices/settings/reducers/customModelCard.ts +64 -0
  327. package/src/store/global/slices/settings/selectors/index.ts +1 -0
  328. package/src/store/global/slices/settings/selectors/modelConfig.test.ts +189 -0
  329. package/src/store/global/slices/settings/selectors/modelConfig.ts +179 -0
  330. package/src/store/global/slices/settings/selectors/modelProvider.test.ts +47 -138
  331. package/src/store/global/slices/settings/selectors/modelProvider.ts +102 -243
  332. package/src/store/global/store.ts +1 -1
  333. package/src/types/llm.ts +12 -1
  334. package/src/types/serverConfig.ts +22 -0
  335. package/src/types/settings/index.ts +0 -12
  336. package/src/types/settings/modelProvider.ts +34 -90
  337. package/src/utils/client/switchLang.test.ts +34 -0
  338. package/src/utils/difference.test.ts +46 -0
  339. package/src/utils/difference.ts +15 -2
  340. package/src/utils/fetch.ts +1 -3
  341. package/src/utils/parseModels.ts +62 -0
  342. package/vercel.json +1 -1
  343. package/docs/package.json +0 -5
  344. package/src/features/Conversation/Error/APIKeyForm/Anthropic.tsx +0 -40
  345. package/src/features/Conversation/Error/APIKeyForm/Google.tsx +0 -61
  346. package/src/features/Conversation/Error/APIKeyForm/Groq.tsx +0 -60
  347. package/src/features/Conversation/Error/APIKeyForm/Mistral.tsx +0 -60
  348. package/src/features/Conversation/Error/APIKeyForm/Moonshot.tsx +0 -60
  349. package/src/features/Conversation/Error/APIKeyForm/OpenAI.tsx +0 -63
  350. package/src/features/Conversation/Error/APIKeyForm/OpenRouter.tsx +0 -40
  351. package/src/features/Conversation/Error/APIKeyForm/Perplexity.tsx +0 -60
  352. package/src/features/Conversation/Error/APIKeyForm/TogetherAI.tsx +0 -40
  353. package/src/features/Conversation/Error/APIKeyForm/ZeroOne.tsx +0 -60
  354. package/src/features/Conversation/Error/APIKeyForm/Zhipu.tsx +0 -62
  355. package/src/libs/agent-runtime/utils/env.ts +0 -1
  356. package/src/store/global/slices/settings/selectors/__snapshots__/modelProvider.test.ts.snap +0 -230
  357. /package/src/app/api/chat/{auth.ts → auth/utils.ts} +0 -0
  358. /package/src/components/{AntdStaticMethods.tsx → AntdStaticMethods/index.tsx} +0 -0
@@ -1,6 +1,13 @@
1
1
  ---
2
2
  title: 在 LobeChat 中使用 Ollama
3
- image: https://github.com/lobehub/lobe-chat/assets/28616219/bb5b3611-3aa8-4ec7-a6dc-f35a13b34d81
3
+ description: 学习如何在 LobeChat 中集成和使用 Ollama 本地运行大型语言模型(LLM)框架,以增强你的应用体验。
4
+ tags:
5
+ - Ollama
6
+ - LobeChat
7
+ - 语言模型
8
+ - 本地运行
9
+ - LLM
10
+ - 集成指南
4
11
  ---
5
12
 
6
13
  # 在 LobeChat 中使用 Ollama
@@ -17,9 +24,9 @@ Ollama 是一款强大的本地运行大型语言模型(LLM)的框架,支
17
24
  首先,你需要安装 Ollama,Ollama 支持 macOS、Windows 和 Linux 系统。 根据你的操作系统,选择以下安装方式之一:
18
25
 
19
26
  <Tabs items={['macOS', 'Linux','Windows (预览版)','Docker']}>
20
- <Tabs.Tab>[下载 Ollama for macOS](https://ollama.com/download) 并解压。</Tabs.Tab>
27
+ <Tab>[下载 Ollama for macOS](https://ollama.com/download) 并解压。</Tab>
21
28
 
22
- <Tabs.Tab>
29
+ <Tab>
23
30
  通过以下命令安装:
24
31
 
25
32
  ```bash
@@ -27,18 +34,21 @@ Ollama 是一款强大的本地运行大型语言模型(LLM)的框架,支
27
34
  ```
28
35
 
29
36
  或者,你也可以参考 [Linux 手动安装指南](https://github.com/ollama/ollama/blob/main/docs/linux.md)。
30
- </Tabs.Tab>
37
+
38
+ </Tab>
31
39
 
32
- <Tabs.Tab>[下载 Ollama for Windows](https://ollama.com/download) 并安装。</Tabs.Tab>
40
+ <Tab>[下载 Ollama for Windows](https://ollama.com/download) 并安装。</Tab>
33
41
 
34
- <Tabs.Tab>
42
+ <Tab>
35
43
  如果你更倾向于使用 Docker,Ollama 也提供了官方 Docker 镜像,你可以通过以下命令拉取:
36
44
 
37
45
  ```bash
38
46
  docker pull ollama/ollama
39
47
  ```
40
- </Tabs.Tab>
41
- </Tabs>
48
+
49
+ </Tab>
50
+
51
+ </Tabs>
42
52
 
43
53
  ### 用 Ollama 拉取模型到本地
44
54
 
@@ -58,7 +68,8 @@ Ollama 是一款强大的本地运行大型语言模型(LLM)的框架,支
58
68
 
59
69
  <Callout type={'info'}>
60
70
  你可以前往 [与 Ollama 集成](/zh/self-hosting/examples/ollama) 了解如何部署 LobeChat ,以满足与 Ollama 的集成需求。
61
- </Callout>
71
+
72
+ </Callout>
62
73
  </Steps>
63
74
 
64
75
  ## 自定义配置
@@ -1,6 +1,17 @@
1
1
  ---
2
- title: Get Start
3
- image: https://github.com/lobehub/lobe-chat/assets/28616219/9be1a584-8b66-4bc4-ac96-14c4f94dc499
2
+ title: Get Start with LobeChat
3
+ description: >-
4
+ Explore the exciting features in LobeChat, including Vision Model, TTS & STT,
5
+ Local LLMs, and Multi AI Providers. Discover more about Agent Market, Plugin
6
+ System, and Personalization.
7
+ tags:
8
+ - Feature Overview
9
+ - Vision Model
10
+ - TTS & STT
11
+ - Local LLMs
12
+ - Multi AI Providers
13
+ - Agent Market
14
+ - Plugin System
4
15
  ---
5
16
 
6
17
  # ✨ Feature Overview
@@ -1,6 +1,15 @@
1
1
  ---
2
- title: 开始使用
3
- image: https://github.com/lobehub/lobe-chat/assets/28616219/9be1a584-8b66-4bc4-ac96-14c4f94dc499
2
+ title: 开始使用 LobeChat
3
+ description: 了解 LobeChat 的功能特性,包括视觉识别、语音会话、多 AI 服务商等,体验助手市场、本地大语言模型、插件系统等功能。
4
+ tags:
5
+ - LobeChat
6
+ - 功能特性
7
+ - 视觉识别
8
+ - 语音会话
9
+ - AI 服务商
10
+ - 助手市场
11
+ - 本地大语言模型
12
+ - 插件系统
4
13
  ---
5
14
 
6
15
  # ✨ LobeChat 功能特性一览
@@ -1,13 +1,4 @@
1
1
  {
2
- "ModelSelect": {
3
- "featureTag": {
4
- "custom": "نموذج مخصص، يدعم الوظائف والتعرف على الرؤية، يرجى التحقق من قدرة النموذج على القيام بذلك وفقًا للحالة الفعلية",
5
- "file": "يدعم هذا النموذج قراءة وتعرف على الملفات المرفقة",
6
- "functionCall": "يدعم هذا النموذج استدعاء الوظائف",
7
- "tokens": "هذا النموذج يدعم حتى {{tokens}} رموز في جلسة واحدة",
8
- "vision": "يدعم هذا النموذج التعرف على الرؤية"
9
- }
10
- },
11
2
  "about": "حول",
12
3
  "advanceSettings": "إعدادات متقدمة",
13
4
  "appInitializing": "جاري تهيئة LobeChat، يرجى الانتظار ...",
@@ -95,23 +86,6 @@
95
86
  "zh-TW": "الصينية التقليدية"
96
87
  },
97
88
  "layoutInitializing": "جاري تحميل التخطيط...",
98
- "modelProvider": {
99
- "anthropic": "Anthropic",
100
- "azure": "أزور",
101
- "bedrock": "بيدروك لأمازون ويب سيرفيس",
102
- "google": "جوجل",
103
- "groq": "Groq",
104
- "mistral": "Mistral AI",
105
- "moonshot": "مونشوت الذكاء الاصطناعي",
106
- "ollama": "أولاما",
107
- "oneapi": "وان آبي آي",
108
- "openai": "أوبن إيه آي",
109
- "openrouter": "OpenRouter",
110
- "perplexity": "Perplexity",
111
- "togetherai": "TogetherAI",
112
- "zeroone": "01.AI الصفر والواحد",
113
- "zhipu": "Zhipu"
114
- },
115
89
  "noDescription": "لا توجد وصف",
116
90
  "oauth": "تسجيل الدخول SSO",
117
91
  "ok": "موافق",
@@ -0,0 +1,15 @@
1
+ {
2
+ "ModelSelect": {
3
+ "featureTag": {
4
+ "custom": "نموذج مخصص، الإعداد الافتراضي يدعم الاستدعاء الوظيفي والتعرف البصري، يرجى التحقق من قدرة النموذج على القيام بذلك بناءً على الحالة الفعلية",
5
+ "file": "يدعم هذا النموذج قراءة وتعرف الملفات المرفوعة",
6
+ "functionCall": "يدعم هذا النموذج استدعاء الوظائف",
7
+ "tokens": "يدعم هذا النموذج حتى {{tokens}} رمزًا في جلسة واحدة",
8
+ "vision": "يدعم هذا النموذج التعرف البصري"
9
+ }
10
+ },
11
+ "ModelSwitchPanel": {
12
+ "emptyModel": "لا توجد نماذج ممكن تمكينها، يرجى الانتقال إلى الإعدادات لتمكينها",
13
+ "provider": "مزود"
14
+ }
15
+ }
@@ -85,58 +85,7 @@
85
85
  "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
86
86
  },
87
87
  "unlock": {
88
- "apikey": {
89
- "Anthropic": {
90
- "description": "أدخل مفتاح Anthropic API الخاص بك للبدء في الجلسة. لن يقوم التطبيق بتسجيل مفتاح الواجهة البرمجية الخاص بك",
91
- "title": "استخدام مفتاح واجهة برمجة التطبيقات الخاص بـ Anthropic"
92
- },
93
- "Bedrock": {
94
- "customRegion": "منطقة خدمة مخصصة",
95
- "description": "أدخل مفتاح الوصول الخاص بك لـ AWS AccessKeyId / SecretAccessKey لبدء الجلسة. لن يقوم التطبيق بتسجيل تكوين المصادقة الخاص بك",
96
- "title": "استخدام معلومات مصادقة Bedrock المخصصة"
97
- },
98
- "Google": {
99
- "description": "أدخل مفتاح Google API الخاص بك لبدء الجلسة. لن يقوم التطبيق بتسجيل مفتاح الواجهة البرمجية الخاص بك",
100
- "title": "استخدام مفتاح Google API المخصص"
101
- },
102
- "Groq": {
103
- "description": "قم بإدخال مفتاح API الخاص بك لـ Groq للبدء في الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
104
- "title": "استخدام مفتاح API الخاص بـ Groq المخصص"
105
- },
106
- "Mistral": {
107
- "description": "أدخل مفتاح Mistral AI API الخاص بك لبدء الجلسة. لن يتم تسجيل مفتاح الواجهة البرمجية الخاص بك من قبل التطبيق",
108
- "title": "استخدام مفتاح Mistral AI API المخصص"
109
- },
110
- "Moonshot": {
111
- "description": "قم بإدخال مفتاح API الخاص بك لـ Moonshot AI لبدء الجلسة. لن يتم تسجيل مفتاح الـ API الخاص بك من قبل التطبيق",
112
- "title": "استخدام مفتاح API مخصص لـ Moonshot AI"
113
- },
114
- "OpenAI": {
115
- "addProxyUrl": "إضافة عنوان وكيل OpenAI (اختياري)",
116
- "description": "أدخل مفتاح OpenAI API الخاص بك لبدء الجلسة. لن يقوم التطبيق بتسجيل مفتاح الواجهة البرمجية الخاص بك",
117
- "title": "استخدام مفتاح OpenAI API المخصص"
118
- },
119
- "OpenRouter": {
120
- "description": "أدخل مفتاح OpenRouter API الخاص بك للبدء في الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
121
- "title": "استخدام مفتاح OpenRouter API المخصص"
122
- },
123
- "Perplexity": {
124
- "description": "أدخل مفتاح Perplexity API الخاص بك للبدء في الجلسة. لن يتم تسجيل مفتاح الواجهة البرمجية لتطبيقات الجلسة",
125
- "title": "استخدام مفتاح Perplexity API المخصص"
126
- },
127
- "TogetherAI": {
128
- "description": "أدخل مفتاح TogetherAI API الخاص بك للبدء في الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
129
- "title": "استخدام مفتاح TogetherAI API المخصص"
130
- },
131
- "ZeroOne": {
132
- "description": "أدخل مفتاح ZeroOne API الخاص بك لبدء الجلسة. لن يتم تسجيل مفتاح الواجهة البرمجية لتطبيقك",
133
- "title": "استخدام مفتاح واجهة برمجة التطبيقات الخاص بك لـ ZeroOne"
134
- },
135
- "Zhipu": {
136
- "description": "أدخل مفتاح Zhipu API الخاص بك لبدء الجلسة. لن يقوم التطبيق بتسجيل مفتاح الواجهة البرمجية الخاص بك",
137
- "title": "استخدام مفتاح Zhipu API المخصص"
138
- }
139
- },
88
+ "addProxyUrl": "إضافة عنوان وكيل OpenAI (اختياري)",
140
89
  "closeMessage": "إغلاق الرسالة",
141
90
  "confirm": "تأكيد وإعادة المحاولة",
142
91
  "model": {
@@ -0,0 +1,226 @@
1
+ {
2
+ "anthropic": {
3
+ "endpoint": {
4
+ "desc": "يجب أن يتضمن العنوان، بخلاف الافتراضي، http(s)://",
5
+ "placeholder": "https://api.anthropic.com",
6
+ "title": "عنوان وكيل API"
7
+ },
8
+ "title": "Anthropic",
9
+ "token": {
10
+ "desc": "أدخل مفتاح API الخاص بـ Anthropic",
11
+ "placeholder": "Anthropic API Key",
12
+ "title": "مفتاح API"
13
+ },
14
+ "unlock": {
15
+ "description": "أدخل مفتاح API الخاص بك في Anthropic لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
16
+ "title": "استخدام مفتاح API الخاص بـ Anthropic المخصص"
17
+ }
18
+ },
19
+ "azure": {
20
+ "azureApiVersion": {
21
+ "desc": "نسخة API الخاصة بـ Azure، والتي تتبع تنسيق YYYY-MM-DD، راجع [الإصدارات الأحدث](https://learn.microsoft.com/zh-en/azure/ai-services/openai/reference#chat-completions)",
22
+ "fetch": "جلب القائمة",
23
+ "title": "Azure Api Version"
24
+ },
25
+ "empty": "الرجاء إدخال معرف النموذج لإضافة أول نموذج",
26
+ "endpoint": {
27
+ "desc": "يمكن العثور على هذه القيمة في قسم 'المفاتيح والنقاط النهائية' عند فحص الموارد في بوابة Azure",
28
+ "placeholder": "https://docs-test-001.openai.azure.com",
29
+ "title": "عنوان Azure API"
30
+ },
31
+ "modelListPlaceholder": "يرجى تحديد أو إضافة نموذج OpenAI الذي قمت بنشره",
32
+ "title": "Azure OpenAI",
33
+ "token": {
34
+ "desc": "يمكن العثور على هذه القيمة في قسم 'المفاتيح والنقاط النهائية' عند فحص الموارد في بوابة Azure. يمكن استخدام KEY1 أو KEY2",
35
+ "placeholder": "Azure API Key",
36
+ "title": "مفتاح API"
37
+ },
38
+ "unlock": {
39
+ "description": "أدخل مفتاح API الخاص بـ Azure OpenAI الخاص بك لبدء الجلسة",
40
+ "title": "استخدام مفتاح API الخاص بـ Azure OpenAI المخصص"
41
+ }
42
+ },
43
+ "bedrock": {
44
+ "accessKeyId": {
45
+ "desc": "أدخل AWS Access Key Id",
46
+ "placeholder": "AWS Access Key Id",
47
+ "title": "AWS Access Key Id"
48
+ },
49
+ "checker": {
50
+ "desc": "اختبر ما إذا كان AccessKeyId / SecretAccessKey مدخلاً بشكل صحيح"
51
+ },
52
+ "region": {
53
+ "desc": "أدخل AWS Region",
54
+ "placeholder": "AWS Region",
55
+ "title": "AWS Region"
56
+ },
57
+ "secretAccessKey": {
58
+ "desc": "أدخل AWS Secret Access Key",
59
+ "placeholder": "AWS Secret Access Key",
60
+ "title": "AWS Secret Access Key"
61
+ },
62
+ "title": "Bedrock",
63
+ "unlock": {
64
+ "customRegion": "منطقة خدمة مخصصة",
65
+ "description": "أدخل معرف الوصول / مفتاح الوصول السري الخاص بك في AWS لبدء الجلسة. لن يتم تسجيل تكوين المصادقة الخاص بك من قبل التطبيق",
66
+ "title": "استخدام معلومات المصادقة الخاصة بـ Bedrock المخصصة"
67
+ }
68
+ },
69
+ "google": {
70
+ "title": "Google",
71
+ "token": {
72
+ "desc": "أدخل مفتاح API الخاص بـ Google",
73
+ "placeholder": "Google API Key",
74
+ "title": "مفتاح API"
75
+ },
76
+ "unlock": {
77
+ "description": "أدخل مفتاح API الخاص بك في Google لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
78
+ "title": "استخدام مفتاح API الخاص بـ Google المخصص"
79
+ }
80
+ },
81
+ "groq": {
82
+ "title": "Groq",
83
+ "token": {
84
+ "desc": "أدخل مفتاح API الخاص بـ Groq",
85
+ "placeholder": "Groq API Key",
86
+ "title": "مفتاح API"
87
+ },
88
+ "unlock": {
89
+ "description": "أدخل مفتاح API الخاص بك في Groq لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
90
+ "title": "استخدام مفتاح API الخاص بـ Groq المخصص"
91
+ }
92
+ },
93
+ "mistral": {
94
+ "title": "Mistral AI",
95
+ "token": {
96
+ "desc": "أدخل مفتاح API الخاص بـ Mistral AI",
97
+ "placeholder": "Mistral AI API Key",
98
+ "title": "مفتاح API"
99
+ },
100
+ "unlock": {
101
+ "description": "أدخل مفتاح API الخاص بك في Mistral AI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
102
+ "title": "استخدام مفتاح API الخاص بـ Mistral AI المخصص"
103
+ }
104
+ },
105
+ "moonshot": {
106
+ "title": "الجانب المظلم للقمر",
107
+ "token": {
108
+ "desc": "أدخل مفتاح API الخاص بـ Moonshot AI",
109
+ "placeholder": "Moonshot AI API Key",
110
+ "title": "مفتاح API"
111
+ },
112
+ "unlock": {
113
+ "description": "أدخل مفتاح API الخاص بك في Moonshot AI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
114
+ "title": "استخدام مفتاح API الخاص بـ Moonshot AI المخصص"
115
+ }
116
+ },
117
+ "ollama": {
118
+ "checker": {
119
+ "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
120
+ },
121
+ "customModelName": {
122
+ "desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
123
+ "placeholder": "vicuna,llava,codellama,llama2:13b-text",
124
+ "title": "أسماء النماذج المخصصة"
125
+ },
126
+ "endpoint": {
127
+ "desc": "أدخل عنوان واجهة برمجة التطبيقات الخاص بـ Ollama، إذا لم يتم تحديده محليًا، يمكن تركه فارغًا",
128
+ "placeholder": "http://127.0.0.1:11434/v1",
129
+ "title": "عنوان وكيل الواجهة"
130
+ },
131
+ "title": "Ollama"
132
+ },
133
+ "openai": {
134
+ "endpoint": {
135
+ "desc": "يجب أن يتضمن العنوان، بخلاف الافتراضي، http(s)://",
136
+ "placeholder": "https://api.openai.com/v1",
137
+ "title": "عنوان وكيل الواجهة"
138
+ },
139
+ "title": "OpenAI",
140
+ "token": {
141
+ "desc": "استخدم مفتاح OpenAI الخاص بك",
142
+ "placeholder": "OpenAI API Key",
143
+ "title": "مفتاح OpenAI"
144
+ },
145
+ "unlock": {
146
+ "description": "أدخل مفتاح API الخاص بك في OpenAI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
147
+ "title": "استخدام مفتاح API الخاص بـ OpenAI المخصص"
148
+ }
149
+ },
150
+ "openrouter": {
151
+ "checker": {
152
+ "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
153
+ },
154
+ "customModelName": {
155
+ "desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
156
+ "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
157
+ "title": "أسماء النماذج المخصصة"
158
+ },
159
+ "title": "OpenRouter",
160
+ "token": {
161
+ "desc": "أدخل مفتاح API الخاص بـ OpenRouter AI",
162
+ "placeholder": "OpenRouter AI API Key",
163
+ "title": "مفتاح API"
164
+ },
165
+ "unlock": {
166
+ "description": "أدخل مفتاح API الخاص بك في OpenRouter لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
167
+ "title": "استخدام مفتاح API الخاص بـ OpenRouter المخصص"
168
+ }
169
+ },
170
+ "perplexity": {
171
+ "title": "Perplexity",
172
+ "token": {
173
+ "desc": "أدخل مفتاح API الخاص بـ Perplexity AI",
174
+ "placeholder": "Perplexity AI API Key",
175
+ "title": "مفتاح API"
176
+ },
177
+ "unlock": {
178
+ "description": "أدخل مفتاح API الخاص بك في Perplexity لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
179
+ "title": "استخدام مفتاح API الخاص بـ Perplexity المخصص"
180
+ }
181
+ },
182
+ "togetherai": {
183
+ "checker": {
184
+ "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
185
+ },
186
+ "customModelName": {
187
+ "desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
188
+ "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
189
+ "title": "أسماء النماذج المخصصة"
190
+ },
191
+ "title": "TogetherAI",
192
+ "token": {
193
+ "desc": "أدخل مفتاح API الخاص بـ TogetherAI AI",
194
+ "placeholder": "TogetherAI AI API Key",
195
+ "title": "مفتاح API"
196
+ },
197
+ "unlock": {
198
+ "description": "أدخل مفتاح API الخاص بك في TogetherAI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
199
+ "title": "استخدام مفتاح API الخاص بـ TogetherAI المخصص"
200
+ }
201
+ },
202
+ "zeroone": {
203
+ "title": "01.AI الأشياء الصغرى",
204
+ "token": {
205
+ "desc": "أدخل مفتاح API الخاص بـ 01.AI الأشياء الصغرى",
206
+ "placeholder": "01.AI الأشياء الصغرى API Key",
207
+ "title": "مفتاح API"
208
+ },
209
+ "unlock": {
210
+ "description": "أدخل مفتاح API الخاص بك في ZeroOne لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
211
+ "title": "استخدام مفتاح API الخاص بـ ZeroOne المخصص"
212
+ }
213
+ },
214
+ "zhipu": {
215
+ "title": "Zhipu",
216
+ "token": {
217
+ "desc": "أدخل مفتاح API الخاص بـ Zhipu",
218
+ "placeholder": "Zhipu API Key",
219
+ "title": "مفتاح API"
220
+ },
221
+ "unlock": {
222
+ "description": "أدخل مفتاح API الخاص بك في Zhipu لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
223
+ "title": "استخدام مفتاح API الخاص بـ Zhipu المخصص"
224
+ }
225
+ }
226
+ }