@lobehub/chat 1.49.10 → 1.49.12

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 (95) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/locales/ar/components.json +24 -0
  4. package/locales/ar/modelProvider.json +0 -24
  5. package/locales/ar/models.json +15 -0
  6. package/locales/bg-BG/components.json +24 -0
  7. package/locales/bg-BG/modelProvider.json +0 -24
  8. package/locales/bg-BG/models.json +15 -0
  9. package/locales/de-DE/components.json +24 -0
  10. package/locales/de-DE/modelProvider.json +0 -24
  11. package/locales/de-DE/models.json +15 -0
  12. package/locales/en-US/components.json +24 -0
  13. package/locales/en-US/modelProvider.json +0 -24
  14. package/locales/en-US/models.json +15 -0
  15. package/locales/es-ES/components.json +24 -0
  16. package/locales/es-ES/modelProvider.json +0 -24
  17. package/locales/es-ES/models.json +15 -0
  18. package/locales/fa-IR/components.json +24 -0
  19. package/locales/fa-IR/modelProvider.json +0 -24
  20. package/locales/fa-IR/models.json +15 -0
  21. package/locales/fr-FR/components.json +24 -0
  22. package/locales/fr-FR/modelProvider.json +0 -24
  23. package/locales/fr-FR/models.json +15 -0
  24. package/locales/it-IT/components.json +24 -0
  25. package/locales/it-IT/modelProvider.json +0 -24
  26. package/locales/it-IT/models.json +15 -0
  27. package/locales/ja-JP/components.json +24 -0
  28. package/locales/ja-JP/modelProvider.json +0 -24
  29. package/locales/ja-JP/models.json +15 -0
  30. package/locales/ko-KR/components.json +24 -0
  31. package/locales/ko-KR/modelProvider.json +0 -24
  32. package/locales/ko-KR/models.json +4 -0
  33. package/locales/nl-NL/components.json +24 -0
  34. package/locales/nl-NL/modelProvider.json +0 -24
  35. package/locales/nl-NL/models.json +15 -0
  36. package/locales/pl-PL/components.json +24 -0
  37. package/locales/pl-PL/modelProvider.json +0 -24
  38. package/locales/pl-PL/models.json +15 -0
  39. package/locales/pt-BR/components.json +24 -0
  40. package/locales/pt-BR/modelProvider.json +0 -24
  41. package/locales/pt-BR/models.json +15 -0
  42. package/locales/ru-RU/components.json +24 -0
  43. package/locales/ru-RU/modelProvider.json +0 -24
  44. package/locales/ru-RU/models.json +15 -0
  45. package/locales/tr-TR/components.json +24 -0
  46. package/locales/tr-TR/modelProvider.json +0 -24
  47. package/locales/tr-TR/models.json +15 -0
  48. package/locales/vi-VN/components.json +24 -0
  49. package/locales/vi-VN/modelProvider.json +0 -24
  50. package/locales/vi-VN/models.json +15 -0
  51. package/locales/zh-CN/components.json +24 -0
  52. package/locales/zh-CN/modelProvider.json +0 -24
  53. package/locales/zh-CN/models.json +16 -1
  54. package/locales/zh-TW/components.json +24 -0
  55. package/locales/zh-TW/modelProvider.json +0 -24
  56. package/locales/zh-TW/models.json +15 -0
  57. package/package.json +1 -1
  58. package/src/app/(main)/chat/(workspace)/@portal/_layout/Mobile.tsx +1 -0
  59. package/src/app/(main)/chat/(workspace)/_layout/Desktop/Portal.tsx +26 -2
  60. package/src/app/(main)/settings/provider/(detail)/[id]/page.tsx +10 -3
  61. package/src/app/(main)/settings/provider/(detail)/ollama/CheckError.tsx +70 -0
  62. package/src/app/(main)/settings/provider/(detail)/ollama/Container.tsx +57 -0
  63. package/src/app/(main)/settings/provider/(detail)/ollama/OllamaModelDownloader/index.tsx +127 -0
  64. package/src/app/(main)/settings/provider/(detail)/ollama/OllamaModelDownloader/useDownloadMonitor.ts +29 -0
  65. package/src/app/(main)/settings/provider/(detail)/ollama/page.tsx +2 -7
  66. package/src/app/(main)/settings/provider/features/ProviderConfig/Checker.tsx +90 -69
  67. package/src/app/(main)/settings/provider/features/ProviderConfig/index.tsx +6 -6
  68. package/src/components/FormAction/index.tsx +66 -0
  69. package/src/components/OllamaSetupGuide/index.tsx +217 -0
  70. package/src/components/Thinking/index.tsx +14 -16
  71. package/src/config/aiModels/ollama.ts +12 -19
  72. package/src/config/modelProviders/ollama.ts +1 -0
  73. package/src/config/modelProviders/siliconcloud.ts +2 -2
  74. package/src/database/repositories/aiInfra/index.ts +33 -2
  75. package/src/database/server/models/aiProvider.ts +5 -1
  76. package/src/features/Conversation/Error/OllamaBizError/SetupGuide.tsx +2 -209
  77. package/src/features/Conversation/components/MarkdownElements/LobeThinking/Render.tsx +7 -58
  78. package/src/libs/agent-runtime/ollama/index.ts +1 -1
  79. package/src/libs/agent-runtime/siliconcloud/index.ts +33 -1
  80. package/src/locales/default/components.ts +26 -0
  81. package/src/locales/default/modelProvider.ts +0 -26
  82. package/src/server/routers/lambda/aiProvider.ts +2 -10
  83. package/src/services/aiProvider/client.ts +2 -8
  84. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +10 -10
  85. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +4 -3
  86. package/src/store/chat/slices/aiChat/initialState.ts +1 -1
  87. package/src/store/chat/slices/message/action.ts +4 -3
  88. package/src/store/global/initialState.ts +2 -0
  89. package/src/store/global/selectors.ts +2 -0
  90. package/src/store/serverConfig/selectors.test.ts +3 -0
  91. package/src/store/serverConfig/store.test.ts +3 -2
  92. package/src/store/serverConfig/store.ts +1 -1
  93. package/src/store/user/slices/common/action.test.ts +1 -0
  94. package/src/types/serverConfig.ts +1 -1
  95. package/src/app/(main)/settings/provider/(detail)/ollama/Checker.tsx +0 -73
