@lobehub/chat 1.53.10 → 1.53.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 (62) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/locales/ar/modelProvider.json +2 -2
  4. package/locales/bg-BG/modelProvider.json +2 -2
  5. package/locales/de-DE/modelProvider.json +2 -2
  6. package/locales/en-US/modelProvider.json +2 -2
  7. package/locales/es-ES/modelProvider.json +2 -2
  8. package/locales/fa-IR/modelProvider.json +2 -2
  9. package/locales/fr-FR/modelProvider.json +2 -2
  10. package/locales/it-IT/modelProvider.json +2 -2
  11. package/locales/ja-JP/modelProvider.json +2 -2
  12. package/locales/ko-KR/modelProvider.json +2 -2
  13. package/locales/nl-NL/modelProvider.json +2 -2
  14. package/locales/pl-PL/modelProvider.json +2 -2
  15. package/locales/pt-BR/modelProvider.json +2 -2
  16. package/locales/ru-RU/modelProvider.json +2 -2
  17. package/locales/tr-TR/modelProvider.json +2 -2
  18. package/locales/vi-VN/modelProvider.json +2 -2
  19. package/locales/zh-CN/modelProvider.json +3 -3
  20. package/locales/zh-TW/modelProvider.json +2 -2
  21. package/package.json +1 -1
  22. package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +8 -8
  23. package/src/config/aiModels/spark.ts +9 -0
  24. package/src/libs/agent-runtime/ai360/index.ts +37 -21
  25. package/src/libs/agent-runtime/anthropic/index.ts +17 -5
  26. package/src/libs/agent-runtime/baichuan/index.ts +11 -2
  27. package/src/libs/agent-runtime/cloudflare/index.ts +22 -7
  28. package/src/libs/agent-runtime/deepseek/index.ts +29 -13
  29. package/src/libs/agent-runtime/fireworksai/index.ts +30 -18
  30. package/src/libs/agent-runtime/giteeai/index.ts +46 -30
  31. package/src/libs/agent-runtime/github/index.test.ts +0 -49
  32. package/src/libs/agent-runtime/github/index.ts +18 -6
  33. package/src/libs/agent-runtime/google/index.ts +17 -7
  34. package/src/libs/agent-runtime/groq/index.ts +43 -27
  35. package/src/libs/agent-runtime/higress/index.ts +45 -25
  36. package/src/libs/agent-runtime/huggingface/index.ts +20 -9
  37. package/src/libs/agent-runtime/hunyuan/index.ts +34 -18
  38. package/src/libs/agent-runtime/internlm/index.ts +27 -12
  39. package/src/libs/agent-runtime/lmstudio/index.ts +34 -0
  40. package/src/libs/agent-runtime/mistral/index.ts +24 -14
  41. package/src/libs/agent-runtime/moonshot/index.ts +28 -13
  42. package/src/libs/agent-runtime/novita/index.ts +35 -18
  43. package/src/libs/agent-runtime/ollama/index.test.ts +20 -1
  44. package/src/libs/agent-runtime/ollama/index.ts +33 -5
  45. package/src/libs/agent-runtime/openai/__snapshots__/index.test.ts.snap +108 -0
  46. package/src/libs/agent-runtime/openai/index.ts +43 -27
  47. package/src/libs/agent-runtime/openrouter/__snapshots__/index.test.ts.snap +39 -11
  48. package/src/libs/agent-runtime/openrouter/index.ts +51 -33
  49. package/src/libs/agent-runtime/qwen/index.ts +45 -29
  50. package/src/libs/agent-runtime/sensenova/index.ts +24 -6
  51. package/src/libs/agent-runtime/siliconcloud/index.ts +50 -34
  52. package/src/libs/agent-runtime/stepfun/index.ts +42 -26
  53. package/src/libs/agent-runtime/tencentcloud/index.ts +44 -0
  54. package/src/libs/agent-runtime/togetherai/index.ts +19 -6
  55. package/src/libs/agent-runtime/xai/index.ts +28 -13
  56. package/src/libs/agent-runtime/zeroone/index.ts +29 -13
  57. package/src/libs/agent-runtime/zhipu/index.test.ts +0 -9
  58. package/src/libs/agent-runtime/zhipu/index.ts +18 -6
  59. package/src/locales/default/modelProvider.ts +1 -2
  60. package/src/server/manifest.ts +2 -2
  61. package/src/libs/agent-runtime/zhipu/authToken.test.ts +0 -18
  62. package/src/libs/agent-runtime/zhipu/authToken.ts +0 -22
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.53.12](https://github.com/lobehub/lobe-chat/compare/v1.53.11...v1.53.12)
6
+
7
+ <sup>Released on **2025-02-14**</sup>
8
+
9
+ #### ♻ Code Refactoring
10
+
11
+ - **misc**: Improve model fetch behavior.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Code refactoring
19
+
20
+ - **misc**: Improve model fetch behavior, closes [#6055](https://github.com/lobehub/lobe-chat/issues/6055) ([4c2aaf6](https://github.com/lobehub/lobe-chat/commit/4c2aaf6))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
30
+ ### [Version 1.53.11](https://github.com/lobehub/lobe-chat/compare/v1.53.10...v1.53.11)
31
+
32
+ <sup>Released on **2025-02-13**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Fix provider form api key.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's fixed
44
+
45
+ - **misc**: Fix provider form api key, closes [#6115](https://github.com/lobehub/lobe-chat/issues/6115) ([d074238](https://github.com/lobehub/lobe-chat/commit/d074238))
46
+
47
+ </details>
48
+
49
+ <div align="right">
50
+
51
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
52
+
53
+ </div>
54
+
5
55
  ### [Version 1.53.10](https://github.com/lobehub/lobe-chat/compare/v1.53.9...v1.53.10)
6
56
 
7
57
  <sup>Released on **2025-02-13**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,22 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Improve model fetch behavior."
6
+ ]
7
+ },
8
+ "date": "2025-02-14",
9
+ "version": "1.53.12"
10
+ },
11
+ {
12
+ "children": {
13
+ "fixes": [
14
+ "Fix provider form api key."
15
+ ]
16
+ },
17
+ "date": "2025-02-13",
18
+ "version": "1.53.11"
19
+ },
2
20
  {
3
21
  "children": {
4
22
  "fixes": [
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "يرجى إدخال مفتاح API الخاص بك",
69
- "required": "يرجى إدخال مفتاح API الخاص بك",
70
69
  "title": "مفتاح API"
71
70
  },
72
71
  "basicTitle": "المعلومات الأساسية",
@@ -94,7 +93,8 @@
94
93
  "title": "اسم المزود"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "يرجى إدخال عنوان الطلب الخاص بك، إذا لم يتم إدخاله سيتم استخدام عنوان الطلب المقابل لـ SDK",
96
+ "placeholder": "يرجى إدخال عنوان الطلب الخاص بك",
97
+ "required": "يرجى إدخال عنوان الوكيل",
98
98
  "title": "عنوان الوكيل"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Моля, въведете вашия API ключ",
69
- "required": "Моля, въведете вашия API ключ",
70
69
  "title": "API ключ"
71
70
  },
72
71
  "basicTitle": "Основна информация",
@@ -94,7 +93,8 @@
94
93
  "title": "Име на доставчика"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Моля, въведете адреса на вашето запитване, ако не е попълнен, ще се използва съответния адрес на SDK",
96
+ "placeholder": "Моля, въведете адреса на вашето запитване",
97
+ "required": "Моля, въведете адреса на проксито",
98
98
  "title": "Адрес на прокси"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Bitte geben Sie Ihren API-Schlüssel ein",
69
- "required": "Bitte geben Sie Ihren API-Schlüssel ein",
70
69
  "title": "API-Schlüssel"
71
70
  },
