plazbot-cli
Version:
CLI para Plazbot SDK
103 lines (89 loc) • 3.83 kB
text/typescript
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);
}
});