@@ -176,6 +176,9 @@
176
176
  "Pro/meta-llama/Meta-Llama-3.1-8B-Instruct": {
177
177
  "description": "Meta Llama 3.1 là một phần của gia đình mô hình ngôn ngữ lớn đa ngôn ngữ do Meta phát triển, bao gồm các biến thể tiền huấn luyện và tinh chỉnh theo chỉ dẫn với quy mô tham số 8B, 70B và 405B. Mô hình 8B này được tối ưu hóa cho các tình huống đối thoại đa ngôn ngữ, thể hiện xuất sắc trong nhiều bài kiểm tra chuẩn ngành. Mô hình được đào tạo bằng hơn 15 triệu tỷ tokens từ dữ liệu công khai và sử dụng các kỹ thuật như tinh chỉnh giám sát và học tăng cường phản hồi của con người để nâng cao tính hữu ích và an toàn của mô hình. Llama 3.1 hỗ trợ sinh văn bản và sinh mã, với thời điểm cắt kiến thức là tháng 12 năm 2023."
178
178
  },
179
+ "Qwen/QVQ-72B-Preview": {
180
+ "description": "QVQ-72B-Preview là một mô hình nghiên cứu do đội ngũ Qwen phát triển, tập trung vào khả năng suy diễn hình ảnh, có lợi thế độc đáo trong việc hiểu các cảnh phức tạp và giải quyết các vấn đề toán học liên quan đến hình ảnh."
181
+ },
179
182
  "Qwen/QwQ-32B-Preview": {
180
183
  "description": "QwQ-32B-Preview là mô hình nghiên cứu thử nghiệm mới nhất của Qwen, tập trung vào việc nâng cao khả năng suy luận của AI. Thông qua việc khám phá các cơ chế phức tạp như trộn ngôn ngữ và suy luận đệ quy, những lợi thế chính bao gồm khả năng phân tích suy luận mạnh mẽ, khả năng toán học và lập trình. Tuy nhiên, cũng có những vấn đề về chuyển đổi ngôn ngữ, vòng lặp suy luận, các vấn đề an toàn và sự khác biệt về các khả năng khác."
181
184
  },
@@ -530,12 +533,21 @@
530
533
  "databricks/dbrx-instruct": {
531
534
  "description": "DBRX Instruct cung cấp khả năng xử lý chỉ dẫn đáng tin cậy, hỗ trợ nhiều ứng dụng trong ngành."
532
535
  },
536
+ "deepseek-ai/DeepSeek-R1": {
537
+ "description": "DeepSeek-R1 là một mô hình suy diễn được điều khiển bởi học tăng cường (RL), giải quyết các vấn đề về tính lặp lại và khả năng đọc hiểu trong mô hình. Trước khi áp dụng RL, DeepSeek-R1 đã giới thiệu dữ liệu khởi động lạnh, tối ưu hóa thêm hiệu suất suy diễn. Nó thể hiện hiệu suất tương đương với OpenAI-o1 trong các nhiệm vụ toán học, mã và suy diễn, và thông qua phương pháp đào tạo được thiết kế cẩn thận, nâng cao hiệu quả tổng thể."
538
+ },
533
539
  "deepseek-ai/DeepSeek-V2.5": {
534
540
  "description": "DeepSeek V2.5 kết hợp các đặc điểm xuất sắc của các phiên bản trước, tăng cường khả năng tổng quát và mã hóa."
535
541
  },
542
+ "deepseek-ai/DeepSeek-V3": {
543
+ "description": "DeepSeek-V3 là một mô hình ngôn ngữ hỗn hợp chuyên gia (MoE) với 6710 tỷ tham số, sử dụng chú ý tiềm ẩn đa đầu (MLA) và kiến trúc DeepSeekMoE, kết hợp với chiến lược cân bằng tải không có tổn thất phụ trợ, tối ưu hóa hiệu suất suy diễn và đào tạo. Thông qua việc được tiền huấn luyện trên 14.8 triệu tỷ token chất lượng cao, và thực hiện tinh chỉnh giám sát và học tăng cường, DeepSeek-V3 vượt trội về hiệu suất so với các mô hình mã nguồn mở khác, gần gũi với các mô hình đóng nguồn hàng đầu."
544
+ },
536
545
  "deepseek-ai/deepseek-llm-67b-chat": {
537
546
  "description": "DeepSeek 67B là mô hình tiên tiến được huấn luyện cho các cuộc đối thoại phức tạp."
538
547
  },