72
71
  "basicTitle": "Grundinformationen",
@@ -94,7 +93,8 @@
94
93
  "title": "Name des Anbieters"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Bitte geben Sie Ihre Anforderungsadresse ein, wenn nicht angegeben, wird die entsprechende Anforderungsadresse des SDK verwendet",
96
+ "placeholder": "Bitte geben Sie Ihre Anforderungs-URL ein",
97
+ "required": "Bitte geben Sie die Proxy-Adresse ein",
98
98
  "title": "Proxy-Adresse"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Please enter your API Key",
69
- "required": "Please enter your API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Basic Information",
@@ -94,7 +93,8 @@
94
93
  "title": "Provider Name"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Please enter your request URL, if left blank, the corresponding SDK request URL will be used",
96
+ "placeholder": "Please enter your request URL",
97
+ "required": "Please enter the proxy address",
98
98
  "title": "Proxy URL"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Por favor, introduce tu API Key",
69
- "required": "Por favor, introduce tu API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Información básica",
@@ -94,7 +93,8 @@
94
93
  "title": "Nombre del proveedor"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Por favor, introduce tu dirección de solicitud, si no se completa, se usará la dirección de solicitud correspondiente del SDK",
96
+ "placeholder": "Por favor, introduce tu dirección de solicitud",
97
+ "required": "Por favor, introduce la dirección del proxy",
98
98
  "title": "Dirección del proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "لطفاً کلید API خود را وارد کنید",
