diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 5e47714d..73c9635b 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -11,8 +11,12 @@ import FireworksProviderLogo from '@renderer/assets/images/providers/fireworks.p import GithubProviderLogo from '@renderer/assets/images/providers/github.png' import GoogleProviderLogo from '@renderer/assets/images/providers/google.png' import GraphRagProviderLogo from '@renderer/assets/images/providers/graph-rag.png' +import GrokProviderLogo from '@renderer/assets/images/providers/grok.png' import GroqProviderLogo from '@renderer/assets/images/providers/groq.png' +import HyperbolicProviderLogo from '@renderer/assets/images/providers/hyperbolic.png' +import JinaProviderLogo from '@renderer/assets/images/providers/jina.png' import MinimaxProviderLogo from '@renderer/assets/images/providers/minimax.png' +import MistralProviderLogo from '@renderer/assets/images/providers/mistral.png' import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.png' import NvidiaProviderLogo from '@renderer/assets/images/providers/nvidia.png' import OcoolAiProviderLogo from '@renderer/assets/images/providers/ocoolai.png' @@ -24,10 +28,6 @@ import StepProviderLogo from '@renderer/assets/images/providers/step.png' import TogetherProviderLogo from '@renderer/assets/images/providers/together.png' import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' -import GrokProviderLogo from '@renderer/assets/images/providers/grok.png' -import HyperbolicProviderLogo from '@renderer/assets/images/providers/hyperbolic.png' -import MistralProviderLogo from '@renderer/assets/images/providers/mistral.png' -import JinaProviderLogo from '@renderer/assets/images/providers/jina.png' export function getProviderLogo(providerId: string) { switch (providerId) { @@ -326,6 +326,7 @@ export const PROVIDER_CONFIG = { }, websites: { official: 'https://app.hyperbolic.xyz', + apiKey: 'https://app.hyperbolic.xyz/settings', docs: 'https://docs.hyperbolic.xyz', models: 'https://app.hyperbolic.xyz/models' } @@ -336,6 +337,7 @@ export const PROVIDER_CONFIG = { }, websites: { official: 'https://mistral.ai', + apiKey: 'https://console.mistral.ai/api-keys/', docs: 'https://docs.mistral.ai', models: 'https://docs.mistral.ai/getting-started/models/models_overview' } @@ -346,6 +348,7 @@ export const PROVIDER_CONFIG = { }, websites: { official: 'https://jina.ai', + apiKey: 'https://jina.ai/', docs: 'https://jina.ai', models: 'https://jina.ai' } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 44e3bb02..962b03cd 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -377,8 +377,10 @@ "not_checked": "Not Checked", "delete.title": "Delete Provider", "delete.content": "Are you sure you want to delete this provider?", - "edit.name": "Provider Name", - "edit.name.placeholder": "Example: OpenAI", + "add.title": "Add Provider", + "add.name": "Provider Name", + "add.name.placeholder": "Example: OpenAI", + "add.type": "Provider Type", "no_models": "Please add models first before checking the API connection" } }, diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index e42526c7..364b3349 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -377,8 +377,10 @@ "not_checked": "Не проверено", "delete.title": "Удалить провайдер", "delete.content": "Вы уверены, что хотите удалить этот провайдер?", - "edit.name": "Имя провайдера", - "edit.name.placeholder": "Пример: OpenAI", + "add.title": "Добавить провайдер", + "add.name": "Имя провайдера", + "add.name.placeholder": "Пример: OpenAI", + "add.type": "Тип провайдера", "no_models": "Пожалуйста, добавьте модели перед проверкой соединения с API" } }, diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 88f127cb..527f112e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -365,8 +365,10 @@ "not_checked": "未检查", "delete.title": "删除提供商", "delete.content": "确定要删除此模型提供商吗?", - "edit.name": "模型提供商名称", - "edit.name.placeholder": "例如 OpenAI", + "add.title": "添加提供商", + "add.name": "提供商名称", + "add.name.placeholder": "例如 OpenAI", + "add.type": "提供商类型", "no_models": "请先添加模型再检查 API 连接" } }, diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index bb9a8ad0..cca217b4 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -364,9 +364,11 @@ "remove_duplicate_keys": "移除重複密鑰", "not_checked": "未檢查", "delete.title": "刪除提供者", - ".delete.content": "確定要刪除此提供者嗎?", - "edit.name": "提供者名稱", - "edit.name.placeholder": "例如:OpenAI", + "delete.content": "確定要刪除此提供者嗎?", + "add.title": "添加提供者", + "add.name": "提供者名稱", + "add.name.placeholder": "例如:OpenAI", + "add.type": "提供商類型", "no_models": "請先添加模型再檢查 API 連接" } }, diff --git a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx index e4e10825..1712222c 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx @@ -1,31 +1,32 @@ import { TopView } from '@renderer/components/TopView' -import { Provider } from '@renderer/types' -import { Input, Modal } from 'antd' +import { Provider, ProviderType } from '@renderer/types' +import { Divider, Form, Input, Modal, Select } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' interface Props { provider?: Provider - resolve: (name: string) => void + resolve: (result: { name: string; type: ProviderType }) => void } const PopupContainer: React.FC = ({ provider, resolve }) => { const [open, setOpen] = useState(true) const [name, setName] = useState(provider?.name || '') + const [type, setType] = useState(provider?.type || 'openai') const { t } = useTranslation() const onOk = () => { setOpen(false) - resolve(name) + resolve({ name, type }) } const onCancel = () => { setOpen(false) - resolve('') + resolve({ name: '', type: 'openai' }) } const onClose = () => { - resolve(name) + resolve({ name, type }) } const buttonDisabled = name.length === 0 @@ -39,15 +40,31 @@ const PopupContainer: React.FC = ({ provider, resolve }) => { width={360} closable={false} centered - title={t('settings.provider.edit.name')} + title={t('settings.provider.add.title')} okButtonProps={{ disabled: buttonDisabled }}> - setName(e.target.value.trim())} - placeholder={t('settings.provider.edit.name.placeholder')} - onKeyDown={(e) => e.key === 'Enter' && onOk()} - maxLength={32} - /> + +
+ + setName(e.target.value.trim())} + placeholder={t('settings.provider.add.name.placeholder')} + onKeyDown={(e) => e.key === 'Enter' && onOk()} + maxLength={32} + /> + + +