548
+ "deepseek-ai/deepseek-vl2": {
549
+ "description": "DeepSeek-VL2 là một mô hình ngôn ngữ hình ảnh hỗn hợp chuyên gia (MoE) được phát triển dựa trên DeepSeekMoE-27B, sử dụng kiến trúc MoE với kích hoạt thưa, đạt được hiệu suất xuất sắc chỉ với 4.5B tham số được kích hoạt. Mô hình này thể hiện xuất sắc trong nhiều nhiệm vụ như hỏi đáp hình ảnh, nhận diện ký tự quang học, hiểu tài liệu/bảng/biểu đồ và định vị hình ảnh."
550
+ },
539
551
  "deepseek-chat": {
540
552
  "description": "Mô hình mã nguồn mở mới kết hợp khả năng tổng quát và mã, không chỉ giữ lại khả năng đối thoại tổng quát của mô hình Chat ban đầu và khả năng xử lý mã mạnh mẽ của mô hình Coder, mà còn tốt hơn trong việc phù hợp với sở thích của con người. Hơn nữa, DeepSeek-V2.5 cũng đã đạt được sự cải thiện lớn trong nhiều khía cạnh như nhiệm vụ viết, theo dõi chỉ dẫn."
541
553
  },
@@ -548,6 +560,9 @@
548
560
  "deepseek-coder-v2:236b": {
549
561
  "description": "DeepSeek Coder V2 là mô hình mã nguồn mở hỗn hợp chuyên gia, thể hiện xuất sắc trong các nhiệm vụ mã, tương đương với GPT4-Turbo."
550
562
  },
563
+ "deepseek-r1": {
564
+ "description": "DeepSeek-R1 là một mô hình suy diễn được điều khiển bởi học tăng cường (RL), giải quyết các vấn đề về tính lặp lại và khả năng đọc hiểu trong mô hình. Trước khi áp dụng RL, DeepSeek-R1 đã giới thiệu dữ liệu khởi động lạnh, tối ưu hóa thêm hiệu suất suy diễn. Nó thể hiện hiệu suất tương đương với OpenAI-o1 trong các nhiệm vụ toán học, mã và suy diễn, và thông qua phương pháp đào tạo được thiết kế cẩn thận, nâng cao hiệu quả tổng thể."
565
+ },
551
566
  "deepseek-reasoner": {
552
567
  "description": "Mô hình suy diễn do DeepSeek phát triển. Trước khi đưa ra câu trả lời cuối cùng, mô hình sẽ xuất ra một đoạn nội dung chuỗi suy nghĩ để nâng cao độ chính xác của câu trả lời cuối."
553
568
  },
@@ -86,6 +86,30 @@
86
86
  "emptyModel": "没有启用的模型,请前往设置开启",
87
87
  "provider": "提供商"
88
88
  },
89
+ "OllamaSetupGuide": {
90
+ "cors": {
91
+ "description": "因浏览器安全限制,你需要为 Ollama 进行跨域配置后方可正常使用。",
92
+ "linux": {
93
+ "env": "在 [Service] 部分下添加 `Environment`,添加 OLLAMA_ORIGINS 环境变量:",
94
+ "reboot": "重载 systemd 并重启 Ollama",
95
+ "systemd": "调用 systemd 编辑 ollama 服务:"
96
+ },
97
+ "macos": "请打开「终端」应用程序,并粘贴以下指令,并按回车运行",
98
+ "reboot": "请在执行完成后重启 Ollama 服务",
99
+ "title": "配置 Ollama 允许跨域访问",
100
+ "windows": "在 Windows 上,点击「控制面板」,进入编辑系统环境变量。为您的用户账户新建名为 「OLLAMA_ORIGINS」 的环境变量,值为 * ,点击 「OK/应用」 保存"
101
+ },
102
+ "install": {
103
+ "description": "请确认你已经开启 Ollama ,如果没有下载 Ollama ,请前往官网<1>下载</1>",
104
+ "docker": "如果你更倾向于使用 Docker,Ollama 也提供了官方 Docker 镜像,你可以通过以下命令拉取:",
105
+ "linux": {
106
+ "command": "通过以下命令安装:",
107
+ "manual": "或者,你也可以参考 <1>Linux 手动安装指南</1> 自行安装"
108
+ },
109
+ "title": "在本地安装并开启 Ollama 应用",
110
+ "windowsTab": "Windows (预览版)"
111
+ }
112
+ },
89
113
  "Thinking": {
90
114
  "thinking": "深度思考中...",
91
115
  "thought": "已深度思考(用时 {{duration}} 秒)",
@@ -154,30 +154,6 @@
154
154
  "desc": "必须包含http(s)://,本地未额外指定可留空",
155
155
  "title": "Ollama 服务地址"
156
156
  },
157
- "setup": {
158
- "cors": {
159
- "description": "因浏览器安全限制,你需要为 Ollama 进行跨域配置后方可正常使用。",
160
- "linux": {
161
- "env": "在 [Service] 部分下添加 `Environment`,添加 OLLAMA_ORIGINS 环境变量:",
162
- "reboot": "重载 systemd 并重启 Ollama",
163
- "systemd": "调用 systemd 编辑 ollama 服务:"
164
- },
165
- "macos": "请打开「终端」应用程序,并粘贴以下指令,并按回车运行",
166
- "reboot": "请在执行完成后重启 Ollama 服务",
167
- "title": "配置 Ollama 允许跨域访问",
168
- "windows": "在 Windows 上,点击「控制面板」,进入编辑系统环境变量。为您的用户账户新建名为 「OLLAMA_ORIGINS」 的环境变量,值为 * ,点击 「OK/应用」 保存"
169
- },
170
- "install": {
171
- "description": "请确认你已经开启 Ollama ,如果没有下载 Ollama ,请前往官网<1>下载</1>",
172
- "docker": "如果你更倾向于使用 Docker,Ollama 也提供了官方 Docker 镜像,你可以通过以下命令拉取:",
173
- "linux": {
174
- "command": "通过以下命令安装:",
175
- "manual": "或者,你也可以参考 <1>Linux 手动安装指南</1> 自行安装"
176
- },
177
- "title": "在本地安装并开启 Ollama 应用",
178
- "windowsTab": "Windows (预览版)"
179
- }
180
- },
181
157
  "title": "Ollama",
