๐ set.ts โข 7433 bytes
import { t } from '../i18n.js'
import { loadConfig, setApiKey, updateAppConfig } from '../config.js'
import { saveKeys, loadMemorySearchConfig, hasMemorySearchConfig, saveMemorySearchConfig } from '../apikeys.js'
import { testConnection } from '../models.js'
import { ChatEngine } from '../chat.js'
/**
* ๅค็ /set ็ณปๅๅฝไปค๏ผ/set mem, /set interactive, /set <key>
*
* ่ฟๅ { handled, config, engine } โ ๅฆๆ handled=true๏ผcli.ts ๅบ continue
* config ๅ engine ๅฏ่ฝ่ขซไฟฎๆน๏ผAPI้
็ฝฎๅๆดๆถ้่ฆๅๆญฅๅไธปๅพช็ฏ๏ผ
*/
export async function handleSetCommand(
trimmed: string,
config: any,
engine: any,
color: any,
ACCENT: string,
MUTED: string,
SUCCESS: string,
ERROR: string,
WARN: string,
askQuestion: (q: string) => Promise<string>
): Promise<{ handled: boolean; config: any; engine: any }> {
// /set mem / /set memory โ ๅ้่ฎฐๅฟ API ๅฏ้ฅ้
็ฝฎ
if (trimmed === '/set mem' || trimmed === '/set memory') {
console.log('')
console.log(` ${ACCENT}๐ง ${t('memory.api_config')}${color.reset}`)
console.log(` ${ACCENT}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${color.reset}`)
// ๆพ็คบๅฝๅ็ถๆ
const currentConfig = loadMemorySearchConfig()
const isCustom = hasMemorySearchConfig()
console.log(` ${MUTED}${t('memory.current_status')} ${isCustom ? t('memory.custom_key') : t('memory.using_default')}${color.reset}`)
console.log(` ${MUTED}${t('memory.api_url')}${currentConfig.baseUrl}${color.reset}`)
console.log(` ${MUTED}${t('memory.model_name')}${currentConfig.model}${color.reset}`)
console.log('')
const newKey = await askQuestion(` ${ACCENT}${t("memory.new_key_prompt")}${color.reset}`)
if (!newKey.trim() || newKey.trim().toLowerCase() === 'q') {
console.log(` ${MUTED}${t('memory.keep_current')}${color.reset}`)
console.log('')
return { handled: true, config, engine }
}
// ไฟๅญๆฐๅฏ้ฅ
saveMemorySearchConfig({ apiKey: newKey.trim() })
console.log('')
console.log(` ${SUCCESS}โ
${t('memory.api_key_encrypted')}${color.reset}`)
console.log('')
return { handled: true, config, engine }
}
// /set / /set interactive โ ไบคไบๅผ่ฎพ็ฝฎ API ้
็ฝฎ
if (trimmed === '/set' || trimmed === '/set interactive') {
console.log('')
console.log(` ${ACCENT}๐ง ${t('api.wizard_title')}${color.reset}`)
console.log(` ${ACCENT}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${color.reset}`)
console.log(` ${MUTED}${t('api.wizard_hint')}${color.reset}`)
console.log(` ${MUTED}${t("api.op_hint")}${color.reset}`)
console.log('')
// 1. URL ๅฐๅ
let baseUrl = ''
while (!baseUrl.trim()) {
baseUrl = await askQuestion(` ${ACCENT}${t("api.url_prompt")}${color.reset}`)
if (baseUrl.trim().toLowerCase() === 'q') {
console.log(` ${MUTED}${t('model.op_cancel')}${color.reset}`)
break
}
}
if (!baseUrl.trim()) return { handled: true, config, engine }
// 2. API Key
let apiKey = ''
while (!apiKey.trim()) {
apiKey = await askQuestion(` ${ACCENT}${t("api.key_prompt")}${color.reset}`)
if (apiKey.trim().toLowerCase() === 'q') {
console.log(` ${MUTED}${t('model.op_cancel')}${color.reset}`)
break
}
}
if (!apiKey.trim()) return { handled: true, config, engine }
// 3. ๆจกๅๅๅท
let model = ''
while (!model.trim()) {
model = await askQuestion(` ${ACCENT}${t('model.custom_title')} (Q ๅๆถ): ${color.reset}`)
if (model.trim().toLowerCase() === 'q') {
console.log(` ${MUTED}${t('model.op_cancel')}${color.reset}`)
break
}
}
if (!model.trim()) return { handled: true, config, engine }
// 4. ๆจกๅๆพ็คบๅ็งฐ
const displayName = await askQuestion(` ${ACCENT}ๆจกๅๆพ็คบๅ็งฐ (ๅ่ฝฆ่ทณ่ฟ): ${color.reset}`) || model
// ไฟๅญ้
็ฝฎ๏ผๅ ๅฏ๏ผ
saveKeys(apiKey, baseUrl)
updateAppConfig({ model, displayName: displayName || model })
// ๆต่ฏ่้ๆง
console.log('')
console.log(` ${ACCENT}โณ ${t("api.testing")}${color.reset}`)
const testConfig = {
apiKey: apiKey,
baseUrl: baseUrl,
model: model,
timeoutMs: 30000,
}
try {
const testEngine = new ChatEngine(testConfig)
await testEngine.chat('Hi')
// ่ฟๆฅๆๅ๏ผๅบ็จ้
็ฝฎ
config.apiKey = apiKey
config.baseUrl = baseUrl
config.model = model
Object.assign(engine, new ChatEngine(config))
console.log('')
console.log(` ${SUCCESS}โ
${t('api.config_done')}${color.reset}`)
console.log(` ${MUTED} URL: ${baseUrl}${color.reset}`)
console.log(` ${MUTED} API Key: โ ${t('api.key_encrypted')}${color.reset}`)
console.log(` ${MUTED} ${t("status.model")}: ${model}${color.reset}`)
console.log(` ${MUTED} ${t('api.display_name')}${displayName || model}${color.reset}`)
console.log('')
} catch (e: any) {
// ่ฟๆฅๅคฑ่ดฅ๏ผๆขๅค้ป่ฎค้
็ฝฎ
console.log(` ${ERROR}โ ${t('api.connect_failed')} ${e.message}${color.reset}`)
console.log(` ${WARN}${t('api.fallback_default')}${color.reset}`)
const defaultConfig = loadConfig()
config.apiKey = defaultConfig.apiKey
config.baseUrl = defaultConfig.baseUrl
config.model = defaultConfig.model
Object.assign(engine, new ChatEngine(config))
console.log(` ${MUTED}${t('api.switched_default')}${config.model}${color.reset}`)
console.log('')
console.log(` ${WARN}${t("error.model_saved_not_applied")}${color.reset}`)
console.log('')
}
return { handled: true, config, engine }
}
// /set <key> โ ๅฟซๆท่ฎพ็ฝฎ API Key
if (trimmed.startsWith('/set ')) {
const parts = trimmed.slice(5).trim().split(/\s+/)
if (!parts[0] || parts[0] === '') {
console.log(` ${ACCENT}${t('api.usage')}${color.reset}`)
console.log(` ${ACCENT}/set${color.reset} ${MUTED}${t('api.set_interactive')}${color.reset}`)
console.log(` ${ACCENT}/set <api_key>${color.reset} ${MUTED}${t('api.set_quick')}${color.reset}`)
return { handled: true, config, engine }
}
const apiKey = parts[0]
const baseUrl = parts[1] || 'https://api.minimax.chat/v1'
// ๅฟซๆท่ฎพ็ฝฎไน้่ฆ่ฟๆฅๆต่ฏ
process.stdout.write(` ${ACCENT}${t("api.testing")}${color.reset}`)
const testResult = await testConnection(baseUrl, apiKey, config.model)
process.stdout.write('\r' + ' '.repeat(40) + '\r')
if (!testResult.success) {
console.log(` ${ERROR}${t('model.test_failed')} ${testResult.error}${color.reset}`)
console.log(` ${MUTED}${t('api.key_not_saved')}${color.reset}`)
return { handled: true, config, engine }
}
setApiKey(apiKey, baseUrl)
console.log(` ${SUCCESS}${t('api.key_stored')}${color.reset}`)
config.apiKey = apiKey
config.baseUrl = baseUrl
Object.assign(engine, new ChatEngine(config))
console.log(` ${SUCCESS}${t('api.engine_reinit')} (${testResult.latencyMs}ms)${color.reset}`)
return { handled: true, config, engine }
}
return { handled: false, config, engine }
}