diff --git a/locales/ar/common.json b/locales/ar/common.json index 8d3506f269fe..d249f85c6659 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -275,6 +275,7 @@ }, "temp": "مؤقت", "terms": "شروط الخدمة", + "update": "تحديث", "updateAgent": "تحديث معلومات الوكيل", "upgradeVersion": { "action": "ترقية", diff --git a/locales/ar/modelProvider.json b/locales/ar/modelProvider.json index 68c55561cdaa..e52e1e087f60 100644 --- a/locales/ar/modelProvider.json +++ b/locales/ar/modelProvider.json @@ -63,6 +63,44 @@ "title": "رقم حساب Cloudflare / عنوان URL API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "يرجى إدخال مفتاح API الخاص بك", + "required": "يرجى إدخال مفتاح API الخاص بك", + "title": "مفتاح API" + }, + "basicTitle": "المعلومات الأساسية", + "configTitle": "معلومات التكوين", + "confirm": "إنشاء جديد", + "createSuccess": "تم الإنشاء بنجاح", + "description": { + "placeholder": "نبذة عن مزود الخدمة (اختياري)", + "title": "نبذة عن مزود الخدمة" + }, + "id": { + "placeholder": "يفضل أن يكون بالكامل بحروف صغيرة، مثل openai، لن يمكن تعديله بعد الإنشاء", + "required": "يرجى إدخال معرف المزود", + "title": "معرف المزود" + }, + "logo": { + "required": "يرجى تحميل شعار المزود بشكل صحيح", + "title": "شعار المزود" + }, + "name": { + "placeholder": "يرجى إدخال اسم العرض لمزود الخدمة", + "required": "يرجى إدخال اسم المزود", + "title": "اسم المزود" + }, + "proxyUrl": { + "placeholder": "يرجى إدخال عنوان الطلب الخاص بك، إذا لم يتم إدخاله سيتم استخدام عنوان الطلب المقابل لـ SDK", + "title": "عنوان الوكيل" + }, + "sdkType": { + "required": "يرجى اختيار نوع SDK", + "title": "تنسيق الطلب" + }, + "title": "إنشاء مزود AI مخصص" + }, "github": { "personalAccessToken": { "desc": "أدخل رمز الوصول الشخصي الخاص بك على Github، انقر [هنا](https://github.com/settings/tokens) لإنشاء واحد", @@ -77,6 +115,23 @@ "title": "رمز HuggingFace" } }, + "list": { + "title": { + "disabled": "مزود الخدمة غير مفعل", + "enabled": "مزود الخدمة مفعل" + } + }, + "menu": { + "addCustomProvider": "إضافة مزود خدمة مخصص", + "all": "الكل", + "list": { + "disabled": "غير مفعل", + "enabled": "مفعل" + }, + "notFound": "لم يتم العثور على نتائج البحث", + "searchProviders": "البحث عن مزودين...", + "sort": "ترتيب مخصص" + }, "ollama": { "checker": { "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "سيتم استخدام خوارزمية التشفير <1>AES-GCM لتشفير مفتاحك وعنوان الوكيل وما إلى ذلك", + "apiKey": { + "desc": "يرجى إدخال مفتاح API الخاص بك {{name}}", + "placeholder": "{{name}} مفتاح API", + "title": "مفتاح API" + }, + "baseURL": { + "desc": "يجب أن يحتوي على http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "عنوان وكيل API" + }, + "checker": { + "button": "تحقق", + "desc": "اختبار ما إذا كان مفتاح API وعنوان الوكيل قد تم إدخالهما بشكل صحيح", + "pass": "تم التحقق بنجاح", + "title": "اختبار الاتصال" + }, + "fetchOnClient": { + "desc": "سيتم بدء طلب الجلسة مباشرة من المتصفح، مما قد يحسن سرعة الاستجابة", + "title": "استخدام وضع الطلب من العميل" + }, + "helpDoc": "دليل التكوين", + "waitingForMore": "المزيد من النماذج قيد <1>التخطيط للإدماج، يرجى الانتظار" + }, + "createNew": { + "title": "إنشاء نموذج AI مخصص" + }, + "item": { + "config": "تكوين النموذج", + "customModelCards": { + "addNew": "إنشاء وإضافة نموذج {{id}}", + "confirmDelete": "سيتم حذف هذا النموذج المخصص، ولن يمكن استعادته بعد الحذف، يرجى توخي الحذر." + }, + "delete": { + "confirm": "هل تؤكد حذف النموذج {{displayName}}؟", + "success": "تم الحذف بنجاح", + "title": "حذف النموذج" + }, + "modelConfig": { + "azureDeployName": { + "extra": "الحقل المطلوب في Azure OpenAI", + "placeholder": "يرجى إدخال اسم نشر النموذج في Azure", + "title": "اسم نشر النموذج" + }, + "displayName": { + "placeholder": "يرجى إدخال اسم العرض للنموذج، مثل ChatGPT، GPT-4، إلخ", + "title": "اسم عرض النموذج" + }, + "files": { + "extra": "تنفيذ تحميل الملفات الحالي هو مجرد حل Hack، يقتصر على التجربة الذاتية. يرجى الانتظار حتى يتم تنفيذ القدرة الكاملة لتحميل الملفات لاحقًا", + "title": "دعم تحميل الملفات" + }, + "functionCall": { + "extra": "سيؤدي هذا التكوين إلى فتح القدرة على استدعاء الدوال في التطبيق، ما إذا كان يدعم استدعاء الدوال يعتمد بالكامل على النموذج نفسه، يرجى اختبار قابلية استخدام استدعاء الدوال لهذا النموذج بنفسك", + "title": "دعم استدعاء الدوال" + }, + "id": { + "extra": "سيتم عرضه كعلامة للنموذج", + "placeholder": "يرجى إدخال معرف النموذج، مثل gpt-4-turbo-preview أو claude-2.1", + "title": "معرف النموذج" + }, + "modalTitle": "تكوين النموذج المخصص", + "tokens": { + "title": "الحد الأقصى لعدد الرموز", + "unlimited": "غير محدود" + }, + "vision": { + "extra": "سيؤدي هذا التكوين إلى فتح إعدادات تحميل الصور في التطبيق، ما إذا كان يدعم التعرف يعتمد بالكامل على النموذج نفسه، يرجى اختبار قابلية استخدام التعرف البصري لهذا النموذج بنفسك", + "title": "دعم التعرف البصري" + } + }, + "pricing": { + "image": "${{amount}}/صورة", + "inputCharts": "${{amount}}/M حرف", + "inputMinutes": "${{amount}}/دقيقة", + "inputTokens": "إدخال ${{amount}}/م", + "outputTokens": "إخراج ${{amount}}/م" + }, + "releasedAt": "صدر في {{releasedAt}}" + }, + "list": { + "disabled": "غير مفعل", + "enabled": "مفعل", + "enabledActions": { + "disableAll": "تعطيل الكل", + "enableAll": "تفعيل الكل", + "sort": "ترتيب النموذج حسب التخصيص" + }, + "enabledEmpty": "لا توجد نماذج مفعلة، يرجى تفعيل النماذج المفضلة لديك من القائمة أدناه~", + "fetcher": { + "clear": "مسح النماذج المستخرجة", + "fetch": "الحصول على قائمة النماذج", + "fetching": "جارٍ الحصول على قائمة النماذج...", + "latestTime": "آخر تحديث: {{time}}", + "noLatestTime": "لم يتم الحصول على القائمة بعد" + }, + "search": "ابحث عن نموذج...", + "searchResult": "تم العثور على {{count}} نموذج", + "title": "قائمة النماذج", + "total": "إجمالي {{count}} نموذج متاح" + }, + "searchNotFound": "لم يتم العثور على نتائج البحث" + }, + "sortModal": { + "success": "تم تحديث الترتيب بنجاح", + "title": "ترتيب مخصص", + "update": "تحديث" + }, + "updateAiProvider": { + "confirmDelete": "سيتم حذف مزود AI هذا، ولن يمكن استعادته بعد الحذف، هل تؤكد الحذف؟", + "deleteSuccess": "تم الحذف بنجاح", + "tooltip": "تحديث التكوين الأساسي للمزود", + "updateSuccess": "تم التحديث بنجاح" + }, "wenxin": { "accessKey": { "desc": "أدخل مفتاح الوصول من منصة بايدو تشيانفان", diff --git a/locales/ar/setting.json b/locales/ar/setting.json index 70310b5a8ecd..e01d443ccd2d 100644 --- a/locales/ar/setting.json +++ b/locales/ar/setting.json @@ -411,6 +411,7 @@ "common": "إعدادات عامة", "experiment": "تجربة", "llm": "نموذج اللغة", + "provider": "مزود خدمة الذكاء الاصطناعي", "sync": "مزامنة السحابة", "system-agent": "مساعد النظام", "tts": "خدمة الكلام" diff --git a/locales/bg-BG/common.json b/locales/bg-BG/common.json index 49e4c8b2618b..25b8bb5f353f 100644 --- a/locales/bg-BG/common.json +++ b/locales/bg-BG/common.json @@ -275,6 +275,7 @@ }, "temp": "Временен", "terms": "Условия за ползване", + "update": "Актуализиране", "updateAgent": "Актуализирай информацията за агента", "upgradeVersion": { "action": "Надстрой", diff --git a/locales/bg-BG/modelProvider.json b/locales/bg-BG/modelProvider.json index a6fe0f16f2b4..5bdd728b4c85 100644 --- a/locales/bg-BG/modelProvider.json +++ b/locales/bg-BG/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID на Cloudflare / API адрес" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Моля, въведете вашия API ключ", + "required": "Моля, въведете вашия API ключ", + "title": "API ключ" + }, + "basicTitle": "Основна информация", + "configTitle": "Конфигурационна информация", + "confirm": "Създаване", + "createSuccess": "Създаването е успешно", + "description": { + "placeholder": "Описание на доставчика (по избор)", + "title": "Описание на доставчика" + }, + "id": { + "placeholder": "Препоръчително изцяло с малки букви, например openai, след създаването не може да се промени", + "required": "Моля, въведете ID на доставчика", + "title": "ID на доставчика" + }, + "logo": { + "required": "Моля, качете правилното лого на доставчика", + "title": "Лого на доставчика" + }, + "name": { + "placeholder": "Моля, въведете показваното име на доставчика", + "required": "Моля, въведете името на доставчика", + "title": "Име на доставчика" + }, + "proxyUrl": { + "placeholder": "Моля, въведете адреса на вашето запитване, ако не е попълнен, ще се използва съответния адрес на SDK", + "title": "Адрес на прокси" + }, + "sdkType": { + "required": "Моля, изберете тип SDK", + "title": "Формат на запитването" + }, + "title": "Създаване на персонализиран AI доставчик" + }, "github": { "personalAccessToken": { "desc": "Въведете вашия GitHub PAT, кликнете [тук](https://github.com/settings/tokens), за да създадете", @@ -77,6 +115,23 @@ "title": "HuggingFace токен" } }, + "list": { + "title": { + "disabled": "Неактивен доставчик", + "enabled": "Активен доставчик" + } + }, + "menu": { + "addCustomProvider": "Добавяне на персонализиран доставчик", + "all": "Всички", + "list": { + "disabled": "Неактивиран", + "enabled": "Активиран" + }, + "notFound": "Не са намерени резултати от търсенето", + "searchProviders": "Търсене на доставчици...", + "sort": "Персонализирано сортиране" + }, "ollama": { "checker": { "desc": "Тестване дали адресът на прокси е попълнен правилно", @@ -131,6 +186,122 @@ "title": "Изтегляне на зададения Ollama модел" } }, + "providerModels": { + "config": { + "aesGcm": "Вашият ключ и адреса на прокси ще бъдат криптирани с <1>AES-GCM алгоритъм", + "apiKey": { + "desc": "Моля, въведете вашия {{name}} API ключ", + "placeholder": "{{name}} API ключ", + "title": "API ключ" + }, + "baseURL": { + "desc": "Трябва да съдържа http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API адрес на прокси" + }, + "checker": { + "button": "Проверка", + "desc": "Тест на API ключа и адреса на прокси за правилно попълване", + "pass": "Проверката е успешна", + "title": "Проверка на свързаност" + }, + "fetchOnClient": { + "desc": "Режимът на клиентски запитвания ще инициира сесийни запитвания директно от браузъра, което може да ускори времето за отговор", + "title": "Използване на клиентски режим на запитвания" + }, + "helpDoc": "Ръководство за конфигуриране", + "waitingForMore": "Още модели са в <1>планиране, моля, очаквайте" + }, + "createNew": { + "title": "Създаване на персонализиран AI модел" + }, + "item": { + "config": "Конфигуриране на модела", + "customModelCards": { + "addNew": "Създаване и добавяне на модел {{id}}", + "confirmDelete": "Ще изтриете този персонализиран модел, след изтриването няма да може да бъде възстановен, моля, действайте внимателно." + }, + "delete": { + "confirm": "Потвърдете ли, че искате да изтриете модела {{displayName}}?", + "success": "Изтриването е успешно", + "title": "Изтриване на модел" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Полето, което действително се изисква в Azure OpenAI", + "placeholder": "Моля, въведете името на модела за разполагане в Azure", + "title": "Име на разполагане на модела" + }, + "displayName": { + "placeholder": "Моля, въведете показваното име на модела, например ChatGPT, GPT-4 и др.", + "title": "Показвано име на модела" + }, + "files": { + "extra": "Текущата функция за качване на файлове е само един хак, само за опити. Пълната функционалност за качване на файлове ще бъде реализирана по-късно.", + "title": "Поддръжка на качване на файлове" + }, + "functionCall": { + "extra": "Тази конфигурация ще активира само функцията за извикване в приложението, дали поддържа извикване на функции зависи изцяло от самия модел, моля, тествайте наличността на функцията за извикване на този модел.", + "title": "Поддръжка на извикване на функции" + }, + "id": { + "extra": "Ще се показва като етикет на модела", + "placeholder": "Моля, въведете ID на модела, например gpt-4-turbo-preview или claude-2.1", + "title": "ID на модела" + }, + "modalTitle": "Конфигурация на персонализиран модел", + "tokens": { + "title": "Максимален брой токени", + "unlimited": "Без ограничения" + }, + "vision": { + "extra": "Тази конфигурация ще активира само конфигурацията за качване на изображения в приложението, дали поддържа разпознаване зависи изцяло от самия модел, моля, тествайте наличността на визуалната разпознаваемост на този модел.", + "title": "Поддръжка на визуално разпознаване" + } + }, + "pricing": { + "image": "${{amount}}/изображение", + "inputCharts": "${{amount}}/M символи", + "inputMinutes": "${{amount}}/минути", + "inputTokens": "Входящи ${{amount}}/М", + "outputTokens": "Изходящи ${{amount}}/М" + }, + "releasedAt": "Пуснато на {{releasedAt}}" + }, + "list": { + "disabled": "Неактивен", + "enabled": "Активен", + "enabledActions": { + "disableAll": "Деактивирай всичко", + "enableAll": "Активирай всичко", + "sort": "Персонализиране на подредбата на моделите" + }, + "enabledEmpty": "Няма активни модели, моля активирайте желаните модели от списъка по-долу~", + "fetcher": { + "clear": "Изчисти получените модели", + "fetch": "Получаване на списък с модели", + "fetching": "Получаване на списък с модели...", + "latestTime": "Последно обновление: {{time}}", + "noLatestTime": "Все още не е получен списък" + }, + "search": "Търсене на модели...", + "searchResult": "Намерени са {{count}} модела", + "title": "Списък с модели", + "total": "Общо {{count}} налични модела" + }, + "searchNotFound": "Не са намерени резултати от търсенето" + }, + "sortModal": { + "success": "Сортирането е успешно обновено", + "title": "Персонализирано сортиране", + "update": "Актуализиране" + }, + "updateAiProvider": { + "confirmDelete": "Ще изтриете този AI доставчик, след изтриването няма да може да бъде възстановен, потвърдете ли, че искате да изтриете?", + "deleteSuccess": "Изтриването е успешно", + "tooltip": "Актуализиране на основната конфигурация на доставчика", + "updateSuccess": "Актуализацията е успешна" + }, "wenxin": { "accessKey": { "desc": "Въведете Access Key от платформата Baidu Qianfan", diff --git a/locales/bg-BG/setting.json b/locales/bg-BG/setting.json index bd1cf469bdca..64a396ecd0d8 100644 --- a/locales/bg-BG/setting.json +++ b/locales/bg-BG/setting.json @@ -411,6 +411,7 @@ "common": "Общи настройки", "experiment": "Експеримент", "llm": "Езиков модел", + "provider": "AI доставчик", "sync": "Синхронизиране в облака", "system-agent": "Системен асистент", "tts": "Текст към реч" diff --git a/locales/de-DE/common.json b/locales/de-DE/common.json index 6fb1994d268f..00dee9504e1b 100644 --- a/locales/de-DE/common.json +++ b/locales/de-DE/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporär", "terms": "Nutzungsbedingungen", + "update": "Aktualisieren", "updateAgent": "Assistentenprofil aktualisieren", "upgradeVersion": { "action": "Aktualisieren", diff --git a/locales/de-DE/modelProvider.json b/locales/de-DE/modelProvider.json index b2ab1569b0de..e890633c52c3 100644 --- a/locales/de-DE/modelProvider.json +++ b/locales/de-DE/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare-Kundenkennung / API-Adresse" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Bitte geben Sie Ihren API-Schlüssel ein", + "required": "Bitte geben Sie Ihren API-Schlüssel ein", + "title": "API-Schlüssel" + }, + "basicTitle": "Grundinformationen", + "configTitle": "Konfigurationsinformationen", + "confirm": "Neu erstellen", + "createSuccess": "Erstellung erfolgreich", + "description": { + "placeholder": "Beschreibung des Anbieters (optional)", + "title": "Beschreibung des Anbieters" + }, + "id": { + "placeholder": "Empfohlen in Kleinbuchstaben, z.B. openai, nach der Erstellung nicht mehr änderbar", + "required": "Bitte geben Sie die Anbieter-ID ein", + "title": "Anbieter-ID" + }, + "logo": { + "required": "Bitte laden Sie das korrekte Anbieter-Logo hoch", + "title": "Anbieter-Logo" + }, + "name": { + "placeholder": "Bitte geben Sie den angezeigten Namen des Anbieters ein", + "required": "Bitte geben Sie den Namen des Anbieters ein", + "title": "Name des Anbieters" + }, + "proxyUrl": { + "placeholder": "Bitte geben Sie Ihre Anforderungsadresse ein, wenn nicht angegeben, wird die entsprechende Anforderungsadresse des SDK verwendet", + "title": "Proxy-Adresse" + }, + "sdkType": { + "required": "Bitte wählen Sie den SDK-Typ aus", + "title": "Anforderungsformat" + }, + "title": "Erstellen Sie einen benutzerdefinierten AI-Anbieter" + }, "github": { "personalAccessToken": { "desc": "Geben Sie Ihr GitHub-PAT ein und klicken Sie [hier](https://github.com/settings/tokens), um eines zu erstellen.", @@ -77,6 +115,23 @@ "title": "HuggingFace-Token" } }, + "list": { + "title": { + "disabled": "Dienstanbieter nicht aktiviert", + "enabled": "Dienstanbieter aktiviert" + } + }, + "menu": { + "addCustomProvider": "Benutzerdefinierten Anbieter hinzufügen", + "all": "Alle", + "list": { + "disabled": "Nicht aktiviert", + "enabled": "Aktiviert" + }, + "notFound": "Keine Suchergebnisse gefunden", + "searchProviders": "Anbieter suchen...", + "sort": "Benutzerdefinierte Sortierung" + }, "ollama": { "checker": { "desc": "Testen Sie, ob die Proxy-Adresse korrekt eingetragen wurde", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Ihr Schlüssel und die Proxy-Adresse werden mit dem <1>AES-GCM-Verschlüsselungsalgorithmus verschlüsselt", + "apiKey": { + "desc": "Bitte geben Sie Ihren {{name}} API-Schlüssel ein", + "placeholder": "{{name}} API-Schlüssel", + "title": "API-Schlüssel" + }, + "baseURL": { + "desc": "Muss http(s):// enthalten", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API-Proxy-Adresse" + }, + "checker": { + "button": "Überprüfen", + "desc": "Testen Sie, ob der API-Schlüssel und die Proxy-Adresse korrekt eingegeben wurden", + "pass": "Überprüfung bestanden", + "title": "Verbindungsprüfung" + }, + "fetchOnClient": { + "desc": "Der Client-Anforderungsmodus initiiert die Sitzung direkt aus dem Browser, was die Reaktionsgeschwindigkeit erhöhen kann", + "title": "Client-Anforderungsmodus verwenden" + }, + "helpDoc": "Konfigurationsanleitung", + "waitingForMore": "Weitere Modelle werden <1>geplant, bitte warten Sie" + }, + "createNew": { + "title": "Erstellen Sie ein benutzerdefiniertes AI-Modell" + }, + "item": { + "config": "Modell konfigurieren", + "customModelCards": { + "addNew": "Erstellen und hinzufügen {{id}} Modell", + "confirmDelete": "Das benutzerdefinierte Modell wird gelöscht, nach dem Löschen kann es nicht wiederhergestellt werden. Bitte vorsichtig vorgehen." + }, + "delete": { + "confirm": "Bestätigen Sie das Löschen des Modells {{displayName}}?", + "success": "Löschung erfolgreich", + "title": "Modell löschen" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Feld, das in Azure OpenAI tatsächlich angefordert wird", + "placeholder": "Bitte geben Sie den Modellbereitstellungsnamen in Azure ein", + "title": "Modellbereitstellungsname" + }, + "displayName": { + "placeholder": "Bitte geben Sie den angezeigten Namen des Modells ein, z.B. ChatGPT, GPT-4 usw.", + "title": "Anzeigename des Modells" + }, + "files": { + "extra": "Der aktuelle Datei-Upload ist nur eine Hack-Lösung und nur für eigene Versuche gedacht. Warten Sie auf die vollständige Datei-Upload-Funktionalität.", + "title": "Datei-Upload unterstützen" + }, + "functionCall": { + "extra": "Diese Konfiguration aktiviert nur die Funktionalität zum Aufrufen von Funktionen in der Anwendung. Ob Funktionen unterstützt werden, hängt vollständig vom Modell selbst ab. Bitte testen Sie die Verwendbarkeit der Funktionalität des Modells selbst.", + "title": "Funktionaufrufe unterstützen" + }, + "id": { + "extra": "Wird als Modell-Tag angezeigt", + "placeholder": "Bitte geben Sie die Modell-ID ein, z.B. gpt-4-turbo-preview oder claude-2.1", + "title": "Modell-ID" + }, + "modalTitle": "Benutzerdefinierte Modellkonfiguration", + "tokens": { + "title": "Maximale Token-Anzahl", + "unlimited": "Unbegrenzt" + }, + "vision": { + "extra": "Diese Konfiguration aktiviert nur die Bild-Upload-Funktionalität in der Anwendung. Ob die Erkennung unterstützt wird, hängt vollständig vom Modell selbst ab. Bitte testen Sie die Verwendbarkeit der visuellen Erkennungsfähigkeit des Modells selbst.", + "title": "Visuelle Erkennung unterstützen" + } + }, + "pricing": { + "image": "${{amount}}/Bild", + "inputCharts": "${{amount}}/M Zeichen", + "inputMinutes": "${{amount}}/Minuten", + "inputTokens": "Eingabe ${{amount}}/M", + "outputTokens": "Ausgabe ${{amount}}/M" + }, + "releasedAt": "Veröffentlicht am {{releasedAt}}" + }, + "list": { + "disabled": "Nicht aktiviert", + "enabled": "Aktiviert", + "enabledActions": { + "disableAll": "Alle deaktivieren", + "enableAll": "Alle aktivieren", + "sort": "Benutzerdefinierte Modellreihenfolge" + }, + "enabledEmpty": "Keine aktivierten Modelle vorhanden, bitte aktivieren Sie Ihre bevorzugten Modelle aus der Liste unten~", + "fetcher": { + "clear": "Abgerufene Modelle löschen", + "fetch": "Modellliste abrufen", + "fetching": "Modellliste wird abgerufen...", + "latestTime": "Letzte Aktualisierung: {{time}}", + "noLatestTime": "Liste wurde noch nicht abgerufen" + }, + "search": "Modelle suchen...", + "searchResult": "{{count}} Modelle gefunden", + "title": "Modellliste", + "total": "Insgesamt {{count}} verfügbare Modelle" + }, + "searchNotFound": "Keine Suchergebnisse gefunden" + }, + "sortModal": { + "success": "Sortierung erfolgreich aktualisiert", + "title": "Benutzerdefinierte Sortierung", + "update": "Aktualisieren" + }, + "updateAiProvider": { + "confirmDelete": "Der AI-Anbieter wird gelöscht, nach dem Löschen kann er nicht wiederhergestellt werden. Bestätigen Sie, ob Sie löschen möchten?", + "deleteSuccess": "Löschung erfolgreich", + "tooltip": "Aktualisieren Sie die grundlegenden Anbieterinformationen", + "updateSuccess": "Aktualisierung erfolgreich" + }, "wenxin": { "accessKey": { "desc": "Geben Sie den Access Key der Baidu Qianfan-Plattform ein", diff --git a/locales/de-DE/setting.json b/locales/de-DE/setting.json index 9ce0ab6b16ff..86a5e973a152 100644 --- a/locales/de-DE/setting.json +++ b/locales/de-DE/setting.json @@ -411,6 +411,7 @@ "common": "Allgemeine Einstellungen", "experiment": "Experiment", "llm": "Sprachmodell", + "provider": "KI-Dienstanbieter", "sync": "Cloud-Synchronisierung", "system-agent": "Systemassistent", "tts": "Sprachdienste" diff --git a/locales/en-US/common.json b/locales/en-US/common.json index 02d67d476604..2ae715c201c5 100644 --- a/locales/en-US/common.json +++ b/locales/en-US/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporary", "terms": "Terms of Service", + "update": "Update", "updateAgent": "Update Assistant Information", "upgradeVersion": { "action": "Upgrade", diff --git a/locales/en-US/modelProvider.json b/locales/en-US/modelProvider.json index 0cbd936f8e3a..d3f5717e5c1b 100644 --- a/locales/en-US/modelProvider.json +++ b/locales/en-US/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare Account ID / API Address" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Please enter your API Key", + "required": "Please enter your API Key", + "title": "API Key" + }, + "basicTitle": "Basic Information", + "configTitle": "Configuration Information", + "confirm": "Create", + "createSuccess": "Creation successful", + "description": { + "placeholder": "Provider description (optional)", + "title": "Provider Description" + }, + "id": { + "placeholder": "Suggested all lowercase, e.g., openai, cannot be modified after creation", + "required": "Please enter the provider ID", + "title": "Provider ID" + }, + "logo": { + "required": "Please upload a valid provider logo", + "title": "Provider Logo" + }, + "name": { + "placeholder": "Please enter the display name of the provider", + "required": "Please enter the provider name", + "title": "Provider Name" + }, + "proxyUrl": { + "placeholder": "Please enter your request URL, if left blank, the corresponding SDK request URL will be used", + "title": "Proxy URL" + }, + "sdkType": { + "required": "Please select SDK type", + "title": "Request Format" + }, + "title": "Create Custom AI Provider" + }, "github": { "personalAccessToken": { "desc": "Enter your GitHub PAT. Click [here](https://github.com/settings/tokens) to create one.", @@ -77,6 +115,23 @@ "title": "HuggingFace Token" } }, + "list": { + "title": { + "disabled": "Disabled", + "enabled": "Enabled" + } + }, + "menu": { + "addCustomProvider": "Add Custom Provider", + "all": "All", + "list": { + "disabled": "Disabled", + "enabled": "Enabled" + }, + "notFound": "No search results found", + "searchProviders": "Search Providers...", + "sort": "Custom Sort" + }, "ollama": { "checker": { "desc": "Test if the proxy address is correctly filled in", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Your key and proxy URL will be encrypted using <1>AES-GCM encryption algorithm", + "apiKey": { + "desc": "Please enter your {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Must include http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API Proxy URL" + }, + "checker": { + "button": "Check", + "desc": "Test if the API Key and proxy URL are correctly filled", + "pass": "Check passed", + "title": "Connectivity Check" + }, + "fetchOnClient": { + "desc": "Client request mode will initiate session requests directly from the browser, which can improve response speed", + "title": "Use Client Request Mode" + }, + "helpDoc": "Configuration Guide", + "waitingForMore": "More models are currently <1>planned for integration, please stay tuned" + }, + "createNew": { + "title": "Create Custom AI Model" + }, + "item": { + "config": "Configure Model", + "customModelCards": { + "addNew": "Create and add {{id}} model", + "confirmDelete": "You are about to delete this custom model. Once deleted, it cannot be recovered. Please proceed with caution." + }, + "delete": { + "confirm": "Are you sure you want to delete model {{displayName}}?", + "success": "Deletion successful", + "title": "Delete Model" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Field used for actual requests in Azure OpenAI", + "placeholder": "Please enter the model deployment name in Azure", + "title": "Model Deployment Name" + }, + "displayName": { + "placeholder": "Please enter the display name of the model, e.g., ChatGPT, GPT-4, etc.", + "title": "Model Display Name" + }, + "files": { + "extra": "The current file upload implementation is just a hack solution, limited to self-experimentation. Please wait for complete file upload capabilities in future implementations.", + "title": "File Upload Support" + }, + "functionCall": { + "extra": "This configuration will only enable function calling capabilities in the application. Whether function calling is supported depends entirely on the model itself. Please test the function calling capabilities of the model yourself.", + "title": "Support Function Calling" + }, + "id": { + "extra": "Will be displayed as the model label", + "placeholder": "Please enter model id, e.g., gpt-4-turbo-preview or claude-2.1", + "title": "Model ID" + }, + "modalTitle": "Custom Model Configuration", + "tokens": { + "title": "Maximum Token Count", + "unlimited": "Unlimited" + }, + "vision": { + "extra": "This configuration will only enable image upload capabilities in the application. Whether recognition is supported depends entirely on the model itself. Please test the visual recognition capabilities of the model yourself.", + "title": "Support Vision" + } + }, + "pricing": { + "image": "${{amount}}/Image", + "inputCharts": "${{amount}}/M Characters", + "inputMinutes": "${{amount}}/Minutes", + "inputTokens": "Input ${{amount}}/M", + "outputTokens": "Output ${{amount}}/M" + }, + "releasedAt": "Released at {{releasedAt}}" + }, + "list": { + "disabled": "Disabled", + "enabled": "Enabled", + "enabledActions": { + "disableAll": "Disable All", + "enableAll": "Enable All", + "sort": "Custom Model Sorting" + }, + "enabledEmpty": "No enabled models available. Please enable your preferred models from the list below~", + "fetcher": { + "clear": "Clear fetched models", + "fetch": "Fetch models", + "fetching": "Fetching model list...", + "latestTime": "Last updated: {{time}}", + "noLatestTime": "Model list not yet fetched" + }, + "search": "Search Models...", + "searchResult": "{{count}} models found", + "title": "Model List", + "total": "{{count}} models available" + }, + "searchNotFound": "No search results found" + }, + "sortModal": { + "success": "Sort update successful", + "title": "Custom Order", + "update": "Update" + }, + "updateAiProvider": { + "confirmDelete": "You are about to delete this AI provider. Once deleted, it cannot be retrieved. Are you sure you want to delete?", + "deleteSuccess": "Deletion successful", + "tooltip": "Update provider basic configuration", + "updateSuccess": "Update successful" + }, "wenxin": { "accessKey": { "desc": "Enter the Access Key from the Baidu Qianfan platform", diff --git a/locales/en-US/setting.json b/locales/en-US/setting.json index 98540de3adee..10216ebad5f2 100644 --- a/locales/en-US/setting.json +++ b/locales/en-US/setting.json @@ -411,6 +411,7 @@ "common": "Common Settings", "experiment": "Experiment", "llm": "Language Model", + "provider": "AI Service Provider", "sync": "Cloud Sync", "system-agent": "System Assistant", "tts": "Text-to-Speech" diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json index 8ce9f128abe3..2dd6166b5649 100644 --- a/locales/es-ES/common.json +++ b/locales/es-ES/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporal", "terms": "Términos de servicio", + "update": "Actualizar", "updateAgent": "Actualizar información del asistente", "upgradeVersion": { "action": "Actualizar", diff --git a/locales/es-ES/modelProvider.json b/locales/es-ES/modelProvider.json index fb6b3d73e808..316ae377fe06 100644 --- a/locales/es-ES/modelProvider.json +++ b/locales/es-ES/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID de cuenta de Cloudflare / dirección URL de API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Por favor, introduce tu API Key", + "required": "Por favor, introduce tu API Key", + "title": "API Key" + }, + "basicTitle": "Información básica", + "configTitle": "Información de configuración", + "confirm": "Crear nuevo", + "createSuccess": "Creación exitosa", + "description": { + "placeholder": "Descripción del proveedor (opcional)", + "title": "Descripción del proveedor" + }, + "id": { + "placeholder": "Se recomienda en minúsculas, por ejemplo openai, no se puede modificar después de crear", + "required": "Por favor, introduce el ID del proveedor", + "title": "ID del proveedor" + }, + "logo": { + "required": "Por favor, sube un logo correcto del proveedor", + "title": "Logo del proveedor" + }, + "name": { + "placeholder": "Por favor, introduce el nombre del proveedor", + "required": "Por favor, introduce el nombre del proveedor", + "title": "Nombre del proveedor" + }, + "proxyUrl": { + "placeholder": "Por favor, introduce tu dirección de solicitud, si no se completa, se usará la dirección de solicitud correspondiente del SDK", + "title": "Dirección del proxy" + }, + "sdkType": { + "required": "Por favor, selecciona el tipo de SDK", + "title": "Formato de solicitud" + }, + "title": "Crear proveedor de AI personalizado" + }, "github": { "personalAccessToken": { "desc": "Introduce tu PAT de Github, haz clic [aquí](https://github.com/settings/tokens) para crear uno", @@ -77,6 +115,23 @@ "title": "Token de HuggingFace" } }, + "list": { + "title": { + "disabled": "Proveedor no habilitado", + "enabled": "Proveedor habilitado" + } + }, + "menu": { + "addCustomProvider": "Agregar proveedor personalizado", + "all": "Todo", + "list": { + "disabled": "No habilitado", + "enabled": "Habilitado" + }, + "notFound": "No se encontraron resultados de búsqueda", + "searchProviders": "Buscar proveedores...", + "sort": "Orden personalizado" + }, "ollama": { "checker": { "desc": "Prueba si la dirección del proxy de la interfaz se ha introducido correctamente", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Tu clave y dirección del proxy se cifrarán utilizando el algoritmo de cifrado <1>AES-GCM", + "apiKey": { + "desc": "Por favor, introduce tu {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Debe incluir http(s)://", + "placeholder": "https://tu-direccion-proxy.com/v1", + "title": "Dirección del proxy API" + }, + "checker": { + "button": "Verificar", + "desc": "Prueba si la API Key y la dirección del proxy están correctamente introducidas", + "pass": "Verificación exitosa", + "title": "Verificación de conectividad" + }, + "fetchOnClient": { + "desc": "El modo de solicitud del cliente iniciará la solicitud de sesión directamente desde el navegador, lo que puede mejorar la velocidad de respuesta", + "title": "Usar modo de solicitud del cliente" + }, + "helpDoc": "Guía de configuración", + "waitingForMore": "Más modelos están en <1>planificación de integración, por favor, espera" + }, + "createNew": { + "title": "Crear modelo de AI personalizado" + }, + "item": { + "config": "Configurar modelo", + "customModelCards": { + "addNew": "Crear y agregar modelo {{id}}", + "confirmDelete": "Estás a punto de eliminar este modelo personalizado, una vez eliminado no se puede recuperar, por favor actúa con precaución." + }, + "delete": { + "confirm": "¿Confirmar eliminación del modelo {{displayName}}?", + "success": "Eliminación exitosa", + "title": "Eliminar modelo" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Campo solicitado en Azure OpenAI", + "placeholder": "Por favor, introduce el nombre de despliegue del modelo en Azure", + "title": "Nombre de despliegue del modelo" + }, + "displayName": { + "placeholder": "Por favor, introduce el nombre de visualización del modelo, por ejemplo, ChatGPT, GPT-4, etc.", + "title": "Nombre de visualización del modelo" + }, + "files": { + "extra": "La implementación actual de carga de archivos es solo una solución temporal, solo para prueba personal. La capacidad completa de carga de archivos estará disponible en futuras implementaciones.", + "title": "Soporte para carga de archivos" + }, + "functionCall": { + "extra": "Esta configuración solo habilitará la capacidad de llamada a funciones en la aplicación, si se admite la llamada a funciones depende completamente del modelo en sí, prueba la disponibilidad de la capacidad de llamada a funciones de este modelo.", + "title": "Soporte para llamada a funciones" + }, + "id": { + "extra": "Se mostrará como etiqueta del modelo", + "placeholder": "Por favor, introduce el id del modelo, por ejemplo, gpt-4-turbo-preview o claude-2.1", + "title": "ID del modelo" + }, + "modalTitle": "Configuración del modelo personalizado", + "tokens": { + "title": "Número máximo de tokens", + "unlimited": "Sin límite" + }, + "vision": { + "extra": "Esta configuración solo habilitará la configuración de carga de imágenes en la aplicación, si se admite el reconocimiento depende completamente del modelo en sí, prueba la disponibilidad de la capacidad de reconocimiento visual de este modelo.", + "title": "Soporte para reconocimiento visual" + } + }, + "pricing": { + "image": "${{amount}}/imagen", + "inputCharts": "${{amount}}/M caracteres", + "inputMinutes": "${{amount}}/minuto", + "inputTokens": "Entrada ${{amount}}/M", + "outputTokens": "Salida ${{amount}}/M" + }, + "releasedAt": "Publicado el {{releasedAt}}" + }, + "list": { + "disabled": "No habilitado", + "enabled": "Habilitado", + "enabledActions": { + "disableAll": "Deshabilitar todo", + "enableAll": "Habilitar todo", + "sort": "Ordenar modelos personalizados" + }, + "enabledEmpty": "No hay modelos habilitados, por favor habilita los modelos que te gusten de la lista a continuación~", + "fetcher": { + "clear": "Eliminar modelos obtenidos", + "fetch": "Obtener lista de modelos", + "fetching": "Obteniendo lista de modelos...", + "latestTime": "Última actualización: {{time}}", + "noLatestTime": "Lista aún no obtenida" + }, + "search": "Buscar modelos...", + "searchResult": "Se encontraron {{count}} modelos", + "title": "Lista de modelos", + "total": "Un total de {{count}} modelos disponibles" + }, + "searchNotFound": "No se encontraron resultados de búsqueda" + }, + "sortModal": { + "success": "Orden actualizado con éxito", + "title": "Orden personalizado", + "update": "Actualizar" + }, + "updateAiProvider": { + "confirmDelete": "Estás a punto de eliminar este proveedor de AI, una vez eliminado no se puede recuperar, ¿confirmar eliminación?", + "deleteSuccess": "Eliminación exitosa", + "tooltip": "Actualizar configuración básica del proveedor", + "updateSuccess": "Actualización exitosa" + }, "wenxin": { "accessKey": { "desc": "Introduce la Access Key de la plataforma Qianfan de Baidu", diff --git a/locales/es-ES/setting.json b/locales/es-ES/setting.json index 5cfa5452bb99..c1ac3233f943 100644 --- a/locales/es-ES/setting.json +++ b/locales/es-ES/setting.json @@ -411,6 +411,7 @@ "common": "Configuración común", "experiment": "Experimento", "llm": "Modelo de lenguaje", + "provider": "Proveedor de servicios de IA", "sync": "Sincronización en la nube", "system-agent": "Asistente del sistema", "tts": "Servicio de voz" diff --git a/locales/fa-IR/common.json b/locales/fa-IR/common.json index c31a94b510ca..d51df880c098 100644 --- a/locales/fa-IR/common.json +++ b/locales/fa-IR/common.json @@ -275,6 +275,7 @@ }, "temp": "موقت", "terms": "شرایط خدمات", + "update": "به‌روزرسانی", "updateAgent": "به‌روزرسانی اطلاعات دستیار", "upgradeVersion": { "action": "ارتقاء", diff --git a/locales/fa-IR/modelProvider.json b/locales/fa-IR/modelProvider.json index 5dc0afc74777..a2fe9b5a8b78 100644 --- a/locales/fa-IR/modelProvider.json +++ b/locales/fa-IR/modelProvider.json @@ -63,6 +63,44 @@ "title": "شناسه حساب Cloudflare / آدرس API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "لطفاً کلید API خود را وارد کنید", + "required": "لطفاً کلید API خود را وارد کنید", + "title": "کلید API" + }, + "basicTitle": "اطلاعات پایه", + "configTitle": "اطلاعات پیکربندی", + "confirm": "ایجاد جدید", + "createSuccess": "ایجاد با موفقیت انجام شد", + "description": { + "placeholder": "توضیحات ارائه‌دهنده (اختیاری)", + "title": "توضیحات ارائه‌دهنده" + }, + "id": { + "placeholder": "توصیه می‌شود تماماً با حروف کوچک باشد، مانند openai، پس از ایجاد قابل ویرایش نخواهد بود", + "required": "لطفاً شناسه ارائه‌دهنده را وارد کنید", + "title": "شناسه ارائه‌دهنده" + }, + "logo": { + "required": "لطفاً لوگوی صحیح ارائه‌دهنده را بارگذاری کنید", + "title": "لوگوی ارائه‌دهنده" + }, + "name": { + "placeholder": "لطفاً نام نمایشی ارائه‌دهنده را وارد کنید", + "required": "لطفاً نام ارائه‌دهنده را وارد کنید", + "title": "نام ارائه‌دهنده" + }, + "proxyUrl": { + "placeholder": "لطفاً آدرس درخواست خود را وارد کنید، در صورت عدم وارد کردن از آدرس درخواست مربوط به SDK استفاده خواهد شد", + "title": "آدرس پروکسی" + }, + "sdkType": { + "required": "لطفاً نوع SDK را انتخاب کنید", + "title": "فرمت درخواست" + }, + "title": "ایجاد ارائه‌دهنده AI سفارشی" + }, "github": { "personalAccessToken": { "desc": "توکن دسترسی شخصی Github خود را وارد کنید، برای ایجاد [اینجا](https://github.com/settings/tokens) کلیک کنید", @@ -77,6 +115,23 @@ "title": "توکن HuggingFace" } }, + "list": { + "title": { + "disabled": "سرویس‌دهنده غیرفعال", + "enabled": "سرویس‌دهنده فعال" + } + }, + "menu": { + "addCustomProvider": "اضافه کردن ارائه‌دهنده سفارشی", + "all": "همه", + "list": { + "disabled": "غیرفعال", + "enabled": "فعال" + }, + "notFound": "نتیجه‌ای برای جستجو پیدا نشد", + "searchProviders": "جستجوی ارائه‌دهندگان...", + "sort": "مرتب‌سازی سفارشی" + }, "ollama": { "checker": { "desc": "آزمایش کنید که آیا آدرس پروکسی به درستی وارد شده است", @@ -131,6 +186,122 @@ "title": "دانلود مدل مشخص شده Ollama" } }, + "providerModels": { + "config": { + "aesGcm": "کلید شما و آدرس پروکسی و غیره با استفاده از <1>AES-GCM رمزگذاری خواهد شد", + "apiKey": { + "desc": "لطفاً کلید API {{name}} خود را وارد کنید", + "placeholder": "{{name}} کلید API", + "title": "کلید API" + }, + "baseURL": { + "desc": "باید شامل http(s):// باشد", + "placeholder": "https://your-proxy-url.com/v1", + "title": "آدرس پروکسی API" + }, + "checker": { + "button": "بررسی", + "desc": "آزمون کلید API و آدرس پروکسی برای صحت", + "pass": "بررسی موفقیت‌آمیز", + "title": "بررسی اتصال" + }, + "fetchOnClient": { + "desc": "مدل درخواست کلاینت به طور مستقیم از مرورگر درخواست جلسه را آغاز می‌کند و می‌تواند سرعت پاسخ را افزایش دهد", + "title": "استفاده از مدل درخواست کلاینت" + }, + "helpDoc": "راهنمای پیکربندی", + "waitingForMore": "مدل‌های بیشتری در حال <1>برنامه‌ریزی برای اتصال هستند، لطفاً منتظر بمانید" + }, + "createNew": { + "title": "ایجاد مدل AI سفارشی" + }, + "item": { + "config": "پیکربندی مدل", + "customModelCards": { + "addNew": "ایجاد و افزودن مدل {{id}}", + "confirmDelete": "در حال حذف این مدل سفارشی هستید، پس از حذف قابل بازیابی نخواهد بود، لطفاً با احتیاط عمل کنید." + }, + "delete": { + "confirm": "آیا مطمئن هستید که می‌خواهید مدل {{displayName}} را حذف کنید؟", + "success": "حذف با موفقیت انجام شد", + "title": "حذف مدل" + }, + "modelConfig": { + "azureDeployName": { + "extra": "فیلدی که در Azure OpenAI درخواست واقعی می‌شود", + "placeholder": "لطفاً نام استقرار مدل در Azure را وارد کنید", + "title": "نام استقرار مدل" + }, + "displayName": { + "placeholder": "لطفاً نام نمایشی مدل را وارد کنید، مانند ChatGPT، GPT-4 و غیره", + "title": "نام نمایشی مدل" + }, + "files": { + "extra": "پیاده‌سازی بارگذاری فایل فعلی تنها یک راه‌حل Hack است و فقط برای آزمایش شخصی محدود است. لطفاً منتظر پیاده‌سازی کامل قابلیت بارگذاری فایل باشید", + "title": "پشتیبانی از بارگذاری فایل" + }, + "functionCall": { + "extra": "این پیکربندی تنها قابلیت فراخوانی توابع در برنامه را فعال می‌کند، اینکه آیا فراخوانی توابع پشتیبانی می‌شود به خود مدل بستگی دارد، لطفاً قابلیت استفاده از فراخوانی توابع این مدل را آزمایش کنید", + "title": "پشتیبانی از فراخوانی توابع" + }, + "id": { + "extra": "به عنوان برچسب مدل نمایش داده خواهد شد", + "placeholder": "لطفاً شناسه مدل را وارد کنید، مانند gpt-4-turbo-preview یا claude-2.1", + "title": "شناسه مدل" + }, + "modalTitle": "پیکربندی مدل سفارشی", + "tokens": { + "title": "حداکثر تعداد توکن", + "unlimited": "بدون محدودیت" + }, + "vision": { + "extra": "این پیکربندی تنها قابلیت بارگذاری تصویر در برنامه را فعال می‌کند، اینکه آیا شناسایی پشتیبانی می‌شود به خود مدل بستگی دارد، لطفاً قابلیت استفاده از شناسایی بصری این مدل را آزمایش کنید", + "title": "پشتیبانی از شناسایی بصری" + } + }, + "pricing": { + "image": "${{amount}}/تصویر", + "inputCharts": "${{amount}}/M کاراکتر", + "inputMinutes": "${{amount}}/دقیقه", + "inputTokens": "ورودی ${{amount}}/M", + "outputTokens": "خروجی ${{amount}}/M" + }, + "releasedAt": "منتشر شده در {{releasedAt}}" + }, + "list": { + "disabled": "غیرفعال", + "enabled": "فعال", + "enabledActions": { + "disableAll": "غیرفعال کردن همه", + "enableAll": "فعال کردن همه", + "sort": "مرتب‌سازی مدل‌های سفارشی" + }, + "enabledEmpty": "مدل فعال وجود ندارد، لطفاً از لیست زیر مدل مورد نظر خود را فعال کنید~", + "fetcher": { + "clear": "پاک کردن مدل‌های دریافت شده", + "fetch": "دریافت لیست مدل‌ها", + "fetching": "در حال دریافت لیست مدل‌ها...", + "latestTime": "آخرین زمان به‌روزرسانی: {{time}}", + "noLatestTime": "لیست هنوز دریافت نشده است" + }, + "search": "جستجوی مدل...", + "searchResult": "{{count}} مدل پیدا شد", + "title": "لیست مدل‌ها", + "total": "در مجموع {{count}} مدل در دسترس است" + }, + "searchNotFound": "نتیجه‌ای برای جستجو پیدا نشد" + }, + "sortModal": { + "success": "به‌روزرسانی مرتب‌سازی با موفقیت انجام شد", + "title": "مرتب‌سازی سفارشی", + "update": "به‌روزرسانی" + }, + "updateAiProvider": { + "confirmDelete": "در حال حذف این ارائه‌دهنده AI هستید، پس از حذف قابل بازیابی نخواهد بود، آیا مطمئن هستید که می‌خواهید حذف کنید؟", + "deleteSuccess": "حذف با موفقیت انجام شد", + "tooltip": "به‌روزرسانی پیکربندی پایه ارائه‌دهنده", + "updateSuccess": "به‌روزرسانی با موفقیت انجام شد" + }, "wenxin": { "accessKey": { "desc": "کلید دسترسی Qianfan پلتفرم بایدو را وارد کنید", diff --git a/locales/fa-IR/setting.json b/locales/fa-IR/setting.json index 6e232668d53b..7f994d979b26 100644 --- a/locales/fa-IR/setting.json +++ b/locales/fa-IR/setting.json @@ -411,6 +411,7 @@ "common": "تنظیمات عمومی", "experiment": "آزمایش", "llm": "مدل زبان", + "provider": "ارائه دهنده خدمات هوش مصنوعی", "sync": "همگام‌سازی ابری", "system-agent": "دستیار سیستم", "tts": "خدمات صوتی" diff --git a/locales/fr-FR/common.json b/locales/fr-FR/common.json index ca37d5b2920e..cbda18f51ff4 100644 --- a/locales/fr-FR/common.json +++ b/locales/fr-FR/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporaire", "terms": "Conditions de service", + "update": "Mise à jour", "updateAgent": "Mettre à jour les informations de l'agent", "upgradeVersion": { "action": "Mettre à jour", diff --git a/locales/fr-FR/modelProvider.json b/locales/fr-FR/modelProvider.json index 4628b03f64c1..28febbaa6edf 100644 --- a/locales/fr-FR/modelProvider.json +++ b/locales/fr-FR/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID de compte Cloudflare / adresse API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Veuillez entrer votre clé API", + "required": "Veuillez entrer votre clé API", + "title": "Clé API" + }, + "basicTitle": "Informations de base", + "configTitle": "Informations de configuration", + "confirm": "Créer", + "createSuccess": "Création réussie", + "description": { + "placeholder": "Description du fournisseur (facultatif)", + "title": "Description du fournisseur" + }, + "id": { + "placeholder": "Utilisez uniquement des lettres minuscules, par exemple openai, non modifiable après création", + "required": "Veuillez entrer l'ID du fournisseur", + "title": "ID du fournisseur" + }, + "logo": { + "required": "Veuillez télécharger un logo valide pour le fournisseur", + "title": "Logo du fournisseur" + }, + "name": { + "placeholder": "Veuillez entrer le nom d'affichage du fournisseur", + "required": "Veuillez entrer le nom du fournisseur", + "title": "Nom du fournisseur" + }, + "proxyUrl": { + "placeholder": "Veuillez entrer votre adresse de requête, sinon l'adresse de requête correspondante au SDK sera utilisée", + "title": "Adresse du proxy" + }, + "sdkType": { + "required": "Veuillez sélectionner le type de SDK", + "title": "Format de requête" + }, + "title": "Créer un fournisseur AI personnalisé" + }, "github": { "personalAccessToken": { "desc": "Entrez votre PAT GitHub, cliquez [ici](https://github.com/settings/tokens) pour en créer un.", @@ -77,6 +115,23 @@ "title": "Jeton HuggingFace" } }, + "list": { + "title": { + "disabled": "Fournisseur non activé", + "enabled": "Fournisseur activé" + } + }, + "menu": { + "addCustomProvider": "Ajouter un fournisseur personnalisé", + "all": "Tout", + "list": { + "disabled": "Non activé", + "enabled": "Activé" + }, + "notFound": "Aucun résultat trouvé", + "searchProviders": "Rechercher des fournisseurs...", + "sort": "Tri personnalisé" + }, "ollama": { "checker": { "desc": "Vérifiez si l'adresse du proxy est correctement saisie", @@ -131,6 +186,122 @@ "title": "Télécharger le modèle Ollama spécifié" } }, + "providerModels": { + "config": { + "aesGcm": "Votre clé et votre adresse de proxy seront chiffrées à l'aide de l'algorithme de chiffrement <1>AES-GCM", + "apiKey": { + "desc": "Veuillez entrer votre {{name}} clé API", + "placeholder": "{{name}} clé API", + "title": "Clé API" + }, + "baseURL": { + "desc": "Doit inclure http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "Adresse du proxy API" + }, + "checker": { + "button": "Vérifier", + "desc": "Tester si la clé API et l'adresse de proxy sont correctement renseignées", + "pass": "Vérification réussie", + "title": "Vérification de connectivité" + }, + "fetchOnClient": { + "desc": "Le mode de requête client lancera directement la requête de session depuis le navigateur, ce qui peut améliorer la vitesse de réponse", + "title": "Utiliser le mode de requête client" + }, + "helpDoc": "Guide de configuration", + "waitingForMore": "D'autres modèles sont en <1>planification d'intégration, restez à l'écoute" + }, + "createNew": { + "title": "Créer un modèle AI personnalisé" + }, + "item": { + "config": "Configurer le modèle", + "customModelCards": { + "addNew": "Créer et ajouter le modèle {{id}}", + "confirmDelete": "Vous allez supprimer ce modèle personnalisé, une fois supprimé, il ne pourra pas être récupéré, veuillez agir avec prudence." + }, + "delete": { + "confirm": "Confirmer la suppression du modèle {{displayName}} ?", + "success": "Suppression réussie", + "title": "Supprimer le modèle" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Champ utilisé pour la demande réelle dans Azure OpenAI", + "placeholder": "Veuillez entrer le nom de déploiement du modèle dans Azure", + "title": "Nom de déploiement du modèle" + }, + "displayName": { + "placeholder": "Veuillez entrer le nom d'affichage du modèle, par exemple ChatGPT, GPT-4, etc.", + "title": "Nom d'affichage du modèle" + }, + "files": { + "extra": "La mise en œuvre actuelle du téléchargement de fichiers n'est qu'une solution de contournement, à essayer à vos risques et périls. Veuillez attendre la mise en œuvre complète des capacités de téléchargement de fichiers.", + "title": "Téléchargement de fichiers pris en charge" + }, + "functionCall": { + "extra": "Cette configuration n'activera que la capacité d'appel de fonction dans l'application, la prise en charge des appels de fonction dépend entièrement du modèle lui-même, veuillez tester la disponibilité des capacités d'appel de fonction de ce modèle.", + "title": "Appels de fonction pris en charge" + }, + "id": { + "extra": "S'affichera comme une étiquette de modèle", + "placeholder": "Veuillez entrer l'id du modèle, par exemple gpt-4-turbo-preview ou claude-2.1", + "title": "ID du modèle" + }, + "modalTitle": "Configuration du modèle personnalisé", + "tokens": { + "title": "Nombre maximum de tokens", + "unlimited": "Illimité" + }, + "vision": { + "extra": "Cette configuration n'activera que la configuration de téléchargement d'images dans l'application, la prise en charge de la reconnaissance dépend entièrement du modèle lui-même, veuillez tester la disponibilité des capacités de reconnaissance visuelle de ce modèle.", + "title": "Reconnaissance visuelle prise en charge" + } + }, + "pricing": { + "image": "${{amount}}/image", + "inputCharts": "${{amount}}/M caractères", + "inputMinutes": "${{amount}}/minutes", + "inputTokens": "Entrée ${{amount}}/M", + "outputTokens": "Sortie ${{amount}}/M" + }, + "releasedAt": "Publié le {{releasedAt}}" + }, + "list": { + "disabled": "Non activé", + "enabled": "Activé", + "enabledActions": { + "disableAll": "Désactiver tout", + "enableAll": "Activer tout", + "sort": "Trier les modèles personnalisés" + }, + "enabledEmpty": "Aucun modèle activé pour le moment, veuillez activer vos modèles préférés dans la liste ci-dessous~", + "fetcher": { + "clear": "Effacer les modèles récupérés", + "fetch": "Récupérer la liste des modèles", + "fetching": "Récupération de la liste des modèles en cours...", + "latestTime": "Dernière mise à jour : {{time}}", + "noLatestTime": "Aucune liste récupérée pour le moment" + }, + "search": "Rechercher des modèles...", + "searchResult": "Trouvé {{count}} modèle(s)", + "title": "Liste des modèles", + "total": "Un total de {{count}} modèles disponibles" + }, + "searchNotFound": "Aucun résultat trouvé" + }, + "sortModal": { + "success": "Mise à jour du tri réussie", + "title": "Tri personnalisé", + "update": "Mettre à jour" + }, + "updateAiProvider": { + "confirmDelete": "Vous allez supprimer ce fournisseur AI, une fois supprimé, il ne pourra pas être récupéré, confirmez-vous la suppression ?", + "deleteSuccess": "Suppression réussie", + "tooltip": "Mettre à jour la configuration de base du fournisseur", + "updateSuccess": "Mise à jour réussie" + }, "wenxin": { "accessKey": { "desc": "Entrez la clé d'accès de la plateforme Qianfan de Baidu", diff --git a/locales/fr-FR/setting.json b/locales/fr-FR/setting.json index 7a26e2e4a1ad..1b8cd51a407b 100644 --- a/locales/fr-FR/setting.json +++ b/locales/fr-FR/setting.json @@ -411,6 +411,7 @@ "common": "Paramètres généraux", "experiment": "Expérience", "llm": "Modèle de langue", + "provider": "Fournisseur de services d'IA", "sync": "Synchronisation cloud", "system-agent": "Agent système", "tts": "Service vocal" diff --git a/locales/it-IT/common.json b/locales/it-IT/common.json index 5e40a98e1f22..32ad2ecc9809 100644 --- a/locales/it-IT/common.json +++ b/locales/it-IT/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporaneo", "terms": "Termini di servizio", + "update": "Aggiornamento", "updateAgent": "Aggiorna informazioni agente", "upgradeVersion": { "action": "Aggiorna", diff --git a/locales/it-IT/modelProvider.json b/locales/it-IT/modelProvider.json index a225b1c382ef..491eb6bc9884 100644 --- a/locales/it-IT/modelProvider.json +++ b/locales/it-IT/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID account Cloudflare / indirizzo API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Inserisci la tua API Key", + "required": "Inserisci la tua API Key", + "title": "API Key" + }, + "basicTitle": "Informazioni di base", + "configTitle": "Informazioni di configurazione", + "confirm": "Crea", + "createSuccess": "Creazione avvenuta con successo", + "description": { + "placeholder": "Descrizione del fornitore (opzionale)", + "title": "Descrizione del fornitore" + }, + "id": { + "placeholder": "Si consiglia di utilizzare solo lettere minuscole, ad esempio openai, non modificabile dopo la creazione", + "required": "Inserisci l'ID del fornitore", + "title": "ID del fornitore" + }, + "logo": { + "required": "Carica un logo del fornitore valido", + "title": "Logo del fornitore" + }, + "name": { + "placeholder": "Inserisci il nome visualizzato del fornitore", + "required": "Inserisci il nome del fornitore", + "title": "Nome del fornitore" + }, + "proxyUrl": { + "placeholder": "Inserisci il tuo indirizzo di richiesta, se non specificato verrà utilizzato l'indirizzo di richiesta corrispondente all'SDK", + "title": "Indirizzo proxy" + }, + "sdkType": { + "required": "Seleziona il tipo di SDK", + "title": "Formato della richiesta" + }, + "title": "Crea fornitore AI personalizzato" + }, "github": { "personalAccessToken": { "desc": "Inserisci il tuo PAT di Github, clicca [qui](https://github.com/settings/tokens) per crearne uno", @@ -77,6 +115,23 @@ "title": "Token HuggingFace" } }, + "list": { + "title": { + "disabled": "Fornitore non attivato", + "enabled": "Fornitore attivato" + } + }, + "menu": { + "addCustomProvider": "Aggiungi fornitore personalizzato", + "all": "Tutti", + "list": { + "disabled": "Non attivato", + "enabled": "Attivato" + }, + "notFound": "Nessun risultato trovato", + "searchProviders": "Cerca fornitori...", + "sort": "Ordinamento personalizzato" + }, "ollama": { "checker": { "desc": "Verifica se l'indirizzo del proxy è stato compilato correttamente", @@ -131,6 +186,122 @@ "title": "Scarica il modello Ollama specificato" } }, + "providerModels": { + "config": { + "aesGcm": "La tua chiave e l'indirizzo proxy saranno crittografati utilizzando l'algoritmo di crittografia <1>AES-GCM", + "apiKey": { + "desc": "Inserisci la tua {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Deve contenere http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "Indirizzo proxy API" + }, + "checker": { + "button": "Controlla", + "desc": "Verifica se l'API Key e l'indirizzo proxy sono stati inseriti correttamente", + "pass": "Controllo superato", + "title": "Verifica connettività" + }, + "fetchOnClient": { + "desc": "La modalità di richiesta client avvierà direttamente la richiesta di sessione dal browser, migliorando la velocità di risposta", + "title": "Utilizza la modalità di richiesta client" + }, + "helpDoc": "Guida alla configurazione", + "waitingForMore": "Altri modelli sono in fase di <1>implementazione, resta sintonizzato" + }, + "createNew": { + "title": "Crea modello AI personalizzato" + }, + "item": { + "config": "Configura modello", + "customModelCards": { + "addNew": "Crea e aggiungi modello {{id}}", + "confirmDelete": "Stai per eliminare questo modello personalizzato, una volta eliminato non sarà recuperabile, procedi con cautela." + }, + "delete": { + "confirm": "Confermi di voler eliminare il modello {{displayName}}?", + "success": "Eliminazione avvenuta con successo", + "title": "Elimina modello" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Campo effettivamente richiesto in Azure OpenAI", + "placeholder": "Inserisci il nome di distribuzione del modello in Azure", + "title": "Nome di distribuzione del modello" + }, + "displayName": { + "placeholder": "Inserisci il nome visualizzato del modello, ad esempio ChatGPT, GPT-4, ecc.", + "title": "Nome visualizzato del modello" + }, + "files": { + "extra": "L'attuale implementazione del caricamento file è solo una soluzione temporanea, limitata a tentativi personali. Attendere implementazioni complete per il caricamento file.", + "title": "Supporto per il caricamento file" + }, + "functionCall": { + "extra": "Questa configurazione abiliterà solo la capacità di chiamata di funzione nell'app, la disponibilità della chiamata di funzione dipende interamente dal modello stesso, testare autonomamente la disponibilità della chiamata di funzione di questo modello.", + "title": "Supporto per chiamate di funzione" + }, + "id": { + "extra": "Sarà visualizzato come etichetta del modello", + "placeholder": "Inserisci l'id del modello, ad esempio gpt-4-turbo-preview o claude-2.1", + "title": "ID del modello" + }, + "modalTitle": "Configurazione modello personalizzato", + "tokens": { + "title": "Numero massimo di token", + "unlimited": "Illimitato" + }, + "vision": { + "extra": "Questa configurazione abiliterà solo la configurazione di caricamento immagini nell'app, la disponibilità di riconoscimento dipende interamente dal modello stesso, testare autonomamente la disponibilità di riconoscimento visivo di questo modello.", + "title": "Supporto per riconoscimento visivo" + } + }, + "pricing": { + "image": "${{amount}}/Immagine", + "inputCharts": "${{amount}}/M caratteri", + "inputMinutes": "${{amount}}/minuti", + "inputTokens": "Ingresso ${{amount}}/M", + "outputTokens": "Uscita ${{amount}}/M" + }, + "releasedAt": "Rilasciato il {{releasedAt}}" + }, + "list": { + "disabled": "Non attivato", + "enabled": "Attivato", + "enabledActions": { + "disableAll": "Disattiva tutto", + "enableAll": "Attiva tutto", + "sort": "Ordinamento modelli personalizzato" + }, + "enabledEmpty": "Nessun modello attivato, attiva i modelli desiderati dall'elenco qui sotto~", + "fetcher": { + "clear": "Cancella i modelli recuperati", + "fetch": "Recupera l'elenco dei modelli", + "fetching": "Recupero dell'elenco dei modelli in corso...", + "latestTime": "Ultimo aggiornamento: {{time}}", + "noLatestTime": "Nessun elenco recuperato finora" + }, + "search": "Cerca modelli...", + "searchResult": "Trovati {{count}} modelli", + "title": "Elenco dei modelli", + "total": "Totale di {{count}} modelli disponibili" + }, + "searchNotFound": "Nessun risultato trovato" + }, + "sortModal": { + "success": "Ordinamento aggiornato con successo", + "title": "Ordinamento personalizzato", + "update": "Aggiorna" + }, + "updateAiProvider": { + "confirmDelete": "Stai per eliminare questo fornitore AI, una volta eliminato non sarà recuperabile, confermi di voler eliminare?", + "deleteSuccess": "Eliminazione avvenuta con successo", + "tooltip": "Aggiorna la configurazione di base del fornitore", + "updateSuccess": "Aggiornamento avvenuto con successo" + }, "wenxin": { "accessKey": { "desc": "Inserisci l'Access Key della piattaforma Qianfan di Baidu", diff --git a/locales/it-IT/setting.json b/locales/it-IT/setting.json index 97ae4ea80332..0ab578883a88 100644 --- a/locales/it-IT/setting.json +++ b/locales/it-IT/setting.json @@ -411,6 +411,7 @@ "common": "Impostazioni comuni", "experiment": "实验", "llm": "Modello linguistico", + "provider": "Fornitore di servizi AI", "sync": "云端同步", "system-agent": "Assistente di sistema", "tts": "Servizio vocale" diff --git a/locales/ja-JP/common.json b/locales/ja-JP/common.json index f324aa5140b5..7bb8c49979a8 100644 --- a/locales/ja-JP/common.json +++ b/locales/ja-JP/common.json @@ -275,6 +275,7 @@ }, "temp": "一時的", "terms": "利用規約", + "update": "更新", "updateAgent": "エージェント情報を更新", "upgradeVersion": { "action": "アップグレード", diff --git a/locales/ja-JP/modelProvider.json b/locales/ja-JP/modelProvider.json index dfc773218fe7..eda3a672043f 100644 --- a/locales/ja-JP/modelProvider.json +++ b/locales/ja-JP/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare アカウント ID / API アドレス" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "あなたの API キーを入力してください", + "required": "あなたの API キーを入力してください", + "title": "API キー" + }, + "basicTitle": "基本情報", + "configTitle": "設定情報", + "confirm": "新規作成", + "createSuccess": "新規作成に成功しました", + "description": { + "placeholder": "サービスプロバイダーの紹介(任意)", + "title": "サービスプロバイダーの紹介" + }, + "id": { + "placeholder": "小文字で入力してください(例: openai)。作成後は変更できません", + "required": "サービスプロバイダー ID を入力してください", + "title": "サービスプロバイダー ID" + }, + "logo": { + "required": "正しいサービスプロバイダーのロゴをアップロードしてください", + "title": "サービスプロバイダーのロゴ" + }, + "name": { + "placeholder": "サービスプロバイダーの表示名を入力してください", + "required": "サービスプロバイダー名を入力してください", + "title": "サービスプロバイダー名" + }, + "proxyUrl": { + "placeholder": "リクエストアドレスを入力してください。未入力の場合は SDK に対応するリクエストアドレスが使用されます", + "title": "プロキシアドレス" + }, + "sdkType": { + "required": "SDK タイプを選択してください", + "title": "リクエスト形式" + }, + "title": "カスタム AI サービスプロバイダーの作成" + }, "github": { "personalAccessToken": { "desc": "あなたのGithub PATを入力してください。[こちら](https://github.com/settings/tokens)をクリックして作成します", @@ -77,6 +115,23 @@ "title": "HuggingFace トークン" } }, + "list": { + "title": { + "disabled": "サービスプロバイダーは無効です", + "enabled": "サービスプロバイダーは有効です" + } + }, + "menu": { + "addCustomProvider": "カスタムサービスプロバイダーを追加", + "all": "すべて", + "list": { + "disabled": "未使用", + "enabled": "使用中" + }, + "notFound": "検索結果が見つかりません", + "searchProviders": "サービスプロバイダーを検索...", + "sort": "カスタムソート" + }, "ollama": { "checker": { "desc": "プロキシアドレスが正しく入力されているかをテストします", @@ -131,6 +186,122 @@ "title": "指定されたOllamaモデルをダウンロード" } }, + "providerModels": { + "config": { + "aesGcm": "あなたのキーとプロキシアドレスなどは <1>AES-GCM 暗号化アルゴリズムを使用して暗号化されます", + "apiKey": { + "desc": "あなたの {{name}} API キーを入力してください", + "placeholder": "{{name}} API キー", + "title": "API キー" + }, + "baseURL": { + "desc": "http(s):// を含める必要があります", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API プロキシアドレス" + }, + "checker": { + "button": "チェック", + "desc": "API キーとプロキシアドレスが正しく入力されているかテストします", + "pass": "チェックに合格しました", + "title": "接続性チェック" + }, + "fetchOnClient": { + "desc": "クライアントリクエストモードはブラウザから直接セッションリクエストを発起し、応答速度を向上させます", + "title": "クライアントリクエストモードを使用" + }, + "helpDoc": "設定ガイド", + "waitingForMore": "さらに多くのモデルが <1>接続予定 です。お楽しみに" + }, + "createNew": { + "title": "カスタム AI モデルの作成" + }, + "item": { + "config": "モデルを設定", + "customModelCards": { + "addNew": "{{id}} モデルを作成して追加", + "confirmDelete": "このカスタムモデルを削除しようとしています。削除後は復元できませんので、慎重に操作してください。" + }, + "delete": { + "confirm": "モデル {{displayName}} を削除してもよろしいですか?", + "success": "削除に成功しました", + "title": "モデルを削除" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Azure OpenAI で実際にリクエストされるフィールド", + "placeholder": "Azure でのモデルデプロイ名を入力してください", + "title": "モデルデプロイ名" + }, + "displayName": { + "placeholder": "モデルの表示名を入力してください(例: ChatGPT、GPT-4 など)", + "title": "モデル表示名" + }, + "files": { + "extra": "現在のファイルアップロード実装は一つのハック手法に過ぎず、自己責任での試行に限られます。完全なファイルアップロード機能は今後の実装をお待ちください", + "title": "ファイルアップロードをサポート" + }, + "functionCall": { + "extra": "この設定はアプリ内の関数呼び出し機能のみを有効にします。関数呼び出しのサポートはモデル自体に依存しますので、そのモデルの関数呼び出し機能の可用性を自分でテストしてください", + "title": "関数呼び出しをサポート" + }, + "id": { + "extra": "モデルラベルとして表示されます", + "placeholder": "モデル ID を入力してください(例: gpt-4-turbo-preview または claude-2.1)", + "title": "モデル ID" + }, + "modalTitle": "カスタムモデル設定", + "tokens": { + "title": "最大トークン数", + "unlimited": "無制限" + }, + "vision": { + "extra": "この設定はアプリ内の画像アップロード設定のみを有効にします。認識のサポートはモデル自体に依存しますので、そのモデルの視覚認識機能の可用性を自分でテストしてください", + "title": "視覚認識をサポート" + } + }, + "pricing": { + "image": "${{amount}}/画像", + "inputCharts": "${{amount}}/M 文字", + "inputMinutes": "${{amount}}/分", + "inputTokens": "入力 ${{amount}}/M", + "outputTokens": "出力 ${{amount}}/M" + }, + "releasedAt": "リリース日: {{releasedAt}}" + }, + "list": { + "disabled": "無効", + "enabled": "有効", + "enabledActions": { + "disableAll": "すべて無効にする", + "enableAll": "すべて有効にする", + "sort": "カスタムモデルの並べ替え" + }, + "enabledEmpty": "有効なモデルはありません。下のリストからお気に入りのモデルを有効にしてください〜", + "fetcher": { + "clear": "取得したモデルをクリア", + "fetch": "モデルリストを取得", + "fetching": "モデルリストを取得中...", + "latestTime": "最終更新日時:{{time}}", + "noLatestTime": "まだリストを取得していません" + }, + "search": "モデルを検索...", + "searchResult": "{{count}} 個のモデルが見つかりました", + "title": "モデルリスト", + "total": "利用可能なモデルは合計 {{count}} 件です" + }, + "searchNotFound": "検索結果が見つかりませんでした" + }, + "sortModal": { + "success": "ソートが更新されました", + "title": "カスタムソート", + "update": "更新" + }, + "updateAiProvider": { + "confirmDelete": "この AI サービスプロバイダーを削除しようとしています。削除後は復元できません。削除してもよろしいですか?", + "deleteSuccess": "削除に成功しました", + "tooltip": "サービスプロバイダーの基本設定を更新", + "updateSuccess": "更新に成功しました" + }, "wenxin": { "accessKey": { "desc": "百度千帆プラットフォームのAccess Keyを入力してください", diff --git a/locales/ja-JP/setting.json b/locales/ja-JP/setting.json index 43c5adf18861..b09714913d6b 100644 --- a/locales/ja-JP/setting.json +++ b/locales/ja-JP/setting.json @@ -411,6 +411,7 @@ "common": "一般設定", "experiment": "実験", "llm": "言語モデル", + "provider": "AIサービスプロバイダー", "sync": "クラウド同期", "system-agent": "システムアシスタント", "tts": "音声サービス" diff --git a/locales/ko-KR/common.json b/locales/ko-KR/common.json index 8d98cb52963a..e667bfed0a60 100644 --- a/locales/ko-KR/common.json +++ b/locales/ko-KR/common.json @@ -275,6 +275,7 @@ }, "temp": "임시", "terms": "이용 약관", + "update": "업데이트", "updateAgent": "에이전트 정보 업데이트", "upgradeVersion": { "action": "업그레이드", diff --git a/locales/ko-KR/modelProvider.json b/locales/ko-KR/modelProvider.json index 860fa15bdfd0..6db54c01d335 100644 --- a/locales/ko-KR/modelProvider.json +++ b/locales/ko-KR/modelProvider.json @@ -63,6 +63,44 @@ "title": "클라우드 플레어 계정 ID / API 주소" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "API 키를 입력하세요", + "required": "API 키를 입력하세요", + "title": "API 키" + }, + "basicTitle": "기본 정보", + "configTitle": "설정 정보", + "confirm": "새로 만들기", + "createSuccess": "생성이 성공적으로 완료되었습니다", + "description": { + "placeholder": "서비스 제공자 소개 (선택 사항)", + "title": "서비스 제공자 소개" + }, + "id": { + "placeholder": "소문자로 입력하세요, 예: openai, 생성 후 수정할 수 없습니다", + "required": "서비스 제공자 ID를 입력하세요", + "title": "서비스 제공자 ID" + }, + "logo": { + "required": "올바른 서비스 제공자 로고를 업로드하세요", + "title": "서비스 제공자 로고" + }, + "name": { + "placeholder": "서비스 제공자의 표시 이름을 입력하세요", + "required": "서비스 제공자 이름을 입력하세요", + "title": "서비스 제공자 이름" + }, + "proxyUrl": { + "placeholder": "요청 주소를 입력하세요, 입력하지 않으면 SDK의 요청 주소가 사용됩니다", + "title": "프록시 주소" + }, + "sdkType": { + "required": "SDK 유형을 선택하세요", + "title": "요청 형식" + }, + "title": "사용자 정의 AI 서비스 제공자 생성" + }, "github": { "personalAccessToken": { "desc": "당신의 Github PAT를 입력하세요. [여기](https://github.com/settings/tokens)를 클릭하여 생성하세요.", @@ -77,6 +115,23 @@ "title": "HuggingFace 토큰" } }, + "list": { + "title": { + "disabled": "서비스 제공자가 비활성화되었습니다", + "enabled": "서비스 제공자가 활성화되었습니다" + } + }, + "menu": { + "addCustomProvider": "사용자 정의 서비스 제공자 추가", + "all": "모두", + "list": { + "disabled": "비활성화됨", + "enabled": "활성화됨" + }, + "notFound": "검색 결과를 찾을 수 없습니다", + "searchProviders": "서비스 제공자 검색...", + "sort": "사용자 정의 정렬" + }, "ollama": { "checker": { "desc": "프록시 주소가 올바르게 입력되었는지 테스트합니다", @@ -131,6 +186,122 @@ "title": "지정된 Ollama 모델 다운로드" } }, + "providerModels": { + "config": { + "aesGcm": "귀하의 비밀 키와 프록시 주소 등은 <1>AES-GCM 암호화 알고리즘을 사용하여 암호화됩니다", + "apiKey": { + "desc": "{{name}} API 키를 입력하세요", + "placeholder": "{{name}} API 키", + "title": "API 키" + }, + "baseURL": { + "desc": "http(s)://를 포함해야 합니다", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API 프록시 주소" + }, + "checker": { + "button": "검사", + "desc": "API 키와 프록시 주소가 올바르게 입력되었는지 테스트합니다", + "pass": "검사 통과", + "title": "연결성 검사" + }, + "fetchOnClient": { + "desc": "클라이언트 요청 모드는 브라우저에서 직접 세션 요청을 시작하여 응답 속도를 높일 수 있습니다", + "title": "클라이언트 요청 모드 사용" + }, + "helpDoc": "설정 가이드", + "waitingForMore": "더 많은 모델이 <1>계획 중입니다. 기대해 주세요" + }, + "createNew": { + "title": "사용자 정의 AI 모델 생성" + }, + "item": { + "config": "모델 구성", + "customModelCards": { + "addNew": "{{id}} 모델 생성 및 추가", + "confirmDelete": "해당 사용자 정의 모델을 삭제하려고 합니다. 삭제 후에는 복구할 수 없으니 신중하게 진행하세요." + }, + "delete": { + "confirm": "모델 {{displayName}}를 삭제하시겠습니까?", + "success": "삭제 성공", + "title": "모델 삭제" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Azure OpenAI에서 실제 요청되는 필드", + "placeholder": "Azure에서 모델 배포 이름을 입력하세요", + "title": "모델 배포 이름" + }, + "displayName": { + "placeholder": "모델의 표시 이름을 입력하세요, 예: ChatGPT, GPT-4 등", + "title": "모델 표시 이름" + }, + "files": { + "extra": "현재 파일 업로드 구현은 단지 하나의 해킹 방법일 뿐이며, 스스로 시도하는 것만 가능합니다. 완전한 파일 업로드 기능은 후속 구현을 기다려 주세요.", + "title": "파일 업로드 지원" + }, + "functionCall": { + "extra": "이 설정은 애플리케이션 내에서 함수 호출 기능만 활성화합니다. 함수 호출 지원 여부는 모델 자체에 따라 다르므로, 해당 모델의 함수 호출 가능성을 스스로 테스트하세요.", + "title": "함수 호출 지원" + }, + "id": { + "extra": "모델 태그로 표시됩니다", + "placeholder": "모델 ID를 입력하세요, 예: gpt-4-turbo-preview 또는 claude-2.1", + "title": "모델 ID" + }, + "modalTitle": "사용자 정의 모델 구성", + "tokens": { + "title": "최대 토큰 수", + "unlimited": "제한 없음" + }, + "vision": { + "extra": "이 설정은 애플리케이션 내에서 이미지 업로드 기능만 활성화합니다. 인식 지원 여부는 모델 자체에 따라 다르므로, 해당 모델의 시각 인식 가능성을 스스로 테스트하세요.", + "title": "시각 인식 지원" + } + }, + "pricing": { + "image": "${{amount}}/이미지", + "inputCharts": "${{amount}}/M 문자", + "inputMinutes": "${{amount}}/분", + "inputTokens": "입력 ${{amount}}/M", + "outputTokens": "출력 ${{amount}}/M" + }, + "releasedAt": "발행일 {{releasedAt}}" + }, + "list": { + "disabled": "비활성화", + "enabled": "활성화", + "enabledActions": { + "disableAll": "모두 비활성화", + "enableAll": "모두 활성화", + "sort": "사용자 정의 모델 정렬" + }, + "enabledEmpty": "활성화된 모델이 없습니다. 아래 목록에서 원하는 모델을 활성화하세요~", + "fetcher": { + "clear": "가져온 모델 지우기", + "fetch": "모델 목록 가져오기", + "fetching": "모델 목록을 가져오는 중...", + "latestTime": "마지막 업데이트 시간: {{time}}", + "noLatestTime": "아직 목록을 가져오지 않았습니다." + }, + "search": "모델 검색...", + "searchResult": "{{count}} 개의 모델이 검색되었습니다", + "title": "모델 목록", + "total": "사용 가능한 모델 총 {{count}} 개" + }, + "searchNotFound": "검색 결과를 찾을 수 없습니다" + }, + "sortModal": { + "success": "정렬 업데이트 성공", + "title": "사용자 정의 정렬", + "update": "업데이트" + }, + "updateAiProvider": { + "confirmDelete": "해당 AI 서비스 제공자를 삭제하려고 합니다. 삭제 후에는 복구할 수 없으니 확인하시겠습니까?", + "deleteSuccess": "삭제 성공", + "tooltip": "서비스 제공자 기본 설정 업데이트", + "updateSuccess": "업데이트 성공" + }, "wenxin": { "accessKey": { "desc": "바이두 천범 플랫폼의 Access Key를 입력하세요", diff --git a/locales/ko-KR/setting.json b/locales/ko-KR/setting.json index 5425cd642af1..19dbb33bd78d 100644 --- a/locales/ko-KR/setting.json +++ b/locales/ko-KR/setting.json @@ -411,6 +411,7 @@ "common": "일반 설정", "experiment": "실험", "llm": "언어 모델", + "provider": "AI 서비스 제공자", "sync": "클라우드 동기화", "system-agent": "시스템 도우미", "tts": "음성 서비스" diff --git a/locales/nl-NL/common.json b/locales/nl-NL/common.json index ec486adb3ba8..f84960c39adb 100644 --- a/locales/nl-NL/common.json +++ b/locales/nl-NL/common.json @@ -275,6 +275,7 @@ }, "temp": "tijdelijk", "terms": "algemene voorwaarden", + "update": "Bijwerken", "updateAgent": "update assistent", "upgradeVersion": { "action": "upgraden", diff --git a/locales/nl-NL/modelProvider.json b/locales/nl-NL/modelProvider.json index 8ed9933a477b..5f9c01830a75 100644 --- a/locales/nl-NL/modelProvider.json +++ b/locales/nl-NL/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare-account ID / API-URL" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Vul je API-sleutel in", + "required": "Vul je API-sleutel in", + "title": "API-sleutel" + }, + "basicTitle": "Basisinformatie", + "configTitle": "Configuratie-informatie", + "confirm": "Nieuw aanmaken", + "createSuccess": "Succesvol aangemaakt", + "description": { + "placeholder": "Beschrijving van de provider (optioneel)", + "title": "Beschrijving van de provider" + }, + "id": { + "placeholder": "Gebruik alleen kleine letters, bijvoorbeeld openai, kan niet worden gewijzigd na aanmaak", + "required": "Vul de provider ID in", + "title": "Provider ID" + }, + "logo": { + "required": "Upload een correcte provider-logo", + "title": "Provider-logo" + }, + "name": { + "placeholder": "Voer de weergavenaam van de provider in", + "required": "Vul de naam van de provider in", + "title": "Naam van de provider" + }, + "proxyUrl": { + "placeholder": "Vul je aanvraagadres in, als je dit niet invult, wordt het overeenkomstige aanvraagadres van de SDK gebruikt", + "title": "Proxy-adres" + }, + "sdkType": { + "required": "Selecteer het SDK-type", + "title": "Aanvraagformaat" + }, + "title": "Maak een aangepaste AI-provider" + }, "github": { "personalAccessToken": { "desc": "Vul je Github PAT in, klik [hier](https://github.com/settings/tokens) om er een te maken", @@ -77,6 +115,23 @@ "title": "HuggingFace Token" } }, + "list": { + "title": { + "disabled": "Dienstverlener niet ingeschakeld", + "enabled": "Dienstverlener ingeschakeld" + } + }, + "menu": { + "addCustomProvider": "Voeg aangepaste provider toe", + "all": "Alles", + "list": { + "disabled": "Niet ingeschakeld", + "enabled": "Ingeschakeld" + }, + "notFound": "Geen zoekresultaten gevonden", + "searchProviders": "Zoek providers...", + "sort": "Aangepaste sortering" + }, "ollama": { "checker": { "desc": "Test of het proxyadres correct is ingevuld", @@ -131,6 +186,122 @@ "title": "Download het opgegeven Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Je sleutel en proxy-adres worden versleuteld met <1>AES-GCM encryptie-algoritme", + "apiKey": { + "desc": "Vul je {{name}} API-sleutel in", + "placeholder": "{{name}} API-sleutel", + "title": "API-sleutel" + }, + "baseURL": { + "desc": "Moet http(s):// bevatten", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API-proxy-adres" + }, + "checker": { + "button": "Controleer", + "desc": "Test of de API-sleutel en proxy-adres correct zijn ingevuld", + "pass": "Controle geslaagd", + "title": "Connectiviteitstest" + }, + "fetchOnClient": { + "desc": "Clientaanvraagmodus zal sessieaanvragen rechtstreeks vanuit de browser initiëren, wat de responssnelheid kan verbeteren", + "title": "Gebruik clientaanvraagmodus" + }, + "helpDoc": "Configuratiehandleiding", + "waitingForMore": "Meer modellen zijn in <1>planning voor integratie, blijf op de hoogte" + }, + "createNew": { + "title": "Maak een aangepast AI-model" + }, + "item": { + "config": "Configureer model", + "customModelCards": { + "addNew": "Maak en voeg {{id}} model toe", + "confirmDelete": "Je staat op het punt dit aangepaste model te verwijderen, na verwijdering kan het niet worden hersteld, wees voorzichtig." + }, + "delete": { + "confirm": "Bevestig verwijdering van model {{displayName}}?", + "success": "Verwijdering geslaagd", + "title": "Verwijder model" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Het veld dat daadwerkelijk wordt aangevraagd in Azure OpenAI", + "placeholder": "Voer de modelimplementatienaam in Azure in", + "title": "Modelimplementatienaam" + }, + "displayName": { + "placeholder": "Voer de weergavenaam van het model in, bijvoorbeeld ChatGPT, GPT-4, enz.", + "title": "Weergavenaam van het model" + }, + "files": { + "extra": "De huidige bestandsuploadimplementatie is slechts een hackoplossing, alleen voor eigen gebruik. Volledige bestandsuploadcapaciteit komt later beschikbaar.", + "title": "Ondersteuning voor bestandsupload" + }, + "functionCall": { + "extra": "Deze configuratie zal alleen de functieaanroepcapaciteit in de applicatie inschakelen, of functies worden ondersteund hangt volledig af van het model zelf, test de beschikbaarheid van de functieaanroepcapaciteit van dit model zelf.", + "title": "Ondersteuning voor functieaanroep" + }, + "id": { + "extra": "Zal worden weergegeven als modellabel", + "placeholder": "Voer model-id in, bijvoorbeeld gpt-4-turbo-preview of claude-2.1", + "title": "Model ID" + }, + "modalTitle": "Configuratie van aangepast model", + "tokens": { + "title": "Maximaal aantal tokens", + "unlimited": "Onbeperkt" + }, + "vision": { + "extra": "Deze configuratie zal alleen de afbeeldinguploadcapaciteit in de applicatie inschakelen, of herkenning wordt ondersteund hangt volledig af van het model zelf, test de beschikbaarheid van de visuele herkenningscapaciteit van dit model zelf.", + "title": "Ondersteuning voor visuele herkenning" + } + }, + "pricing": { + "image": "${{amount}}/Afbeelding", + "inputCharts": "${{amount}}/M Tekens", + "inputMinutes": "${{amount}}/Minuten", + "inputTokens": "Invoer ${{amount}}/M", + "outputTokens": "Uitvoer ${{amount}}/M" + }, + "releasedAt": "Uitgebracht op {{releasedAt}}" + }, + "list": { + "disabled": "Niet ingeschakeld", + "enabled": "Ingeschakeld", + "enabledActions": { + "disableAll": "Alle uitschakelen", + "enableAll": "Alle inschakelen", + "sort": "Aangepaste model sortering" + }, + "enabledEmpty": "Geen ingeschakelde modellen, schakel de modellen hieronder in die je leuk vindt~", + "fetcher": { + "clear": "Verwijder de opgehaalde modellen", + "fetch": "Haal modellenlijst op", + "fetching": "Bezig met het ophalen van de modellenlijst...", + "latestTime": "Laatste update tijd: {{time}}", + "noLatestTime": "Lijst nog niet opgehaald" + }, + "search": "Zoek modellen...", + "searchResult": "Gevonden {{count}} modellen", + "title": "Modellenlijst", + "total": "In totaal {{count}} modellen beschikbaar" + }, + "searchNotFound": "Geen zoekresultaten gevonden" + }, + "sortModal": { + "success": "Sortering succesvol bijgewerkt", + "title": "Aangepaste sortering", + "update": "Bijwerken" + }, + "updateAiProvider": { + "confirmDelete": "Je staat op het punt deze AI-provider te verwijderen, na verwijdering kan deze niet worden hersteld, bevestig je verwijdering?", + "deleteSuccess": "Verwijdering geslaagd", + "tooltip": "Werk basisconfiguratie van provider bij", + "updateSuccess": "Bijwerking geslaagd" + }, "wenxin": { "accessKey": { "desc": "Vul de Access Key van het Baidu Qianfan-platform in", diff --git a/locales/nl-NL/setting.json b/locales/nl-NL/setting.json index c44e43b37f36..97e23bdf116e 100644 --- a/locales/nl-NL/setting.json +++ b/locales/nl-NL/setting.json @@ -411,6 +411,7 @@ "common": "Algemene instellingen", "experiment": "Experiment", "llm": "Taalmodel", + "provider": "AI-dienstverlener", "sync": "Cloudsynchronisatie", "system-agent": "Systeemassistent", "tts": "Spraakdienst" diff --git a/locales/pl-PL/common.json b/locales/pl-PL/common.json index 6a52fc52bbbd..f3e0541455d4 100644 --- a/locales/pl-PL/common.json +++ b/locales/pl-PL/common.json @@ -275,6 +275,7 @@ }, "temp": "Tymczasowy", "terms": "Warunki korzystania", + "update": "Aktualizuj", "updateAgent": "Zaktualizuj informacje o agencie", "upgradeVersion": { "action": "Aktualizuj", diff --git a/locales/pl-PL/modelProvider.json b/locales/pl-PL/modelProvider.json index 58bf86f19296..761cbfd28d89 100644 --- a/locales/pl-PL/modelProvider.json +++ b/locales/pl-PL/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID konta Cloudflare / adres API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Proszę wpisać swój klucz API", + "required": "Proszę wpisać swój klucz API", + "title": "Klucz API" + }, + "basicTitle": "Podstawowe informacje", + "configTitle": "Informacje konfiguracyjne", + "confirm": "Utwórz", + "createSuccess": "Utworzenie zakończone sukcesem", + "description": { + "placeholder": "Opis dostawcy usług (opcjonalnie)", + "title": "Opis dostawcy usług" + }, + "id": { + "placeholder": "Zaleca się użycie małych liter, np. openai, po utworzeniu nie można edytować", + "required": "Proszę wpisać identyfikator dostawcy", + "title": "Identyfikator dostawcy" + }, + "logo": { + "required": "Proszę przesłać poprawne logo dostawcy", + "title": "Logo dostawcy" + }, + "name": { + "placeholder": "Proszę wpisać nazwę wyświetlaną dostawcy", + "required": "Proszę wpisać nazwę dostawcy", + "title": "Nazwa dostawcy" + }, + "proxyUrl": { + "placeholder": "Proszę wpisać adres żądania, jeśli nie zostanie podany, użyty zostanie odpowiedni adres żądania SDK", + "title": "Adres proxy" + }, + "sdkType": { + "required": "Proszę wybrać typ SDK", + "title": "Format żądania" + }, + "title": "Utwórz niestandardowego dostawcę AI" + }, "github": { "personalAccessToken": { "desc": "Wprowadź swój osobisty token dostępu GitHub (PAT), kliknij [tutaj](https://github.com/settings/tokens), aby go utworzyć", @@ -77,6 +115,23 @@ "title": "Token HuggingFace" } }, + "list": { + "title": { + "disabled": "Usługa nieaktywna", + "enabled": "Usługa aktywna" + } + }, + "menu": { + "addCustomProvider": "Dodaj niestandardowego dostawcę", + "all": "Wszystko", + "list": { + "disabled": "Nieaktywny", + "enabled": "Aktywny" + }, + "notFound": "Nie znaleziono wyników wyszukiwania", + "searchProviders": "Szukaj dostawców...", + "sort": "Niestandardowe sortowanie" + }, "ollama": { "checker": { "desc": "Test czy adres proxy jest poprawnie wypełniony", @@ -131,6 +186,122 @@ "title": "Pobierz określony model Ollama" } }, + "providerModels": { + "config": { + "aesGcm": "Twój klucz oraz adres proxy będą szyfrowane za pomocą <1>AES-GCM", + "apiKey": { + "desc": "Proszę wpisać swój {{name}} klucz API", + "placeholder": "{{name}} klucz API", + "title": "Klucz API" + }, + "baseURL": { + "desc": "Musi zawierać http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "Adres proxy API" + }, + "checker": { + "button": "Sprawdź", + "desc": "Testuj, czy klucz API i adres proxy są poprawnie wpisane", + "pass": "Sprawdzenie zakończone sukcesem", + "title": "Sprawdzenie łączności" + }, + "fetchOnClient": { + "desc": "Tryb żądania klienta rozpocznie sesję bezpośrednio z przeglądarki, co może przyspieszyć czas odpowiedzi", + "title": "Użyj trybu żądania klienta" + }, + "helpDoc": "Dokumentacja konfiguracyjna", + "waitingForMore": "Więcej modeli jest w <1>planach integracji, proszę czekać" + }, + "createNew": { + "title": "Utwórz niestandardowy model AI" + }, + "item": { + "config": "Konfiguracja modelu", + "customModelCards": { + "addNew": "Utwórz i dodaj model {{id}}", + "confirmDelete": "Zaraz usuniesz ten niestandardowy model, po usunięciu nie będzie można go przywrócić, proszę działać ostrożnie." + }, + "delete": { + "confirm": "Czy na pewno chcesz usunąć model {{displayName}}?", + "success": "Usunięcie zakończone sukcesem", + "title": "Usuń model" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Pole, które jest rzeczywiście używane w Azure OpenAI", + "placeholder": "Proszę wpisać nazwę wdrożenia modelu w Azure", + "title": "Nazwa wdrożenia modelu" + }, + "displayName": { + "placeholder": "Proszę wpisać nazwę wyświetlaną modelu, np. ChatGPT, GPT-4 itp.", + "title": "Nazwa wyświetlana modelu" + }, + "files": { + "extra": "Obecna implementacja przesyłania plików jest jedynie rozwiązaniem hackowym, przeznaczonym do samodzielnego testowania. Pełna funkcjonalność przesyłania plików będzie dostępna w przyszłości.", + "title": "Wsparcie dla przesyłania plików" + }, + "functionCall": { + "extra": "Ta konfiguracja włączy tylko możliwość wywoływania funkcji w aplikacji, czy model obsługuje wywołania funkcji zależy od samego modelu, proszę samodzielnie przetestować dostępność wywołań funkcji tego modelu.", + "title": "Wsparcie dla wywołań funkcji" + }, + "id": { + "extra": "Będzie wyświetlane jako etykieta modelu", + "placeholder": "Proszę wpisać id modelu, np. gpt-4-turbo-preview lub claude-2.1", + "title": "ID modelu" + }, + "modalTitle": "Konfiguracja niestandardowego modelu", + "tokens": { + "title": "Maksymalna liczba tokenów", + "unlimited": "Bez ograniczeń" + }, + "vision": { + "extra": "Ta konfiguracja włączy tylko możliwość przesyłania obrazów w aplikacji, czy model obsługuje rozpoznawanie zależy od samego modelu, proszę samodzielnie przetestować dostępność rozpoznawania wizualnego tego modelu.", + "title": "Wsparcie dla rozpoznawania wizualnego" + } + }, + "pricing": { + "image": "${{amount}}/obraz", + "inputCharts": "${{amount}}/M znaków", + "inputMinutes": "${{amount}}/minut", + "inputTokens": "Wprowadzenie ${{amount}}/M", + "outputTokens": "Wyjście ${{amount}}/M" + }, + "releasedAt": "Wydano {{releasedAt}}" + }, + "list": { + "disabled": "Nieaktywne", + "enabled": "Aktywne", + "enabledActions": { + "disableAll": "Dezaktywuj wszystkie", + "enableAll": "Aktywuj wszystkie", + "sort": "Sortowanie modeli niestandardowych" + }, + "enabledEmpty": "Brak aktywnych modeli, aktywuj ulubione modele z poniższej listy~", + "fetcher": { + "clear": "Wyczyść pobrane modele", + "fetch": "Pobierz listę modeli", + "fetching": "Pobieranie listy modeli...", + "latestTime": "Ostatnia aktualizacja: {{time}}", + "noLatestTime": "Lista nie została jeszcze pobrana" + }, + "search": "Szukaj modeli...", + "searchResult": "Znaleziono {{count}} modeli", + "title": "Lista modeli", + "total": "Łącznie dostępnych modeli: {{count}}" + }, + "searchNotFound": "Nie znaleziono wyników wyszukiwania" + }, + "sortModal": { + "success": "Aktualizacja sortowania zakończona sukcesem", + "title": "Niestandardowe sortowanie", + "update": "Aktualizuj" + }, + "updateAiProvider": { + "confirmDelete": "Zaraz usuniesz tego dostawcę AI, po usunięciu nie będzie można go przywrócić, czy na pewno chcesz usunąć?", + "deleteSuccess": "Usunięcie zakończone sukcesem", + "tooltip": "Aktualizuj podstawowe ustawienia dostawcy", + "updateSuccess": "Aktualizacja zakończona sukcesem" + }, "wenxin": { "accessKey": { "desc": "Wprowadź Access Key z platformy Baidu Qianfan", diff --git a/locales/pl-PL/setting.json b/locales/pl-PL/setting.json index 0a2e25083f95..fa66a39b0674 100644 --- a/locales/pl-PL/setting.json +++ b/locales/pl-PL/setting.json @@ -411,6 +411,7 @@ "common": "Ustawienia ogólne", "experiment": "Eksperyment", "llm": "Model językowy", + "provider": "Dostawca usług AI", "sync": "Synchronizacja w chmurze", "system-agent": "System Agent", "tts": "Usługa głosowa" diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json index d704d8af05aa..c852c5880662 100644 --- a/locales/pt-BR/common.json +++ b/locales/pt-BR/common.json @@ -275,6 +275,7 @@ }, "temp": "Temporário", "terms": "Termos de Serviço", + "update": "Atualizar", "updateAgent": "Atualizar informações do assistente", "upgradeVersion": { "action": "Atualizar", diff --git a/locales/pt-BR/modelProvider.json b/locales/pt-BR/modelProvider.json index de62bc6036c7..8292753763f0 100644 --- a/locales/pt-BR/modelProvider.json +++ b/locales/pt-BR/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID da conta do Cloudflare / Endereço da API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Por favor, insira sua API Key", + "required": "Por favor, insira sua API Key", + "title": "API Key" + }, + "basicTitle": "Informações Básicas", + "configTitle": "Informações de Configuração", + "confirm": "Criar Novo", + "createSuccess": "Criação bem-sucedida", + "description": { + "placeholder": "Descrição do provedor (opcional)", + "title": "Descrição do Provedor" + }, + "id": { + "placeholder": "Sugestão: tudo em minúsculas, por exemplo, openai, não poderá ser modificado após a criação", + "required": "Por favor, insira o ID do provedor", + "title": "ID do Provedor" + }, + "logo": { + "required": "Por favor, envie um logo correto do provedor", + "title": "Logo do Provedor" + }, + "name": { + "placeholder": "Por favor, insira o nome de exibição do provedor", + "required": "Por favor, insira o nome do provedor", + "title": "Nome do Provedor" + }, + "proxyUrl": { + "placeholder": "Por favor, insira seu endereço de requisição, se não for preenchido, será usado o endereço correspondente do SDK", + "title": "Endereço do Proxy" + }, + "sdkType": { + "required": "Por favor, selecione o tipo de SDK", + "title": "Formato da Requisição" + }, + "title": "Criar Provedor de AI Personalizado" + }, "github": { "personalAccessToken": { "desc": "Insira seu PAT do Github, clique [aqui](https://github.com/settings/tokens) para criar", @@ -77,6 +115,23 @@ "title": "Token do HuggingFace" } }, + "list": { + "title": { + "disabled": "Fornecedor não habilitado", + "enabled": "Fornecedor habilitado" + } + }, + "menu": { + "addCustomProvider": "Adicionar Provedor Personalizado", + "all": "Todos", + "list": { + "disabled": "Desativado", + "enabled": "Ativado" + }, + "notFound": "Nenhum resultado encontrado", + "searchProviders": "Pesquisar Provedores...", + "sort": "Ordenação Personalizada" + }, "ollama": { "checker": { "desc": "Teste se o endereço do proxy está corretamente preenchido", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Sua chave e o endereço do proxy serão criptografados usando o algoritmo de criptografia <1>AES-GCM", + "apiKey": { + "desc": "Por favor, insira sua {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Deve incluir http(s)://", + "placeholder": "https://seu-endereco-proxy.com/v1", + "title": "Endereço do Proxy API" + }, + "checker": { + "button": "Verificar", + "desc": "Teste se a API Key e o endereço do proxy estão preenchidos corretamente", + "pass": "Verificação bem-sucedida", + "title": "Verificação de Conectividade" + }, + "fetchOnClient": { + "desc": "O modo de requisição do cliente iniciará a requisição de sessão diretamente do navegador, podendo aumentar a velocidade de resposta", + "title": "Usar Modo de Requisição do Cliente" + }, + "helpDoc": "Tutorial de Configuração", + "waitingForMore": "Mais modelos estão <1>planejados para integração, fique atento" + }, + "createNew": { + "title": "Criar Modelo de AI Personalizado" + }, + "item": { + "config": "Configurar Modelo", + "customModelCards": { + "addNew": "Criar e adicionar modelo {{id}}", + "confirmDelete": "Você está prestes a excluir este modelo personalizado, após a exclusão não poderá ser recuperado, por favor, proceda com cautela." + }, + "delete": { + "confirm": "Confirmar exclusão do modelo {{displayName}}?", + "success": "Exclusão bem-sucedida", + "title": "Excluir Modelo" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Campo solicitado na Azure OpenAI", + "placeholder": "Por favor, insira o nome de implantação do modelo na Azure", + "title": "Nome de Implantação do Modelo" + }, + "displayName": { + "placeholder": "Por favor, insira o nome de exibição do modelo, por exemplo, ChatGPT, GPT-4, etc.", + "title": "Nome de Exibição do Modelo" + }, + "files": { + "extra": "A implementação atual de upload de arquivos é apenas uma solução temporária, limitada a tentativas pessoais. A capacidade completa de upload de arquivos será implementada posteriormente.", + "title": "Suporte a Upload de Arquivos" + }, + "functionCall": { + "extra": "Esta configuração apenas habilitará a capacidade de chamada de função no aplicativo, se a função for suportada depende do modelo em si, teste a capacidade de chamada de função desse modelo.", + "title": "Suporte a Chamada de Função" + }, + "id": { + "extra": "Será exibido como uma etiqueta do modelo", + "placeholder": "Por favor, insira o id do modelo, por exemplo, gpt-4-turbo-preview ou claude-2.1", + "title": "ID do Modelo" + }, + "modalTitle": "Configuração do Modelo Personalizado", + "tokens": { + "title": "Número máximo de tokens", + "unlimited": "Ilimitado" + }, + "vision": { + "extra": "Esta configuração apenas habilitará a configuração de upload de imagens no aplicativo, se o reconhecimento for suportado depende do modelo em si, teste a capacidade de reconhecimento visual desse modelo.", + "title": "Suporte a Reconhecimento Visual" + } + }, + "pricing": { + "image": "${{amount}}/imagem", + "inputCharts": "${{amount}}/M caracteres", + "inputMinutes": "${{amount}}/minuto", + "inputTokens": "Entrada ${{amount}}/M", + "outputTokens": "Saída ${{amount}}/M" + }, + "releasedAt": "Lançado em {{releasedAt}}" + }, + "list": { + "disabled": "Não habilitado", + "enabled": "Habilitado", + "enabledActions": { + "disableAll": "Desabilitar todos", + "enableAll": "Habilitar todos", + "sort": "Ordenar modelos personalizados" + }, + "enabledEmpty": "Nenhum modelo habilitado no momento, por favor habilite os modelos desejados na lista abaixo~", + "fetcher": { + "clear": "Limpar modelos obtidos", + "fetch": "Obter lista de modelos", + "fetching": "Obtendo lista de modelos...", + "latestTime": "Última atualização: {{time}}", + "noLatestTime": "Lista ainda não obtida" + }, + "search": "Pesquisar modelos...", + "searchResult": "Encontrados {{count}} modelos", + "title": "Lista de Modelos", + "total": "Um total de {{count}} modelos disponíveis" + }, + "searchNotFound": "Nenhum resultado encontrado" + }, + "sortModal": { + "success": "Ordenação atualizada com sucesso", + "title": "Ordenação Personalizada", + "update": "Atualizar" + }, + "updateAiProvider": { + "confirmDelete": "Você está prestes a excluir este provedor de AI, após a exclusão não poderá ser recuperado, deseja confirmar a exclusão?", + "deleteSuccess": "Exclusão bem-sucedida", + "tooltip": "Atualizar configurações básicas do provedor", + "updateSuccess": "Atualização bem-sucedida" + }, "wenxin": { "accessKey": { "desc": "Insira a Access Key da plataforma Qianfan do Baidu", diff --git a/locales/pt-BR/setting.json b/locales/pt-BR/setting.json index 8a18207517a4..610fa3018807 100644 --- a/locales/pt-BR/setting.json +++ b/locales/pt-BR/setting.json @@ -411,6 +411,7 @@ "common": "Configurações Comuns", "experiment": "Experimento", "llm": "Modelo de Linguagem", + "provider": "Fornecedor de IA", "sync": "Sincronização na nuvem", "system-agent": "Assistente do Sistema", "tts": "Serviço de Voz" diff --git a/locales/ru-RU/common.json b/locales/ru-RU/common.json index 67d128277da2..5705e43cbc5a 100644 --- a/locales/ru-RU/common.json +++ b/locales/ru-RU/common.json @@ -275,6 +275,7 @@ }, "temp": "Временный", "terms": "Условия использования", + "update": "Обновить", "updateAgent": "Обновить информацию об агенте", "upgradeVersion": { "action": "обновить", diff --git a/locales/ru-RU/modelProvider.json b/locales/ru-RU/modelProvider.json index 60b7ab31cb90..cbb7b38d79d5 100644 --- a/locales/ru-RU/modelProvider.json +++ b/locales/ru-RU/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID аккаунта Cloudflare / адрес API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Пожалуйста, введите ваш API Key", + "required": "Пожалуйста, введите ваш API Key", + "title": "API Key" + }, + "basicTitle": "Основная информация", + "configTitle": "Конфигурационная информация", + "confirm": "Создать", + "createSuccess": "Создание успешно", + "description": { + "placeholder": "Описание провайдера (необязательно)", + "title": "Описание провайдера" + }, + "id": { + "placeholder": "Рекомендуется использовать строчные буквы, например, openai, после создания изменить нельзя", + "required": "Пожалуйста, введите ID провайдера", + "title": "ID провайдера" + }, + "logo": { + "required": "Пожалуйста, загрузите правильный логотип провайдера", + "title": "Логотип провайдера" + }, + "name": { + "placeholder": "Пожалуйста, введите отображаемое имя провайдера", + "required": "Пожалуйста, введите имя провайдера", + "title": "Имя провайдера" + }, + "proxyUrl": { + "placeholder": "Пожалуйста, введите ваш адрес запроса, если не заполните, будет использован соответствующий адрес SDK", + "title": "Адрес прокси" + }, + "sdkType": { + "required": "Пожалуйста, выберите тип SDK", + "title": "Формат запроса" + }, + "title": "Создание пользовательского AI провайдера" + }, "github": { "personalAccessToken": { "desc": "Введите ваш персональный токен доступа GitHub (PAT), нажмите [здесь](https://github.com/settings/tokens), чтобы создать его", @@ -77,6 +115,23 @@ "title": "Токен HuggingFace" } }, + "list": { + "title": { + "disabled": "Поставщик не активирован", + "enabled": "Поставщик активирован" + } + }, + "menu": { + "addCustomProvider": "Добавить пользовательского провайдера", + "all": "Все", + "list": { + "disabled": "Не активирован", + "enabled": "Активирован" + }, + "notFound": "Результаты поиска не найдены", + "searchProviders": "Поиск провайдеров...", + "sort": "Пользовательская сортировка" + }, "ollama": { "checker": { "desc": "Проверить правильность адреса прокси", @@ -131,6 +186,122 @@ "title": "Download specified Ollama model" } }, + "providerModels": { + "config": { + "aesGcm": "Ваши ключи и адрес прокси будут зашифрованы с использованием <1>AES-GCM", + "apiKey": { + "desc": "Пожалуйста, введите ваш {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Должен содержать http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API адрес прокси" + }, + "checker": { + "button": "Проверить", + "desc": "Проверьте, правильно ли заполнены API Key и адрес прокси", + "pass": "Проверка пройдена", + "title": "Проверка соединения" + }, + "fetchOnClient": { + "desc": "Клиентский режим запросов будет инициировать сессии напрямую из браузера, что может ускорить время отклика", + "title": "Использовать клиентский режим запросов" + }, + "helpDoc": "Документация по настройке", + "waitingForMore": "Больше моделей находится в <1>планировании подключения, ожидайте с нетерпением" + }, + "createNew": { + "title": "Создание пользовательской AI модели" + }, + "item": { + "config": "Настроить модель", + "customModelCards": { + "addNew": "Создать и добавить модель {{id}}", + "confirmDelete": "Вы собираетесь удалить эту пользовательскую модель, после удаления восстановить ее будет невозможно, будьте осторожны." + }, + "delete": { + "confirm": "Подтвердите удаление модели {{displayName}}?", + "success": "Удаление успешно", + "title": "Удалить модель" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Поле, запрашиваемое в Azure OpenAI", + "placeholder": "Пожалуйста, введите имя развертывания модели в Azure", + "title": "Имя развертывания модели" + }, + "displayName": { + "placeholder": "Пожалуйста, введите отображаемое имя модели, например, ChatGPT, GPT-4 и т.д.", + "title": "Отображаемое имя модели" + }, + "files": { + "extra": "Текущая реализация загрузки файлов является лишь хакерским решением, предназначенным только для самостоятельного тестирования. Полные возможности загрузки файлов ожидайте в будущем.", + "title": "Поддержка загрузки файлов" + }, + "functionCall": { + "extra": "Эта настройка только активирует возможность вызова функций в приложении, поддержка вызова функций полностью зависит от самой модели, пожалуйста, протестируйте доступность вызова функций этой модели.", + "title": "Поддержка вызова функций" + }, + "id": { + "extra": "Будет отображаться как метка модели", + "placeholder": "Пожалуйста, введите id модели, например, gpt-4-turbo-preview или claude-2.1", + "title": "ID модели" + }, + "modalTitle": "Настройка пользовательской модели", + "tokens": { + "title": "Максимальное количество токенов", + "unlimited": "Без ограничений" + }, + "vision": { + "extra": "Эта настройка только активирует возможность загрузки изображений в приложении, поддержка распознавания полностью зависит от самой модели, пожалуйста, протестируйте доступность визуального распознавания этой модели.", + "title": "Поддержка визуального распознавания" + } + }, + "pricing": { + "image": "${{amount}}/изображение", + "inputCharts": "${{amount}}/M символов", + "inputMinutes": "${{amount}}/минуты", + "inputTokens": "Ввод ${{amount}}/М", + "outputTokens": "Вывод ${{amount}}/М" + }, + "releasedAt": "Выпущено {{releasedAt}}" + }, + "list": { + "disabled": "Не активирован", + "enabled": "Активирован", + "enabledActions": { + "disableAll": "Отключить все", + "enableAll": "Включить все", + "sort": "Сортировка моделей по индивидуальному порядку" + }, + "enabledEmpty": "Нет активированных моделей, пожалуйста, активируйте понравившиеся модели из списка ниже~", + "fetcher": { + "clear": "Очистить полученные модели", + "fetch": "Получить список моделей", + "fetching": "Получение списка моделей...", + "latestTime": "Последнее обновление: {{time}}", + "noLatestTime": "Список еще не получен" + }, + "search": "Поиск моделей...", + "searchResult": "Найдено {{count}} моделей", + "title": "Список моделей", + "total": "Всего доступно {{count}} моделей" + }, + "searchNotFound": "Результаты поиска не найдены" + }, + "sortModal": { + "success": "Сортировка обновлена успешно", + "title": "Пользовательская сортировка", + "update": "Обновить" + }, + "updateAiProvider": { + "confirmDelete": "Вы собираетесь удалить этого AI провайдера, после удаления его будет невозможно восстановить, подтвердите, хотите ли вы удалить?", + "deleteSuccess": "Удаление успешно", + "tooltip": "Обновить базовую конфигурацию провайдера", + "updateSuccess": "Обновление успешно" + }, "wenxin": { "accessKey": { "desc": "Введите Access Key платформы Baidu Qianfan", diff --git a/locales/ru-RU/setting.json b/locales/ru-RU/setting.json index 9d92f97bc079..4c1760d114ea 100644 --- a/locales/ru-RU/setting.json +++ b/locales/ru-RU/setting.json @@ -411,6 +411,7 @@ "common": "Общие настройки", "experiment": "Эксперимент", "llm": "Языковая модель", + "provider": "Поставщик ИИ услуг", "sync": "Синхронизация с облаком", "system-agent": "Системный агент", "tts": "Голосовые услуги" diff --git a/locales/tr-TR/common.json b/locales/tr-TR/common.json index 4e25f113b807..fef00b0d780e 100644 --- a/locales/tr-TR/common.json +++ b/locales/tr-TR/common.json @@ -275,6 +275,7 @@ }, "temp": "Geçici", "terms": "Hizmet Koşulları", + "update": "Güncelle", "updateAgent": "Asistan Bilgilerini Güncelle", "upgradeVersion": { "action": "Güncelle", diff --git a/locales/tr-TR/modelProvider.json b/locales/tr-TR/modelProvider.json index e8b78d143ca3..f9bdec06057f 100644 --- a/locales/tr-TR/modelProvider.json +++ b/locales/tr-TR/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare Hesap ID / API Adresi" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Lütfen API Anahtarınızı girin", + "required": "Lütfen API Anahtarınızı girin", + "title": "API Anahtarı" + }, + "basicTitle": "Temel Bilgiler", + "configTitle": "Yapılandırma Bilgileri", + "confirm": "Yeni Oluştur", + "createSuccess": "Başarıyla oluşturuldu", + "description": { + "placeholder": "Hizmet sağlayıcı tanımı (isteğe bağlı)", + "title": "Hizmet Sağlayıcı Tanımı" + }, + "id": { + "placeholder": "Küçük harflerle yazılması önerilir, örneğin openai, oluşturduktan sonra değiştirilemez", + "required": "Lütfen hizmet sağlayıcı ID'sini girin", + "title": "Hizmet Sağlayıcı ID" + }, + "logo": { + "required": "Lütfen geçerli bir hizmet sağlayıcı logosu yükleyin", + "title": "Hizmet Sağlayıcı Logosu" + }, + "name": { + "placeholder": "Lütfen hizmet sağlayıcının gösterim adını girin", + "required": "Lütfen hizmet sağlayıcı adını girin", + "title": "Hizmet Sağlayıcı Adı" + }, + "proxyUrl": { + "placeholder": "Lütfen istek adresinizi girin, boş bırakılırsa SDK'nın ilgili istek adresi kullanılacaktır", + "title": "Proxy Adresi" + }, + "sdkType": { + "required": "Lütfen SDK türünü seçin", + "title": "İstek Formatı" + }, + "title": "Özel AI Hizmet Sağlayıcısı Oluştur" + }, "github": { "personalAccessToken": { "desc": "Github PAT'nizi girin, [buraya](https://github.com/settings/tokens) tıklayarak oluşturun", @@ -77,6 +115,23 @@ "title": "HuggingFace Token" } }, + "list": { + "title": { + "disabled": "Hizmet sağlayıcı devre dışı", + "enabled": "Hizmet sağlayıcı etkin" + } + }, + "menu": { + "addCustomProvider": "Özel Hizmet Sağlayıcı Ekle", + "all": "Tümü", + "list": { + "disabled": "Devre Dışı", + "enabled": "Aktif" + }, + "notFound": "Arama sonuçları bulunamadı", + "searchProviders": "Hizmet sağlayıcıları ara...", + "sort": "Özel Sıralama" + }, "ollama": { "checker": { "desc": "Proxy adresinin doğru girilip girilmediğini test edin", @@ -131,6 +186,122 @@ "title": "下载指定的 Ollama 模型" } }, + "providerModels": { + "config": { + "aesGcm": "Anahtarınız ve proxy adresi gibi bilgiler <1>AES-GCM şifreleme algoritması ile şifrelenecektir", + "apiKey": { + "desc": "{{name}} API Anahtarınızı girin", + "placeholder": "{{name}} API Anahtarı", + "title": "API Anahtarı" + }, + "baseURL": { + "desc": "http(s):// içermelidir", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API Proxy Adresi" + }, + "checker": { + "button": "Kontrol Et", + "desc": "API Anahtarı ve proxy adresinin doğru girilip girilmediğini test edin", + "pass": "Kontrol başarılı", + "title": "Bağlantı Kontrolü" + }, + "fetchOnClient": { + "desc": "İstemci istek modu, tarayıcıdan doğrudan oturum isteği başlatır, yanıt hızını artırabilir", + "title": "İstemci İstek Modunu Kullan" + }, + "helpDoc": "Yapılandırma Kılavuzu", + "waitingForMore": "Daha fazla model <1>planlanıyor, lütfen bekleyin" + }, + "createNew": { + "title": "Özel AI Modeli Oluştur" + }, + "item": { + "config": "Modeli Yapılandır", + "customModelCards": { + "addNew": "{{id}} modelini oluştur ve ekle", + "confirmDelete": "Bu özel modeli silmek üzeresiniz, silindikten sonra geri alınamaz, lütfen dikkatli olun." + }, + "delete": { + "confirm": "{{displayName}} modelini silmek istediğinize emin misiniz?", + "success": "Silme işlemi başarılı", + "title": "Modeli Sil" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Azure OpenAI'de gerçek istek için alan", + "placeholder": "Lütfen Azure'daki model dağıtım adını girin", + "title": "Model Dağıtım Adı" + }, + "displayName": { + "placeholder": "Lütfen modelin gösterim adını girin, örneğin ChatGPT, GPT-4 vb.", + "title": "Model Gösterim Adı" + }, + "files": { + "extra": "Mevcut dosya yükleme uygulaması yalnızca bir Hack çözümüdür, yalnızca denemek için geçerlidir. Tam dosya yükleme yeteneği için lütfen sonraki uygulamayı bekleyin.", + "title": "Dosya Yüklemeyi Destekle" + }, + "functionCall": { + "extra": "Bu yapılandırma yalnızca uygulamadaki fonksiyon çağırma yeteneğini açacaktır, fonksiyon çağırma desteği tamamen modele bağlıdır, lütfen bu modelin fonksiyon çağırma yeteneğini test edin.", + "title": "Fonksiyon Çağırmayı Destekle" + }, + "id": { + "extra": "Model etiketi olarak gösterilecektir", + "placeholder": "Lütfen model id'sini girin, örneğin gpt-4-turbo-preview veya claude-2.1", + "title": "Model ID" + }, + "modalTitle": "Özel Model Yapılandırması", + "tokens": { + "title": "Maksimum token sayısı", + "unlimited": "Sınırsız" + }, + "vision": { + "extra": "Bu yapılandırma yalnızca uygulamadaki resim yükleme yapılandırmasını açacaktır, tanıma desteği tamamen modele bağlıdır, lütfen bu modelin görsel tanıma yeteneğini test edin.", + "title": "Görsel Tanımayı Destekle" + } + }, + "pricing": { + "image": "${{amount}}/Resim", + "inputCharts": "${{amount}}/M Karakter", + "inputMinutes": "${{amount}}/Dakika", + "inputTokens": "Girdi ${{amount}}/M", + "outputTokens": "Çıktı ${{amount}}/M" + }, + "releasedAt": "Yayınlanma tarihi: {{releasedAt}}" + }, + "list": { + "disabled": "Devre dışı", + "enabled": "Etkin", + "enabledActions": { + "disableAll": "Hepsini devre dışı bırak", + "enableAll": "Hepsini etkinleştir", + "sort": "Özel model sıralaması" + }, + "enabledEmpty": "Etkin model yok, lütfen aşağıdaki listeden beğendiğiniz modeli etkinleştirin~", + "fetcher": { + "clear": "Alınan modelleri temizle", + "fetch": "Model listesini al", + "fetching": "Model listesi alınıyor...", + "latestTime": "Son güncelleme zamanı: {{time}}", + "noLatestTime": "Henüz liste alınmadı" + }, + "search": "Model ara...", + "searchResult": "{{count}} model bulundu", + "title": "Model Listesi", + "total": "Toplam {{count}} adet model mevcut" + }, + "searchNotFound": "Arama sonuçları bulunamadı" + }, + "sortModal": { + "success": "Sıralama güncellemesi başarılı", + "title": "Özel Sıralama", + "update": "Güncelle" + }, + "updateAiProvider": { + "confirmDelete": "Bu AI hizmet sağlayıcısını silmek üzeresiniz, silindikten sonra geri alınamaz, silmek istediğinize emin misiniz?", + "deleteSuccess": "Silme işlemi başarılı", + "tooltip": "Hizmet sağlayıcının temel yapılandırmasını güncelle", + "updateSuccess": "Güncelleme başarılı" + }, "wenxin": { "accessKey": { "desc": "Baidu Qianfan platform için Access Key girin", diff --git a/locales/tr-TR/setting.json b/locales/tr-TR/setting.json index 34fde2a7f150..30d8758284f1 100644 --- a/locales/tr-TR/setting.json +++ b/locales/tr-TR/setting.json @@ -411,6 +411,7 @@ "common": "Genel Ayarlar", "experiment": "Deney", "llm": "Modeller", + "provider": "Yapay Zeka Hizmet Sağlayıcısı", "sync": "Bulut Senkronizasyonu", "system-agent": "Sistem Asistanı", "tts": "Metin Seslendirme" diff --git a/locales/vi-VN/common.json b/locales/vi-VN/common.json index 42fab0ebb57c..465ae0531dc5 100644 --- a/locales/vi-VN/common.json +++ b/locales/vi-VN/common.json @@ -275,6 +275,7 @@ }, "temp": "Tạm thời", "terms": "Điều khoản dịch vụ", + "update": "Cập nhật", "updateAgent": "Cập nhật thông tin trợ lý", "upgradeVersion": { "action": "Nâng cấp", diff --git a/locales/vi-VN/modelProvider.json b/locales/vi-VN/modelProvider.json index e1df86d6f43d..ccb024ed7fb2 100644 --- a/locales/vi-VN/modelProvider.json +++ b/locales/vi-VN/modelProvider.json @@ -63,6 +63,44 @@ "title": "ID tài khoản Cloudflare / địa chỉ API" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "Vui lòng nhập API Key của bạn", + "required": "Vui lòng nhập API Key của bạn", + "title": "API Key" + }, + "basicTitle": "Thông tin cơ bản", + "configTitle": "Thông tin cấu hình", + "confirm": "Tạo mới", + "createSuccess": "Tạo mới thành công", + "description": { + "placeholder": "Giới thiệu về nhà cung cấp (tùy chọn)", + "title": "Giới thiệu về nhà cung cấp" + }, + "id": { + "placeholder": "Nên viết toàn bộ bằng chữ thường, ví dụ openai, không thể sửa sau khi tạo", + "required": "Vui lòng nhập ID nhà cung cấp", + "title": "ID nhà cung cấp" + }, + "logo": { + "required": "Vui lòng tải lên Logo nhà cung cấp hợp lệ", + "title": "Logo nhà cung cấp" + }, + "name": { + "placeholder": "Vui lòng nhập tên hiển thị của nhà cung cấp", + "required": "Vui lòng nhập tên nhà cung cấp", + "title": "Tên nhà cung cấp" + }, + "proxyUrl": { + "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", + "title": "Địa chỉ proxy" + }, + "sdkType": { + "required": "Vui lòng chọn loại SDK", + "title": "Định dạng yêu cầu" + }, + "title": "Tạo nhà cung cấp AI tùy chỉnh" + }, "github": { "personalAccessToken": { "desc": "Nhập mã truy cập cá nhân Github của bạn, nhấp vào [đây](https://github.com/settings/tokens) để tạo", @@ -77,6 +115,23 @@ "title": "Mã thông báo HuggingFace" } }, + "list": { + "title": { + "disabled": "Nhà cung cấp chưa được kích hoạt", + "enabled": "Nhà cung cấp đã được kích hoạt" + } + }, + "menu": { + "addCustomProvider": "Thêm nhà cung cấp tùy chỉnh", + "all": "Tất cả", + "list": { + "disabled": "Chưa kích hoạt", + "enabled": "Đã kích hoạt" + }, + "notFound": "Không tìm thấy kết quả tìm kiếm", + "searchProviders": "Tìm kiếm nhà cung cấp...", + "sort": "Sắp xếp tùy chỉnh" + }, "ollama": { "checker": { "desc": "Kiểm tra địa chỉ proxy có được nhập chính xác không", @@ -131,6 +186,122 @@ "title": "Tải xuống mô hình Ollama đã chỉ định" } }, + "providerModels": { + "config": { + "aesGcm": "Khóa của bạn và địa chỉ proxy sẽ được mã hóa bằng thuật toán <1>AES-GCM", + "apiKey": { + "desc": "Vui lòng nhập {{name}} API Key của bạn", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "Phải bao gồm http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "Địa chỉ proxy API" + }, + "checker": { + "button": "Kiểm tra", + "desc": "Kiểm tra xem API Key và địa chỉ proxy có được nhập đúng không", + "pass": "Kiểm tra thành công", + "title": "Kiểm tra kết nối" + }, + "fetchOnClient": { + "desc": "Chế độ yêu cầu từ khách hàng sẽ phát động yêu cầu phiên trực tiếp từ trình duyệt, có thể cải thiện tốc độ phản hồi", + "title": "Sử dụng chế độ yêu cầu từ khách hàng" + }, + "helpDoc": "Hướng dẫn cấu hình", + "waitingForMore": "Nhiều mô hình hơn đang <1>được lên kế hoạch, xin hãy chờ đợi" + }, + "createNew": { + "title": "Tạo mô hình AI tùy chỉnh" + }, + "item": { + "config": "Cấu hình mô hình", + "customModelCards": { + "addNew": "Tạo và thêm mô hình {{id}}", + "confirmDelete": "Sắp xóa mô hình tùy chỉnh này, sau khi xóa sẽ không thể khôi phục, xin hãy cẩn thận." + }, + "delete": { + "confirm": "Xác nhận xóa mô hình {{displayName}}?", + "success": "Xóa thành công", + "title": "Xóa mô hình" + }, + "modelConfig": { + "azureDeployName": { + "extra": "Trường thực tế được yêu cầu trong Azure OpenAI", + "placeholder": "Vui lòng nhập tên triển khai mô hình trong Azure", + "title": "Tên triển khai mô hình" + }, + "displayName": { + "placeholder": "Vui lòng nhập tên hiển thị của mô hình, ví dụ ChatGPT, GPT-4, v.v.", + "title": "Tên hiển thị mô hình" + }, + "files": { + "extra": "Hiện tại, việc tải lên tệp chỉ là một giải pháp Hack, chỉ dành cho thử nghiệm cá nhân. Vui lòng chờ đợi khả năng tải lên tệp hoàn chỉnh trong các bản cập nhật sau.", + "title": "Hỗ trợ tải lên tệp" + }, + "functionCall": { + "extra": "Cấu hình này chỉ mở khả năng gọi hàm trong ứng dụng, việc hỗ trợ gọi hàm hoàn toàn phụ thuộc vào mô hình, xin hãy tự kiểm tra khả năng gọi hàm của mô hình này.", + "title": "Hỗ trợ gọi hàm" + }, + "id": { + "extra": "Sẽ được hiển thị như một nhãn mô hình", + "placeholder": "Vui lòng nhập id mô hình, ví dụ gpt-4-turbo-preview hoặc claude-2.1", + "title": "ID mô hình" + }, + "modalTitle": "Cấu hình mô hình tùy chỉnh", + "tokens": { + "title": "Số lượng token tối đa", + "unlimited": "Không giới hạn" + }, + "vision": { + "extra": "Cấu hình này chỉ mở khả năng tải lên hình ảnh trong ứng dụng, việc hỗ trợ nhận diện hoàn toàn phụ thuộc vào mô hình, xin hãy tự kiểm tra khả năng nhận diện hình ảnh của mô hình này.", + "title": "Hỗ trợ nhận diện hình ảnh" + } + }, + "pricing": { + "image": "${{amount}}/Hình ảnh", + "inputCharts": "${{amount}}/Ký tự M", + "inputMinutes": "${{amount}}/Phút", + "inputTokens": "Nhập ${{amount}}/M", + "outputTokens": "Xuất ${{amount}}/M" + }, + "releasedAt": "Phát hành vào {{releasedAt}}" + }, + "list": { + "disabled": "Chưa được kích hoạt", + "enabled": "Đã được kích hoạt", + "enabledActions": { + "disableAll": "Vô hiệu hóa tất cả", + "enableAll": "Kích hoạt tất cả", + "sort": "Sắp xếp mô hình tùy chỉnh" + }, + "enabledEmpty": "Chưa có mô hình nào được kích hoạt, hãy kích hoạt mô hình bạn yêu thích từ danh sách bên dưới nhé~", + "fetcher": { + "clear": "Xóa mô hình đã lấy", + "fetch": "Lấy danh sách mô hình", + "fetching": "Đang lấy danh sách mô hình...", + "latestTime": "Thời gian cập nhật lần cuối: {{time}}", + "noLatestTime": "Chưa lấy danh sách" + }, + "search": "Tìm kiếm mô hình...", + "searchResult": "Tìm thấy {{count}} mô hình", + "title": "Danh sách mô hình", + "total": "Có tổng cộng {{count}} mô hình khả dụng" + }, + "searchNotFound": "Không tìm thấy kết quả tìm kiếm" + }, + "sortModal": { + "success": "Cập nhật sắp xếp thành công", + "title": "Sắp xếp tùy chỉnh", + "update": "Cập nhật" + }, + "updateAiProvider": { + "confirmDelete": "Sắp xóa nhà cung cấp AI này, sau khi xóa sẽ không thể khôi phục, xác nhận có xóa không?", + "deleteSuccess": "Xóa thành công", + "tooltip": "Cập nhật cấu hình cơ bản của nhà cung cấp", + "updateSuccess": "Cập nhật thành công" + }, "wenxin": { "accessKey": { "desc": "Nhập Access Key từ nền tảng Qianfan của Baidu", diff --git a/locales/vi-VN/setting.json b/locales/vi-VN/setting.json index 2d7cbbd24a24..ad1b0062e114 100644 --- a/locales/vi-VN/setting.json +++ b/locales/vi-VN/setting.json @@ -411,6 +411,7 @@ "common": "Cài đặt chung", "experiment": "Thử nghiệm", "llm": "Mô hình ngôn ngữ", + "provider": "Nhà cung cấp AI", "sync": "Đồng bộ trên đám mây", "system-agent": "Trợ lý hệ thống", "tts": "Dịch vụ giọng nói" diff --git a/locales/zh-CN/common.json b/locales/zh-CN/common.json index 67e1795a7cae..40f6546ee78f 100644 --- a/locales/zh-CN/common.json +++ b/locales/zh-CN/common.json @@ -275,6 +275,7 @@ }, "temp": "临时", "terms": "服务条款", + "update": "更新", "updateAgent": "更新助理信息", "upgradeVersion": { "action": "升级", diff --git a/locales/zh-CN/modelProvider.json b/locales/zh-CN/modelProvider.json index e40e224dc835..4de0e2bb56eb 100644 --- a/locales/zh-CN/modelProvider.json +++ b/locales/zh-CN/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare 账户 ID / API 地址" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "请填写你的 API Key", + "required": "请填写你的 API Key", + "title": "API Key" + }, + "basicTitle": "基本信息", + "configTitle": "配置信息", + "confirm": "新建", + "createSuccess": "新建成功", + "description": { + "placeholder": "服务商简介(选填)", + "title": "服务商简介" + }, + "id": { + "placeholder": "建议全小写,例如 openai,创建后将不可修改", + "required": "请填写服务商 ID", + "title": "服务商 ID" + }, + "logo": { + "required": "请上传正确的服务商 Logo", + "title": "服务商 Logo" + }, + "name": { + "placeholder": "请输入服务商的展示名称", + "required": "请填写服务商名称", + "title": "服务商名称" + }, + "proxyUrl": { + "placeholder": "请填写你的请求地址,如果不填则会使用 SDK 对应的请求地址", + "title": "代理地址" + }, + "sdkType": { + "required": "请选择 SDK 类型", + "title": "请求格式" + }, + "title": "创建自定义 AI 服务商" + }, "github": { "personalAccessToken": { "desc": "填入你的 Github PAT,点击 [这里](https://github.com/settings/tokens) 创建", @@ -77,6 +115,23 @@ "title": "HuggingFace Token" } }, + "list": { + "title": { + "disabled": "未启用服务商", + "enabled": "已启用服务商" + } + }, + "menu": { + "addCustomProvider": "添加自定义服务商", + "all": "全部", + "list": { + "disabled": "未启用", + "enabled": "已启用" + }, + "notFound": "未找到搜索结果", + "searchProviders": "搜索服务商...", + "sort": "自定义排序" + }, "ollama": { "checker": { "desc": "测试代理地址是否正确填写", @@ -131,6 +186,122 @@ "title": "下载指定的 Ollama 模型" } }, + "providerModels": { + "config": { + "aesGcm": "您的秘钥与代理地址等将使用 <1>AES-GCM 加密算法进行加密", + "apiKey": { + "desc": "请填写你的 {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "必须包含 http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API 代理地址" + }, + "checker": { + "button": "检查", + "desc": "测试 Api Key 与代理地址是否正确填写", + "pass": "检查通过", + "title": "连通性检查" + }, + "fetchOnClient": { + "desc": "客户端请求模式将从浏览器直接发起会话请求,可提升响应速度", + "title": "使用客户端请求模式" + }, + "helpDoc": "配置教程", + "waitingForMore": "更多模型正在 <1>计划接入 中,敬请期待" + }, + "createNew": { + "title": "创建自定义 AI 模型" + }, + "item": { + "config": "配置模型", + "customModelCards": { + "addNew": "创建并添加 {{id}} 模型", + "confirmDelete": "即将删除该自定义模型,删除后将不可恢复,请谨慎操作。" + }, + "delete": { + "confirm": "确认删除模型 {{displayName}}?", + "success": "删除成功", + "title": "删除模型" + }, + "modelConfig": { + "azureDeployName": { + "extra": "在 Azure OpenAI 中实际请求的字段", + "placeholder": "请输入 Azure 中的模型部署名称", + "title": "模型部署名称" + }, + "displayName": { + "placeholder": "请输入模型的展示名称,例如 ChatGPT、GPT-4 等", + "title": "模型展示名称" + }, + "files": { + "extra": "当前文件上传实现仅为一种 Hack 方案,仅限自行尝试。完整文件上传能力请等待后续实现", + "title": "支持文件上传" + }, + "functionCall": { + "extra": "此配置将仅开启应用中的函数调用能力,是否支持函数调用完全取决于模型本身,请自行测试该模型的函数调用能力可用性", + "title": "支持函数调用" + }, + "id": { + "extra": "将作为模型标签进行展示", + "placeholder": "请输入模型id,例如 gpt-4-turbo-preview 或 claude-2.1", + "title": "模型 ID" + }, + "modalTitle": "自定义模型配置", + "tokens": { + "title": "最大 token 数", + "unlimited": "无限制" + }, + "vision": { + "extra": "此配置将仅开启应用中的图片上传配置,是否支持识别完全取决于模型本身,请自行测试该模型的视觉识别能力可用性", + "title": "支持视觉识别" + } + }, + "pricing": { + "image": "${{amount}}/图片", + "inputCharts": "${{amount}}/M 字符", + "inputMinutes": "${{amount}}/分钟", + "inputTokens": "输入 ${{amount}}/M", + "outputTokens": "输出 ${{amount}}/M" + }, + "releasedAt": "发布于{{releasedAt}}" + }, + "list": { + "disabled": "未启用", + "enabled": "已启用", + "enabledActions": { + "disableAll": "全部禁用", + "enableAll": "全部启用", + "sort": "自定义模型排序" + }, + "enabledEmpty": "暂无启用模型,请从下方列表中启用心仪的模型吧~", + "fetcher": { + "clear": "清除获取的模型", + "fetch": "获取模型列表", + "fetching": "正在获取模型列表...", + "latestTime": "上次更新时间:{{time}}", + "noLatestTime": "暂未获取列表" + }, + "search": "搜索模型...", + "searchResult": "搜索到 {{count}} 个模型", + "title": "模型列表", + "total": "共 {{count}} 个模型可用" + }, + "searchNotFound": "未找到搜索结果" + }, + "sortModal": { + "success": "排序更新成功", + "title": "自定义排序", + "update": "更新" + }, + "updateAiProvider": { + "confirmDelete": "即将删除该 AI 服务商,删除后将无法找回,确认是否删除?", + "deleteSuccess": "删除成功", + "tooltip": "更新服务商基础配置", + "updateSuccess": "更新成功" + }, "wenxin": { "accessKey": { "desc": "填入百度千帆平台的 Access Key", diff --git a/locales/zh-CN/setting.json b/locales/zh-CN/setting.json index ac69caac8a4c..d6406f8c1aa1 100644 --- a/locales/zh-CN/setting.json +++ b/locales/zh-CN/setting.json @@ -411,6 +411,7 @@ "common": "通用设置", "experiment": "实验", "llm": "语言模型", + "provider": "AI 服务商", "sync": "云端同步", "system-agent": "系统助手", "tts": "语音服务" diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 7ccfe9923631..bdcd3980b574 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -275,6 +275,7 @@ }, "temp": "臨時", "terms": "服務條款", + "update": "更新", "updateAgent": "更新助理資訊", "upgradeVersion": { "action": "升級", diff --git a/locales/zh-TW/modelProvider.json b/locales/zh-TW/modelProvider.json index f78a6cc5d16d..05b2bf737f65 100644 --- a/locales/zh-TW/modelProvider.json +++ b/locales/zh-TW/modelProvider.json @@ -63,6 +63,44 @@ "title": "Cloudflare 帳戶 ID / API 位址" } }, + "createNewAiProvider": { + "apiKey": { + "placeholder": "請填寫你的 API Key", + "required": "請填寫你的 API Key", + "title": "API Key" + }, + "basicTitle": "基本資訊", + "configTitle": "配置信息", + "confirm": "新建", + "createSuccess": "新建成功", + "description": { + "placeholder": "服務商簡介(選填)", + "title": "服務商簡介" + }, + "id": { + "placeholder": "建議全小寫,例如 openai,創建後將不可修改", + "required": "請填寫服務商 ID", + "title": "服務商 ID" + }, + "logo": { + "required": "請上傳正確的服務商 Logo", + "title": "服務商 Logo" + }, + "name": { + "placeholder": "請輸入服務商的展示名稱", + "required": "請填寫服務商名稱", + "title": "服務商名稱" + }, + "proxyUrl": { + "placeholder": "請填寫你的請求地址,如果不填則會使用 SDK 對應的請求地址", + "title": "代理地址" + }, + "sdkType": { + "required": "請選擇 SDK 類型", + "title": "請求格式" + }, + "title": "創建自定義 AI 服務商" + }, "github": { "personalAccessToken": { "desc": "填入你的 Github 個人存取權杖,點擊[這裡](https://github.com/settings/tokens) 創建", @@ -77,6 +115,23 @@ "title": "HuggingFace Token" } }, + "list": { + "title": { + "disabled": "未啟用服務商", + "enabled": "已啟用服務商" + } + }, + "menu": { + "addCustomProvider": "添加自定義服務商", + "all": "全部", + "list": { + "disabled": "未啟用", + "enabled": "已啟用" + }, + "notFound": "未找到搜索結果", + "searchProviders": "搜索服務商...", + "sort": "自定義排序" + }, "ollama": { "checker": { "desc": "測試代理地址是否正確填寫", @@ -131,6 +186,122 @@ "title": "下載指定的 Ollama 模型" } }, + "providerModels": { + "config": { + "aesGcm": "您的秘鑰與代理地址等將使用 <1>AES-GCM 加密算法進行加密", + "apiKey": { + "desc": "請填寫你的 {{name}} API Key", + "placeholder": "{{name}} API Key", + "title": "API Key" + }, + "baseURL": { + "desc": "必須包含 http(s)://", + "placeholder": "https://your-proxy-url.com/v1", + "title": "API 代理地址" + }, + "checker": { + "button": "檢查", + "desc": "測試 Api Key 與代理地址是否正確填寫", + "pass": "檢查通過", + "title": "連通性檢查" + }, + "fetchOnClient": { + "desc": "客戶端請求模式將從瀏覽器直接發起會話請求,可提升響應速度", + "title": "使用客戶端請求模式" + }, + "helpDoc": "配置教程", + "waitingForMore": "更多模型正在 <1>計劃接入 中,敬請期待" + }, + "createNew": { + "title": "創建自定義 AI 模型" + }, + "item": { + "config": "配置模型", + "customModelCards": { + "addNew": "創建並添加 {{id}} 模型", + "confirmDelete": "即將刪除該自定義模型,刪除後將不可恢復,請謹慎操作。" + }, + "delete": { + "confirm": "確認刪除模型 {{displayName}}?", + "success": "刪除成功", + "title": "刪除模型" + }, + "modelConfig": { + "azureDeployName": { + "extra": "在 Azure OpenAI 中實際請求的字段", + "placeholder": "請輸入 Azure 中的模型部署名稱", + "title": "模型部署名稱" + }, + "displayName": { + "placeholder": "請輸入模型的展示名稱,例如 ChatGPT、GPT-4 等", + "title": "模型展示名稱" + }, + "files": { + "extra": "當前文件上傳實現僅為一種 Hack 方案,僅限自行嘗試。完整文件上傳能力請等待後續實現", + "title": "支持文件上傳" + }, + "functionCall": { + "extra": "此配置將僅開啟應用中的函數調用能力,是否支持函數調用完全取決於模型本身,請自行測試該模型的函數調用能力可用性", + "title": "支持函數調用" + }, + "id": { + "extra": "將作為模型標籤進行展示", + "placeholder": "請輸入模型id,例如 gpt-4-turbo-preview 或 claude-2.1", + "title": "模型 ID" + }, + "modalTitle": "自定義模型配置", + "tokens": { + "title": "最大 token 數", + "unlimited": "無限制" + }, + "vision": { + "extra": "此配置將僅開啟應用中的圖片上傳配置,是否支持識別完全取決於模型本身,請自行測試該模型的視覺識別能力可用性", + "title": "支持視覺識別" + } + }, + "pricing": { + "image": "${{amount}}/圖片", + "inputCharts": "${{amount}}/M 字符", + "inputMinutes": "${{amount}}/分鐘", + "inputTokens": "輸入 ${{amount}}/M", + "outputTokens": "輸出 ${{amount}}/M" + }, + "releasedAt": "發佈於{{releasedAt}}" + }, + "list": { + "disabled": "未啟用", + "enabled": "已啟用", + "enabledActions": { + "disableAll": "全部禁用", + "enableAll": "全部啟用", + "sort": "自訂模型排序" + }, + "enabledEmpty": "暫無啟用模型,請從下方列表中啟用心儀的模型吧~", + "fetcher": { + "clear": "清除取得的模型", + "fetch": "取得模型列表", + "fetching": "正在取得模型列表...", + "latestTime": "上次更新時間:{{time}}", + "noLatestTime": "尚未取得列表" + }, + "search": "搜尋模型...", + "searchResult": "搜尋到 {{count}} 個模型", + "title": "模型列表", + "total": "共 {{count}} 個模型可用" + }, + "searchNotFound": "未找到搜尋結果" + }, + "sortModal": { + "success": "排序更新成功", + "title": "自定義排序", + "update": "更新" + }, + "updateAiProvider": { + "confirmDelete": "即將刪除該 AI 服務商,刪除後將無法找回,確認是否刪除?", + "deleteSuccess": "刪除成功", + "tooltip": "更新服務商基礎配置", + "updateSuccess": "更新成功" + }, "wenxin": { "accessKey": { "desc": "填入百度千帆平台的 Access Key", diff --git a/locales/zh-TW/setting.json b/locales/zh-TW/setting.json index 21e35c85a6f5..f683dab3577d 100644 --- a/locales/zh-TW/setting.json +++ b/locales/zh-TW/setting.json @@ -411,6 +411,7 @@ "common": "通用設置", "experiment": "實驗", "llm": "語言模型", + "provider": "AI 服務商", "sync": "雲端同步", "system-agent": "系統助手", "tts": "語音服務" diff --git a/src/app/(main)/(mobile)/me/settings/features/Category.tsx b/src/app/(main)/(mobile)/me/settings/features/Category.tsx index 3e47083a7f5e..eb128b52e55b 100644 --- a/src/app/(main)/(mobile)/me/settings/features/Category.tsx +++ b/src/app/(main)/(mobile)/me/settings/features/Category.tsx @@ -9,7 +9,7 @@ import { useCategory } from './useCategory'; const Category = memo(() => { const items = useCategory(); - return items?.map((item, index) => ); + return items?.map((item, index) => ); }); export default Category; diff --git a/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx b/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx index d2781dc29f97..71202d39e34d 100644 --- a/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx +++ b/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx @@ -6,6 +6,7 @@ import { Flexbox } from 'react-layout-kit'; import urlJoin from 'url-join'; import { CellProps } from '@/components/Cell'; +import { isServerMode } from '@/const/version'; import { SettingsTabs } from '@/store/global/initialState'; import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; @@ -37,11 +38,17 @@ export const useCategory = () => { ), }, - showLLM && { - icon: Brain, - key: SettingsTabs.LLM, - label: t('tab.llm'), - }, + showLLM && isServerMode + ? { + icon: Brain, + key: SettingsTabs.Provider, + label: t('tab.provider'), + } + : { + icon: Brain, + key: SettingsTabs.LLM, + label: t('tab.llm'), + }, { icon: Mic2, key: SettingsTabs.TTS, label: t('tab.tts') }, { icon: Bot, diff --git a/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx index 4fda8e3a813c..576351578c57 100644 --- a/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx +++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx @@ -4,10 +4,9 @@ import { memo } from 'react'; import { Flexbox } from 'react-layout-kit'; import ModelSwitchPanel from '@/features/ModelSwitchPanel'; +import { useModelSupportToolUse } from '@/hooks/useModelSupportToolUse'; import { useAgentStore } from '@/store/agent'; import { agentSelectors } from '@/store/agent/selectors'; -import { useUserStore } from '@/store/user'; -import { modelProviderSelectors } from '@/store/user/selectors'; import PluginTag from '../../../features/PluginTag'; import KnowledgeTag from './KnowledgeTag'; @@ -20,7 +19,7 @@ const TitleTags = memo(() => { const plugins = useAgentStore(agentSelectors.currentAgentPlugins, isEqual); const enabledKnowledge = useAgentStore(agentSelectors.currentEnabledKnowledge, isEqual); - const showPlugin = useUserStore(modelProviderSelectors.isModelEnabledFunctionCall(model)); + const showPlugin = useModelSupportToolUse(model); return ( diff --git a/src/app/(main)/settings/hooks/useCategory.tsx b/src/app/(main)/settings/hooks/useCategory.tsx index 4afb134cf489..eeb2eaf4c971 100644 --- a/src/app/(main)/settings/hooks/useCategory.tsx +++ b/src/app/(main)/settings/hooks/useCategory.tsx @@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; import type { MenuProps } from '@/components/Menu'; +import { isServerMode } from '@/const/version'; import { SettingsTabs } from '@/store/global/initialState'; import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; @@ -50,15 +51,27 @@ export const useCategory = () => { ), }, - showLLM && { - icon: , - key: SettingsTabs.LLM, - label: ( - e.preventDefault()}> - {t('tab.llm')} - - ), - }, + showLLM && + // TODO: Remove /llm when v2.0 + !isServerMode + ? { + icon: , + key: SettingsTabs.LLM, + label: ( + e.preventDefault()}> + {t('tab.llm')} + + ), + } + : { + icon: , + key: SettingsTabs.Provider, + label: ( + e.preventDefault()}> + {t('tab.provider')} + + ), + }, enableSTT && { icon: , diff --git a/src/app/(main)/settings/provider/(detail)/[id]/index.tsx b/src/app/(main)/settings/provider/(detail)/[id]/index.tsx new file mode 100644 index 000000000000..515359ad82f8 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/[id]/index.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + + +import ModelList from '../../features/ModelList'; +import ProviderConfig, { ProviderConfigProps } from '../../features/ProviderConfig'; + +const ProviderDetail = memo((card) => { + return ( + + + + + ); +}); + +export default ProviderDetail; diff --git a/src/app/(main)/settings/provider/(detail)/[id]/page.tsx b/src/app/(main)/settings/provider/(detail)/[id]/page.tsx new file mode 100644 index 000000000000..df0b6bb53701 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/[id]/page.tsx @@ -0,0 +1,95 @@ +import { redirect } from 'next/navigation'; + +import Ai21Provider from '@/config/modelProviders/ai21'; +import Ai360Provider from '@/config/modelProviders/ai360'; +import AnthropicProvider from '@/config/modelProviders/anthropic'; +import BaichuanProvider from '@/config/modelProviders/baichuan'; +import DeepSeekProvider from '@/config/modelProviders/deepseek'; +import FireworksAIProvider from '@/config/modelProviders/fireworksai'; +import GiteeAIProvider from '@/config/modelProviders/giteeai'; +import GoogleProvider from '@/config/modelProviders/google'; +import GroqProvider from '@/config/modelProviders/groq'; +import HigressProvider from '@/config/modelProviders/higress'; +import HunyuanProvider from '@/config/modelProviders/hunyuan'; +import InternLMProvider from '@/config/modelProviders/internlm'; +import MinimaxProvider from '@/config/modelProviders/minimax'; +import MistralProvider from '@/config/modelProviders/mistral'; +import MoonshotProvider from '@/config/modelProviders/moonshot'; +import NovitaProvider from '@/config/modelProviders/novita'; +import OpenRouterProvider from '@/config/modelProviders/openrouter'; +import PerplexityProvider from '@/config/modelProviders/perplexity'; +import QwenProvider from '@/config/modelProviders/qwen'; +import SiliconCloudProvider from '@/config/modelProviders/siliconcloud'; +import SparkProvider from '@/config/modelProviders/spark'; +import StepfunProvider from '@/config/modelProviders/stepfun'; +import TaichuProvider from '@/config/modelProviders/taichu'; +import TogetherAIProvider from '@/config/modelProviders/togetherai'; +import UpstageProvider from '@/config/modelProviders/upstage'; +import XAIProvider from '@/config/modelProviders/xai'; +import ZeroOneProvider from '@/config/modelProviders/zeroone'; +import ZhiPuProvider from '@/config/modelProviders/zhipu'; +import { isServerMode } from '@/const/version'; +import { serverDB } from '@/database/server'; +import { AiProviderModel } from '@/database/server/models/aiProvider'; +import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt'; +import { PagePropsWithId } from '@/types/next'; +import { getUserAuth } from '@/utils/server/auth'; + +import ProviderDetail from './index'; + +const DEFAULT_MODEL_PROVIDER_LIST = [ + AnthropicProvider, + GoogleProvider, + DeepSeekProvider, + OpenRouterProvider, + NovitaProvider, + TogetherAIProvider, + FireworksAIProvider, + GroqProvider, + PerplexityProvider, + MistralProvider, + Ai21Provider, + UpstageProvider, + XAIProvider, + QwenProvider, + HunyuanProvider, + SparkProvider, + ZhiPuProvider, + ZeroOneProvider, + StepfunProvider, + MoonshotProvider, + BaichuanProvider, + MinimaxProvider, + Ai360Provider, + TaichuProvider, + InternLMProvider, + SiliconCloudProvider, + HigressProvider, + GiteeAIProvider, +]; + +const Page = async (props: PagePropsWithId) => { + const params = await props.params; + + const builtinProviderCard = DEFAULT_MODEL_PROVIDER_LIST.find((v) => v.id === params.id); + if (!!builtinProviderCard) return ; + + if (isServerMode) { + const { userId } = await getUserAuth(); + + const aiProviderModel = new AiProviderModel(serverDB, userId!); + + const userCard = await aiProviderModel.getAiProviderById( + params.id, + KeyVaultsGateKeeper.getUserKeyVaults, + ); + + if (!userCard) return redirect('/settings/provider'); + + return ; + } + + return
not found
; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/azure/page.tsx b/src/app/(main)/settings/provider/(detail)/azure/page.tsx new file mode 100644 index 000000000000..9dbaa562c8aa --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/azure/page.tsx @@ -0,0 +1,119 @@ +'use client'; + +import { Markdown } from '@lobehub/ui'; +import { AutoComplete, Input } from 'antd'; +import { createStyles } from 'antd-style'; +import { useTranslation } from 'react-i18next'; + +import { AzureProviderCard } from '@/config/modelProviders'; +import { ModelProvider } from '@/libs/agent-runtime'; +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; +import { useUserStore } from '@/store/user'; +import { modelProviderSelectors } from '@/store/user/selectors'; + +import { KeyVaultsConfigKey, LLMProviderApiTokenKey, LLMProviderBaseUrlKey } from '../../const'; +import { SkeletonInput } from '../../features/ProviderConfig'; +import { ProviderItem } from '../../type'; +import ProviderDetail from '../[id]'; + +const useStyles = createStyles(({ css, token }) => ({ + markdown: css` + p { + color: ${token.colorTextDescription} !important; + } + `, + tip: css` + font-size: 12px; + color: ${token.colorTextDescription}; + `, +})); + +const providerKey = ModelProvider.Azure; + +const useProviderCard = (): ProviderItem => { + const { t } = useTranslation('modelProvider'); + const { styles } = useStyles(); + + // Get the first model card's deployment name as the check model + const checkModel = useUserStore((s) => { + const chatModelCards = modelProviderSelectors.getModelCardsById(providerKey)(s); + + if (chatModelCards.length > 0) { + return chatModelCards[0].deploymentName; + } + + return 'gpt-35-turbo'; + }); + + const isLoading = useAiInfraStore(aiProviderSelectors.isAiProviderConfigLoading(providerKey)); + + return { + ...AzureProviderCard, + apiKeyItems: [ + { + children: isLoading ? ( + + ) : ( + + ), + desc: t('azure.token.desc'), + label: t('azure.token.title'), + name: [KeyVaultsConfigKey, LLMProviderApiTokenKey], + }, + { + children: isLoading ? ( + + ) : ( + + ), + desc: t('azure.endpoint.desc'), + label: t('azure.endpoint.title'), + name: [KeyVaultsConfigKey, LLMProviderBaseUrlKey], + }, + { + children: isLoading ? ( + + ) : ( + ({ label: i, value: i }))} + placeholder={'20XX-XX-XX'} + /> + ), + desc: ( + + {t('azure.azureApiVersion.desc')} + + ), + label: t('azure.azureApiVersion.title'), + name: [KeyVaultsConfigKey, 'apiVersion'], + }, + ], + checkModel, + modelList: { + azureDeployName: true, + notFoundContent: t('azure.empty'), + placeholder: t('azure.modelListPlaceholder'), + }, + }; +}; + +const Page = () => { + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/bedrock/page.tsx b/src/app/(main)/settings/provider/(detail)/bedrock/page.tsx new file mode 100644 index 000000000000..b61163a5f330 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/bedrock/page.tsx @@ -0,0 +1,91 @@ +'use client'; + +import { Input, Select } from 'antd'; +import { useTranslation } from 'react-i18next'; + +import { BedrockProviderCard } from '@/config/modelProviders'; +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; +import { GlobalLLMProviderKey } from '@/types/user/settings'; + +import { KeyVaultsConfigKey } from '../../const'; +import { SkeletonInput } from '../../features/ProviderConfig'; +import { ProviderItem } from '../../type'; +import ProviderDetail from '../[id]'; + +const providerKey: GlobalLLMProviderKey = 'bedrock'; + +const useBedrockCard = (): ProviderItem => { + const { t } = useTranslation('modelProvider'); + + const isLoading = useAiInfraStore(aiProviderSelectors.isAiProviderConfigLoading(providerKey)); + + return { + ...BedrockProviderCard, + apiKeyItems: [ + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.accessKeyId.desc`), + label: t(`${providerKey}.accessKeyId.title`), + name: [KeyVaultsConfigKey, 'accessKeyId'], + }, + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.secretAccessKey.desc`), + label: t(`${providerKey}.secretAccessKey.title`), + name: [KeyVaultsConfigKey, 'secretAccessKey'], + }, + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.sessionToken.desc`), + label: t(`${providerKey}.sessionToken.title`), + name: [KeyVaultsConfigKey, 'sessionToken'], + }, + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.baseURLOrAccountID.desc`), + label: t(`${providerKey}.baseURLOrAccountID.title`), + name: [KeyVaultsConfigKey, 'baseURLOrAccountID'], + }, + ], + }; +}; + +const Page = () => { + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/github/page.tsx b/src/app/(main)/settings/provider/(detail)/github/page.tsx new file mode 100644 index 000000000000..0341581fce75 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/github/page.tsx @@ -0,0 +1,67 @@ +'use client'; + +import { Markdown } from '@lobehub/ui'; +import { Input } from 'antd'; +import { createStyles } from 'antd-style'; +import { useTranslation } from 'react-i18next'; + +import { GithubProviderCard } from '@/config/modelProviders'; +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; +import { GlobalLLMProviderKey } from '@/types/user/settings'; + +import { KeyVaultsConfigKey, LLMProviderApiTokenKey } from '../../const'; +import { SkeletonInput } from '../../features/ProviderConfig'; +import { ProviderItem } from '../../type'; +import ProviderDetail from '../[id]'; + +const useStyles = createStyles(({ css, token }) => ({ + markdown: css` + p { + color: ${token.colorTextDescription} !important; + } + `, + tip: css` + font-size: 12px; + color: ${token.colorTextDescription}; + `, +})); + +const providerKey: GlobalLLMProviderKey = 'github'; + +// Same as OpenAIProvider, but replace API Key with Github Personal Access Token +const useProviderCard = (): ProviderItem => { + const { t } = useTranslation('modelProvider'); + const { styles } = useStyles(); + const isLoading = useAiInfraStore(aiProviderSelectors.isAiProviderConfigLoading(providerKey)); + + return { + ...GithubProviderCard, + apiKeyItems: [ + { + children: isLoading ? ( + + ) : ( + + ), + desc: ( + + {t(`${providerKey}.personalAccessToken.desc`)} + + ), + label: t(`${providerKey}.personalAccessToken.title`), + name: [KeyVaultsConfigKey, providerKey, LLMProviderApiTokenKey], + }, + ], + }; +}; + +const Page = () => { + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/huggingface/page.tsx b/src/app/(main)/settings/provider/(detail)/huggingface/page.tsx new file mode 100644 index 000000000000..1946e335775e --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/huggingface/page.tsx @@ -0,0 +1,67 @@ +'use client'; + +import { Markdown } from '@lobehub/ui'; +import { Input } from 'antd'; +import { createStyles } from 'antd-style'; +import { useTranslation } from 'react-i18next'; + +import { HuggingFaceProviderCard } from '@/config/modelProviders'; +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; +import { GlobalLLMProviderKey } from '@/types/user/settings'; + +import { KeyVaultsConfigKey, LLMProviderApiTokenKey } from '../../const'; +import { SkeletonInput } from '../../features/ProviderConfig'; +import { ProviderItem } from '../../type'; +import ProviderDetail from '../[id]'; + +const useStyles = createStyles(({ css, token }) => ({ + markdown: css` + p { + color: ${token.colorTextDescription} !important; + } + `, + tip: css` + font-size: 12px; + color: ${token.colorTextDescription}; + `, +})); + +const providerKey: GlobalLLMProviderKey = 'huggingface'; + +// Same as OpenAIProvider, but replace API Key with HuggingFace Access Token +const useProviderCard = (): ProviderItem => { + const { t } = useTranslation('modelProvider'); + const { styles } = useStyles(); + const isLoading = useAiInfraStore(aiProviderSelectors.isAiProviderConfigLoading(providerKey)); + + return { + ...HuggingFaceProviderCard, + apiKeyItems: [ + { + children: isLoading ? ( + + ) : ( + + ), + desc: ( + + {t(`${providerKey}.accessToken.desc`)} + + ), + label: t(`${providerKey}.accessToken.title`), + name: [KeyVaultsConfigKey, providerKey, LLMProviderApiTokenKey], + }, + ], + }; +}; + +const Page = () => { + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/ollama/Checker.tsx b/src/app/(main)/settings/provider/(detail)/ollama/Checker.tsx new file mode 100644 index 000000000000..fa6ec60f16d1 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/ollama/Checker.tsx @@ -0,0 +1,73 @@ +import { CheckCircleFilled } from '@ant-design/icons'; +import { Alert, Highlighter } from '@lobehub/ui'; +import { Button } from 'antd'; +import { useTheme } from 'antd-style'; +import { ListResponse } from 'ollama/browser'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; +import useSWR from 'swr'; + +import { useIsMobile } from '@/hooks/useIsMobile'; +import { ollamaService } from '@/services/ollama'; + +const OllamaChecker = memo(() => { + const { t } = useTranslation('setting'); + + const theme = useTheme(); + + const { data, error, isLoading, mutate } = useSWR( + 'ollama.list', + ollamaService.getModels, + { + revalidateOnFocus: false, + revalidateOnMount: false, + revalidateOnReconnect: false, + }, + ); + + const checkConnection = () => { + mutate().catch(); + }; + + const isMobile = useIsMobile(); + + return ( + + + {!error && data?.models && ( + + + {t('llm.checker.pass')} + + )} + + + {error && ( + + + + {JSON.stringify(error.body || error, null, 2)} + + + } + message={t(`response.${error.type}` as any, { ns: 'error' })} + showIcon + type={'error'} + /> + + )} +
+ ); +}); + +export default OllamaChecker; diff --git a/src/app/(main)/settings/provider/(detail)/ollama/page.tsx b/src/app/(main)/settings/provider/(detail)/ollama/page.tsx new file mode 100644 index 000000000000..d4b85d0583b3 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/ollama/page.tsx @@ -0,0 +1,34 @@ +'use client'; + +import { useTranslation } from 'react-i18next'; + +import { OllamaProviderCard } from '@/config/modelProviders'; + +import ProviderDetail from '../[id]'; +import Checker from './Checker'; + +const Page = () => { + const { t } = useTranslation('modelProvider'); + + return ( + , + desc: t('ollama.checker.desc'), + label: t('ollama.checker.title'), + minWidth: undefined, + }} + settings={{ + ...OllamaProviderCard.settings, + proxyUrl: { + desc: t('ollama.endpoint.desc'), + placeholder: 'http://127.0.0.1:11434', + title: t('ollama.endpoint.title'), + }, + }} + /> + ); +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/openai/page.tsx b/src/app/(main)/settings/provider/(detail)/openai/page.tsx new file mode 100644 index 000000000000..d7b798fadbea --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/openai/page.tsx @@ -0,0 +1,23 @@ +import { serverFeatureFlags } from '@/config/featureFlags'; +import { OpenAIProviderCard } from '@/config/modelProviders'; + +import ProviderDetail from '../[id]'; + +const Page = async () => { + const { showOpenAIProxyUrl, showOpenAIApiKey } = serverFeatureFlags(); + + return ( + + ); +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(detail)/wenxin/page.tsx b/src/app/(main)/settings/provider/(detail)/wenxin/page.tsx new file mode 100644 index 000000000000..66af253eadb9 --- /dev/null +++ b/src/app/(main)/settings/provider/(detail)/wenxin/page.tsx @@ -0,0 +1,61 @@ +'use client'; + +import { Input } from 'antd'; +import { useTranslation } from 'react-i18next'; + +import { WenxinProviderCard } from '@/config/modelProviders'; +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; +import { GlobalLLMProviderKey } from '@/types/user/settings'; + +import { KeyVaultsConfigKey } from '../../const'; +import { SkeletonInput } from '../../features/ProviderConfig'; +import { ProviderItem } from '../../type'; +import ProviderDetail from '../[id]'; + +const providerKey: GlobalLLMProviderKey = 'wenxin'; + +const useProviderCard = (): ProviderItem => { + const { t } = useTranslation('modelProvider'); + + const isLoading = useAiInfraStore(aiProviderSelectors.isAiProviderConfigLoading(providerKey)); + + return { + ...WenxinProviderCard, + apiKeyItems: [ + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.accessKey.desc`), + label: t(`${providerKey}.accessKey.title`), + name: [KeyVaultsConfigKey, 'accessKey'], + }, + { + children: isLoading ? ( + + ) : ( + + ), + desc: t(`${providerKey}.secretKey.desc`), + label: t(`${providerKey}.secretKey.title`), + name: [KeyVaultsConfigKey, 'secretKey'], + }, + ], + }; +}; + +const Page = () => { + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/(main)/settings/provider/(list)/Footer.tsx b/src/app/(main)/settings/provider/(list)/Footer.tsx new file mode 100644 index 000000000000..210cf9b9c159 --- /dev/null +++ b/src/app/(main)/settings/provider/(list)/Footer.tsx @@ -0,0 +1,36 @@ +'use client'; + +import { useTheme } from 'antd-style'; +import Link from 'next/link'; +import { memo } from 'react'; +import { Trans } from 'react-i18next'; +import { Center } from 'react-layout-kit'; + +import { MORE_MODEL_PROVIDER_REQUEST_URL } from '@/const/url'; + +const Footer = memo(() => { + const theme = useTheme(); + return ( +
+
+ + 更多模型正在 + + 计划接入 + + 中 ,敬请期待 + +
+
+ ); +}); + +export default Footer; diff --git a/src/app/(main)/settings/provider/(list)/ProviderGrid/Card.tsx b/src/app/(main)/settings/provider/(list)/ProviderGrid/Card.tsx new file mode 100644 index 000000000000..a11e642fe971 --- /dev/null +++ b/src/app/(main)/settings/provider/(list)/ProviderGrid/Card.tsx @@ -0,0 +1,130 @@ +import { ProviderCombine, ProviderIcon } from '@lobehub/icons'; +import { Avatar } from '@lobehub/ui'; +import { Divider, Skeleton, Typography } from 'antd'; +import { createStyles } from 'antd-style'; +import Link from 'next/link'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import InstantSwitch from '@/components/InstantSwitch'; +import { useAiInfraStore } from '@/store/aiInfra'; +import { AiProviderListItem } from '@/types/aiProvider'; + +const { Paragraph } = Typography; + +const useStyles = createStyles(({ css, token, isDarkMode }) => ({ + banner: css` + opacity: ${isDarkMode ? 0.9 : 0.4}; + `, + container: css` + position: relative; + + overflow: hidden; + + height: 100%; + + background: ${token.colorBgContainer}; + border-radius: 12px; + box-shadow: 0 0 1px 1px ${isDarkMode ? token.colorFillQuaternary : token.colorFillSecondary} + inset; + + transition: box-shadow 0.2s ${token.motionEaseInOut}; + + &:hover { + box-shadow: 0 0 1px 1px ${isDarkMode ? token.colorFillSecondary : token.colorFill} inset; + } + `, + desc: css` + min-height: 44px; + margin-block-end: 0 !important; + color: ${token.colorTextDescription}; + `, + tagBlue: css` + color: ${token.geekblue}; + background: ${token.geekblue1}; + `, + tagGreen: css` + color: ${token.green}; + background: ${token.green1}; + `, + time: css` + color: ${token.colorTextDescription}; + `, + title: css` + zoom: 1.2; + margin-block-end: 0 !important; + font-size: 18px !important; + font-weight: bold; + `, + token: css` + font-family: ${token.fontFamilyCode}; + `, +})); + +interface ProviderCardProps extends AiProviderListItem { + loading?: boolean; +} +const ProviderCard = memo( + ({ id, description, name, enabled, source, logo, loading }) => { + const { t } = useTranslation('providers'); + const { cx, styles, theme } = useStyles(); + const toggleProviderEnabled = useAiInfraStore((s) => s.toggleProviderEnabled); + + if (loading) + return ( + + + + ); + + return ( + + + + + {source === 'builtin' ? ( + + ) : ( + + {logo ? ( + + ) : ( + + )} + {name || id} + + )} + + + + {source === 'custom' ? description : t(`${id}.description`)} + + + +
+ { + await toggleProviderEnabled(id, checked); + }} + size={'small'} + /> + + + + ); + }, +); + +export default ProviderCard; diff --git a/src/app/(main)/settings/provider/(list)/ProviderGrid/index.tsx b/src/app/(main)/settings/provider/(list)/ProviderGrid/index.tsx new file mode 100644 index 000000000000..4b397cdc2fff --- /dev/null +++ b/src/app/(main)/settings/provider/(list)/ProviderGrid/index.tsx @@ -0,0 +1,91 @@ +'use client'; + +import { Grid } from '@lobehub/ui'; +import { Typography } from 'antd'; +import { createStyles } from 'antd-style'; +import isEqual from 'fast-deep-equal'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Center, Flexbox } from 'react-layout-kit'; + +import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; + +import Card from './Card'; + +const useStyles = createStyles(({ css, responsive, token }) => ({ + count: css` + height: 20px; + padding-block: 0; + padding-inline: 6px; + + color: ${token.colorTextDescription}; + + background: ${token.colorFillSecondary}; + border-radius: 12px; + `, + grid: css` + grid-template-columns: repeat(2, 1fr); + + ${responsive.desktop} { + grid-template-columns: repeat(3, 1fr); + } + `, +})); + +const loadingArr = Array.from({ length: 12 }) + .fill('-') + .map((item, index) => `${index}x${item}`); + +const List = memo(() => { + const { t } = useTranslation('modelProvider'); + const { styles } = useStyles(); + const enabledList = useAiInfraStore(aiProviderSelectors.enabledAiProviderList, isEqual); + const disabledList = useAiInfraStore(aiProviderSelectors.disabledAiProviderList, isEqual); + const [initAiProviderList] = useAiInfraStore((s) => [s.initAiProviderList]); + + if (!initAiProviderList) + return ( + + + + {t('list.title.enabled')} + + + + {loadingArr.map((item) => ( + + ))} + + + ); + + return ( + + + + + {t('list.title.enabled')} + +
{enabledList.length}
+
+ + {enabledList.map((item) => ( + + ))} + +
+ + + {t('list.title.disabled')} + + + {disabledList.map((item) => ( + + ))} + + +
+ ); +}); + +export default List; diff --git a/src/app/(main)/settings/provider/(list)/index.tsx b/src/app/(main)/settings/provider/(list)/index.tsx new file mode 100644 index 000000000000..c0c1983cdeb6 --- /dev/null +++ b/src/app/(main)/settings/provider/(list)/index.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { isCustomBranding } from '@/const/version'; + +import Footer from './Footer'; +import ProviderGrid from './ProviderGrid'; + +const Page = () => { + return ( + <> + + {!isCustomBranding &&