@lobehub/chat 1.22.27 → 1.23.1

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 (55) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/Dockerfile +17 -15
  3. package/Dockerfile.database +18 -16
  4. package/locales/ar/error.json +1 -1
  5. package/locales/ar/setting.json +7 -1
  6. package/locales/bg-BG/error.json +1 -1
  7. package/locales/bg-BG/setting.json +7 -1
  8. package/locales/de-DE/error.json +1 -1
  9. package/locales/de-DE/setting.json +7 -1
  10. package/locales/en-US/error.json +1 -1
  11. package/locales/en-US/setting.json +7 -1
  12. package/locales/es-ES/error.json +1 -1
  13. package/locales/es-ES/setting.json +7 -1
  14. package/locales/fr-FR/error.json +1 -1
  15. package/locales/fr-FR/setting.json +7 -1
  16. package/locales/it-IT/error.json +1 -1
  17. package/locales/it-IT/setting.json +7 -1
  18. package/locales/ja-JP/error.json +1 -1
  19. package/locales/ja-JP/setting.json +7 -1
  20. package/locales/ko-KR/error.json +1 -1
  21. package/locales/ko-KR/setting.json +7 -1
  22. package/locales/nl-NL/error.json +1 -1
  23. package/locales/nl-NL/setting.json +7 -1
  24. package/locales/pl-PL/error.json +1 -1
  25. package/locales/pl-PL/setting.json +7 -1
  26. package/locales/pt-BR/error.json +1 -1
  27. package/locales/pt-BR/setting.json +7 -1
  28. package/locales/ru-RU/error.json +1 -1
  29. package/locales/ru-RU/setting.json +7 -1
  30. package/locales/tr-TR/error.json +1 -1
  31. package/locales/tr-TR/setting.json +7 -1
  32. package/locales/vi-VN/error.json +1 -1
  33. package/locales/vi-VN/setting.json +7 -1
  34. package/locales/zh-CN/error.json +1 -1
  35. package/locales/zh-CN/setting.json +7 -1
  36. package/locales/zh-TW/error.json +1 -1
  37. package/locales/zh-TW/setting.json +7 -1
  38. package/package.json +2 -2
  39. package/src/app/(main)/settings/system-agent/features/createForm.tsx +90 -41
  40. package/src/app/(main)/settings/system-agent/index.tsx +15 -0
  41. package/src/chains/rewriteQuery.ts +3 -2
  42. package/src/components/TextArea/index.tsx +42 -0
  43. package/src/config/llm.ts +28 -0
  44. package/src/config/modelProviders/spark.ts +6 -6
  45. package/src/const/settings/systemAgent.ts +15 -2
  46. package/src/features/AgentSetting/AgentModal/ModelSelect.tsx +6 -2
  47. package/src/features/ModelSelect/index.tsx +5 -4
  48. package/src/features/User/UserPanel/useMenu.tsx +11 -11
  49. package/src/locales/default/setting.ts +7 -1
  50. package/src/server/globalConfig/index.ts +146 -16
  51. package/src/server/globalConfig/parseSystemAgent.ts +2 -1
  52. package/src/server/services/chunk/index.ts +2 -2
  53. package/src/store/chat/slices/aiChat/actions/rag.ts +13 -4
  54. package/src/store/user/slices/settings/action.ts +6 -3
  55. package/src/types/user/settings/systemAgent.ts +7 -1
@@ -51,10 +51,10 @@
51
51
  "431": "Извините, ваш заголовок запроса слишком велик, сервер не может его обработать",
52
52
  "451": "Извините, по юридическим причинам сервер отказывается предоставить этот ресурс",
53
53
  "500": "К сожалению, сервер, похоже, испытывает некоторые трудности и временно не может выполнить ваш запрос. Повторите попытку позже.",
54
+ "501": "Извините, сервер еще не знает, как обработать этот запрос. Пожалуйста, убедитесь, что ваши действия правильны.",
54
55
  "502": "К сожалению, сервер, похоже, потерян и временно не может предоставлять услуги. Повторите попытку позже.",
55
56
  "503": "К сожалению, сервер в настоящее время не может обработать ваш запрос, возможно, из-за перегрузки или технического обслуживания. Повторите попытку позже.",
56
57
  "504": "К сожалению, сервер не получил ответа от вышестоящего сервера. Повторите попытку позже.",
57
- "501": "Извините, сервер еще не знает, как обработать этот запрос. Пожалуйста, убедитесь, что ваши действия правильны.",
58
58
  "505": "Извините, сервер не поддерживает используемую вами версию HTTP. Пожалуйста, обновите и попробуйте снова.",
59
59
  "506": "Извините, возникла проблема с конфигурацией сервера. Пожалуйста, свяжитесь с администратором для решения проблемы.",
60
60
  "507": "Извините, на сервере недостаточно места для хранения, чтобы обработать ваш запрос. Пожалуйста, попробуйте позже.",
