feat: simple random load balance for claude api key

This commit is contained in:
ikechan8370 2024-03-13 18:27:55 +08:00
parent 7d83c34e98
commit 3b5a26ce62
2 changed files with 54 additions and 15 deletions

View file

@ -46,7 +46,10 @@ const BASEURL = 'https://api.anthropic.com'
* input_tokens: number,
* output_tokens: number,
* }>} usage
*
* @property {{
* type: string,
* message: string,
* }} error
* Claude响应的基本格式
*/
@ -172,6 +175,10 @@ export class ClaudeAPIClient extends BaseClient {
if (this.debug) {
console.log(JSON.stringify(response))
}
if (response.type === 'error') {
logger.error(response.error.message)
throw new Error(response.error.type)
}
await this.upsertMessage(thisMessage)
const respMessage = Object.assign(response, {
id: idModel,

View file

@ -424,20 +424,52 @@ class Core {
return await this.chatGPTApi.sendMessage(prompt, conversation)
} else if (use === 'claude') {
// slack已经不可用移除
const client = new ClaudeAPIClient({
key: Config.claudeApiKey,
model: Config.claudeApiModel || 'claude-3-sonnet-20240229',
debug: true,
baseUrl: Config.claudeApiBaseUrl
// temperature: Config.claudeApiTemperature || 0.5
})
let rsp = await client.sendMessage(prompt, {
stream: false,
parentMessageId: conversation.parentMessageId,
conversationId: conversation.conversationId,
system: Config.claudeSystemPrompt
})
return rsp
let keys = Config.claudeApiKey?.split(/[,;]/).map(key => key.trim()).filter(key => key)
let choiceIndex = Math.floor(Math.random() * keys.length)
let key = keys[choiceIndex]
logger.info(`使用API Key${key}`)
while (keys.length >= 0) {
let errorMessage = ''
const client = new ClaudeAPIClient({
key,
model: Config.claudeApiModel || 'claude-3-sonnet-20240229',
debug: true,
baseUrl: Config.claudeApiBaseUrl
// temperature: Config.claudeApiTemperature || 0.5
})
try {
let rsp = await client.sendMessage(prompt, {
stream: false,
parentMessageId: conversation.parentMessageId,
conversationId: conversation.conversationId,
system: Config.claudeSystemPrompt
})
return rsp
} catch (err) {
errorMessage = err.message
switch (err.message) {
case 'rate_limit_error': {
// api没钱了或者当月/日/时/分额度耗尽
// throw new Error('claude API额度耗尽或触发速率限制')
break
}
case 'authentication_error': {
// 无效的key
// throw new Error('claude API key无效')
break
}
default:
}
logger.warn(`claude api 错误:[${key}] ${errorMessage}`)
}
if (keys.length === 0) {
throw new Error(errorMessage)
}
keys.splice(choiceIndex, 1)
choiceIndex = Math.floor(Math.random() * keys.length)
key = keys[choiceIndex]
logger.info(`使用API Key${key}`)
}
} else if (use === 'claude2') {
let { conversationId } = conversation
let client = new ClaudeAIClient({