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 response = await axios.post(url, {
message: messagePayload
}, { headers, timeout: 15000 });
}, { headers, timeout: 5000 });
if (response.data && response.data.base64) {
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(
remoteJid: string,
maxItems = 4,
windowSeconds = 120
maxItems = 3,
windowSeconds = 90
): Promise<Array<{ base64: string, mimeType: string, messageId: string }>> {
if (!EVOLUTION_API_URL || !EVOLUTION_INSTANCE_NAME || !remoteJid) {
return [];
}
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(
url,
{ where: { "key": { "remoteJid": remoteJid } } },
{ headers, timeout: 8000 }
{ headers, timeout: 3000 }
);
const records = response.data?.messages?.records || [];
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 isMedia = Boolean(r.message?.imageMessage || r.message?.videoMessage);
const isRecent = r.messageTimestamp ? (nowSec - r.messageTimestamp <= windowSeconds) : true;
return isMedia && isRecent;
if (!isMedia || !r.messageTimestamp) return false;
const diff = Math.abs(nowSec - r.messageTimestamp);
return diff <= windowSeconds;
}).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);
if (media && media.base64) {
results.push({
return {
base64: media.base64,
mimeType: media.mimetype,
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) {
console.warn('Could not fetch recent media from chat:', err?.message);
return [];