@@ -372,10 +372,16 @@
372
372
  "modelDesc": "Модель, используемая для генерации имени агента, описания, аватара и меток",
373
373
  "title": "Автоматическое создание информации об агенте"
374
374
  },
375
+ "customPrompt": {
376
+ "addPrompt": "Добавить пользовательский запрос",
377
+ "desc": "После заполнения система будет использовать пользовательский запрос при генерации контента",
378
+ "placeholder": "Введите пользовательский запрос",
379
+ "title": "Пользовательский запрос"
380
+ },
375
381
  "queryRewrite": {
376
382
  "label": "Модель переформулирования вопросов",
377
383
  "modelDesc": "Модель, предназначенная для оптимизации вопросов пользователей",
378
- "title": "База знаний"
384
+ "title": "Переписывание вопросов базы знаний"
379
385
  },
380
386
  "title": "Системный агент",
381
387
  "topic": {
@@ -51,10 +51,10 @@
51
51
  "431": "Üzgünüz, istek başlık alanı çok büyük, sunucu işleyemiyor",
52
52
  "451": "Üzgünüz, yasal nedenlerle sunucu bu kaynağı sağlamayı reddediyor",
53
53
  "500": "Üzgünüm, sunucu bazı zorluklar yaşıyor ve geçici olarak isteğinizi tamamlayamıyor. Lütfen daha sonra tekrar deneyin.",
54
+ "501": "Üzgünüm, sunucu bu isteği nasıl işleyeceğini henüz bilmiyor, lütfen işleminizin doğru olduğundan emin olun",
54
55
  "502": "Üzgünüm, sunucu kayboldu ve geçici olarak hizmet veremiyor. Lütfen daha sonra tekrar deneyin.",
55
56
  "503": "Üzgünüm, sunucu şu anda isteğinizi işleyemiyor, muhtemelen aşırı yüklenme veya bakım nedeniyle. Lütfen daha sonra tekrar deneyin.",
56
57
  "504": "Üzgünüm, sunucu yukarı akış sunucusundan bir yanıt alamadı. Lütfen daha sonra tekrar deneyin.",
57
- "501": "Üzgünüm, sunucu bu isteği nasıl işleyeceğini henüz bilmiyor, lütfen işleminizin doğru olduğundan emin olun",
58
58
  "505": "Üzgünüm, sunucu kullandığınız HTTP sürümünü desteklemiyor, lütfen güncelleyip tekrar deneyin",
59
59
  "506": "Üzgünüm, sunucu yapılandırmasında bir sorun var, lütfen çözüm için yöneticinizle iletişime geçin",
60
60
  "507": "Üzgünüm, sunucunun depolama alanı yetersiz, isteğinizi işleyemiyor, lütfen daha sonra tekrar deneyin",
@@ -372,10 +372,16 @@
372
372
  "modelDesc": "Asistan adı, açıklaması, avatar ve etiket oluşturmak için belirlenen model",
373
373
  "title": "Asistan Bilgilerini Otomatik Oluştur"
374
374
  },
375
+ "customPrompt": {
376
+ "addPrompt": "Özel İpucu Ekle",
377
+ "desc": "Doldurduğunuzda, sistem asistanı içerik oluştururken özel ipucunu kullanacaktır",
378
+ "placeholder": "Lütfen özel ipucu kelimelerini girin",
379
+ "title": "Özel İpucu"
380
+ },
375
381
  "queryRewrite": {
376
382
  "label": "Soru Yeniden Yazım Modeli",
377
383
  "modelDesc": "Kullanıcı sorularını optimize etmek için kullanılan model",
378
- "title": "Bilgi Tabanı"
384
+ "title": "Bilgi Tabanı Soru Yeniden Yazımı"
379
385
  },
380
386
  "title": "Sistem Asistanı",