182
158
  "unlock": {
183
159
  "cancel": "取消下载",
@@ -176,6 +176,9 @@
176
176
  "Pro/meta-llama/Meta-Llama-3.1-8B-Instruct": {
177
177
  "description": "Meta Llama 3.1 是由 Meta 开发的多语言大型语言模型家族,包括 8B、70B 和 405B 三种参数规模的预训练和指令微调变体。该 8B 指令微调模型针对多语言对话场景进行了优化,在多项行业基准测试中表现优异。模型训练使用了超过 15 万亿个 tokens 的公开数据,并采用了监督微调和人类反馈强化学习等技术来提升模型的有用性和安全性。Llama 3.1 支持文本生成和代码生成,知识截止日期为 2023 年 12 月"
178
178
  },
179
+ "Qwen/QVQ-72B-Preview": {
180
+ "description": "QVQ-72B-Preview 是由 Qwen 团队开发的专注于视觉推理能力的研究型模型,其在复杂场景理解和解决视觉相关的数学问题方面具有独特优势。"
181
+ },
179
182
  "Qwen/QwQ-32B-Preview": {
180
183
  "description": "QwQ模型是由 Qwen 团队开发的实验性研究模型,专注于增强 AI 推理能力。"
181
184
  },
@@ -530,12 +533,21 @@
530
533
  "databricks/dbrx-instruct": {
531
534
  "description": "DBRX Instruct 提供高可靠性的指令处理能力,支持多行业应用。"
532
535
  },
536
+ "deepseek-ai/DeepSeek-R1": {
537
+ "description": "DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进一步优化了推理性能。它在数学、代码和推理任务中与 OpenAI-o1 表现相当,并且通过精心设计的训练方法,提升了整体效果。"
538
+ },
533
539
  "deepseek-ai/DeepSeek-V2.5": {
534
- "description": "DeepSeek-V2.5 是 DeepSeek-V2-Chat 和 DeepSeek-Coder-V2-Instruct 的升级版本,集成了两个先前版本的通用和编码能力。该模型在多个方面进行了优化,包括写作和指令跟随能力,更好地与人类偏好保持一致。DeepSeek-V2.5 在各种评估基准上都取得了显著的提升,如 AlpacaEval 2.0、ArenaHard、AlignBench 和 MT-Bench "
540
+ "description": "DeepSeek-V2.5 是 DeepSeek-V2-Chat 和 DeepSeek-Coder-V2-Instruct 的升级版本,集成了两个先前版本的通用和编码能力。该模型在多个方面进行了优化,包括写作和指令跟随能力,更好地与人类偏好保持一致。DeepSeek-V2.5 在各种评估基准上都取得了显著的提升,如 AlpacaEval 2.0、ArenaHard、AlignBench 和 MT-Bench 等。"
541
+ },
542
+ "deepseek-ai/DeepSeek-V3": {
543
+ "description": "DeepSeek-V3 是一款拥有 6710 亿参数的混合专家(MoE)语言模型,采用多头潜在注意力(MLA)和 DeepSeekMoE 架构,结合无辅助损失的负载平衡策略,优化推理和训练效率。通过在 14.8 万亿高质量tokens上预训练,并进行监督微调和强化学习,DeepSeek-V3 在性能上超越其他开源模型,接近领先闭源模型。"
535
544
  },
536
545
  "deepseek-ai/deepseek-llm-67b-chat": {
537
546
  "description": "DeepSeek LLM Chat (67B) 是创新的 AI 模型 提供深度语言理解和互动能力。"
538
547
  },
548
+ "deepseek-ai/deepseek-vl2": {
549
+ "description": "DeepSeek-VL2 是一个基于 DeepSeekMoE-27B 开发的混合专家(MoE)视觉语言模型,采用稀疏激活的 MoE 架构,在仅激活 4.5B 参数的情况下实现了卓越性能。该模型在视觉问答、光学字符识别、文档/表格/图表理解和视觉定位等多个任务中表现优异。"
550
+ },
539
551
  "deepseek-chat": {
540
552
  "description": "融合通用与代码能力的全新开源模型, 不仅保留了原有 Chat 模型的通用对话能力和 Coder 模型的强大代码处理能力,还更好地对齐了人类偏好。此外,DeepSeek-V2.5 在写作任务、指令跟随等多个方面也实现了大幅提升。"
541
553
  },
@@ -548,6 +560,9 @@
548
560
  "deepseek-coder-v2:236b": {
549
561
  "description": "DeepSeek Coder V2 是开源的混合专家代码模型,在代码任务方面表现优异,与 GPT4-Turbo 相媲美。"
550
562
  },
563
+ "deepseek-r1": {
564
+ "description": "DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进一步优化了推理性能。它在数学、代码和推理任务中与 OpenAI-o1 表现相当,并且通过精心设计的训练方法,提升了整体效果。"
565
+ },
551
566
  "deepseek-reasoner": {
552
567
  "description": "DeepSeek 推出的推理模型。在输出最终回答之前,模型会先输出一段思维链内容,以提升最终答案的准确性。"
553
568
  },
@@ -86,6 +86,30 @@
86
86
  "emptyModel": "沒有啟用的模型,請前往設定開啟",
87
87
  "provider": "提供商"
88
88
  },
