UNPKG

plazbot-cli

Version:
103 lines (89 loc) 3.83 kB
import { Command } from 'commander'; import { Agent } from 'plazbot'; import { getStoredCredentials } from '../../utils/credentials'; import { logger } from '../../utils/logger'; import { AgentCommandOptions, AgentResponse, AgentSource } from '../../types/agent'; import crypto from 'crypto'; import readline from 'readline'; export const chatCommand = new Command('chat') .description('Inicia una sesión de chat interactiva con un agente') .requiredOption('-a, --agent-id <id>', 'ID del agente') .option('-s, --session-id <id>', 'ID de sesión (opcional)') .option('-m, --multiple-answers', 'Permitir múltiples respuestas', false) .option('--dev', 'Usar ambiente de desarrollo', false) .action(async (options: AgentCommandOptions & { agentId: string; sessionId?: string; multipleAnswers?: boolean; }) => { try { // Obtener credenciales guardadas const credentials = await getStoredCredentials(); const agent = new Agent({ workspaceId: credentials.workspace, apiKey: credentials.apiKey, zone: credentials.zone, ...(options.dev && { customUrl: "http://localhost:5090" }) }); // Generar un sessionId si no se proporcionó uno const sessionId = options.sessionId || crypto.randomUUID(); // Crear interfaz de readline const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // Limpiar la pantalla console.clear(); // Mostrar encabezado console.log('Chat session initialized\n'); console.log('┌' + '─'.repeat(60) + '┐'); console.log('│' + ' Plazbot Agent Chat'.padEnd(59) + '│'); console.log('│' + ''.padEnd(59) + '│'); console.log('│' + ' Type your messages and press Enter to send.'.padEnd(59) + '│'); console.log('│' + ' Type "/exit" or press Ctrl+C to end the conversation.'.padEnd(59) + '│'); console.log('└' + '─'.repeat(60) + '┘\n'); console.log('Session ID:', sessionId, '\n'); // Función para preguntar const askQuestion = () => { rl.question('You: ', async (question) => { if (question.toLowerCase() === '/exit') { console.log('\nChat session ended.'); rl.close(); return; } try { console.log('⋮ Waiting for response...'); const response = await agent.onMessage({ agentId: options.agentId, question, sessionId, multipleAnswers: options.multipleAnswers }) as AgentResponse; console.log('\nAssistant:'); console.log(' ' + response.answer); console.log(); // Línea en blanco para separar mensajes // Si hay fuentes, mostrarlas if (response.sources && response.sources.length > 0) { console.log('Sources:'); response.sources.forEach((source: AgentSource) => { console.log(` - ${source.title || 'Untitled'}`); if (source.url) console.log(` ${source.url}`); }); console.log(); // Línea en blanco después de las fuentes } askQuestion(); // Continuar el ciclo de preguntas } catch (error) { const message = error instanceof Error ? error.message : 'Error desconocido'; console.error('\n❌ Error:', message); askQuestion(); // Continuar a pesar del error } }); }; // Iniciar el ciclo de preguntas askQuestion(); } catch (error) { const message = error instanceof Error ? error.message : 'Error desconocido'; console.error('\n❌ Error:', message); process.exit(1); } });