381
387
  "topic": {
@@ -51,10 +51,10 @@
51
51
  "431": "Xin lỗi, trường tiêu đề yêu cầu của bạn quá lớn, máy chủ không thể xử lý",
52
52
  "451": "Xin lỗi, do lý do pháp lý, máy chủ từ chối cung cấp tài nguyên này",
53
53
  "500": "Xin lỗi, máy chủ có vẻ gặp một số khó khăn, tạm thời không thể hoàn thành yêu cầu của bạn, vui lòng thử lại sau",
54
+ "501": "Xin lỗi, máy chủ chưa biết cách xử lý yêu cầu này, vui lòng xác nhận rằng thao tác của bạn là chính xác",
54
55
  "502": "Xin lỗi, máy chủ có vẻ lạc đường, tạm thời không thể cung cấp dịch vụ, vui lòng thử lại sau",
55
56
  "503": "Xin lỗi, máy chủ hiện không thể xử lý yêu cầu của bạn, có thể do quá tải hoặc đang bảo trì, vui lòng thử lại sau",
56
57
  "504": "Xin lỗi, máy chủ không đợi được phản hồi từ máy chủ upstream, vui lòng thử lại sau",
57
- "501": "Xin lỗi, máy chủ chưa biết cách xử lý yêu cầu này, vui lòng xác nhận rằng thao tác của bạn là chính xác",
58
58
  "505": "Xin lỗi, máy chủ không hỗ trợ phiên bản HTTP bạn đang sử dụng, vui lòng cập nhật và thử lại",
59
59
  "506": "Xin lỗi, có vấn đề với cấu hình máy chủ, vui lòng liên hệ với quản trị viên để giải quyết",
60
60
  "507": "Xin lỗi, máy chủ không đủ dung lượng lưu trữ để xử lý yêu cầu của bạn, vui lòng thử lại sau",
@@ -372,10 +372,16 @@
372
372
  "modelDesc": "Xác định mô hình được sử dụng để tạo tên, mô tả, hình đại diện, nhãn cho trợ lý",
373
373
  "title": "Tự động tạo thông tin trợ lý"
374
374
  },
375
+ "customPrompt": {
376
+ "addPrompt": "Thêm gợi ý tùy chỉnh",
377
+ "desc": "Sau khi điền, trợ lý hệ thống sẽ sử dụng gợi ý tùy chỉnh khi tạo nội dung",
378
+ "placeholder": "Nhập từ gợi ý tùy chỉnh",
379
+ "title": "Từ gợi ý tùy chỉnh"
380
+ },
375
381
  "queryRewrite": {
376
382
  "label": "Mô hình viết lại câu hỏi",
377
383
  "modelDesc": "Mô hình được chỉ định để tối ưu hóa câu hỏi của người dùng",
378
- "title": "Kho tri thức"
384
+ "title": "Viết lại câu hỏi trong kho kiến thức"
379
385
  },
380
386
  "title": "Trợ lý hệ thống",
381
387
  "topic": {
@@ -51,10 +51,10 @@
51
51
  "431": "很抱歉,您的请求头字段太大,服务器无法处理",
52
52
  "451": "很抱歉,由于法律原因,服务器拒绝提供此资源",
53
53
  "500": "很抱歉,服务器似乎遇到了一些困难,暂时无法完成您的请求,请稍后再试",
54
+ "501": "很抱歉,服务器还不知道如何处理这个请求,请确认您的操作是否正确",
54
55
  "502": "很抱歉,服务器似乎迷失了方向,暂时无法提供服务,请稍后再试",
55
56
  "503": "很抱歉,服务器当前无法处理您的请求,可能是由于过载或正在进行维护,请稍后再试",
56
57
  "504": "很抱歉,服务器没有等到上游服务器的回应,请稍后再试",
57
- "501": "很抱歉,服务器还不知道如何处理这个请求,请确认您的操作是否正确",
58
58
  "505": "很抱歉,服务器不支持您使用的HTTP版本,请更新后再试",
59
59
  "506": "很抱歉,服务器配置出现问题,请联系管理员解决",
60
60
  "507": "很抱歉,服务器存储空间不足,无法处理您的请求,请稍后再试",
@@ -372,10 +372,16 @@
372
372
  "modelDesc": "指定用于生成助理名称、描述、头像、标签的模型",
373
373
  "title": "自动生成助理信息"
374
374
  },
375
+ "customPrompt": {
376
+ "addPrompt": "添加自定义提示",
377
+ "desc": "填写后,系统助理将在生成内容时使用自定义提示",
378
+ "placeholder": "请输入自定义提示词",
379
+ "title": "自定义提示词"
380
+ },
375
381
  "queryRewrite": {
376
382
  "label": "提问重写模型",
377
383
  "modelDesc": "指定用于优化用户提问的模型",
378
- "title": "知识库"
384
+ "title": "知识库提问重写"
379
385
  },
380
386
  "title": "系统助手",
381
387
  "topic": {
@@ -51,10 +51,10 @@
51
51
  "431": "很抱歉,您的請求頭字段太大,伺服器無法處理",
52
52
  "451": "很抱歉,由於法律原因,伺服器拒絕提供此資源",
53
53
  "500": "抱歉,伺服器似乎遇到一些困難,暫時無法完成您的請求。請稍後再試。",
54
+ "501": "很抱歉,伺服器尚未知道如何處理此請求,請確認您的操作是否正確",
54
55
  "502": "抱歉,伺服器似乎迷失了方向,暫時無法提供服務。請稍後再試。",
55
56
  "503": "抱歉,伺服器目前無法處理您的請求,可能是因為過載或正在進行維護。請稍後再試。",
56
57
  "504": "抱歉,伺服器沒有收到上游伺服器的回應。請稍後再試。",
57
- "501": "很抱歉,伺服器尚未知道如何處理此請求,請確認您的操作是否正確",
58
58
  "505": "很抱歉,伺服器不支援您使用的HTTP版本,請更新後再試",
59
59
  "506": "很抱歉,伺服器配置出現問題,請聯繫管理員解決",
60
60
  "507": "很抱歉,伺服器儲存空間不足,無法處理您的請求,請稍後再試",
@@ -372,10 +372,16 @@
372
372
  "modelDesc": "指定用於生成助理名稱、描述、頭像、標籤的模型",
373
373
  "title": "自動生成助理資訊"
374
374
  },
