feat(providerConfig): implement API key rotation logic for providers

- Added a new function to handle rotating API keys for providers, reusing legacy multi-key logic.
- Updated the providerToAiSdkConfig function to utilize the new key rotation mechanism.
- Enhanced TranslateService imports for better organization.
This commit is contained in:
MyPrototypeWhat 2025-09-01 12:47:12 +08:00
parent e39e349dd3
commit e74c5a8ba3
2 changed files with 35 additions and 3 deletions

View File

@ -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 = {}

View File

@ -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')