69
- "required": "لطفاً کلید API خود را وارد کنید",
70
69
  "title": "کلید API"
71
70
  },
72
71
  "basicTitle": "اطلاعات پایه",
@@ -94,7 +93,8 @@
94
93
  "title": "نام ارائه‌دهنده"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "لطفاً آدرس درخواست خود را وارد کنید، در صورت عدم وارد کردن از آدرس درخواست مربوط به SDK استفاده خواهد شد",
96
+ "placeholder": "لطفاً آدرس درخواست خود را وارد کنید",
97
+ "required": "لطفاً آدرس پروکسی را وارد کنید",
98
98
  "title": "آدرس پروکسی"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Veuillez entrer votre clé API",
69
- "required": "Veuillez entrer votre clé API",
70
69
  "title": "Clé API"
71
70
  },
72
71
  "basicTitle": "Informations de base",
@@ -94,7 +93,8 @@
94
93
  "title": "Nom du fournisseur"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Veuillez entrer votre adresse de requête, sinon l'adresse de requête correspondante au SDK sera utilisée",
96
+ "placeholder": "Veuillez saisir votre adresse de requête",
97
+ "required": "Veuillez remplir l'adresse du proxy",
98
98
  "title": "Adresse du proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Inserisci la tua API Key",
69
- "required": "Inserisci la tua API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Informazioni di base",
@@ -94,7 +93,8 @@
94
93
  "title": "Nome del fornitore"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Inserisci il tuo indirizzo di richiesta, se non specificato verrà utilizzato l'indirizzo di richiesta corrispondente all'SDK",
96
+ "placeholder": "Inserisci il tuo URL di richiesta",
97
+ "required": "Inserisci l'indirizzo del proxy",
98
98
  "title": "Indirizzo proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "あなたの API キーを入力してください",
69
- "required": "あなたの API キーを入力してください",
70
69
  "title": "API キー"
71
70
  },
72
71
  "basicTitle": "基本情報",
@@ -94,7 +93,8 @@
94
93
  "title": "サービスプロバイダー名"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "リクエストアドレスを入力してください。未入力の場合は SDK に対応するリクエストアドレスが使用されます",
96
+ "placeholder": "リクエストURLを入力してください",
97
+ "required": "プロキシURLを入力してください",
98
98
  "title": "プロキシアドレス"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "API 키를 입력하세요",
69
- "required": "API 키를 입력하세요",
70
69
  "title": "API 키"
71
70
  },
72
71
  "basicTitle": "기본 정보",
