UNPKG

@agentkai/cli

Version:
264 lines (263 loc) 10.5 kB
import { Colors, Logger } from '@agentkai/node'; import * as fs from 'fs'; import * as path from 'path'; import * as readline from 'readline'; export class ChatCommand { constructor(system) { Object.defineProperty(this, "system", { enumerable: true, configurable: true, writable: true, value: system }); Object.defineProperty(this, "logger", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "rl", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "version", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.logger = new Logger('ChatCommand'); // 创建readline接口 this.rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); // 初始化版本号 this.version = this.getVersion(); } /** * 获取当前应用版本号 */ getVersion() { try { // 可能的包路径 const possiblePaths = [ path.resolve(__dirname, '../../../package.json'), // 开发环境 path.resolve(__dirname, '../../package.json'), // npm包安装环境 path.resolve(process.cwd(), 'package.json') // 当前工作目录 ]; // 尝试读取package.json for (const pkgPath of possiblePaths) { if (fs.existsSync(pkgPath)) { const packageData = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); if (packageData.name === 'agentkai') { return packageData.version; } } } } catch (error) { this.logger.debug('无法读取版本号:', error); } return '未知'; // 默认返回未知版本 } async execute() { try { // 临时关闭或调整logger选项,确保UI显示正常 const originalLoggerOptions = Logger.getGlobalOptions(); Logger.setGlobalOptions({ ...originalLoggerOptions, showTimestamp: false, // 隐藏时间戳使界面更整洁 showModule: false, // 隐藏模块名称 }); this.printWelcomeMessage(); await this.startChat(); // 恢复原始logger选项 Logger.setGlobalOptions(originalLoggerOptions); } catch (error) { this.logger.error('聊天过程中发生错误:', error); throw error; } finally { this.rl.close(); } } printWelcomeMessage() { // 清屏效果(使用ANSI转义序列) process.stdout.write('\x1Bc'); console.log(`\n${Colors.bright}✨ 欢迎使用 ${Colors.success}AgentKai${Colors.reset} ${Colors.bright}智能助手 ✨${Colors.reset} ${Colors.dim}v${this.version}${Colors.reset}\n`); console.log(`${Colors.dim}── 特殊命令 ──${Colors.reset}`); console.log(` ${Colors.bright}!save${Colors.reset} <内容> 保存重要信息到长期记忆`); console.log(` ${Colors.bright}!search${Colors.reset} <关键词> 搜索长期记忆`); console.log(` ${Colors.bright}!clear${Colors.reset} 清除当前对话历史`); console.log(` ${Colors.bright}exit${Colors.reset} 退出聊天模式\n`); console.log(`${Colors.dim}输入您的问题或命令开始对话...${Colors.reset}\n`); } async startChat() { // 循环处理用户输入 let chatting = true; while (chatting) { try { const input = await this.getUserInput(); // 检查是否退出 if (input.toLowerCase() === 'exit') { // 使用简化logger配置显示退出消息 const originalLoggerOptions = Logger.getGlobalOptions(); Logger.setGlobalOptions({ ...originalLoggerOptions, showTimestamp: false, showLogLevel: false, showModule: false, }); this.logger.success('感谢使用,再见!'); // 恢复logger配置 Logger.setGlobalOptions(originalLoggerOptions); chatting = false; break; } // 处理特殊命令 if (input.startsWith('!')) { await this.handleSpecialCommand(input); continue; } // 处理常规对话(不显示分隔符,保持界面简洁) const response = await this.system.processInput(input); // 显示输出,使用彩色但简洁的格式 console.log(`\n${Colors.info}AI:${Colors.reset} ${response.output}`); // 显示token使用情况 - 让token信息始终显示,但使用暗色调 const tokenInfo = response.tokens; if (tokenInfo) { console.log(`${Colors.dim}Token 使用情况: 提示词 ${tokenInfo.prompt} | 回复 ${tokenInfo.completion} | 总计 ${tokenInfo.total}${Colors.reset}\n`); } } catch (error) { this.logger.error('处理消息时出错:', error); console.log(`\n${Colors.error}出现错误:${Colors.reset} 无法处理您的消息。请重试或检查日志。\n`); } } } getUserInput() { return new Promise((resolve) => { this.rl.question(`${Colors.bright}>${Colors.reset} `, (answer) => { resolve(answer.trim()); }); }); } async handleSpecialCommand(input) { const parts = input.split(' '); const command = parts[0].toLowerCase(); const args = parts.slice(1).join(' '); switch (command) { case '!save': if (!args) { this.logger.warn('请提供要保存的内容'); return; } await this.saveMemory(args); break; case '!search': if (!args) { this.logger.warn('请提供搜索关键词'); return; } await this.searchMemories(args); break; case '!clear': await this.clearConversation(); break; default: this.logger.warn(`未知命令: ${command}`); break; } } async saveMemory(content) { // 使用临时简化logger配置 const originalLoggerOptions = Logger.getGlobalOptions(); Logger.setGlobalOptions({ ...originalLoggerOptions, showTimestamp: false, showLogLevel: false, showModule: false, }); try { this.logger.info(`正在保存记忆...`); await this.system.addMemory(content, { type: 'manual', timestamp: Date.now(), }); this.logger.success(`✓ 记忆已成功保存`); } catch (error) { this.logger.error(`✗ 记忆保存失败`, error); } finally { // 恢复原始logger配置 Logger.setGlobalOptions(originalLoggerOptions); } } async searchMemories(query) { try { // 使用临时简化logger配置 const originalLoggerOptions = Logger.getGlobalOptions(); Logger.setGlobalOptions({ ...originalLoggerOptions, showTimestamp: false, showLogLevel: false, showModule: false, }); this.logger.info(`搜索记忆: "${query}"...`); const memories = await this.system.searchMemories(query); if (memories.length === 0) { this.logger.info(`没有找到相关记忆`); // 恢复原始logger配置 Logger.setGlobalOptions(originalLoggerOptions); return; } this.logger.success(`找到 ${memories.length} 条相关记忆:`); memories.forEach((memory, index) => { const date = new Date(memory.createdAt).toLocaleString(); console.log(`\n${Colors.bright}${index + 1}.${Colors.reset} ${memory.content}`); // 显示相似度信息 if (memory.metadata && memory.metadata.similarity !== undefined) { console.log(` ${Colors.dim}相似度: ${memory.metadata.similarity.toFixed(4)} | 日期: ${date}${Colors.reset}`); } else { console.log(` ${Colors.dim}日期: ${date}${Colors.reset}`); } }); console.log(); // 额外的空行增加可读性 // 恢复原始logger配置 Logger.setGlobalOptions(originalLoggerOptions); } catch (error) { this.logger.error('搜索记忆失败:', error); // 确保即使出错也恢复logger配置 Logger.setGlobalOptions(Logger.getGlobalOptions()); } } async clearConversation() { // 使用临时简化logger配置 const originalLoggerOptions = Logger.getGlobalOptions(); Logger.setGlobalOptions({ ...originalLoggerOptions, showTimestamp: false, showLogLevel: false, showModule: false, }); try { this.logger.info(`正在清除对话历史...`); await this.system.clearCurrentConversation(); this.logger.success(`✓ 对话历史已清除`); } catch (error) { this.logger.error(`✗ 清除对话历史失败`, error); } finally { // 恢复原始logger配置 Logger.setGlobalOptions(originalLoggerOptions); } } }