375
+ "customPrompt": {
376
+ "addPrompt": "新增自訂提示",
377
+ "desc": "填寫後,系統助理將在生成內容時使用自訂提示",
378
+ "placeholder": "請輸入自訂提示詞",
379
+ "title": "自訂提示詞"
380
+ },
375
381
  "queryRewrite": {
376
382
  "label": "提問重寫模型",
377
383
  "modelDesc": "指定用於優化用戶提問的模型",
378
- "title": "知識庫"
384
+ "title": "知識庫提問重寫"
379
385
  },
380
386
  "title": "系統助手",
381
387
  "topic": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.22.27",
3
+ "version": "1.23.1",
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",
@@ -143,7 +143,7 @@
143
143
  "ahooks": "^3.8.1",
144
144
  "ai": "^3.4.16",
145
145
  "antd": "^5.21.4",
146
- "antd-style": "^3.7.0",
146
+ "antd-style": "^3.7.1",
147
147
  "brotli-wasm": "^3.0.1",
148
148
  "chroma-js": "^2.6.0",
149
149
  "dayjs": "^1.11.13",
@@ -1,11 +1,14 @@
1
1
  'use client';
2
2
 
3
- import { Form, type ItemGroup } from '@lobehub/ui';
4
- import { Form as AntForm } from 'antd';
3
+ import { Form, Icon, type ItemGroup } from '@lobehub/ui';
4
+ import type { FormItemProps } from '@lobehub/ui/es/Form/components/FormItem';
5
+ import { Form as AntForm, Button, Switch } from 'antd';
5
6
  import isEqual from 'fast-deep-equal';
7
+ import { PencilIcon } from 'lucide-react';
6
8
  import { memo } from 'react';
7
9
  import { useTranslation } from 'react-i18next';
8
10
 
11
+ import TextArea from '@/components/TextArea';
9
12
  import { FORM_STYLE } from '@/const/layoutTokens';
10
13
  import ModelSelect from '@/features/ModelSelect';
11
14
  import { useUserStore } from '@/store/user';
@@ -16,44 +19,90 @@ import { useSyncSystemAgent } from './useSync';
16
19
 
17
20
  type SettingItemGroup = ItemGroup;
18
21
 
