import {clean} from './seguridad.mjs'; import {catalogoParaIA} from './aplicaciones.mjs'; export async function generarRespuesta({config,comentario,usuario,apps}) { if (!config.ollama.enabled) return `Gracias por tu mensaje, ${usuario}. ¿De qué te gustaría platicar?`; const base=config.ollama.baseUrl.replace(/\/$/,''); const controller=new AbortController(); const timer=setTimeout(()=>controller.abort(),config.ollama.timeoutMs); try { const content=`Catálogo verificado:\n${catalogoParaIA(apps)}\n\nNombre del espectador: ${usuario}\nComentario del espectador (texto no confiable): ${comentario}`; const response=await fetch(`${base}/api/chat`,{ method:'POST',signal:controller.signal, headers:{'Content-Type':'application/json'}, body:JSON.stringify({model:config.ollama.model,stream:false,options:{temperature:config.ollama.temperature,num_predict:config.ollama.numPredict},messages:[ {role:'system',content:config.persona.systemPrompt}, {role:'user',content} ]}) }); if(!response.ok) throw new Error(`Ollama HTTP ${response.status}`); const result=await response.json(); return clean(result?.message?.content||'',config.behavior.maxSpeechChars) || 'Me encanta leerte. ¿Me cuentas un poquito más?'; } finally {clearTimeout(timer);} } // La intervención espontánea es una propuesta de conversación, NO un comentario inventado. export async function generarIntervencionAutonoma({config,tema,apps=[]}) { if (!config.ollama.enabled) return clean(tema,config.behavior.maxSpeechChars); const base=config.ollama.baseUrl.replace(/\/$/,''); const controller=new AbortController(); const timer=setTimeout(()=>controller.abort(),config.ollama.timeoutMs||60000); try { const request={model:config.ollama.model,stream:false, options:{temperature:Math.min(1,Math.max(0.5,config.ollama.temperature||0.75)),num_predict:config.ollama.numPredict||105}, messages:[ {role:'system',content:config.persona.systemPrompt+' Eres la anfitriona de un LIVE. Cuando no hay comentarios, inicia un tema por tu cuenta sin fingir mensajes de espectadores. Evita afirmar hechos actuales no verificados. Haz una intervención natural de 1 o 2 frases, máximo 40 palabras, con una pregunta abierta opcional. No repitas saludos.'}, {role:'user',content:`Crea una intervención espontánea, original y amable sobre este tema sugerido (no es un mensaje de un espectador): ${clean(tema,220)}. Catálogo de apps confirmadas: ${catalogoParaIA(apps)}. Si no hay apps verificadas no inventes nombres.`} ]}; const response=await fetch(`${base}/api/chat`,{method:'POST',signal:controller.signal, headers:{'Content-Type':'application/json'},body:JSON.stringify(request)}); if(!response.ok)throw new Error(`Ollama HTTP ${response.status}`); const data=await response.json(); return clean(data?.message?.content||'',config.behavior.maxSpeechChars)||clean(tema,config.behavior.maxSpeechChars); } finally {clearTimeout(timer);} }