@@ -94,7 +93,8 @@
94
93
  "title": "서비스 제공자 이름"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "요청 주소를 입력하세요, 입력하지 않으면 SDK의 요청 주소가 사용됩니다",
96
+ "placeholder": "요청 주소를 입력하세요",
97
+ "required": "프록시 주소를 입력하세요",
98
98
  "title": "프록시 주소"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Vul je API-sleutel in",
69
- "required": "Vul je API-sleutel in",
70
69
  "title": "API-sleutel"
71
70
  },
72
71
  "basicTitle": "Basisinformatie",
@@ -94,7 +93,8 @@
94
93
  "title": "Naam van de provider"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Vul je aanvraagadres in, als je dit niet invult, wordt het overeenkomstige aanvraagadres van de SDK gebruikt",
96
+ "placeholder": "Vul je verzoekadres in",
97
+ "required": "Vul het proxyadres in",
98
98
  "title": "Proxy-adres"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Proszę wpisać swój klucz API",
69
- "required": "Proszę wpisać swój klucz API",
70
69
  "title": "Klucz API"
71
70
  },
72
71
  "basicTitle": "Podstawowe informacje",
@@ -94,7 +93,8 @@
94
93
  "title": "Nazwa dostawcy"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Proszę wpisać adres żądania, jeśli nie zostanie podany, użyty zostanie odpowiedni adres żądania SDK",
96
+ "placeholder": "Proszę wpisać adres żądania",
97
+ "required": "Proszę wpisać adres proxy",
98
98
  "title": "Adres proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Por favor, insira sua API Key",
69
- "required": "Por favor, insira sua API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Informações Básicas",
@@ -94,7 +93,8 @@
94
93
  "title": "Nome do Provedor"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Por favor, insira seu endereço de requisição, se não for preenchido, será usado o endereço correspondente do SDK",
96
+ "placeholder": "Por favor, insira o seu endereço de solicitação",
97
+ "required": "Por favor, insira o endereço do proxy",
98
98
  "title": "Endereço do Proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Пожалуйста, введите ваш API Key",
69
- "required": "Пожалуйста, введите ваш API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Основная информация",
@@ -94,7 +93,8 @@
94
93
  "title": "Имя провайдера"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Пожалуйста, введите ваш адрес запроса, если не заполните, будет использован соответствующий адрес SDK",
96
+ "placeholder": "Пожалуйста, введите ваш адрес запроса",
97
+ "required": "Пожалуйста, введите адрес прокси",
98
98
  "title": "Адрес прокси"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Lütfen API Anahtarınızı girin",
69
- "required": "Lütfen API Anahtarınızı girin",
70
69
  "title": "API Anahtarı"
71
70
  },
72
71
  "basicTitle": "Temel Bilgiler",
@@ -94,7 +93,8 @@
94
93
  "title": "Hizmet Sağlayıcı Adı"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Lütfen istek adresinizi girin, boş bırakılırsa SDK'nın ilgili istek adresi kullanılacaktır",
96
+ "placeholder": "Lütfen istek adresinizi girin",
97
+ "required": "Lütfen proxy adresini girin",
98
98
  "title": "Proxy Adresi"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "Vui lòng nhập API Key của bạn",
69
- "required": "Vui lòng nhập API Key của bạn",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "Thông tin cơ bản",
@@ -94,7 +93,8 @@
94
93
  "title": "Tên nhà cung cấp"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "Vui lòng nhập địa chỉ yêu cầu của bạn, nếu không sẽ sử dụng địa chỉ yêu cầu tương ứng của SDK",
96
+ "placeholder": "Vui lòng nhập địa chỉ yêu cầu của bạn",
97
+ "required": "Vui lòng nhập địa chỉ proxy",
98
98
  "title": "Địa chỉ proxy"
99
99
  },
