๐Ÿ“„ keypool.ts  โ€ข  4961 bytes
import { t } from '../i18n.js'
import {
  loadChatKeyPool, addChatKey, removeChatKey,
  loadEmbeddingKeyPool, addEmbeddingKey, removeEmbeddingKey
} from '../apikeys.js'

/** ๅค„็† /keypool ๅ‘ฝไปค */
export async function handleKeypoolCommand(
  args: string[],
  color: any,
  MUTED: string,
  SUCCESS: string,
  ERROR: string,
  WARN: string,
  askPassword: (prompt: string) => Promise<string>,
  askQuestion: (prompt: string) => Promise<string>
): Promise<void> {
  console.log('')
  console.log(`  ๐Ÿ”‘ ${t('keypool.title')}`)
  console.log(`  ${MUTED}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${color.reset}`)

  // /keypool list
  if (args[0] === 'list' || args.length === 0) {
    const chatPool = loadChatKeyPool()
    console.log(`  Chat API Keys:`)
    chatPool.forEach((e, i) => {
      console.log(`    [${i + 1}] ${e.name}  ${e.model}  ${e.baseUrl}`)
    })
    if (chatPool.length === 0) console.log(`    (${t('keypool.no_keys')})`)
    
    const embedPool = loadEmbeddingKeyPool()
    console.log(`  Embedding API Keys:`)
    embedPool.forEach((e, i) => {
      console.log(`    [${i + 1}] ${e.name}  ${e.model}  ${e.baseUrl}`)
    })
    if (embedPool.length === 0) console.log(`    (${t('keypool.no_keys')})`)
    console.log('')
    console.log(`  ${MUTED}${t('keypool.add_hint')}${color.reset}`)
    console.log(`  ${MUTED}${t('keypool.remove_hint')}${color.reset}`)
    console.log('')
    return
  }

  // /keypool add chat <name> <model> <baseUrl>
  if (args[0] === 'add' && args[1] === 'chat') {
    const parts = args.slice(2)
    if (parts.length < 3) {
      console.log('Usage: /keypool add chat <name> <model> <baseUrl>')
      console.log('')
      return
    }
    const [name, model, baseUrl] = parts
    const apiKey = await askPassword('Enter API Key: ')
    if (!apiKey) { console.log('Cancelled\n'); return }
    try {
      addChatKey(name, model, baseUrl, apiKey)
      console.log(`  ${SUCCESS}โœ“ ${t('keypool.chat_added')}${color.reset}`)
      console.log(`  ${MUTED}  ${t('keypool.details')}: ${baseUrl}${color.reset}`)
      console.log('')
    } catch (e: any) { console.log(`  ${ERROR}Error: ${e.message}${color.reset}\n`) }
    return
  }

  // /keypool add embed <name> <model> <baseUrl>
  if (args[0] === 'add' && (args[1] === 'embed' || args[1] === 'embedding')) {
    const parts = args.slice(2)
    if (parts.length < 3) {
      console.log('Usage: /keypool add embed <name> <model> <baseUrl>')
      console.log('')
      return
    }
    const [name, model, baseUrl] = parts
    const apiKey = await askPassword('Enter API Key: ')
    if (!apiKey) { console.log('Cancelled\n'); return }
    try {
      addEmbeddingKey(name, model, baseUrl, apiKey)
      console.log(`  ${SUCCESS}โœ“ ${t('keypool.embed_added')}${color.reset}`)
      console.log(`  ${MUTED}  ${t('keypool.details')}: ${baseUrl}${color.reset}`)
      console.log('')
    } catch (e: any) { console.log(`  ${ERROR}Error: ${e.message}${color.reset}\n`) }
    return
  }

  // /keypool remove chat <name>
  if (args[0] === 'remove' && args[1] === 'chat') {
    const name = args.slice(2).join(' ')
    if (!name) { console.log('Usage: /keypool remove chat <name>\n'); return }
    const confirm = await askQuestion(`  ${WARN}${t('model.confirm_delete', {name: `Chat ${name}`})} ${color.reset}`)
    if (confirm.toLowerCase() !== 'y') { console.log(`  ${MUTED}${t('model.cancelled')}${color.reset}\n`); return }
    if (removeChatKey(name)) {
      console.log(`  ${SUCCESS}โœ“ ${t('keypool.chat_deleted')}${color.reset}\n`)
    } else {
      console.log(`  ${ERROR}โœ— ${t('keypool.not_found')}${color.reset}\n`)
    }
    return
  }

  // /keypool remove embed <name>
  if (args[0] === 'remove' && (args[1] === 'embed' || args[1] === 'embedding')) {
    const name = args.slice(2).join(' ')
    if (!name) { console.log('Usage: /keypool remove embed <name>\n'); return }
    const confirm = await askQuestion(`  ${WARN}${t('model.confirm_delete', {name: `Embedding ${name}`})} ${color.reset}`)
    if (confirm.toLowerCase() !== 'y') { console.log(`  ${MUTED}${t('model.cancelled')}${color.reset}\n`); return }
    if (removeEmbeddingKey(name)) {
      console.log(`  ${SUCCESS}โœ“ ${t('keypool.embed_deleted')}${color.reset}\n`)
    } else {
      console.log(`  ${ERROR}โœ— ${t('keypool.not_found')}${color.reset}\n`)
    }
    return
  }

  // ๅธฎๅŠฉ
  console.log('Usage:')
  console.log(`  /keypool list                          ${t('keypool.help_list')}`)
  console.log(`  /keypool add chat <name> <model> <url> ${t('keypool.help_add_chat')}`)
  console.log(`  /keypool add embed <name> <model> <url> ${t('keypool.help_add_embed')}`)
  console.log(`  /keypool remove chat <name>           ${t('keypool.help_del_chat')}`)
  console.log(`  /keypool remove embed <name>          ${t('keypool.help_del_embed')}`)
  console.log('')
}