89
+ "OllamaSetupGuide": {
90
+ "cors": {
91
+ "description": "因瀏覽器安全限制,你需要為 Ollama 進行跨域配置後方可正常使用。",
92
+ "linux": {
93
+ "env": "在 [Service] 部分下添加 `Environment`,添加 OLLAMA_ORIGINS 環境變數:",
94
+ "reboot": "重載 systemd 並重啟 Ollama",
95
+ "systemd": "調用 systemd 編輯 ollama 服務:"
96
+ },
97
+ "macos": "請打開「終端」應用程式,並粘貼以下指令,然後按回車執行",
98
+ "reboot": "請在執行完成後重啟 Ollama 服務",
99
+ "title": "配置 Ollama 允許跨域訪問",
100
+ "windows": "在 Windows 上,點擊「控制面板」,進入編輯系統環境變數。為您的用戶帳戶新建名為「OLLAMA_ORIGINS」的環境變數,值為 *,點擊「確定/應用」保存"
101
+ },
102
+ "install": {
103
+ "description": "請確認你已經啟動 Ollama,如果沒有下載 Ollama,請前往官網<1>下載</1>",
104
+ "docker": "如果你更傾向於使用 Docker,Ollama 也提供了官方 Docker 映像,你可以通過以下命令拉取:",
105
+ "linux": {
106
+ "command": "通過以下命令安裝:",
107
+ "manual": "或者,你也可以參考 <1>Linux 手動安裝指南</1> 自行安裝"
108
+ },
109
+ "title": "在本地安裝並啟動 Ollama 應用",
110
+ "windowsTab": "Windows (預覽版)"
111
+ }
112
+ },
89
113
  "Thinking": {
90
114
  "thinking": "深度思考中...",
91
115
  "thought": "已深度思考(用時 {{duration}} 秒)",
@@ -154,30 +154,6 @@
154
154
  "desc": "必須包含http(s)://,本地未額外指定可留空",
155
155
  "title": "接口代理地址"
156
156
  },
157
- "setup": {
158
- "cors": {
159
- "description": "因瀏覽器安全限制,您需要為 Ollama 進行跨域配置後才能正常使用。",
160
- "linux": {
161
- "env": "在 [Service] 部分下添加 `Environment`,新增 OLLAMA_ORIGINS 環境變數:",
162
- "reboot": "重新載入 systemd 並重新啟動 Ollama",
163
- "systemd": "呼叫 systemd 編輯 ollama 服務:"
164
- },
165
- "macos": "請開啟「終端」應用程式,貼上以下指令,然後按 Enter 執行",
166
- "reboot": "執行完成後請重新啟動 Ollama 服務",
167
- "title": "配置 Ollama 允許跨域訪問",
168
- "windows": "在 Windows 上,點擊「控制面板」,進入編輯系統環境變數。為您的使用者帳戶新增名為「OLLAMA_ORIGINS」的環境變數,值為 *,點擊「確定/應用」保存"
169
- },
170
- "install": {
171
- "description": "請確認您已經啟用 Ollama,如果尚未下載 Ollama,請前往官網<1>下載</1>",
172
- "docker": "如果您更傾向於使用 Docker,Ollama 也提供了官方 Docker 映像,您可以透過以下命令拉取:",
173
- "linux": {
174
- "command": "透過以下命令安裝:",
175
- "manual": "或者,您也可以參考 <1>Linux 手動安裝指南</1> 自行安裝"
176
- },
177
- "title": "在本地安裝並啟動 Ollama 應用",
178
- "windowsTab": "Windows (預覽版)"
179
- }
180
- },
181
157
  "title": "Ollama",