100
100
  "sdkType": {
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "请填写你的 API Key",
69
- "required": "请填写你的 API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "基本信息",
@@ -94,7 +93,8 @@
94
93
  "title": "服务商名称"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "请填写你的请求地址,如果不填则会使用 SDK 对应的请求地址",
96
+ "placeholder": "请填写你的请求地址",
97
+ "required": "请填写代理地址",
98
98
  "title": "代理地址"
99
99
  },
100
100
  "sdkType": {
@@ -305,4 +305,4 @@
305
305
  "zhipu": {
306
306
  "title": "智谱"
307
307
  }
308
- }
308
+ }
@@ -66,7 +66,6 @@
66
66
  "createNewAiProvider": {
67
67
  "apiKey": {
68
68
  "placeholder": "請填寫你的 API Key",
69
- "required": "請填寫你的 API Key",
70
69
  "title": "API Key"
71
70
  },
72
71
  "basicTitle": "基本資訊",
@@ -94,7 +93,8 @@
94
93
  "title": "服務商名稱"
95
94
  },
96
95
  "proxyUrl": {
97
- "placeholder": "請填寫你的請求地址,如果不填則會使用 SDK 對應的請求地址",
96
+ "placeholder": "請填寫你的請求地址",
97
+ "required": "請填寫代理地址",
98
98
  "title": "代理地址"
99
99
  },
100
100
  "sdkType": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.53.10",
