feat(umind): los agentes también leen archivos, no solo audios e imágenes
Faltaba la tercera pata: audio pasaba por Whisper, imagen por OCR, y un PDF o
un Word adjunto se ignoraba en silencio. Ahora hay un interruptor por canal
—"Leer archivos adjuntos"— y los documentos que llegan por Telegram o WhatsApp
se convierten a texto antes de pasar al agente.
PDF se lee con stdlib cuando el documento es digital (facturas, cotizaciones,
lo exportado por cualquier programa) y cae al OCR si es un escaneo. Word .docx
es un zip con XML adentro; texto plano, CSV y JSON van directo.
El agente recibe el contenido con contexto ("el cliente adjuntó X, y escribió
Y"), no el chorizo pelado: sin eso el modelo contesta como si el cliente
hubiera tipeado una factura.
De paso la importación de plantillas gana PDF, que usa el mismo extractor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e681f41639
commit
c4b0305112
@@ -45,6 +45,12 @@ func ProcesarMensajeTelegramUmind(canal *models.UmindCanal, chatID int64, texto
|
||||
// getFile, lo pasa por Whisper/OCR y responde igual que un mensaje de texto.
|
||||
// Si no está habilitada, se ignora en silencio.
|
||||
func ProcesarMediaTelegramUmind(canal *models.UmindCanal, chatID int64, fileID, tipo string) error {
|
||||
return ProcesarMediaTelegramUmindConNombre(canal, chatID, fileID, tipo, "", "")
|
||||
}
|
||||
|
||||
// ProcesarMediaTelegramUmindConNombre es la versión completa: los documentos
|
||||
// traen nombre de archivo y, a veces, un texto que los acompaña (caption).
|
||||
func ProcesarMediaTelegramUmindConNombre(canal *models.UmindCanal, chatID int64, fileID, tipo, nombreArchivo, caption string) error {
|
||||
agente, err := models.GetUmindAgenteByID(canal.AgenteID)
|
||||
if err != nil || !agente.Activo {
|
||||
return fmt.Errorf("agente no encontrado o inactivo: %w", err)
|
||||
@@ -84,6 +90,19 @@ func ProcesarMediaTelegramUmind(canal *models.UmindCanal, chatID int64, fileID,
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "document":
|
||||
if !canal.UsarArchivosDocs {
|
||||
return nil
|
||||
}
|
||||
data, err := descargarArchivoTelegram(botToken, fileID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("no se pudo descargar el archivo de Telegram: %w", err)
|
||||
}
|
||||
texto, err = ExtraerTextoDeArchivo(canal.AgenteID, nombreArchivo, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
texto = TextoDeArchivoParaAgente(nombreArchivo, caption, texto)
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user