182
158
  "unlock": {
183
159
  "cancel": "取消下載",
@@ -176,6 +176,9 @@
176
176
  "Pro/meta-llama/Meta-Llama-3.1-8B-Instruct": {
177
177
  "description": "Meta Llama 3.1 是由 Meta 開發的多語言大型語言模型家族,包括 8B、70B 和 405B 三種參數規模的預訓練和指令微調變體。該 8B 指令微調模型針對多語言對話場景進行了優化,在多項行業基準測試中表現優異。模型訓練使用了超過 15 萬億個 tokens 的公開數據,並採用了監督微調和人類反饋強化學習等技術來提升模型的有用性和安全性。Llama 3.1 支持文本生成和代碼生成,知識截止日期為 2023 年 12 月"
178
178
  },
179
+ "Qwen/QVQ-72B-Preview": {
180
+ "description": "QVQ-72B-Preview 是由 Qwen 團隊開發的專注於視覺推理能力的研究型模型,其在複雜場景理解和解決視覺相關的數學問題方面具有獨特優勢。"
181
+ },
179
182
  "Qwen/QwQ-32B-Preview": {
180
183
  "description": "QwQ-32B-Preview是Qwen 最新的實驗性研究模型,專注於提升AI推理能力。通過探索語言混合、遞歸推理等複雜機制,主要優勢包括強大的推理分析能力、數學和編程能力。與此同時,也存在語言切換問題、推理循環、安全性考量、其他能力方面的差異。"
181
184
  },
@@ -530,12 +533,21 @@
530
533
  "databricks/dbrx-instruct": {
531
534
  "description": "DBRX Instruct 提供高可靠性的指令處理能力,支持多行業應用。"
532
535
  },
536
+ "deepseek-ai/DeepSeek-R1": {
537
+ "description": "DeepSeek-R1 是一款強化學習(RL)驅動的推理模型,解決了模型中的重複性和可讀性問題。在 RL 之前,DeepSeek-R1 引入了冷啟動數據,進一步優化了推理性能。它在數學、程式碼和推理任務中與 OpenAI-o1 表現相當,並且通過精心設計的訓練方法,提升了整體效果。"
538
+ },
533
539
  "deepseek-ai/DeepSeek-V2.5": {
534
540
  "description": "DeepSeek V2.5 集合了先前版本的優秀特徵,增強了通用和編碼能力。"
535
541
  },
542
+ "deepseek-ai/DeepSeek-V3": {
543
+ "description": "DeepSeek-V3 是一款擁有 6710 億參數的混合專家(MoE)語言模型,採用多頭潛在注意力(MLA)和 DeepSeekMoE 架構,結合無輔助損失的負載平衡策略,優化推理和訓練效率。通過在 14.8 萬億高品質 tokens 上預訓練,並進行監督微調和強化學習,DeepSeek-V3 在性能上超越其他開源模型,接近領先閉源模型。"
544
+ },
536
545
  "deepseek-ai/deepseek-llm-67b-chat": {
537
546
  "description": "DeepSeek 67B 是為高複雜性對話訓練的先進模型。"
538
547
  },
548
+ "deepseek-ai/deepseek-vl2": {
549
+ "description": "DeepSeek-VL2 是一個基於 DeepSeekMoE-27B 開發的混合專家(MoE)視覺語言模型,採用稀疏激活的 MoE 架構,在僅激活 4.5B 參數的情況下實現了卓越性能。該模型在視覺問答、光學字符識別、文檔/表格/圖表理解和視覺定位等多個任務中表現優異。"
550
+ },
539
551
  "deepseek-chat": {
540
552
  "description": "融合通用與代碼能力的全新開源模型,不僅保留了原有 Chat 模型的通用對話能力和 Coder 模型的強大代碼處理能力,還更好地對齊了人類偏好。此外,DeepSeek-V2.5 在寫作任務、指令跟隨等多個方面也實現了大幅提升。"
541
553
  },
@@ -548,6 +560,9 @@
548
560
  "deepseek-coder-v2:236b": {
549
561
  "description": "DeepSeek Coder V2 是開源的混合專家代碼模型,在代碼任務方面表現優異,與 GPT4-Turbo 相媲美。"
550
562
  },
563
+ "deepseek-r1": {
564
+ "description": "DeepSeek-R1 是一款強化學習(RL)驅動的推理模型,解決了模型中的重複性和可讀性問題。在 RL 之前,DeepSeek-R1 引入了冷啟動數據,進一步優化了推理性能。它在數學、程式碼和推理任務中與 OpenAI-o1 表現相當,並且通過精心設計的訓練方法,提升了整體效果。"
565
+ },
551
566
  "deepseek-reasoner": {
552
567
  "description": "DeepSeek 推出的推理模型。在輸出最終回答之前,模型會先輸出一段思維鏈內容,以提升最終答案的準確性。"
553
568
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.49.10",
3
+ "version": "1.49.12",
4
4
  "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -28,6 +28,7 @@ const Layout = ({ children }: PropsWithChildren) => {
28
28
  <Modal
29
29
  allowFullscreen
30
30
  className={cx(isPortalThread && styles.container)}
31
+ footer={null}
31
32
  height={'95%'}
32
33
  onCancel={() => togglePortal(false)}
33
34
  open={showMobilePortal}
@@ -1,9 +1,10 @@
1
1
  'use client';
2
2
 
3
- import { DraggablePanel, DraggablePanelContainer } from '@lobehub/ui';
3
+ import { DraggablePanel, DraggablePanelContainer, type DraggablePanelProps } from '@lobehub/ui';
4
4
  import { createStyles, useResponsive } from 'antd-style';
5
+ import isEqual from 'fast-deep-equal';
5
6
  import { rgba } from 'polished';
6
- import { PropsWithChildren, memo } from 'react';
7
+ import { PropsWithChildren, memo, useState } from 'react';
7
8
  import { Flexbox } from 'react-layout-kit';
8
9
 
9
10
  import {
@@ -13,6 +14,8 @@ import {
13
14
  } from '@/const/layoutTokens';
14
15
  import { useChatStore } from '@/store/chat';
15
16
  import { chatPortalSelectors, portalThreadSelectors } from '@/store/chat/selectors';
17
+ import { useGlobalStore } from '@/store/global';
18
+ import { systemStatusSelectors } from '@/store/global/selectors';
16
19
 
17
20
  const useStyles = createStyles(({ css, token, isDarkMode }) => ({
18
21
  content: css`
@@ -49,6 +52,24 @@ const PortalPanel = memo(({ children }: PropsWithChildren) => {
49
52
  portalThreadSelectors.showThread(s),
50
53
  ]);
51
54
 
55
+ const [portalWidth, updateSystemStatus] = useGlobalStore((s) => [
56
+ systemStatusSelectors.portalWidth(s),
57
+ s.updateSystemStatus,
58
+ ]);
59
+
60
+ const [tmpWidth, setWidth] = useState(portalWidth);
61
+ if (tmpWidth !== portalWidth) setWidth(portalWidth);
62
+
63
+ const handleSizeChange: DraggablePanelProps['onSizeChange'] = (_, size) => {
64
+ if (!size) return;
65
+ const nextWidth = typeof size.width === 'string' ? Number.parseInt(size.width) : size.width;
66
+ if (!nextWidth) return;
67
+
68
+ if (isEqual(nextWidth, portalWidth)) return;
69
+ setWidth(nextWidth);
70
+ updateSystemStatus({ portalWidth: nextWidth });
71
+ };
72
+
52
73
  return (
53
74
  showInspector && (
54
75
  <DraggablePanel
@@ -56,6 +77,7 @@ const PortalPanel = memo(({ children }: PropsWithChildren) => {
56
77
  classNames={{
57
78
  content: styles.content,
58
79
  }}
80
+ defaultSize={{ width: tmpWidth }}
59
81
  expand
60
82
  hanlderStyle={{ display: 'none' }}
61
83
  maxWidth={CHAT_PORTAL_MAX_WIDTH}
@@ -63,9 +85,11 @@ const PortalPanel = memo(({ children }: PropsWithChildren) => {
63
85
  showArtifactUI || showToolUI || showThread ? CHAT_PORTAL_TOOL_UI_WIDTH : CHAT_PORTAL_WIDTH
64
86
  }
65
87
  mode={md ? 'fixed' : 'float'}
88
+ onSizeChange={handleSizeChange}
66
89
  placement={'right'}
67
90
  showHandlerWhenUnexpand={false}
68
91
  showHandlerWideArea={false}
92
+ size={{ height: '100%', width: portalWidth }}
69
93
  >
70
94
  <DraggablePanelContainer
71
95
  style={{
@@ -2,10 +2,12 @@ import { redirect } from 'next/navigation';
2
2
 
3
3
  import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders';
4
4
  import { isServerMode } from '@/const/version';
5
+ import { AiInfraRepos } from '@/database/repositories/aiInfra';
5
6
  import { serverDB } from '@/database/server';
6
- import { AiProviderModel } from '@/database/server/models/aiProvider';
7
+ import { getServerGlobalConfig } from '@/server/globalConfig';
7
8
  import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
8
9
  import { PagePropsWithId } from '@/types/next';
10
+ import { ProviderConfig } from '@/types/user/settings';
9
11
  import { getUserAuth } from '@/utils/server/auth';
10
12
 
11
13
  import ClientMode from './ClientMode';
@@ -22,9 +24,14 @@ const Page = async (props: PagePropsWithId) => {
22
24
  if (isServerMode) {
23
25
  const { userId } = await getUserAuth();
24
26
 
25
- const aiProviderModel = new AiProviderModel(serverDB, userId!);
27
+ const { aiProvider } = getServerGlobalConfig();
28
+ const aiInfraRepos = new AiInfraRepos(
29
+ serverDB,
30
+ userId!,
31
+ aiProvider as Record<string, ProviderConfig>,
32
+ );
26
33
 
27
- const userCard = await aiProviderModel.getAiProviderById(
34
+ const userCard = await aiInfraRepos.getAiProviderDetail(
28
35
  params.id,
29
36
  KeyVaultsGateKeeper.getUserKeyVaults,
30
37
  );
@@ -0,0 +1,70 @@
1
+ import { Skeleton } from 'antd';
2
+ import dynamic from 'next/dynamic';
3
+ import { ReactNode } from 'react';
4
+
5
+ import { ChatMessageError } from '@/types/message';
6
+
7
+ import Container from './Container';
8
+
9
+ const loading = () => <Skeleton active style={{ width: 400 }} />;
10
+
11
+ const OllamaSetupGuide = dynamic(() => import('@/components/OllamaSetupGuide'), {
12
+ loading,
13
+ ssr: false,
14
+ });
15
+
16
+ const InvalidModel = dynamic(() => import('./OllamaModelDownloader'), {
17
+ loading,
18
+ ssr: false,
19
+ });
20
+
21
+ interface OllamaError {
22
+ code: string | null;
23
+ message: string;
24
+ param?: any;
25
+ type: string;
26
+ }
27
+
28
+ interface OllamaErrorResponse {
29
+ error: OllamaError;
30
+ }
31
+
32
+ const UNRESOLVED_MODEL_REGEXP = /model "([\w+,-_]+)" not found/;
33
+
34
+ const CheckError = ({
35
+ defaultError,
36
+ error,
37
+ setError,
38
+ }: {
39
+ defaultError: ReactNode;
40
+ error?: ChatMessageError;
41
+ setError: (error?: ChatMessageError) => void;
42
+ }) => {
43
+ const errorBody: OllamaErrorResponse = (error as any)?.body;
44
+
45
+ const errorMessage = errorBody.error?.message;
46
+
47
+ // error of not pull the model
48
+ const unresolvedModel = errorMessage?.match(UNRESOLVED_MODEL_REGEXP)?.[1];
49
+
50
+ if (unresolvedModel) {
51
+ return (
52
+ <Container setError={setError}>
53
+ <InvalidModel model={unresolvedModel} />
54
+ </Container>
55
+ );
56
+ }
57
+
58
+ // error of not enable model or not set the CORS rules
59
+ if (errorMessage?.includes('Failed to fetch') || errorMessage?.includes('fetch failed')) {
60
+ return (
61
+ <Container setError={setError}>
62
+ <OllamaSetupGuide />
63
+ </Container>
64
+ );
65
+ }
66
+
67
+ return defaultError;
68
+ };
69
+
70
+ export default CheckError;
@@ -0,0 +1,57 @@
1
+ import { ActionIcon } from '@lobehub/ui';
2
+ import { createStyles } from 'antd-style';
3
+ import { XIcon } from 'lucide-react';
4
+ import { ReactNode, useState } from 'react';
5
+ import { Flexbox } from 'react-layout-kit';
6
+
7
+ const useStyles = createStyles(({ css, token, responsive }) => ({
8
+ close: css`
9
+ position: absolute;
10
+ inset-block-start: 16px;
11
+ inset-inline-end: 16px;
12
+ `,
13
+ container: css`
14
+ position: relative;
15
+
16
+ width: min(50vw, 600px);
17
+ padding-inline: 40px;
18
+ border: 1px solid ${token.colorBorderBg};
19
+ border-radius: 8px;
20
+
21
+ background: ${token.colorBgContainer};
22
+
23
+ ${responsive.mobile} {
24
+ width: 100%;
25
+ padding-inline: 12px;
26
+ }
27
+ `,
28
+ }));
29
+
30
+ const Container = ({
31
+ setError,
32
+ children,
33
+ }: {
34
+ children: ReactNode;
35
+ setError: (error?: any) => void;
36
+ }) => {
37
+ const { styles } = useStyles();
38
+ const [show, setShow] = useState(true);
39
+
40
+ return (
41
+ show && (
42
+ <Flexbox className={styles.container}>
43
+ <ActionIcon
44
+ className={styles.close}
45
+ icon={XIcon}
46
+ onClick={() => {
47
+ setShow(false);
48
+ setError(undefined);
49
+ }}
50
+ />
51
+ {children}
52
+ </Flexbox>
53
+ )
54
+ );
55
+ };
56
+
57
+ export default Container;
@@ -0,0 +1,127 @@
1
+ import { Ollama } from '@lobehub/icons';
2
+ import { Button, Input, Progress } from 'antd';
3
+ import { useTheme } from 'antd-style';
4
+ import { memo, useMemo, useState } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { Center, Flexbox } from 'react-layout-kit';
7
+ import useSWR from 'swr';
8
+
9
+ import FormAction from '@/components/FormAction';
10
+ import { ollamaService } from '@/services/ollama';
11
+ import { formatSize } from '@/utils/format';
12
+
13
+ import { useDownloadMonitor } from './useDownloadMonitor';
14
+
15
+ interface OllamaModelDownloaderProps {
16
+ model: string;
17
+ }
18
+
19
+ const OllamaModelDownloader = memo<OllamaModelDownloaderProps>(({ model }) => {
20
+ const { t } = useTranslation(['modelProvider', 'error']);
21
+
22
+ const [modelToPull, setModelToPull] = useState(model);
23
+ const [completed, setCompleted] = useState(0);
24
+ const [total, setTotal] = useState(0);
25
+ const { remainingTime, downloadSpeed } = useDownloadMonitor(total, completed);
26
+ const percent = useMemo(() => {
27
+ return total ? Number(((completed / total) * 100).toFixed(1)) : 0;
28
+ }, [completed, total]);
29
+
30
+ const theme = useTheme();
31
+
32
+ const { mutate, isLoading: isDownloading } = useSWR(
33
+ [modelToPull],
34
+ async ([model]) => {
35
+ const generator = await ollamaService.pullModel(model);
36
+ for await (const progress of generator) {
37
+ if (progress.completed) {
38
+ setCompleted(progress.completed);
39
+ setTotal(progress.total);
40
+ }
41
+ }
42
+ return null;
43
+ },
44
+ {
45
+ onSuccess: () => {},
46
+ revalidateOnFocus: false,
47
+ revalidateOnMount: false,
48
+ },
49
+ );
50
+
51
+ return (
52
+ <Center gap={16} paddingBlock={32} style={{ width: '100%' }}>
53
+ <FormAction
54
+ avatar={<Ollama color={theme.colorPrimary} size={64} />}
55
+ description={isDownloading ? t('ollama.download.desc') : t('ollama.unlock.description')}
56
+ title={
57
+ isDownloading
58
+ ? t('ollama.download.title', { model: modelToPull })
59
+ : t('ollama.unlock.title')
60
+ }
61
+ >
62
+ {!isDownloading && (
63
+ <Input
64
+ onChange={(e) => {
65
+ setModelToPull(e.target.value);
66
+ }}
67
+ value={modelToPull}
68
+ />
69
+ )}
70
+ </FormAction>
71
+ {isDownloading && (
72
+ <Flexbox flex={1} gap={8} style={{ maxWidth: 300 }} width={'100%'}>
73
+ <Progress
74
+ percent={percent}
75
+ showInfo
76
+ strokeColor={theme.colorSuccess}
77
+ trailColor={theme.colorSuccessBg}
78
+ />
79
+ <Flexbox
80
+ distribution={'space-between'}
81
+ horizontal
82
+ style={{ color: theme.colorTextDescription, fontSize: 12 }}
83
+ >
84
+ <span>
85
+ {t('ollama.download.remainingTime')}: {remainingTime}
86
+ </span>
87
+ <span>
88
+ {t('ollama.download.speed')}: {downloadSpeed}
89
+ </span>
90
+ </Flexbox>
91
+ </Flexbox>
92
+ )}
93
+ <Flexbox gap={12} style={{ maxWidth: 300 }} width={'100%'}>
94
+ <Button
95
+ block
96
+ loading={isDownloading}
97
+ onClick={() => {
98
+ mutate();
99
+ }}
100
+ style={{ marginTop: 8 }}
101
+ type={'primary'}
102
+ >
103
+ {!isDownloading
104
+ ? t('ollama.unlock.confirm')
105
+ : // if total is 0, show starting, else show downloaded
106
+ !total
107
+ ? t('ollama.unlock.starting')
108
+ : t('ollama.unlock.downloaded', {
109
+ completed: formatSize(completed, 2),
110
+ total: formatSize(total, 2),
111
+ })}
112
+ </Button>
113
+ {isDownloading && (
114
+ <Button
115
+ onClick={() => {
116
+ ollamaService.abort();
117
+ }}
118
+ >
119
+ {t('ollama.unlock.cancel')}
120
+ </Button>
121
+ )}
122
+ </Flexbox>
123
+ </Center>
124
+ );
125
+ });
126
+
127
+ export default OllamaModelDownloader;