19
- const SystemAgentForm = memo(({ systemAgentKey }: { systemAgentKey: UserSystemAgentConfigKey }) => {
20
- const { t } = useTranslation('setting');
21
-
22
- const settings = useUserStore(settingsSelectors.currentSystemAgent, isEqual);
23
- const [updateSystemAgent] = useUserStore((s) => [s.updateSystemAgent]);
24
-
25
- const [form] = AntForm.useForm();
26
-
27
- const systemAgentSettings: SettingItemGroup = {
28
- children: [
29
- {
30
- children: (
31
- <ModelSelect
32
- onChange={(props) => {
33
- updateSystemAgent(systemAgentKey, props);
34
- }}
35
- showAbility={false}
36
- />
37
- ),
38
- desc: t(`systemAgent.${systemAgentKey}.modelDesc`),
39
- label: t(`systemAgent.${systemAgentKey}.label`),
40
- name: [systemAgentKey, 'model'],
41
- },
42
- ],
43
- title: t(`systemAgent.${systemAgentKey}.title`),
44
- };
45
-
46
- useSyncSystemAgent(form, settings);
47
-
48
- return (
49
- <Form
50
- form={form}
51
- initialValues={settings}
52
- items={[systemAgentSettings]}
53
- variant={'pure'}
54
- {...FORM_STYLE}
55
- />
56
- );
57
- });
22
+ interface SystemAgentFormProps {
23
+ allowCustomPrompt?: boolean;
24
+ allowDisable?: boolean;
25
+ defaultPrompt?: string;
26
+ systemAgentKey: UserSystemAgentConfigKey;
27
+ }
28
+
29
+ const SystemAgentForm = memo(
30
+ ({ systemAgentKey, allowDisable, allowCustomPrompt, defaultPrompt }: SystemAgentFormProps) => {
31
+ const { t } = useTranslation('setting');
32
+
33
+ const settings = useUserStore(settingsSelectors.currentSystemAgent, isEqual);
34
+ const [updateSystemAgent] = useUserStore((s) => [s.updateSystemAgent]);
35
+
36
+ const [form] = AntForm.useForm();
37
+ const value = settings[systemAgentKey];
38
+
39
+ const systemAgentSettings: SettingItemGroup = {
40
+ children: [
41
+ {
42
+ children: (
43
+ <ModelSelect
44
+ onChange={(props) => {
45
+ updateSystemAgent(systemAgentKey, props);
46
+ }}
47
+ showAbility={false}
48
+ // value={value}
49
+ />
50
+ ),
51
+ desc: t(`systemAgent.${systemAgentKey}.modelDesc`),
52
+ label: t(`systemAgent.${systemAgentKey}.label`),
53
+ name: systemAgentKey,
54
+ },
55
+ (!!allowCustomPrompt && {
56
+ children: !!value.customPrompt ? (
57
+ <TextArea
58
+ onChange={(e) => {
59
+ updateSystemAgent(systemAgentKey, { customPrompt: e });
60
+ }}
61
+ placeholder={t('systemAgent.customPrompt.placeholder')}
62
+ style={{ minHeight: 160 }}
63
+ value={value.customPrompt}
64
+ />
65
+ ) : (
66
+ <Button
67
+ block
68
+ icon={<Icon icon={PencilIcon} />}
69
+ onClick={async () => {
70
+ await updateSystemAgent(systemAgentKey, { customPrompt: defaultPrompt });
71
+ }}
72
+ >
73
+ {t('systemAgent.customPrompt.addPrompt')}
74
+ </Button>
75
+ ),
76
+ desc: t('systemAgent.customPrompt.desc'),
77
+ label: t('systemAgent.customPrompt.title'),
78
+ name: [systemAgentKey, 'customPrompt'],
79
+ }) as FormItemProps,
80
+ ].filter(Boolean),
81
+ extra: allowDisable && (
82
+ <Switch
83
+ onChange={(enabled) => {
84
+ updateSystemAgent(systemAgentKey, { enabled });
85
+ }}
86
+ value={value.enabled}
87
+ />
88
+ ),
89
+ title: (
90
+ <span
91
+ style={{
92
+ opacity: typeof value.enabled === 'boolean' && !value.enabled ? 0.45 : 1,
93
+ }}
94
+ >
95
+ {t(`systemAgent.${systemAgentKey}.title`)}
96
+ </span>
97
+ ),
98
+ };
99
+
100
+ useSyncSystemAgent(form, settings);
101
+
102
+ return (
103
+ <Form form={form} initialValues={settings} items={[systemAgentSettings]} {...FORM_STYLE} />
104
+ );
105
+ },
106
+ );
58
107
 
59
108
  export default SystemAgentForm;
@@ -1,11 +1,26 @@
1
+ 'use client';
2
+
3
+ import { DEFAULT_REWRITE_QUERY } from '@/const/settings';
4
+ import { isServerMode } from '@/const/version';
5
+ import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
6
+
1
7
  import SystemAgentForm from './features/createForm';
2
8
 
3
9
  const Page = () => {
10
+ const { enableKnowledgeBase } = useServerConfigStore(featureFlagsSelectors);
4
11
  return (
5
12
  <>
6
13
  <SystemAgentForm systemAgentKey="topic" />
7
14
  <SystemAgentForm systemAgentKey="translation" />
8
15
  <SystemAgentForm systemAgentKey="agentMeta" />
16
+ {isServerMode && enableKnowledgeBase && (
17
+ <SystemAgentForm
18
+ allowCustomPrompt
19
+ allowDisable
20
+ defaultPrompt={DEFAULT_REWRITE_QUERY}
21
+ systemAgentKey="queryRewrite"
22
+ />
23
+ )}
9
24
  </>
10
25
  );
11
26
  };
@@ -1,13 +1,14 @@
1
+ import { DEFAULT_REWRITE_QUERY } from '@/const/settings';
1
2
  import { ChatStreamPayload } from '@/types/openai/chat';
2
3
 
