UNPKG

ludmi

Version:

LU (Layer Understanding) is a lightweight framework for controlled chatbot interactions with LLMs, action orchestration, and retrieval-augmented generation (RAG).

86 lines (79 loc) 3.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.classifier = exports.getTopic = void 0; const openai_1 = require("./llm/openai"); const parse_1 = require("./parse"); const getTopic = async ({ topics, conversation, revised, prompts, model = "gpt-4o-mini", temperature = 1, metadata = {} }) => { //get revised prompt const revisedPrompt = (revised) ? { content: revised, price: 0 } : await getRevisedPrompt({ prompt: prompts?.revised, conversation, model, temperature, metadata }); const respTopic = await (0, exports.classifier)({ topics, input: revisedPrompt.content, prompt: prompts?.topic, model, temperature }); return { price: respTopic.price + revisedPrompt.price, revised_prompt: revisedPrompt.content, topic: respTopic.topic }; }; exports.getTopic = getTopic; //Solo clasifica el topic de la entrada del usuario const classifier = async ({ topics, input, prompt, model = "gpt-4o-mini", temperature = .5 }) => { const developerInstruction = prompt || `Clasifica la entrada del usuario con las siguientes categorías de topics: \`${JSON.stringify(topics)}\` Pasos: - Analizar con atención a todos los topics'. - Seleccionar el topic que mejor se ajuste a la entrada del usuario. - Importante responder SOLO con el nombre del topic seleccionado sin agregar nada extra. Formato respuesta: { "topic": "nombre del topic" }`; const messages = [ { role: "user", content: input }, { role: "developer", content: developerInstruction }, ]; const respTopic = await (0, openai_1.getAIResponse)({ messages, model, temperature }); let topic = "ne"; try { const parse = (0, parse_1.JSONparse)(respTopic.content); topic = parse?.topic || parse?.name || "ne"; console.log("Topic clasificado:", topic); } catch (error) { console.error(error); topic = respTopic.content; } return { price: respTopic.price, topic }; }; exports.classifier = classifier; const getRevisedPrompt = async ({ prompt, conversation, model = "gpt-4o-mini", temperature = 1, metadata = {} }) => { const developerInstruction = prompt || `ERES UN REFORMULADOR. A qué se refiere el usuario con la última entrada? Reformula el mensaje para que sea más claro, manteniendo el estilo y la intención original. PASO 1 — ANÁLISIS DE CONTEXTO: Antes de reformular, analiza si el mensaje del usuario indica una despedida, agradecimiento o un reinicio de conversación (por ejemplo: "ok", "gracias", "ah bueno", "hola", etc.). Si es así, **ignora completamente los mensajes anteriores** y reformula el mensaje como una expresión aislada, sin suposiciones ni añadidos. PASO 2 - DIRECCIÓN DEL MENSAJE: - **Mantén el sujeto, el destinatario y la intención original del mensaje.** - Si el mensaje está dirigido al asistente, la reformulación debe seguir dirigida al asistente. - No cambies preguntas en segunda persona ("¿te gusta...?") a primera persona ("¿me gusta...?"). PASO 2 — REFORMULACIÓN: - Si el mensaje no es un cierre o saludo, interpreta a qué se refiere usando el contexto anterior y reformula el mensaje del usuario con claridad. IMPORTANTE: - No agregues nada extra ni expliques lo que haces. - No cambies el sujeto ni la dirección del mensaje. - Solo responde con la reformulación del usuario, como si él mismo lo dijera. - En caso de ser necesario nutrir la entrada del usuario con estos metadatos: ${JSON.stringify(metadata)}`; ; // Create the message to be sent const messages = [ ...conversation, { role: "developer", content: developerInstruction }, ]; return await (0, openai_1.getAIResponse)({ messages, model, temperature }); };