diff --git a/src/main/services/WindowService.ts b/src/main/services/WindowService.ts index ce3217bb..bf06eb1b 100644 --- a/src/main/services/WindowService.ts +++ b/src/main/services/WindowService.ts @@ -163,7 +163,11 @@ export class WindowService { mainWindow.webContents.setWindowOpenHandler((details) => { const { url } = details - const oauthProviderUrls = ['https://account.siliconflow.cn/oauth', 'https://aihubmix.com/oauth'] + const oauthProviderUrls = [ + 'https://account.siliconflow.cn/oauth', + 'https://aihubmix.com/oauth', + 'https://aihubmix.com/topup' + ] if (oauthProviderUrls.some((link) => url.startsWith(link))) { return { diff --git a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx index 53e97e21..1a4b0a78 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx @@ -7,6 +7,7 @@ import { PlusOutlined, SettingOutlined } from '@ant-design/icons' +import { HStack } from '@renderer/components/Layout' import ModelTags from '@renderer/components/ModelTags' import OAuthButton from '@renderer/components/OAuth/OAuthButton' import { EMBEDDING_REGEX, getModelLogo, REASONING_REGEX, VISION_REGEX } from '@renderer/config/models' @@ -17,10 +18,11 @@ import { useProvider } from '@renderer/hooks/useProvider' import i18n from '@renderer/i18n' import { isOpenAIProvider } from '@renderer/providers/ProviderFactory' import { checkApi } from '@renderer/services/ApiService' -import { isProviderSupportAuth } from '@renderer/services/ProviderService' +import { isProviderSupportAuth, isProviderSupportCharge } from '@renderer/services/ProviderService' import { useAppDispatch } from '@renderer/store' import { setModel } from '@renderer/store/assistants' import { Model, ModelType, Provider } from '@renderer/types' +import { aihubmixCharge } from '@renderer/utils/oauth' import { Avatar, Button, Card, Checkbox, Divider, Flex, Input, Popover, Space, Switch } from 'antd' import Link from 'antd/es/typography/Link' import { groupBy, isEmpty } from 'lodash' @@ -270,9 +272,14 @@ const ProviderSetting: FC = ({ provider: _provider }) => { {apiKeyWebsite && ( - - {t('settings.provider.get_api_key')} - + + + {t('settings.provider.get_api_key')} + + {isProviderSupportCharge(provider) && ( + {t('settings.provider.charge')} + )} + {t('settings.provider.api_key.tip')} )} diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index bbf94260..92c7dc07 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -164,10 +164,10 @@ export default class OpenAIProvider extends BaseProvider { if (['o1', 'o1-2024-12-17'].includes(model.id) || model.id.startsWith('o3')) { systemMessage = { role: 'developer', - content: `Formatting re-enabled${systemMessage ? "\n" + systemMessage.content : ""}` - }; + content: `Formatting re-enabled${systemMessage ? '\n' + systemMessage.content : ''}` + } } - + const userMessages: ChatCompletionMessageParam[] = [] const _messages = filterContextMessages(takeRight(messages, contextCount + 1)) @@ -199,9 +199,7 @@ export default class OpenAIProvider extends BaseProvider { // @ts-ignore key is not typed const stream = await this.sdk.chat.completions.create({ model: model.id, - messages: [systemMessage, ...userMessages].filter( - Boolean - ) as ChatCompletionMessageParam[], + messages: [systemMessage, ...userMessages].filter(Boolean) as ChatCompletionMessageParam[], temperature: this.getTemperature(assistant, model), top_p: this.getTopP(assistant, model), max_tokens: maxTokens, diff --git a/src/renderer/src/services/ProviderService.ts b/src/renderer/src/services/ProviderService.ts index 33c0f457..3f0385cb 100644 --- a/src/renderer/src/services/ProviderService.ts +++ b/src/renderer/src/services/ProviderService.ts @@ -19,3 +19,8 @@ export function isProviderSupportAuth(provider: Provider) { const supportProviders = ['silicon', 'aihubmix'] return supportProviders.includes(provider.id) } + +export function isProviderSupportCharge(provider: Provider) { + const supportProviders = ['aihubmix'] + return supportProviders.includes(provider.id) +} diff --git a/src/renderer/src/utils/oauth.ts b/src/renderer/src/utils/oauth.ts index 521c1c86..88bbc227 100644 --- a/src/renderer/src/utils/oauth.ts +++ b/src/renderer/src/utils/oauth.ts @@ -57,3 +57,12 @@ export const oauthWithAihubmix = async (setKey) => { window.removeEventListener('message', messageHandler) window.addEventListener('message', messageHandler) } + +export const aihubmixCharge = async () => { + const chargeUrl = `https://aihubmix.com/topup?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh` + window.open( + chargeUrl, + 'oauth', + 'width=720,height=900,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes' + ) +}