3
+ "version": "1.53.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",
@@ -91,6 +91,7 @@ const CreateNewProvider = memo<CreateNewProviderProps>(({ onClose, open }) => {
91
91
  options={[
92
92
  { label: 'OpenAI', value: 'openai' },
93
93
  { label: 'Anthropic', value: 'anthropic' },
94
+ { label: 'Ollama', value: 'ollama' },
94
95
  ]}
95
96
  />
96
97
  ),
@@ -98,6 +99,13 @@ const CreateNewProvider = memo<CreateNewProviderProps>(({ onClose, open }) => {
98
99
  name: 'sdkType',
99
100
  rules: [{ message: t('createNewAiProvider.sdkType.required'), required: true }],
100
101
  },
102
+ {
103
+ children: <Input allowClear placeholder={'https://xxxx-proxy.com/v1'} variant={'filled'} />,
104
+ label: t('createNewAiProvider.proxyUrl.title'),
105
+ minWidth: 400,
106
+ name: [KeyVaultsConfigKey, LLMProviderBaseUrlKey],
107
+ rules: [{ message: t('createNewAiProvider.proxyUrl.required'), required: true }],
108
+ },
101
109
  {
102
110
  children: (
103
111
  <Input.Password
@@ -109,14 +117,6 @@ const CreateNewProvider = memo<CreateNewProviderProps>(({ onClose, open }) => {
109
117
  label: t('createNewAiProvider.apiKey.title'),
110
118
  minWidth: 400,
111
119
  name: [KeyVaultsConfigKey, LLMProviderApiTokenKey],
112
- rules: [{ message: t('createNewAiProvider.apiKey.required'), required: true }],
113
- },
114
- {
115
- children: <Input allowClear placeholder={'https://xxxx-proxy.com/v1'} variant={'filled'} />,
116
- desc: t('createNewAiProvider.proxyUrl.placeholder'),
117
- label: t('createNewAiProvider.proxyUrl.title'),
118
- minWidth: 400,
119
- name: [KeyVaultsConfigKey, LLMProviderBaseUrlKey],
120
120
  },
121
121
  ];
122
122
 
@@ -32,6 +32,9 @@ const sparkChatModels: AIChatModelCard[] = [
32
32
  type: 'chat',
33
33
  },
34
34
  {
35
+ abilities: {
36
+ functionCall: true,
37
+ },
35
38
  contextWindowTokens: 8192,
36
39
  description:
37
40
  'Spark Max 为功能最为全面的版本,支持联网搜索及众多内置插件。其全面优化的核心能力以及系统角色设定和函数调用功能,使其在各种复杂应用场景中的表现极为优异和出色。',
@@ -42,6 +45,9 @@ const sparkChatModels: AIChatModelCard[] = [
42
45
  type: 'chat',
43
46
  },
44
47
  {
48
+ abilities: {
49
+ functionCall: true,
50
+ },
45
51
  contextWindowTokens: 32_768,
46
52
  description:
47
53
  'Spark Max 32K 配置了大上下文处理能力,更强的上下文理解和逻辑推理能力,支持32K tokens的文本输入,适用于长文档阅读、私有知识问答等场景',
@@ -52,6 +58,9 @@ const sparkChatModels: AIChatModelCard[] = [
52
58
  type: 'chat',
53
59
  },
54
60
  {
61
+ abilities: {
62
+ functionCall: true,
63
+ },
55
64
  contextWindowTokens: 8192,
56
65
  description:
57
66
  'Spark Ultra 是星火大模型系列中最为强大的版本,在升级联网搜索链路同时,提升对文本内容的理解和总结能力。它是用于提升办公生产力和准确响应需求的全方位解决方案,是引领行业的智能产品。',
@@ -1,7 +1,7 @@
1
1
  import { ModelProvider } from '../types';
2
2
  import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';
3
3
 
4
- import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels';
4
+ import type { ChatModelCard } from '@/types/llm';
5
5
 
6
6
  export interface Ai360ModelCard {
7
7
  id: string;
@@ -22,28 +22,44 @@ export const LobeAi360AI = LobeOpenAICompatibleFactory({
22
22
  debug: {
23
23
  chatCompletion: () => process.env.DEBUG_AI360_CHAT_COMPLETION === '1',
24
24
  },
25
- models: {
26
- transformModel: (m) => {
27
- const reasoningKeywords = [
28
- '360gpt2-o1',
29
- '360zhinao2-o1',
30
- ];
25
+ models: async ({ client }) => {
26
+ const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
31
27
 
32
- const model = m as unknown as Ai360ModelCard;
28
+ const reasoningKeywords = [
29
+ '360gpt2-o1',
30
+ '360zhinao2-o1',
31
+ ];
33
32
 
34
- return {
35
- contextWindowTokens: model.total_tokens,
36
- displayName: LOBE_DEFAULT_MODEL_LIST.find((m) => model.id === m.id)?.displayName ?? undefined,
37
- enabled: LOBE_DEFAULT_MODEL_LIST.find((m) => model.id === m.id)?.enabled || false,
38
- functionCall: model.id === '360gpt-pro',
39
- id: model.id,
40
- maxTokens:
41
- typeof model.max_tokens === 'number'
42
- ? model.max_tokens
43
- : undefined,
44
- reasoning: reasoningKeywords.some(keyword => model.id.toLowerCase().includes(keyword)),
45
- };
46
- },
33
+ const modelsPage = await client.models.list() as any;
34
+ const modelList: Ai360ModelCard[] = modelsPage.data;
35
+
36
+ return modelList
37
+ .map((model) => {
38
+ const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.toLowerCase() === m.id.toLowerCase());
39
+
40
+ return {
41
+ contextWindowTokens: model.total_tokens,
42
+ displayName: knownModel?.displayName ?? undefined,
43
+ enabled: knownModel?.enabled || false,
44
+ functionCall:
45
+ model.id === '360gpt-pro'
46
+ || knownModel?.abilities?.functionCall
47
+ || false,
48
+ id: model.id,
49
+ maxTokens:
50
+ typeof model.max_tokens === 'number'
51
+ ? model.max_tokens
52
+ : undefined,
53
+ reasoning:
54
+ reasoningKeywords.some(keyword => model.id.toLowerCase().includes(keyword))
55
+ || knownModel?.abilities?.reasoning
56
+ || false,
57
+ vision:
58
+ knownModel?.abilities?.vision
59
+ || false,
60
+ };
61
+ })
62
+ .filter(Boolean) as ChatModelCard[];
47
63
  },
48
64
  provider: ModelProvider.Ai360,
49
65
  });
@@ -13,7 +13,6 @@ import { buildAnthropicMessages, buildAnthropicTools } from '../utils/anthropicH
13
13
  import { StreamingResponse } from '../utils/response';
14
14
  import { AnthropicStream } from '../utils/streams';
15
15
 
16
- import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels';
17
16
  import type { ChatModelCard } from '@/types/llm';
18
17
 
19
18
  export interface AnthropicModelCard {
@@ -114,6 +113,8 @@ export class LobeAnthropicAI implements LobeRuntimeAI {
114
113
  }
115
114
 
116
115
  async models() {
116
+ const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
117
+
117
118
  const url = `${this.baseURL}/v1/models`;
118
119
  const response = await fetch(url, {
119
120
  headers: {
@@ -128,13 +129,24 @@ export class LobeAnthropicAI implements LobeRuntimeAI {
128
129
 
129
130
  return modelList
130
131
  .map((model) => {
132
+ const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.toLowerCase() === m.id.toLowerCase());
133
+
131
134
  return {
132
- contextWindowTokens: LOBE_DEFAULT_MODEL_LIST.find((m) => model.id === m.id)?.contextWindowTokens ?? undefined,
135
+ contextWindowTokens: knownModel?.contextWindowTokens ?? undefined,
133
136
  displayName: model.display_name,
134
- enabled: LOBE_DEFAULT_MODEL_LIST.find((m) => model.id === m.id)?.enabled || false,
135
- functionCall: model.id.toLowerCase().includes('claude-3'),
137
+ enabled: knownModel?.enabled || false,
138
+ functionCall:
139
+ model.id.toLowerCase().includes('claude-3')
140
+ || knownModel?.abilities?.functionCall
141
+ || false,
136
142
  id: model.id,
137
- vision: model.id.toLowerCase().includes('claude-3') && !model.id.toLowerCase().includes('claude-3-5-haiku'),
143
+ reasoning:
144
+ knownModel?.abilities?.reasoning
145
+ || false,
146
+ vision:
147
+ model.id.toLowerCase().includes('claude-3') && !model.id.toLowerCase().includes('claude-3-5-haiku')
148
+ || knownModel?.abilities?.vision
149
+ || false,
138
150
  };
139
151
  })
140
152
  .filter(Boolean) as ChatModelCard[];
@@ -3,7 +3,6 @@ import OpenAI from 'openai';
3
3
  import { ChatStreamPayload, ModelProvider } from '../types';
4
4
  import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';
5
5
 
6
- import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels';
7
6
  import type { ChatModelCard } from '@/types/llm';
8
7
 
9
8
  export interface BaichuanModelCard {
@@ -32,18 +31,28 @@ export const LobeBaichuanAI = LobeOpenAICompatibleFactory({
32
31
  chatCompletion: () => process.env.DEBUG_BAICHUAN_CHAT_COMPLETION === '1',
33
32
  },
34
33
  models: async ({ client }) => {
34
+ const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
35
+
35
36
  const modelsPage = await client.models.list() as any;
36
37
  const modelList: BaichuanModelCard[] = modelsPage.data;
37
38
 
38
39
  return modelList
39
40
  .map((model) => {
41
+ const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.model.toLowerCase() === m.id.toLowerCase());
42
+
40
43
  return {
41
44
  contextWindowTokens: model.max_input_length,
42
45
  displayName: model.model_show_name,
43
- enabled: LOBE_DEFAULT_MODEL_LIST.find((m) => model.model === m.id)?.enabled || false,
46
+ enabled: knownModel?.enabled || false,
44
47
  functionCall: model.function_call,
45
48
  id: model.model,
46
49
  maxTokens: model.max_tokens,
50
+ reasoning:
51
+ knownModel?.abilities?.reasoning
52
+ || false,
53
+ vision:
54
+ knownModel?.abilities?.vision
55
+ || false,
47
56
  };
48
57
  })
49
58
  .filter(Boolean) as ChatModelCard[];