UNPKG

skailan-ai

Version:

Servicio de IA y procesamiento de lenguaje natural para Skailan

224 lines (216 loc) 6.98 kB
import { AIService } from "./AIService"; export class IntentClassificationService { aiService; intents; constructor(llmConfig, intents) { this.aiService = new AIService(llmConfig); this.intents = intents || this.getDefaultIntents(); } async classifyIntent(text) { const intentsDescription = this.intents .map((intent) => `- ${intent.name}: ${intent.description}`) .join("\n"); const prompt = ` Clasifica la intención del siguiente texto y responde en formato JSON: Texto: "${text}" Intenciones disponibles: ${intentsDescription} Responde con un JSON que contenga: { "intent": "nombre_de_la_intencion", "confidence": 0.95, "entities": [ { "type": "tipo_entidad", "value": "valor_extraido", "confidence": 0.9 } ], "slots": { "slot_name": "valor_extraido" }, "summary": "Breve resumen de la clasificación" } Solo responde con el JSON, sin texto adicional. `; try { const response = await this.aiService.generateText(prompt); const result = JSON.parse(response); return { intent: result.intent, confidence: result.confidence, entities: result.entities, slots: result.slots, summary: result.summary, }; } catch (error) { // Fallback a clasificación básica return this.fallbackIntentClassification(text); } } async classifyConversationIntent(messages) { const conversationText = messages .map((msg) => `${msg.role}: ${msg.content}`) .join("\n"); const intentsDescription = this.intents .map((intent) => `- ${intent.name}: ${intent.description}`) .join("\n"); const prompt = ` Clasifica la intención principal de esta conversación y responde en formato JSON: Conversación: ${conversationText} Intenciones disponibles: ${intentsDescription} Responde con un JSON que contenga: { "intent": "nombre_de_la_intencion", "confidence": 0.95, "entities": [ { "type": "tipo_entidad", "value": "valor_extraido", "confidence": 0.9 } ], "slots": { "slot_name": "valor_extraido" }, "summary": "Resumen de la intención de la conversación" } Solo responde con el JSON, sin texto adicional. `; try { const response = await this.aiService.generateText(prompt); const result = JSON.parse(response); return { intent: result.intent, confidence: result.confidence, entities: result.entities, slots: result.slots, summary: result.summary, }; } catch (error) { return this.fallbackIntentClassification(conversationText); } } addIntent(intent) { this.intents.push(intent); } removeIntent(intentName) { this.intents = this.intents.filter((intent) => intent.name !== intentName); } getIntents() { return [...this.intents]; } getDefaultIntents() { return [ { name: "greeting", description: "Saludos y presentaciones", examples: ["hola", "buenos días", "cómo estás"], }, { name: "farewell", description: "Despedidas", examples: ["adiós", "hasta luego", "nos vemos"], }, { name: "question", description: "Preguntas generales", examples: ["qué es", "cómo funciona", "cuándo"], }, { name: "complaint", description: "Quejas y problemas", examples: ["tengo un problema", "no funciona", "estoy molesto"], }, { name: "praise", description: "Elogios y agradecimientos", examples: ["excelente servicio", "gracias", "muy bueno"], }, { name: "request_info", description: "Solicitud de información", examples: ["necesito información", "cuéntame más", "dime sobre"], }, { name: "request_action", description: "Solicitud de acción", examples: ["quiero que hagas", "necesito que", "por favor"], }, { name: "confirmation", description: "Confirmaciones", examples: ["sí", "correcto", "exacto", "confirmo"], }, { name: "denial", description: "Negaciones", examples: ["no", "incorrecto", "no es así"], }, { name: "unknown", description: "Intención no reconocida", examples: [], }, ]; } fallbackIntentClassification(text) { const lowerText = text.toLowerCase(); // Clasificación básica basada en palabras clave if (lowerText.includes("hola") || lowerText.includes("buenos días") || lowerText.includes("cómo estás")) { return { intent: "greeting", confidence: 0.8, summary: "Clasificado como saludo", }; } if (lowerText.includes("adiós") || lowerText.includes("hasta luego") || lowerText.includes("nos vemos")) { return { intent: "farewell", confidence: 0.8, summary: "Clasificado como despedida", }; } if (lowerText.includes("problema") || lowerText.includes("error") || lowerText.includes("no funciona")) { return { intent: "complaint", confidence: 0.7, summary: "Clasificado como queja", }; } if (lowerText.includes("gracias") || lowerText.includes("excelente") || lowerText.includes("muy bueno")) { return { intent: "praise", confidence: 0.7, summary: "Clasificado como elogio", }; } if (lowerText.includes("qué") || lowerText.includes("cómo") || lowerText.includes("cuándo")) { return { intent: "question", confidence: 0.6, summary: "Clasificado como pregunta", }; } return { intent: "unknown", confidence: 0.5, summary: "Intención no reconocida", }; } } //# sourceMappingURL=IntentClassificationService.js.map