feat: habilitar modo autonomo y optimizar consultas multimedia paralelas en webhook

This commit is contained in:
AI Bot 2026-08-24 13:10:55 -05:00
parent f356cfbadd
commit 3c44471597
2 changed files with 33 additions and 14 deletions

5
AGENTS.md Normal file
View File

@ -0,0 +1,5 @@
# Reglas de Ejecución Autónoma para Antigravity
- **Autonomía Total**: Ejecuta todas las acciones, ediciones de archivos, comandos de terminal, pruebas y diagnósticos de forma proactiva e inmediata sin solicitar confirmación previa ni esperar aprobaciones intermedias.
- **Flujo Completo**: Cuando se solicite un cambio o se reporte un problema, investiga, modifica el código, compila, prueba y entrega la solución terminada.
- **Sin Bloqueos**: No te detengas a pedir permisos antes de ejecutar herramientas, llamadas a bases de datos o scripts de verificación.

View File

@ -25,7 +25,7 @@ export async function getBase64FromMediaMessage(messagePayload: any): Promise<{
const url = `${EVOLUTION_API_URL}/chat/getBase64FromMediaMessage/${EVOLUTION_INSTANCE_NAME}`; const url = `${EVOLUTION_API_URL}/chat/getBase64FromMediaMessage/${EVOLUTION_INSTANCE_NAME}`;
const response = await axios.post(url, { const response = await axios.post(url, {
message: messagePayload message: messagePayload
}, { headers, timeout: 15000 }); }, { headers, timeout: 5000 });
if (response.data && response.data.base64) { if (response.data && response.data.base64) {
return { return {
@ -40,49 +40,63 @@ export async function getBase64FromMediaMessage(messagePayload: any): Promise<{
} }
/** /**
* Fetches recent media messages from the same chat (within a time window) to collect multiple candidate images. * Fetches recent media messages from the same chat (within a strict time window) in parallel.
*/ */
export async function fetchRecentMediaFromSameChat( export async function fetchRecentMediaFromSameChat(
remoteJid: string, remoteJid: string,
maxItems = 4, maxItems = 3,
windowSeconds = 120 windowSeconds = 90
): Promise<Array<{ base64: string, mimeType: string, messageId: string }>> { ): Promise<Array<{ base64: string, mimeType: string, messageId: string }>> {
if (!EVOLUTION_API_URL || !EVOLUTION_INSTANCE_NAME || !remoteJid) { if (!EVOLUTION_API_URL || !EVOLUTION_INSTANCE_NAME || !remoteJid) {
return []; return [];
} }
try { try {
const url = `${EVOLUTION_API_URL}/chat/findMessages/${EVOLUTION_INSTANCE_NAME}?page=1&limit=8`; const url = `${EVOLUTION_API_URL}/chat/findMessages/${EVOLUTION_INSTANCE_NAME}?page=1&limit=5`;
const response = await axios.post( const response = await axios.post(
url, url,
{ where: { "key": { "remoteJid": remoteJid } } }, { where: { "key": { "remoteJid": remoteJid } } },
{ headers, timeout: 8000 } { headers, timeout: 3000 }
); );
const records = response.data?.messages?.records || []; const records = response.data?.messages?.records || [];
const nowSec = Math.floor(Date.now() / 1000); const nowSec = Math.floor(Date.now() / 1000);
// Filter media messages sent within the time window // Strict check: only messages created within the last `windowSeconds` (90s)
const mediaRecords = records.filter((r: any) => { const mediaRecords = records.filter((r: any) => {
const isMedia = Boolean(r.message?.imageMessage || r.message?.videoMessage); const isMedia = Boolean(r.message?.imageMessage || r.message?.videoMessage);
const isRecent = r.messageTimestamp ? (nowSec - r.messageTimestamp <= windowSeconds) : true; if (!isMedia || !r.messageTimestamp) return false;
return isMedia && isRecent; const diff = Math.abs(nowSec - r.messageTimestamp);
return diff <= windowSeconds;
}).slice(0, maxItems); }).slice(0, maxItems);
const results: Array<{ base64: string, mimeType: string, messageId: string }> = []; if (mediaRecords.length === 0) {
return [];
}
for (const record of mediaRecords) { // Fetch all media in parallel with Promise.allSettled
const fetchPromises = mediaRecords.map(async (record: any) => {
const media = await getBase64FromMediaMessage(record); const media = await getBase64FromMediaMessage(record);
if (media && media.base64) { if (media && media.base64) {
results.push({ return {
base64: media.base64, base64: media.base64,
mimeType: media.mimetype, mimeType: media.mimetype,
messageId: record.key?.id || String(Date.now()) messageId: record.key?.id || String(Date.now())
};
}
return null;
}); });
const results = await Promise.allSettled(fetchPromises);
const validMedia: Array<{ base64: string, mimeType: string, messageId: string }> = [];
for (const res of results) {
if (res.status === 'fulfilled' && res.value) {
validMedia.push(res.value);
} }
} }
return results; return validMedia;
} catch (err: any) { } catch (err: any) {
console.warn('Could not fetch recent media from chat:', err?.message); console.warn('Could not fetch recent media from chat:', err?.message);
return []; return [];