mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-17 04:55:51 +00:00
🐛 fix: fix model fetch for spark and fix the support of model reset (#6080)
* fix spark fetch issue * fix lint
This commit is contained in:
@@ -276,6 +276,11 @@
|
||||
"latestTime": "آخر تحديث: {{time}}",
|
||||
"noLatestTime": "لم يتم الحصول على القائمة بعد"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "هل أنت متأكد من إعادة تعيين جميع التعديلات على النموذج الحالي؟ بعد إعادة التعيين، ستعود قائمة النماذج الحالية إلى الحالة الافتراضية",
|
||||
"success": "تمت إعادة التعيين بنجاح",
|
||||
"title": "إعادة تعيين جميع التعديلات"
|
||||
},
|
||||
"search": "ابحث عن نموذج...",
|
||||
"searchResult": "تم العثور على {{count}} نموذج",
|
||||
"title": "قائمة النماذج",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Последно обновление: {{time}}",
|
||||
"noLatestTime": "Все още не е получен списък"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Потвърдете ли, че искате да нулирате всички промени в текущия модел? След нулирането списъкът с текущи модели ще се върне в първоначалното си състояние",
|
||||
"success": "Успешно нулирано",
|
||||
"title": "Нулиране на всички промени"
|
||||
},
|
||||
"search": "Търсене на модели...",
|
||||
"searchResult": "Намерени са {{count}} модела",
|
||||
"title": "Списък с модели",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Letzte Aktualisierung: {{time}}",
|
||||
"noLatestTime": "Liste wurde noch nicht abgerufen"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Möchten Sie alle Änderungen am aktuellen Modell wirklich zurücksetzen? Nach dem Zurücksetzen wird die aktuelle Modellliste auf den Standardzustand zurückgesetzt.",
|
||||
"success": "Zurücksetzen erfolgreich",
|
||||
"title": "Alle Änderungen zurücksetzen"
|
||||
},
|
||||
"search": "Modelle suchen...",
|
||||
"searchResult": "{{count}} Modelle gefunden",
|
||||
"title": "Modellliste",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Last updated: {{time}}",
|
||||
"noLatestTime": "Model list not yet fetched"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Are you sure you want to reset all modifications to the current model? After resetting, the current model list will return to its default state.",
|
||||
"success": "Reset successful",
|
||||
"title": "Reset All Modifications"
|
||||
},
|
||||
"search": "Search Models...",
|
||||
"searchResult": "{{count}} models found",
|
||||
"title": "Model List",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Última actualización: {{time}}",
|
||||
"noLatestTime": "Lista aún no obtenida"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "¿Confirmar el restablecimiento de todas las modificaciones del modelo actual? Después del restablecimiento, la lista de modelos actuales volverá al estado predeterminado",
|
||||
"success": "Restablecimiento exitoso",
|
||||
"title": "Restablecer todas las modificaciones"
|
||||
},
|
||||
"search": "Buscar modelos...",
|
||||
"searchResult": "Se encontraron {{count}} modelos",
|
||||
"title": "Lista de modelos",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "آخرین زمان بهروزرسانی: {{time}}",
|
||||
"noLatestTime": "لیست هنوز دریافت نشده است"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "آیا مطمئن هستید که میخواهید تمام تغییرات مدل فعلی را بازنشانی کنید؟ پس از بازنشانی، لیست مدلهای فعلی به حالت پیشفرض باز خواهد گشت",
|
||||
"success": "بازنشانی با موفقیت انجام شد",
|
||||
"title": "بازنشانی تمام تغییرات"
|
||||
},
|
||||
"search": "جستجوی مدل...",
|
||||
"searchResult": "{{count}} مدل پیدا شد",
|
||||
"title": "لیست مدلها",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Dernière mise à jour : {{time}}",
|
||||
"noLatestTime": "Aucune liste récupérée pour le moment"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Êtes-vous sûr de vouloir réinitialiser toutes les modifications du modèle actuel ? Après la réinitialisation, la liste des modèles actuels reviendra à l'état par défaut",
|
||||
"success": "Réinitialisation réussie",
|
||||
"title": "Réinitialiser toutes les modifications"
|
||||
},
|
||||
"search": "Rechercher des modèles...",
|
||||
"searchResult": "Trouvé {{count}} modèle(s)",
|
||||
"title": "Liste des modèles",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Ultimo aggiornamento: {{time}}",
|
||||
"noLatestTime": "Nessun elenco recuperato finora"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Sei sicuro di voler ripristinare tutte le modifiche al modello corrente? Dopo il ripristino, l'elenco dei modelli correnti tornerà allo stato predefinito",
|
||||
"success": "Ripristino avvenuto con successo",
|
||||
"title": "Ripristina tutte le modifiche"
|
||||
},
|
||||
"search": "Cerca modelli...",
|
||||
"searchResult": "Trovati {{count}} modelli",
|
||||
"title": "Elenco dei modelli",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "最終更新日時:{{time}}",
|
||||
"noLatestTime": "まだリストを取得していません"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "現在のモデルのすべての変更をリセットしてもよろしいですか?リセット後、現在のモデルリストはデフォルトの状態に戻ります",
|
||||
"success": "リセットに成功しました",
|
||||
"title": "すべての変更をリセット"
|
||||
},
|
||||
"search": "モデルを検索...",
|
||||
"searchResult": "{{count}} 個のモデルが見つかりました",
|
||||
"title": "モデルリスト",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "마지막 업데이트 시간: {{time}}",
|
||||
"noLatestTime": "아직 목록을 가져오지 않았습니다."
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "현재 모델의 모든 수정을 초기화하시겠습니까? 초기화 후 현재 모델 목록은 기본 상태로 돌아갑니다.",
|
||||
"success": "초기화 성공",
|
||||
"title": "모든 수정 초기화"
|
||||
},
|
||||
"search": "모델 검색...",
|
||||
"searchResult": "{{count}} 개의 모델이 검색되었습니다",
|
||||
"title": "모델 목록",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Laatste update tijd: {{time}}",
|
||||
"noLatestTime": "Lijst nog niet opgehaald"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Weet je zeker dat je alle wijzigingen van het huidige model wilt resetten? Na de reset zal de huidige modellenlijst terugkeren naar de standaardstatus",
|
||||
"success": "Resetten geslaagd",
|
||||
"title": "Reset alle wijzigingen"
|
||||
},
|
||||
"search": "Zoek modellen...",
|
||||
"searchResult": "Gevonden {{count}} modellen",
|
||||
"title": "Modellenlijst",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Ostatnia aktualizacja: {{time}}",
|
||||
"noLatestTime": "Lista nie została jeszcze pobrana"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Czy na pewno chcesz zresetować wszystkie zmiany w bieżącym modelu? Po zresetowaniu lista modeli wróci do stanu domyślnego",
|
||||
"success": "Resetowanie zakończone sukcesem",
|
||||
"title": "Zresetuj wszystkie zmiany"
|
||||
},
|
||||
"search": "Szukaj modeli...",
|
||||
"searchResult": "Znaleziono {{count}} modeli",
|
||||
"title": "Lista modeli",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Última atualização: {{time}}",
|
||||
"noLatestTime": "Lista ainda não obtida"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Você tem certeza de que deseja redefinir todas as modificações do modelo atual? Após a redefinição, a lista de modelos atuais voltará ao estado padrão",
|
||||
"success": "Redefinição bem-sucedida",
|
||||
"title": "Redefinir todas as modificações"
|
||||
},
|
||||
"search": "Pesquisar modelos...",
|
||||
"searchResult": "Encontrados {{count}} modelos",
|
||||
"title": "Lista de Modelos",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Последнее обновление: {{time}}",
|
||||
"noLatestTime": "Список еще не получен"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Вы уверены, что хотите сбросить все изменения текущей модели? После сброса список текущих моделей вернется к состоянию по умолчанию",
|
||||
"success": "Сброс выполнен успешно",
|
||||
"title": "Сбросить все изменения"
|
||||
},
|
||||
"search": "Поиск моделей...",
|
||||
"searchResult": "Найдено {{count}} моделей",
|
||||
"title": "Список моделей",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Son güncelleme zamanı: {{time}}",
|
||||
"noLatestTime": "Henüz liste alınmadı"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Mevcut modelin tüm değişikliklerini sıfırlamak istediğinize emin misiniz? Sıfırladıktan sonra mevcut model listesi varsayılan duruma dönecektir.",
|
||||
"success": "Sıfırlama başarılı",
|
||||
"title": "Tüm değişiklikleri sıfırla"
|
||||
},
|
||||
"search": "Model ara...",
|
||||
"searchResult": "{{count}} model bulundu",
|
||||
"title": "Model Listesi",
|
||||
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "Thời gian cập nhật lần cuối: {{time}}",
|
||||
"noLatestTime": "Chưa lấy danh sách"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "Xác nhận việc đặt lại tất cả các thay đổi của mô hình hiện tại? Sau khi đặt lại, danh sách mô hình hiện tại sẽ trở về trạng thái mặc định",
|
||||
"success": "Đặt lại thành công",
|
||||
"title": "Đặt lại tất cả các thay đổi"
|
||||
},
|
||||
"search": "Tìm kiếm mô hình...",
|
||||
"searchResult": "Tìm thấy {{count}} mô hình",
|
||||
"title": "Danh sách mô hình",
|
||||
|
||||
@@ -84,4 +84,4 @@
|
||||
"security": "安全",
|
||||
"stats": "数据统计"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,4 +15,4 @@
|
||||
"title": "更新日志",
|
||||
"versionDetails": "版本详情",
|
||||
"welcomeBack": "欢迎回来!"
|
||||
}
|
||||
}
|
||||
@@ -181,4 +181,4 @@
|
||||
}
|
||||
},
|
||||
"zenMode": "专注模式"
|
||||
}
|
||||
}
|
||||
@@ -766,4 +766,4 @@
|
||||
"title": "添加 Web3 钱包"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -301,4 +301,4 @@
|
||||
"usages": "用量统计"
|
||||
},
|
||||
"version": "版本"
|
||||
}
|
||||
}
|
||||
@@ -115,4 +115,4 @@
|
||||
"thought": "已深度思考(用时 {{duration}} 秒)",
|
||||
"thoughtWithDuration": "已深度思考"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -205,4 +205,4 @@
|
||||
"plugins": "插件",
|
||||
"providers": "模型服务商"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,4 +139,4 @@
|
||||
"unknownError": "错误原因: {{reason}}",
|
||||
"uploadFailed": "文件上传失败"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,4 +91,4 @@
|
||||
"uploading": "正在上传"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,4 +29,4 @@
|
||||
"testing": "召回测试"
|
||||
},
|
||||
"title": "知识库"
|
||||
}
|
||||
}
|
||||
@@ -36,4 +36,4 @@
|
||||
"description": "{{appName}} 带给你最好的 ChatGPT, Claude , Gemini, OLLaMA WebUI 使用体验",
|
||||
"title": "欢迎使用 {{appName}}:个人 AI 效能工具,给自己一个更聪明的大脑"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -42,4 +42,4 @@
|
||||
"missVersion": "导入数据缺少版本号,请检查文件后重试",
|
||||
"noMigration": "没有找到当前版本对应的迁移方案,请检查版本号后重试。如仍有问题请提交问题反馈"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "上次更新时间:{{time}}",
|
||||
"noLatestTime": "暂未获取列表"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "确认重置当前模型的所有修改?重置后当前模型列表将会回到默认状态",
|
||||
"success": "重置成功",
|
||||
"title": "重置所有修改"
|
||||
},
|
||||
"search": "搜索模型...",
|
||||
"searchResult": "搜索到 {{count}} 个模型",
|
||||
"title": "模型列表",
|
||||
@@ -300,4 +305,4 @@
|
||||
"zhipu": {
|
||||
"title": "智谱"
|
||||
}
|
||||
}
|
||||
}
|
||||
+1289
-1289
File diff suppressed because it is too large
Load Diff
@@ -163,4 +163,4 @@
|
||||
"title": "插件商店"
|
||||
},
|
||||
"unknownPlugin": "未知插件"
|
||||
}
|
||||
}
|
||||
@@ -32,4 +32,4 @@
|
||||
"files": "文件",
|
||||
"messageDetail": "消息详情",
|
||||
"title": "工作区"
|
||||
}
|
||||
}
|
||||
@@ -1,122 +1,122 @@
|
||||
{
|
||||
"ai21": {
|
||||
"description": "AI21 Labs 为企业构建基础模型和人工智能系统,加速生成性人工智能在生产中的应用。"
|
||||
},
|
||||
"ai360": {
|
||||
"description": "360 AI 是 360 公司推出的 AI 模型和服务平台,提供多种先进的自然语言处理模型,包括 360GPT2 Pro、360GPT Pro、360GPT Turbo 和 360GPT Turbo Responsibility 8K。这些模型结合了大规模参数和多模态能力,广泛应用于文本生成、语义理解、对话系统与代码生成等领域。通过灵活的定价策略,360 AI 满足多样化用户需求,支持开发者集成,推动智能化应用的革新和发展。"
|
||||
},
|
||||
"anthropic": {
|
||||
"description": "Anthropic 是一家专注于人工智能研究和开发的公司,提供了一系列先进的语言模型,如 Claude 3.5 Sonnet、Claude 3 Sonnet、Claude 3 Opus 和 Claude 3 Haiku。这些模型在智能、速度和成本之间取得了理想的平衡,适用于从企业级工作负载到快速响应的各种应用场景。Claude 3.5 Sonnet 作为其最新模型,在多项评估中表现优异,同时保持了较高的性价比。"
|
||||
"openai": {
|
||||
"description": "OpenAI 是全球领先的人工智能研究机构,其开发的模型如GPT系列推动了自然语言处理的前沿。OpenAI 致力于通过创新和高效的AI解决方案改变多个行业。他们的产品具有显著的性能和经济性,广泛用于研究、商业和创新应用。"
|
||||
},
|
||||
"azure": {
|
||||
"description": "Azure 提供多种先进的AI模型,包括GPT-3.5和最新的GPT-4系列,支持多种数据类型和复杂任务,致力于安全、可靠和可持续的AI解决方案。"
|
||||
},
|
||||
"baichuan": {
|
||||
"description": "百川智能是一家专注于人工智能大模型研发的公司,其模型在国内知识百科、长文本处理和生成创作等中文任务上表现卓越,超越了国外主流模型。百川智能还具备行业领先的多模态能力,在多项权威评测中表现优异。其模型包括 Baichuan 4、Baichuan 3 Turbo 和 Baichuan 3 Turbo 128k 等,分别针对不同应用场景进行优化,提供高性价比的解决方案。"
|
||||
"ollama": {
|
||||
"description": "Ollama 提供的模型广泛涵盖代码生成、数学运算、多语种处理和对话互动等领域,支持企业级和本地化部署的多样化需求。"
|
||||
},
|
||||
"anthropic": {
|
||||
"description": "Anthropic 是一家专注于人工智能研究和开发的公司,提供了一系列先进的语言模型,如 Claude 3.5 Sonnet、Claude 3 Sonnet、Claude 3 Opus 和 Claude 3 Haiku。这些模型在智能、速度和成本之间取得了理想的平衡,适用于从企业级工作负载到快速响应的各种应用场景。Claude 3.5 Sonnet 作为其最新模型,在多项评估中表现优异,同时保持了较高的性价比。"
|
||||
},
|
||||
"bedrock": {
|
||||
"description": "Bedrock 是亚马逊 AWS 提供的一项服务,专注于为企业提供先进的 AI 语言模型和视觉模型。其模型家族包括 Anthropic 的 Claude 系列、Meta 的 Llama 3.1 系列等,涵盖从轻量级到高性能的多种选择,支持文本生成、对话、图像处理等多种任务,适用于不同规模和需求的企业应用。"
|
||||
},
|
||||
"cloudflare": {
|
||||
"description": "在 Cloudflare 的全球网络上运行由无服务器 GPU 驱动的机器学习模型。"
|
||||
"google": {
|
||||
"description": "Google 的 Gemini 系列是其最先进、通用的 AI模型,由 Google DeepMind 打造,专为多模态设计,支持文本、代码、图像、音频和视频的无缝理解与处理。适用于从数据中心到移动设备的多种环境,极大提升了AI模型的效率与应用广泛性。"
|
||||
},
|
||||
"deepseek": {
|
||||
"description": "DeepSeek 是一家专注于人工智能技术研究和应用的公司,其最新模型 DeepSeek-V3 多项评测成绩超越 Qwen2.5-72B 和 Llama-3.1-405B 等开源模型,性能对齐领军闭源模型 GPT-4o 与 Claude-3.5-Sonnet。"
|
||||
},
|
||||
"doubao": {
|
||||
"description": "字节跳动推出的自研大模型。通过字节跳动内部50+业务场景实践验证,每日万亿级tokens大使用量持续打磨,提供多种模态能力,以优质模型效果为企业打造丰富的业务体验。"
|
||||
},
|
||||
"fireworksai": {
|
||||
"description": "Fireworks AI 是一家领先的高级语言模型服务商,专注于功能调用和多模态处理。其最新模型 Firefunction V2 基于 Llama-3,优化用于函数调用、对话及指令跟随。视觉语言模型 FireLLaVA-13B 支持图像和文本混合输入。其他 notable 模型包括 Llama 系列和 Mixtral 系列,提供高效的多语言指令跟随与生成支持。"
|
||||
},
|
||||
"giteeai": {
|
||||
"description": "Gitee AI 的 Serverless API 为 AI 开发者提供开箱即用的大模型推理 API 服务。"
|
||||
},
|
||||
"github": {
|
||||
"description": "通过GitHub模型,开发人员可以成为AI工程师,并使用行业领先的AI模型进行构建。"
|
||||
},
|
||||
"google": {
|
||||
"description": "Google 的 Gemini 系列是其最先进、通用的 AI模型,由 Google DeepMind 打造,专为多模态设计,支持文本、代码、图像、音频和视频的无缝理解与处理。适用于从数据中心到移动设备的多种环境,极大提升了AI模型的效率与应用广泛性。"
|
||||
},
|
||||
"groq": {
|
||||
"description": "Groq 的 LPU 推理引擎在最新的独立大语言模型(LLM)基准测试中表现卓越,以其惊人的速度和效率重新定义了 AI 解决方案的标准。Groq 是一种即时推理速度的代表,在基于云的部署中展现了良好的性能。"
|
||||
},
|
||||
"higress": {
|
||||
"description": "Higress 是一款云原生 API 网关,在阿里内部为解决 Tengine reload 对长连接业务有损,以及 gRPC/Dubbo 负载均衡能力不足而诞生。"
|
||||
},
|
||||
"huggingface": {
|
||||
"description": "HuggingFace Inference API 提供了一种快速且免费的方式,让您可以探索成千上万种模型,适用于各种任务。无论您是在为新应用程序进行原型设计,还是在尝试机器学习的功能,这个 API 都能让您即时访问多个领域的高性能模型。"
|
||||
},
|
||||
"hunyuan": {
|
||||
"description": "由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力"
|
||||
},
|
||||
"internlm": {
|
||||
"description": "致力于大模型研究与开发工具链的开源组织。为所有 AI 开发者提供高效、易用的开源平台,让最前沿的大模型与算法技术触手可及"
|
||||
},
|
||||
"lmstudio": {
|
||||
"description": "LM Studio 是一个用于在您的计算机上开发和实验 LLMs 的桌面应用程序。"
|
||||
},
|
||||
"minimax": {
|
||||
"description": "MiniMax 是 2021 年成立的通用人工智能科技公司,致力于与用户共创智能。MiniMax 自主研发了不同模态的通用大模型,其中包括万亿参数的 MoE 文本大模型、语音大模型以及图像大模型。并推出了海螺 AI 等应用。"
|
||||
},
|
||||
"mistral": {
|
||||
"description": "Mistral 提供先进的通用、专业和研究型模型,广泛应用于复杂推理、多语言任务、代码生成等领域,通过功能调用接口,用户可以集成自定义功能,实现特定应用。"
|
||||
},
|
||||
"moonshot": {
|
||||
"description": "Moonshot 是由北京月之暗面科技有限公司推出的开源平台,提供多种自然语言处理模型,应用领域广泛,包括但不限于内容创作、学术研究、智能推荐、医疗诊断等,支持长文本处理和复杂生成任务。"
|
||||
},
|
||||
"novita": {
|
||||
"description": "Novita AI 是一个提供多种大语言模型与 AI 图像生成的 API 服务的平台,灵活、可靠且具有成本效益。它支持 Llama3、Mistral 等最新的开源模型,并为生成式 AI 应用开发提供了全面、用户友好且自动扩展的 API 解决方案,适合 AI 初创公司的快速发展。"
|
||||
},
|
||||
"ollama": {
|
||||
"description": "Ollama 提供的模型广泛涵盖代码生成、数学运算、多语种处理和对话互动等领域,支持企业级和本地化部署的多样化需求。"
|
||||
},
|
||||
"openai": {
|
||||
"description": "OpenAI 是全球领先的人工智能研究机构,其开发的模型如GPT系列推动了自然语言处理的前沿。OpenAI 致力于通过创新和高效的AI解决方案改变多个行业。他们的产品具有显著的性能和经济性,广泛用于研究、商业和创新应用。"
|
||||
},
|
||||
"openrouter": {
|
||||
"description": "OpenRouter 是一个提供多种前沿大模型接口的服务平台,支持 OpenAI、Anthropic、LLaMA 及更多,适合多样化的开发和应用需求。用户可根据自身需求灵活选择最优的模型和价格,助力AI体验的提升。"
|
||||
},
|
||||
"perplexity": {
|
||||
"description": "Perplexity 是一家领先的对话生成模型提供商,提供多种先进的Llama 3.1模型,支持在线和离线应用,特别适用于复杂的自然语言处理任务。"
|
||||
"cloudflare": {
|
||||
"description": "在 Cloudflare 的全球网络上运行由无服务器 GPU 驱动的机器学习模型。"
|
||||
},
|
||||
"qwen": {
|
||||
"description": "通义千问是阿里云自主研发的超大规模语言模型,具有强大的自然语言理解和生成能力。它可以回答各种问题、创作文字内容、表达观点看法、撰写代码等,在多个领域发挥作用。"
|
||||
"github": {
|
||||
"description": "通过GitHub模型,开发人员可以成为AI工程师,并使用行业领先的AI模型进行构建。"
|
||||
},
|
||||
"sensenova": {
|
||||
"description": "商汤日日新,依托商汤大装置的强大的基础支撑,提供高效易用的全栈大模型服务。"
|
||||
},
|
||||
"siliconcloud": {
|
||||
"description": "SiliconCloud,基于优秀开源基础模型的高性价比 GenAI 云服务"
|
||||
},
|
||||
"spark": {
|
||||
"description": "科大讯飞星火大模型提供多领域、多语言的强大 AI 能力,利用先进的自然语言处理技术,构建适用于智能硬件、智慧医疗、智慧金融等多种垂直场景的创新应用。"
|
||||
},
|
||||
"stepfun": {
|
||||
"description": "阶级星辰大模型具备行业领先的多模态及复杂推理能力,支持超长文本理解和强大的自主调度搜索引擎功能。"
|
||||
},
|
||||
"taichu": {
|
||||
"description": "中科院自动化研究所和武汉人工智能研究院推出新一代多模态大模型,支持多轮问答、文本创作、图像生成、3D理解、信号分析等全面问答任务,拥有更强的认知、理解、创作能力,带来全新互动体验。"
|
||||
},
|
||||
"tencentcloud": {
|
||||
"description": "知识引擎原子能力(LLM Knowledge Engine Atomic Power)基于知识引擎研发的知识问答全链路能力,面向企业及开发者,提供灵活组建及开发模型应用的能力。您可通过多款原子能力组建您专属的模型服务,调用文档解析、拆分、embedding、多轮改写等服务进行组装,定制企业专属 AI 业务。"
|
||||
"novita": {
|
||||
"description": "Novita AI 是一个提供多种大语言模型与 AI 图像生成的 API 服务的平台,灵活、可靠且具有成本效益。它支持 Llama3、Mistral 等最新的开源模型,并为生成式 AI 应用开发提供了全面、用户友好且自动扩展的 API 解决方案,适合 AI 初创公司的快速发展。"
|
||||
},
|
||||
"togetherai": {
|
||||
"description": "Together AI 致力于通过创新的 AI 模型实现领先的性能,提供广泛的自定义能力,包括快速扩展支持和直观的部署流程,满足企业的各种需求。"
|
||||
},
|
||||
"fireworksai": {
|
||||
"description": "Fireworks AI 是一家领先的高级语言模型服务商,专注于功能调用和多模态处理。其最新模型 Firefunction V2 基于 Llama-3,优化用于函数调用、对话及指令跟随。视觉语言模型 FireLLaVA-13B 支持图像和文本混合输入。其他 notable 模型包括 Llama 系列和 Mixtral 系列,提供高效的多语言指令跟随与生成支持。"
|
||||
},
|
||||
"groq": {
|
||||
"description": "Groq 的 LPU 推理引擎在最新的独立大语言模型(LLM)基准测试中表现卓越,以其惊人的速度和效率重新定义了 AI 解决方案的标准。Groq 是一种即时推理速度的代表,在基于云的部署中展现了良好的性能。"
|
||||
},
|
||||
"perplexity": {
|
||||
"description": "Perplexity 是一家领先的对话生成模型提供商,提供多种先进的Llama 3.1模型,支持在线和离线应用,特别适用于复杂的自然语言处理任务。"
|
||||
},
|
||||
"mistral": {
|
||||
"description": "Mistral 提供先进的通用、专业和研究型模型,广泛应用于复杂推理、多语言任务、代码生成等领域,通过功能调用接口,用户可以集成自定义功能,实现特定应用。"
|
||||
},
|
||||
"ai21": {
|
||||
"description": "AI21 Labs 为企业构建基础模型和人工智能系统,加速生成性人工智能在生产中的应用。"
|
||||
},
|
||||
"upstage": {
|
||||
"description": "Upstage 专注于为各种商业需求开发AI模型,包括 Solar LLM 和文档 AI,旨在实现工作的人造通用智能(AGI)。通过 Chat API 创建简单的对话代理,并支持功能调用、翻译、嵌入以及特定领域应用。"
|
||||
},
|
||||
"wenxin": {
|
||||
"description": "企业级一站式大模型与AI原生应用开发及服务平台,提供最全面易用的生成式人工智能模型开发、应用开发全流程工具链"
|
||||
},
|
||||
"xai": {
|
||||
"description": "xAI 是一家致力于构建人工智能以加速人类科学发现的公司。我们的使命是推动我们对宇宙的共同理解。"
|
||||
},
|
||||
"zeroone": {
|
||||
"description": "零一万物致力于推动以人为本的AI 2.0技术革命,旨在通过大语言模型创造巨大的经济和社会价值,并开创新的AI生态与商业模式。"
|
||||
"qwen": {
|
||||
"description": "通义千问是阿里云自主研发的超大规模语言模型,具有强大的自然语言理解和生成能力。它可以回答各种问题、创作文字内容、表达观点看法、撰写代码等,在多个领域发挥作用。"
|
||||
},
|
||||
"wenxin": {
|
||||
"description": "企业级一站式大模型与AI原生应用开发及服务平台,提供最全面易用的生成式人工智能模型开发、应用开发全流程工具链"
|
||||
},
|
||||
"tencentcloud": {
|
||||
"description": "知识引擎原子能力(LLM Knowledge Engine Atomic Power)基于知识引擎研发的知识问答全链路能力,面向企业及开发者,提供灵活组建及开发模型应用的能力。您可通过多款原子能力组建您专属的模型服务,调用文档解析、拆分、embedding、多轮改写等服务进行组装,定制企业专属 AI 业务。"
|
||||
},
|
||||
"hunyuan": {
|
||||
"description": "由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力"
|
||||
},
|
||||
"zhipu": {
|
||||
"description": "智谱 AI 提供多模态与语言模型的开放平台,支持广泛的AI应用场景,包括文本处理、图像理解与编程辅助等。"
|
||||
},
|
||||
"siliconcloud": {
|
||||
"description": "SiliconCloud,基于优秀开源基础模型的高性价比 GenAI 云服务"
|
||||
},
|
||||
"zeroone": {
|
||||
"description": "零一万物致力于推动以人为本的AI 2.0技术革命,旨在通过大语言模型创造巨大的经济和社会价值,并开创新的AI生态与商业模式。"
|
||||
},
|
||||
"spark": {
|
||||
"description": "科大讯飞星火大模型提供多领域、多语言的强大 AI 能力,利用先进的自然语言处理技术,构建适用于智能硬件、智慧医疗、智慧金融等多种垂直场景的创新应用。"
|
||||
},
|
||||
"sensenova": {
|
||||
"description": "商汤日日新,依托商汤大装置的强大的基础支撑,提供高效易用的全栈大模型服务。"
|
||||
},
|
||||
"stepfun": {
|
||||
"description": "阶级星辰大模型具备行业领先的多模态及复杂推理能力,支持超长文本理解和强大的自主调度搜索引擎功能。"
|
||||
},
|
||||
"moonshot": {
|
||||
"description": "Moonshot 是由北京月之暗面科技有限公司推出的开源平台,提供多种自然语言处理模型,应用领域广泛,包括但不限于内容创作、学术研究、智能推荐、医疗诊断等,支持长文本处理和复杂生成任务。"
|
||||
},
|
||||
"baichuan": {
|
||||
"description": "百川智能是一家专注于人工智能大模型研发的公司,其模型在国内知识百科、长文本处理和生成创作等中文任务上表现卓越,超越了国外主流模型。百川智能还具备行业领先的多模态能力,在多项权威评测中表现优异。其模型包括 Baichuan 4、Baichuan 3 Turbo 和 Baichuan 3 Turbo 128k 等,分别针对不同应用场景进行优化,提供高性价比的解决方案。"
|
||||
},
|
||||
"minimax": {
|
||||
"description": "MiniMax 是 2021 年成立的通用人工智能科技公司,致力于与用户共创智能。MiniMax 自主研发了不同模态的通用大模型,其中包括万亿参数的 MoE 文本大模型、语音大模型以及图像大模型。并推出了海螺 AI 等应用。"
|
||||
},
|
||||
"lmstudio": {
|
||||
"description": "LM Studio 是一个用于在您的计算机上开发和实验 LLMs 的桌面应用程序。"
|
||||
},
|
||||
"internlm": {
|
||||
"description": "致力于大模型研究与开发工具链的开源组织。为所有 AI 开发者提供高效、易用的开源平台,让最前沿的大模型与算法技术触手可及"
|
||||
},
|
||||
"higress": {
|
||||
"description": "Higress 是一款云原生 API 网关,在阿里内部为解决 Tengine reload 对长连接业务有损,以及 gRPC/Dubbo 负载均衡能力不足而诞生。"
|
||||
},
|
||||
"giteeai": {
|
||||
"description": "Gitee AI 的 Serverless API 为 AI 开发者提供开箱即用的大模型推理 API 服务。"
|
||||
},
|
||||
"taichu": {
|
||||
"description": "中科院自动化研究所和武汉人工智能研究院推出新一代多模态大模型,支持多轮问答、文本创作、图像生成、3D理解、信号分析等全面问答任务,拥有更强的认知、理解、创作能力,带来全新互动体验。"
|
||||
},
|
||||
"ai360": {
|
||||
"description": "360 AI 是 360 公司推出的 AI 模型和服务平台,提供多种先进的自然语言处理模型,包括 360GPT2 Pro、360GPT Pro、360GPT Turbo 和 360GPT Turbo Responsibility 8K。这些模型结合了大规模参数和多模态能力,广泛应用于文本生成、语义理解、对话系统与代码生成等领域。通过灵活的定价策略,360 AI 满足多样化用户需求,支持开发者集成,推动智能化应用的革新和发展。"
|
||||
},
|
||||
"doubao": {
|
||||
"description": "字节跳动推出的自研大模型。通过字节跳动内部50+业务场景实践验证,每日万亿级tokens大使用量持续打磨,提供多种模态能力,以优质模型效果为企业打造丰富的业务体验。"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -88,4 +88,4 @@
|
||||
"title": "评测任务列表"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -441,4 +441,4 @@
|
||||
},
|
||||
"title": "扩展插件"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,4 +7,4 @@
|
||||
"title": "开启新的子话题"
|
||||
},
|
||||
"notSupportMultiModals": "子话题暂不支持文件/图片上传,如有需求,欢迎留言:<1>💬 讨论区</1>"
|
||||
}
|
||||
}
|
||||
@@ -7,4 +7,4 @@
|
||||
"images": "图片:",
|
||||
"prompt": "提示词"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,4 +34,4 @@
|
||||
"searchPlaceholder": "搜索话题...",
|
||||
"temp": "临时",
|
||||
"title": "话题"
|
||||
}
|
||||
}
|
||||
@@ -42,4 +42,4 @@
|
||||
"desc2": "创建你的第一个助手,让我们开始吧~",
|
||||
"title": "给自己一个更聪明的大脑"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,6 +276,11 @@
|
||||
"latestTime": "上次更新時間:{{time}}",
|
||||
"noLatestTime": "尚未取得列表"
|
||||
},
|
||||
"resetAll": {
|
||||
"conform": "確認重置當前模型的所有修改?重置後當前模型列表將會回到預設狀態",
|
||||
"success": "重置成功",
|
||||
"title": "重置所有修改"
|
||||
},
|
||||
"search": "搜尋模型...",
|
||||
"searchResult": "搜尋到 {{count}} 個模型",
|
||||
"title": "模型列表",
|
||||
|
||||
@@ -3,7 +3,7 @@ import { ActionIcon, Tag, copyToClipboard } from '@lobehub/ui';
|
||||
import { App, Switch, Typography } from 'antd';
|
||||
import { createStyles, useTheme } from 'antd-style';
|
||||
import { LucidePencil, TrashIcon } from 'lucide-react';
|
||||
import { memo, useState } from 'react';
|
||||
import { memo, use, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
|
||||
@@ -14,6 +14,7 @@ import { AiModelSourceEnum, AiProviderModelListItem, ChatModelPricing } from '@/
|
||||
import { formatPriceByCurrency } from '@/utils/format';
|
||||
|
||||
import ModelConfigModal from './ModelConfigModal';
|
||||
import { ProviderSettingsContext } from './ProviderSettingsContext';
|
||||
|
||||
export const useStyles = createStyles(({ css, token, cx }) => {
|
||||
const config = css`
|
||||
@@ -74,6 +75,7 @@ const ModelItem = memo<ModelItemProps>(
|
||||
const { styles } = useStyles();
|
||||
const { t } = useTranslation(['modelProvider', 'components', 'models', 'common']);
|
||||
const theme = useTheme();
|
||||
const { modelEditable } = use(ProviderSettingsContext);
|
||||
|
||||
const [activeAiProvider, isModelLoading, toggleModelEnabled, removeAiModel] = useAiInfraStore(
|
||||
(s) => [
|
||||
@@ -191,40 +193,42 @@ const ModelItem = memo<ModelItemProps>(
|
||||
</Flexbox>
|
||||
</Flexbox>
|
||||
<Flexbox align={'center'} gap={4} horizontal>
|
||||
<Flexbox className={styles.config} horizontal style={{ opacity: 1 }}>
|
||||
<ActionIcon
|
||||
icon={LucidePencil}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
setShowConfig(true);
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.config')}
|
||||
/>
|
||||
{source !== AiModelSourceEnum.Builtin && (
|
||||
{modelEditable && (
|
||||
<Flexbox className={styles.config} horizontal style={{ opacity: 1 }}>
|
||||
<ActionIcon
|
||||
icon={TrashIcon}
|
||||
onClick={() => {
|
||||
modal.confirm({
|
||||
centered: true,
|
||||
okButtonProps: {
|
||||
danger: true,
|
||||
type: 'primary',
|
||||
},
|
||||
onOk: async () => {
|
||||
await removeAiModel(id, activeAiProvider!);
|
||||
message.success(t('providerModels.item.delete.success'));
|
||||
},
|
||||
title: t('providerModels.item.delete.confirm', {
|
||||
displayName: displayName || id,
|
||||
}),
|
||||
});
|
||||
icon={LucidePencil}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
setShowConfig(true);
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.delete.title')}
|
||||
title={t('providerModels.item.config')}
|
||||
/>
|
||||
)}
|
||||
</Flexbox>
|
||||
{source !== AiModelSourceEnum.Builtin && (
|
||||
<ActionIcon
|
||||
icon={TrashIcon}
|
||||
onClick={() => {
|
||||
modal.confirm({
|
||||
centered: true,
|
||||
okButtonProps: {
|
||||
danger: true,
|
||||
type: 'primary',
|
||||
},
|
||||
onOk: async () => {
|
||||
await removeAiModel(id, activeAiProvider!);
|
||||
message.success(t('providerModels.item.delete.success'));
|
||||
},
|
||||
title: t('providerModels.item.delete.confirm', {
|
||||
displayName: displayName || id,
|
||||
}),
|
||||
});
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.delete.title')}
|
||||
/>
|
||||
)}
|
||||
</Flexbox>
|
||||
)}
|
||||
<Switch
|
||||
checked={checked}
|
||||
loading={isModelLoading}
|
||||
@@ -254,40 +258,42 @@ const ModelItem = memo<ModelItemProps>(
|
||||
<Tag onClick={copyModelId} style={{ cursor: 'pointer', marginRight: 0 }}>
|
||||
{id}
|
||||
</Tag>
|
||||
<Flexbox className={styles.config} horizontal>
|
||||
<ActionIcon
|
||||
icon={LucidePencil}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
setShowConfig(true);
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.config')}
|
||||
/>
|
||||
{source !== AiModelSourceEnum.Builtin && (
|
||||
{modelEditable && (
|
||||
<Flexbox className={styles.config} horizontal>
|
||||
<ActionIcon
|
||||
icon={TrashIcon}
|
||||
onClick={() => {
|
||||
modal.confirm({
|
||||
centered: true,
|
||||
okButtonProps: {
|
||||
danger: true,
|
||||
type: 'primary',
|
||||
},
|
||||
onOk: async () => {
|
||||
await removeAiModel(id, activeAiProvider!);
|
||||
message.success(t('providerModels.item.delete.success'));
|
||||
},
|
||||
title: t('providerModels.item.delete.confirm', {
|
||||
displayName: displayName || id,
|
||||
}),
|
||||
});
|
||||
icon={LucidePencil}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
setShowConfig(true);
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.delete.title')}
|
||||
title={t('providerModels.item.config')}
|
||||
/>
|
||||
)}
|
||||
</Flexbox>
|
||||
{source !== AiModelSourceEnum.Builtin && (
|
||||
<ActionIcon
|
||||
icon={TrashIcon}
|
||||
onClick={() => {
|
||||
modal.confirm({
|
||||
centered: true,
|
||||
okButtonProps: {
|
||||
danger: true,
|
||||
type: 'primary',
|
||||
},
|
||||
onOk: async () => {
|
||||
await removeAiModel(id, activeAiProvider!);
|
||||
message.success(t('providerModels.item.delete.success'));
|
||||
},
|
||||
title: t('providerModels.item.delete.confirm', {
|
||||
displayName: displayName || id,
|
||||
}),
|
||||
});
|
||||
}}
|
||||
size={'small'}
|
||||
title={t('providerModels.item.delete.title')}
|
||||
/>
|
||||
)}
|
||||
</Flexbox>
|
||||
)}
|
||||
</Flexbox>
|
||||
<Flexbox align={'baseline'} gap={8} horizontal>
|
||||
{content.length > 0 && (
|
||||
|
||||
+37
-10
@@ -1,7 +1,7 @@
|
||||
import { ActionIcon, Icon } from '@lobehub/ui';
|
||||
import { Button, Skeleton, Space, Typography } from 'antd';
|
||||
import { App, Button, Dropdown, Skeleton, Space, Typography } from 'antd';
|
||||
import { useTheme } from 'antd-style';
|
||||
import { CircleX, LucideRefreshCcwDot, PlusIcon } from 'lucide-react';
|
||||
import { CircleX, EllipsisVertical, LucideRefreshCcwDot, PlusIcon } from 'lucide-react';
|
||||
import { memo, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
@@ -23,6 +23,7 @@ const ModelTitle = memo<ModelFetcherProps>(
|
||||
({ provider, showAddNewModel = true, showModelFetcher = true }) => {
|
||||
const theme = useTheme();
|
||||
const { t } = useTranslation('modelProvider');
|
||||
const { modal, message } = App.useApp();
|
||||
const [
|
||||
searchKeyword,
|
||||
totalModels,
|
||||
@@ -30,6 +31,7 @@ const ModelTitle = memo<ModelFetcherProps>(
|
||||
hasRemoteModels,
|
||||
fetchRemoteModelList,
|
||||
clearObtainedModels,
|
||||
clearModelsByProvider,
|
||||
useFetchAiProviderModels,
|
||||
] = useAiInfraStore((s) => [
|
||||
s.modelSearchKeyword,
|
||||
@@ -38,6 +40,7 @@ const ModelTitle = memo<ModelFetcherProps>(
|
||||
aiModelSelectors.hasRemoteModels(s),
|
||||
s.fetchRemoteModelList,
|
||||
s.clearRemoteModels,
|
||||
s.clearModelsByProvider,
|
||||
s.useFetchAiProviderModels,
|
||||
]);
|
||||
|
||||
@@ -123,15 +126,39 @@ const ModelTitle = memo<ModelFetcherProps>(
|
||||
</Button>
|
||||
)}
|
||||
{showAddNewModel && (
|
||||
<Button
|
||||
icon={<Icon icon={PlusIcon} />}
|
||||
onClick={() => {
|
||||
setShowModal(true);
|
||||
}}
|
||||
size={'small'}
|
||||
/>
|
||||
<>
|
||||
<Button
|
||||
icon={<Icon icon={PlusIcon} />}
|
||||
onClick={() => {
|
||||
setShowModal(true);
|
||||
}}
|
||||
size={'small'}
|
||||
/>
|
||||
<CreateNewModelModal open={showModal} setOpen={setShowModal} />
|
||||
</>
|
||||
)}
|
||||
<CreateNewModelModal open={showModal} setOpen={setShowModal} />
|
||||
<Dropdown
|
||||
menu={{
|
||||
items: [
|
||||
{
|
||||
key: 'reset',
|
||||
label: t('providerModels.list.resetAll.title'),
|
||||
onClick: async () => {
|
||||
modal.confirm({
|
||||
content: t('providerModels.list.resetAll.conform'),
|
||||
onOk: async () => {
|
||||
await clearModelsByProvider(provider);
|
||||
message.success(t('providerModels.list.resetAll.success'));
|
||||
},
|
||||
title: t('providerModels.list.resetAll.title'),
|
||||
});
|
||||
},
|
||||
},
|
||||
],
|
||||
}}
|
||||
>
|
||||
<Button icon={<Icon icon={EllipsisVertical} />} size={'small'} />
|
||||
</Dropdown>
|
||||
</Space.Compact>
|
||||
</Flexbox>
|
||||
)}
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
import { createContext } from 'react';
|
||||
|
||||
export interface ProviderSettingsContextValue {
|
||||
modelEditable?: boolean;
|
||||
showAddNewModel?: boolean;
|
||||
showModelFetcher?: boolean;
|
||||
}
|
||||
|
||||
export const ProviderSettingsContext = createContext<ProviderSettingsContextValue>({});
|
||||
@@ -3,6 +3,7 @@
|
||||
import { Suspense, memo } from 'react';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
|
||||
import { ProviderSettingsContext } from '@/app/[variants]/(main)/settings/provider/features/ModelList/ProviderSettingsContext';
|
||||
import { useIsMobile } from '@/hooks/useIsMobile';
|
||||
import { aiModelSelectors, useAiInfraStore } from '@/store/aiInfra';
|
||||
|
||||
@@ -13,7 +14,11 @@ import ModelTitle from './ModelTitle';
|
||||
import SearchResult from './SearchResult';
|
||||
import SkeletonList from './SkeletonList';
|
||||
|
||||
const Content = memo<{ id: string }>(({ id }) => {
|
||||
interface ContentProps {
|
||||
id: string;
|
||||
}
|
||||
|
||||
const Content = memo<ContentProps>(({ id }) => {
|
||||
const [isSearching, isEmpty, useFetchAiProviderModels] = useAiInfraStore((s) => [
|
||||
!!s.modelSearchKeyword,
|
||||
aiModelSelectors.isEmptyAiProviderModelList(s),
|
||||
@@ -38,25 +43,30 @@ const Content = memo<{ id: string }>(({ id }) => {
|
||||
|
||||
interface ModelListProps {
|
||||
id: string;
|
||||
modelEditable?: boolean;
|
||||
showAddNewModel?: boolean;
|
||||
showModelFetcher?: boolean;
|
||||
}
|
||||
|
||||
const ModelList = memo<ModelListProps>(({ id, showModelFetcher, showAddNewModel }) => {
|
||||
const mobile = useIsMobile();
|
||||
const ModelList = memo<ModelListProps>(
|
||||
({ id, showModelFetcher, showAddNewModel, modelEditable = true }) => {
|
||||
const mobile = useIsMobile();
|
||||
|
||||
return (
|
||||
<Flexbox gap={16} paddingInline={mobile ? 12 : 0}>
|
||||
<ModelTitle
|
||||
provider={id}
|
||||
showAddNewModel={showAddNewModel}
|
||||
showModelFetcher={showModelFetcher}
|
||||
/>
|
||||
<Suspense fallback={<SkeletonList />}>
|
||||
<Content id={id} />
|
||||
</Suspense>
|
||||
</Flexbox>
|
||||
);
|
||||
});
|
||||
return (
|
||||
<ProviderSettingsContext value={{ modelEditable, showAddNewModel, showModelFetcher }}>
|
||||
<Flexbox gap={16} paddingInline={mobile ? 12 : 0}>
|
||||
<ModelTitle
|
||||
provider={id}
|
||||
showAddNewModel={showAddNewModel}
|
||||
showModelFetcher={showModelFetcher}
|
||||
/>
|
||||
<Suspense fallback={<SkeletonList />}>
|
||||
<Content id={id} />
|
||||
</Suspense>
|
||||
</Flexbox>
|
||||
</ProviderSettingsContext>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
export default ModelList;
|
||||
|
||||
@@ -69,7 +69,9 @@ const Spark: ModelProviderCard = {
|
||||
modelsUrl: 'https://xinghuo.xfyun.cn/spark',
|
||||
name: 'Spark',
|
||||
settings: {
|
||||
modelEditable: false,
|
||||
sdkType: 'openai',
|
||||
showModelFetcher: false,
|
||||
smoothing: {
|
||||
speed: 2,
|
||||
text: true,
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import pkg from '@/../package.json';
|
||||
import { getServerDBConfig } from '@/config/db';
|
||||
|
||||
import { BRANDING_NAME, ORG_NAME } from './branding';
|
||||
|
||||
export const CURRENT_VERSION = pkg.version;
|
||||
|
||||
export const isServerMode = getServerDBConfig().NEXT_PUBLIC_ENABLED_SERVER_SERVICE;
|
||||
export const isServerMode = process.env.NEXT_PUBLIC_SERVICE_MODE === 'server';
|
||||
export const isUsePgliteDB = process.env.NEXT_PUBLIC_CLIENT_DB === 'pglite';
|
||||
|
||||
export const isDeprecatedEdition = !isServerMode && !isUsePgliteDB;
|
||||
|
||||
@@ -197,6 +197,12 @@ export class AiModelModel {
|
||||
);
|
||||
}
|
||||
|
||||
clearModelsByProvider(providerId: string) {
|
||||
return this.db
|
||||
.delete(aiModels)
|
||||
.where(and(eq(aiModels.providerId, providerId), eq(aiModels.userId, this.userId)));
|
||||
}
|
||||
|
||||
updateModelsOrder = async (providerId: string, sortMap: AiModelSortMap[]) => {
|
||||
await this.db.transaction(async (tx) => {
|
||||
const updates = sortMap.map(({ id, sort }) => {
|
||||
|
||||
@@ -278,6 +278,11 @@ export default {
|
||||
latestTime: '上次更新时间:{{time}}',
|
||||
noLatestTime: '暂未获取列表',
|
||||
},
|
||||
resetAll: {
|
||||
conform: '确认重置当前模型的所有修改?重置后当前模型列表将会回到默认状态',
|
||||
success: '重置成功',
|
||||
title: '重置所有修改',
|
||||
},
|
||||
search: '搜索模型...',
|
||||
searchResult: '搜索到 {{count}} 个模型',
|
||||
title: '模型列表',
|
||||
|
||||
@@ -59,6 +59,11 @@ export const aiModelRouter = router({
|
||||
return ctx.aiModelModel.batchUpdateAiModels(input.id, input.models);
|
||||
}),
|
||||
|
||||
clearModelsByProvider: aiModelProcedure
|
||||
.input(z.object({ providerId: z.string() }))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
return ctx.aiModelModel.clearModelsByProvider(input.providerId);
|
||||
}),
|
||||
clearRemoteModels: aiModelProcedure
|
||||
.input(z.object({ providerId: z.string() }))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
|
||||
@@ -47,6 +47,10 @@ export class ClientService extends BaseClientService implements IAiModelService
|
||||
return this.aiModel.clearRemoteModels(providerId);
|
||||
};
|
||||
|
||||
clearModelsByProvider: IAiModelService['clearModelsByProvider'] = async (providerId) => {
|
||||
return this.aiModel.clearModelsByProvider(providerId);
|
||||
};
|
||||
|
||||
updateAiModelOrder: IAiModelService['updateAiModelOrder'] = async (providerId, items) => {
|
||||
return this.aiModel.updateModelsOrder(providerId, items);
|
||||
};
|
||||
|
||||
@@ -30,6 +30,10 @@ export class ServerService implements IAiModelService {
|
||||
return lambdaClient.aiModel.batchToggleAiModels.mutate({ enabled, id, models });
|
||||
};
|
||||
|
||||
clearModelsByProvider: IAiModelService['clearModelsByProvider'] = async (providerId) => {
|
||||
return lambdaClient.aiModel.clearModelsByProvider.mutate({ providerId });
|
||||
};
|
||||
|
||||
clearRemoteModels: IAiModelService['clearRemoteModels'] = async (providerId) => {
|
||||
return lambdaClient.aiModel.clearRemoteModels.mutate({ providerId });
|
||||
};
|
||||
|
||||
@@ -24,6 +24,8 @@ export interface IAiModelService {
|
||||
|
||||
clearRemoteModels: (providerId: string) => Promise<any>;
|
||||
|
||||
clearModelsByProvider: (providerId: string) => Promise<any>;
|
||||
|
||||
updateAiModelOrder: (providerId: string, items: AiModelSortMap[]) => Promise<any>;
|
||||
|
||||
deleteAiModel: (params: { id: string; providerId: string }) => Promise<any>;
|
||||
|
||||
@@ -17,6 +17,7 @@ const FETCH_AI_PROVIDER_MODEL_LIST_KEY = 'FETCH_AI_PROVIDER_MODELS';
|
||||
export interface AiModelAction {
|
||||
batchToggleAiModels: (ids: string[], enabled: boolean) => Promise<void>;
|
||||
batchUpdateAiModels: (models: AiProviderModelListItem[]) => Promise<void>;
|
||||
clearModelsByProvider: (provider: string) => Promise<void>;
|
||||
clearRemoteModels: (provider: string) => Promise<void>;
|
||||
createNewAiModel: (params: CreateAiModelParams) => Promise<void>;
|
||||
fetchRemoteModelList: (providerId: string) => Promise<void>;
|
||||
@@ -55,6 +56,10 @@ export const createAiModelSlice: StateCreator<
|
||||
await aiModelService.batchUpdateAiModels(id, models);
|
||||
await get().refreshAiModelList();
|
||||
},
|
||||
clearModelsByProvider: async (provider) => {
|
||||
await aiModelService.clearModelsByProvider(provider);
|
||||
await get().refreshAiModelList();
|
||||
},
|
||||
clearRemoteModels: async (provider) => {
|
||||
await aiModelService.clearRemoteModels(provider);
|
||||
await get().refreshAiModelList();
|
||||
|
||||
@@ -72,6 +72,13 @@ export interface AiProviderSettings {
|
||||
* @default false
|
||||
*/
|
||||
disableBrowserRequest?: boolean;
|
||||
/**
|
||||
* whether provider support edit model
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
modelEditable?: boolean;
|
||||
|
||||
proxyUrl?:
|
||||
| {
|
||||
desc?: string;
|
||||
@@ -84,7 +91,6 @@ export interface AiProviderSettings {
|
||||
* default openai
|
||||
*/
|
||||
sdkType?: AiProviderSDKType;
|
||||
|
||||
showAddNewModel?: boolean;
|
||||
/**
|
||||
* whether show api key in the provider config
|
||||
|
||||
Reference in New Issue
Block a user