diff --git a/src/renderer/src/aiCore/provider/providerConfig.ts b/src/renderer/src/aiCore/provider/providerConfig.ts index 2dcf3ba15..6bebb8714 100644 --- a/src/renderer/src/aiCore/provider/providerConfig.ts +++ b/src/renderer/src/aiCore/provider/providerConfig.ts @@ -23,6 +23,32 @@ import { getAiSdkProviderId } from './factory' const logger = loggerService.withContext('ProviderConfigProcessor') +/** + * 获取轮询的API key + * 复用legacy架构的多key轮询逻辑 + */ +function getRotatedApiKey(provider: Provider): string { + const keys = provider.apiKey.split(',').map((key) => key.trim()) + const keyName = `provider:${provider.id}:last_used_key` + + if (keys.length === 1) { + return keys[0] + } + + const lastUsedKey = window.keyv.get(keyName) + if (!lastUsedKey) { + window.keyv.set(keyName, keys[0]) + return keys[0] + } + + const currentIndex = keys.indexOf(lastUsedKey) + const nextIndex = (currentIndex + 1) % keys.length + const nextKey = keys[nextIndex] + window.keyv.set(keyName, nextKey) + + return nextKey +} + /** * 处理特殊provider的转换逻辑 */ @@ -88,7 +114,7 @@ export function providerToAiSdkConfig( // 构建基础配置 const baseConfig = { baseURL: actualProvider.apiHost, - apiKey: actualProvider.apiKey + apiKey: getRotatedApiKey(actualProvider) } // 处理OpenAI模式 const extraOptions: any = {} diff --git a/src/renderer/src/services/TranslateService.ts b/src/renderer/src/services/TranslateService.ts index f84edffcd..c8bdad940 100644 --- a/src/renderer/src/services/TranslateService.ts +++ b/src/renderer/src/services/TranslateService.ts @@ -1,13 +1,19 @@ import { loggerService } from '@logger' import { db } from '@renderer/databases' -import { CustomTranslateLanguage, TranslateHistory, TranslateLanguage, TranslateLanguageCode } from '@renderer/types' +import { + CustomTranslateLanguage, + FetchChatCompletionOptions, + TranslateHistory, + TranslateLanguage, + TranslateLanguageCode +} from '@renderer/types' import { Chunk, ChunkType } from '@renderer/types/chunk' import { uuid } from '@renderer/utils' import { readyToAbort } from '@renderer/utils/abortController' import { formatErrorMessage, isAbortError } from '@renderer/utils/error' import { t } from 'i18next' -import { fetchChatCompletion, FetchChatCompletionOptions } from './ApiService' +import { fetchChatCompletion } from './ApiService' import { getDefaultTranslateAssistant } from './AssistantService' const logger = loggerService.withContext('TranslateService')