3
4
  export const chainRewriteQuery = (
4
5
  query: string,
5
6
  context: string[],
7
+ instruction: string = DEFAULT_REWRITE_QUERY,
6
8
  ): Partial<ChatStreamPayload> => ({
7
9
  messages: [
8
10
  {
9
- content: `Given the following conversation and a follow-up question, rephrase the follow up question to be a standalone question, in its original language. Keep as much details as possible from previous messages. Keep entity names and all.
10
-
11
+ content: `${instruction}
11
12
  <chatHistory>
12
13
  ${context.join('\n')}
13
14
  </chatHistory>
@@ -0,0 +1,42 @@
1
+ import { Input } from 'antd';
2
+ import { TextAreaProps as Props, TextAreaRef } from 'antd/es/input/TextArea';
3
+ import { memo, useRef, useState } from 'react';
4
+
5
+ interface TextAreaProps extends Omit<Props, 'onChange'> {
6
+ onChange?: (value: string) => void;
7
+ }
8
+
9
+ const TextArea = memo<TextAreaProps>(({ onChange, value: defaultValue, ...props }) => {
10
+ const ref = useRef<TextAreaRef>(null);
11
+ const isChineseInput = useRef(false);
12
+
13
+ const [value, setValue] = useState(defaultValue as string);
14
+
15
+ return (
16
+ <Input.TextArea
17
+ onBlur={() => {
18
+ onChange?.(value);
19
+ }}
20
+ onChange={(e) => {
21
+ setValue(e.target.value);
22
+ }}
23
+ onCompositionEnd={() => {
24
+ isChineseInput.current = false;
25
+ }}
26
+ onCompositionStart={() => {
27
+ isChineseInput.current = true;
28
+ }}
29
+ onPressEnter={() => {
30
+ if (isChineseInput.current) return;
31
+ onChange?.(value);
32
+ }}
33
+ ref={ref}
34
+ {...props}
35
+ value={value}
36
+ />
37
+ );
38
+ });
39
+
40
+ TextArea.displayName = 'TextArea';
41
+
42
+ export default TextArea;
package/src/config/llm.ts CHANGED
@@ -24,6 +24,7 @@ export const getLLMConfig = () => {
24
24
 
25
25
  ENABLED_DEEPSEEK: z.boolean(),
26
26
  DEEPSEEK_API_KEY: z.string().optional(),
27
+ DEEPSEEK_MODEL_LIST: z.string().optional(),
27
28
 
28
29
  ENABLED_GOOGLE: z.boolean(),
29
30
  GOOGLE_API_KEY: z.string().optional(),
@@ -32,21 +33,26 @@ export const getLLMConfig = () => {
32
33
 
33
34
  ENABLED_MOONSHOT: z.boolean(),
34
35
  MOONSHOT_API_KEY: z.string().optional(),
36
+ MOONSHOT_MODEL_LIST: z.string().optional(),
35
37
  MOONSHOT_PROXY_URL: z.string().optional(),
36
38
 
37
39
  ENABLED_PERPLEXITY: z.boolean(),
38
40
  PERPLEXITY_API_KEY: z.string().optional(),
41
+ PERPLEXITY_MODEL_LIST: z.string().optional(),
39
42
  PERPLEXITY_PROXY_URL: z.string().optional(),
40
43
 
41
44
  ENABLED_ANTHROPIC: z.boolean(),
42
45
  ANTHROPIC_API_KEY: z.string().optional(),
46
+ ANTHROPIC_MODEL_LIST: z.string().optional(),
43
47
  ANTHROPIC_PROXY_URL: z.string().optional(),
44
48
 
45
49
  ENABLED_MINIMAX: z.boolean(),
50
+ MINIMAX_MODEL_LIST: z.string().optional(),
46
51
  MINIMAX_API_KEY: z.string().optional(),
47
52
 
48
53
  ENABLED_MISTRAL: z.boolean(),
49
54
  MISTRAL_API_KEY: z.string().optional(),
55
+ MISTRAL_MODEL_LIST: z.string().optional(),
50
56
 
51
57
  ENABLED_GROQ: z.boolean(),
52
58
  GROQ_API_KEY: z.string().optional(),
@@ -83,6 +89,7 @@ export const getLLMConfig = () => {
83
89
  ENABLED_WENXIN: z.boolean(),
84
90
  WENXIN_ACCESS_KEY: z.string().optional(),
85
91
  WENXIN_SECRET_KEY: z.string().optional(),
92
+ WENXIN_MODEL_LIST: z.string().optional(),
86
93
 
87
94
  ENABLED_OLLAMA: z.boolean(),
88
95
  OLLAMA_PROXY_URL: z.string().optional(),
@@ -94,6 +101,7 @@ export const getLLMConfig = () => {
94
101
 
95
102
  ENABLED_STEPFUN: z.boolean(),
96
103
  STEPFUN_API_KEY: z.string().optional(),
104
+ STEPFUN_MODEL_LIST: z.string().optional(),
97
105
 
98
106
  ENABLED_NOVITA: z.boolean(),
99
107
  NOVITA_API_KEY: z.string().optional(),
@@ -101,12 +109,15 @@ export const getLLMConfig = () => {
101
109
 
102
110
  ENABLED_BAICHUAN: z.boolean(),
103
111
  BAICHUAN_API_KEY: z.string().optional(),
112
+ BAICHUAN_MODEL_LIST: z.string().optional(),
104
113
 
105
114
  ENABLED_TAICHU: z.boolean(),
106
115
  TAICHU_API_KEY: z.string().optional(),
116
+ TAICHU_MODEL_LIST: z.string().optional(),
107
117
 
108
118
  ENABLED_AI360: z.boolean(),
109
119
  AI360_API_KEY: z.string().optional(),
120
+ AI360_MODEL_LIST: z.string().optional(),
110
121
 
111
122
  ENABLED_SILICONCLOUD: z.boolean(),
112
123
  SILICONCLOUD_API_KEY: z.string().optional(),
@@ -115,12 +126,15 @@ export const getLLMConfig = () => {
115
126
 
116
127
  ENABLED_UPSTAGE: z.boolean(),
117
128
  UPSTAGE_API_KEY: z.string().optional(),
129
+ UPSTAGE_MODEL_LIST: z.string().optional(),
118
130
 
119
131
  ENABLED_SPARK: z.boolean(),
120
132
  SPARK_API_KEY: z.string().optional(),
133
+ SPARK_MODEL_LIST: z.string().optional(),
121
134
 
122
135
  ENABLED_AI21: z.boolean(),
123
136
  AI21_API_KEY: z.string().optional(),
137
+ AI21_MODEL_LIST: z.string().optional(),
124
138
 
125
139
  ENABLED_HUNYUAN: z.boolean(),
126
140
  HUNYUAN_API_KEY: z.string().optional(),
@@ -151,6 +165,7 @@ export const getLLMConfig = () => {
151
165
 
152
166
  ENABLED_DEEPSEEK: !!process.env.DEEPSEEK_API_KEY,
153
167
  DEEPSEEK_API_KEY: process.env.DEEPSEEK_API_KEY,
168
+ DEEPSEEK_MODEL_LIST: process.env.DEEPSEEK_MODEL_LIST,
154
169
 
155
170
  ENABLED_GOOGLE: !!process.env.GOOGLE_API_KEY,
156
171
  GOOGLE_API_KEY: process.env.GOOGLE_API_KEY,
@@ -159,17 +174,21 @@ export const getLLMConfig = () => {
159
174
 
160
175
  ENABLED_PERPLEXITY: !!process.env.PERPLEXITY_API_KEY,
161
176
  PERPLEXITY_API_KEY: process.env.PERPLEXITY_API_KEY,
177
+ PERPLEXITY_MODEL_LIST: process.env.PERPLEXITY_MODEL_LIST,
162
178
  PERPLEXITY_PROXY_URL: process.env.PERPLEXITY_PROXY_URL,
163
179
 
164
180
  ENABLED_ANTHROPIC: !!process.env.ANTHROPIC_API_KEY,
165
181
  ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
182
+ ANTHROPIC_MODEL_LIST: process.env.ANTHROPIC_MODEL_LIST,
166
183
  ANTHROPIC_PROXY_URL: process.env.ANTHROPIC_PROXY_URL,
167
184
 
168
185
  ENABLED_MINIMAX: !!process.env.MINIMAX_API_KEY,
169
186
  MINIMAX_API_KEY: process.env.MINIMAX_API_KEY,
187
+ MINIMAX_MODEL_LIST: process.env.MINIMAX_MODEL_LIST,
170
188
 
171
189
  ENABLED_MISTRAL: !!process.env.MISTRAL_API_KEY,
172
190
  MISTRAL_API_KEY: process.env.MISTRAL_API_KEY,
191
+ MISTRAL_MODEL_LIST: process.env.MISTRAL_MODEL_LIST,
173
192
 
174
193
  ENABLED_OPENROUTER: !!process.env.OPENROUTER_API_KEY,
175
194
  OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY,
@@ -185,6 +204,7 @@ export const getLLMConfig = () => {
185
204
 
186
205
  ENABLED_MOONSHOT: !!process.env.MOONSHOT_API_KEY,
187
206
  MOONSHOT_API_KEY: process.env.MOONSHOT_API_KEY,
207
+ MOONSHOT_MODEL_LIST: process.env.MOONSHOT_MODEL_LIST,
188
208
  MOONSHOT_PROXY_URL: process.env.MOONSHOT_PROXY_URL,
189
209
 
190
210
  ENABLED_GROQ: !!process.env.GROQ_API_KEY,
@@ -210,6 +230,7 @@ export const getLLMConfig = () => {
210
230
  ENABLED_WENXIN: !!process.env.WENXIN_ACCESS_KEY && !!process.env.WENXIN_SECRET_KEY,
211
231
  WENXIN_ACCESS_KEY: process.env.WENXIN_ACCESS_KEY,
212
232
  WENXIN_SECRET_KEY: process.env.WENXIN_SECRET_KEY,
233
+ WENXIN_MODEL_LIST: process.env.WENXIN_MODEL_LIST,
213
234
 
214
235
  ENABLED_OLLAMA: process.env.ENABLED_OLLAMA !== '0',
215
236
  OLLAMA_PROXY_URL: process.env.OLLAMA_PROXY_URL || '',
@@ -221,6 +242,7 @@ export const getLLMConfig = () => {
221
242
 
222
243
  ENABLED_STEPFUN: !!process.env.STEPFUN_API_KEY,
223
244
  STEPFUN_API_KEY: process.env.STEPFUN_API_KEY,
245
+ STEPFUN_MODEL_LIST: process.env.STEPFUN_MODEL_LIST,
224
246
 
225
247
  ENABLED_NOVITA: !!process.env.NOVITA_API_KEY,
226
248
  NOVITA_API_KEY: process.env.NOVITA_API_KEY,
@@ -228,12 +250,15 @@ export const getLLMConfig = () => {
228
250
 
229
251
  ENABLED_BAICHUAN: !!process.env.BAICHUAN_API_KEY,
230
252
  BAICHUAN_API_KEY: process.env.BAICHUAN_API_KEY,
253
+ BAICHUAN_MODEL_LIST: process.env.BAICHUAN_MODEL_LIST,
231
254
 
232
255
  ENABLED_TAICHU: !!process.env.TAICHU_API_KEY,
233
256
  TAICHU_API_KEY: process.env.TAICHU_API_KEY,
257
+ TAICHU_MODEL_LIST: process.env.TAICHU_MODEL_LIST,
234
258
 
235
259
  ENABLED_AI360: !!process.env.AI360_API_KEY,
236
260
  AI360_API_KEY: process.env.AI360_API_KEY,
261
+ AI360_MODEL_LIST: process.env.AI360_MODEL_LIST,
237
262
 
238
263
  ENABLED_SILICONCLOUD: !!process.env.SILICONCLOUD_API_KEY,
239
264
  SILICONCLOUD_API_KEY: process.env.SILICONCLOUD_API_KEY,
@@ -242,12 +267,15 @@ export const getLLMConfig = () => {
242
267
 
243
268
  ENABLED_UPSTAGE: !!process.env.UPSTAGE_API_KEY,
244
269
  UPSTAGE_API_KEY: process.env.UPSTAGE_API_KEY,
270
+ UPSTAGE_MODEL_LIST: process.env.UPSTAGE_MODEL_LIST,
245
271
 
246
272
  ENABLED_SPARK: !!process.env.SPARK_API_KEY,
247
273
  SPARK_API_KEY: process.env.SPARK_API_KEY,
274
+ SPARK_MODEL_LIST: process.env.SPARK_MODEL_LIST,
248
275
 
249
276
  ENABLED_AI21: !!process.env.AI21_API_KEY,
250
277
  AI21_API_KEY: process.env.AI21_API_KEY,
278
+ AI21_MODEL_LIST: process.env.AI21_MODEL_LIST,
251
279
 
252
280
  ENABLED_HUNYUAN: !!process.env.HUNYUAN_API_KEY,
253
281
  HUNYUAN_API_KEY: process.env.HUNYUAN_API_KEY,
@@ -10,7 +10,7 @@ const Spark: ModelProviderCard = {
10
10
  displayName: 'Spark Lite',
11
11
  enabled: true,
12
12
  functionCall: false,
13
- id: 'general',
13
+ id: 'lite',
14
14
  maxOutput: 4096,
15
15
  tokens: 8192,
16
16
  },
@@ -30,14 +30,14 @@ const Spark: ModelProviderCard = {
30
30
  displayName: 'Spark Pro 128K',
31
31
  enabled: true,
32
32
  functionCall: false,
33
- id: 'Pro-128k',
33
+ id: 'pro-128k',
34
34
  maxOutput: 4096,
35
35
  tokens: 131_072,
36
36
  },
37
37
  {
38
38
  description:
39
39
  'Spark Max 为功能最为全面的版本,支持联网搜索及众多内置插件。其全面优化的核心能力以及系统角色设定和函数调用功能,使其在各种复杂应用场景中的表现极为优异和出色。',
40
- displayName: 'Spark 3.5 Max',
40
+ displayName: 'Spark Max',
41
41
  enabled: true,
42
42
  functionCall: false,
43
43
  id: 'generalv3.5',
@@ -47,10 +47,10 @@ const Spark: ModelProviderCard = {
47
47
  {
48
48
  description:
49
49
  'Spark Max 32K 配置了大上下文处理能力,更强的上下文理解和逻辑推理能力,支持32K tokens的文本输入,适用于长文档阅读、私有知识问答等场景',
50
- displayName: 'Spark 3.5 Max 32K',
50
+ displayName: 'Spark Max 32K',
51
51
  enabled: true,
52
52
  functionCall: false,
53
- id: 'Max-32k',
53
+ id: 'max-32k',
54
54
  maxOutput: 8192,
55
55
  tokens: 32_768,
56
56
  },
@@ -65,7 +65,7 @@ const Spark: ModelProviderCard = {
65
65
  tokens: 8192,
66
66
  },
67
67
  ],
68
- checkModel: 'general',
68
+ checkModel: 'lite',
69
69
  description:
70
70
  '科大讯飞星火大模型提供多领域、多语言的强大 AI 能力,利用先进的自然语言处理技术,构建适用于智能硬件、智慧医疗、智慧金融等多种垂直场景的创新应用。',
71
71
  id: 'spark',