Files
Lizandro GuarnizoandClaude Opus 5 ac47769c27 fix(plantillas): "Leer con IA" fallaba con la config de IA que ya está en producción
Escribí una segunda implementación de "llamar al proveedor" en vez de usar la
que ya existe (callAI, la del bot de Telegram). Esa copia no hablaba Anthropic
—se lo mandaba todo al endpoint de OpenAI— y, si la config tenía la URL base
vacía (lo normal: la vista dice que es opcional), armaba una URL relativa que
ni siquiera es una petición válida. Cualquiera de las dos cosas terminaba en
el 502.

Ahora usa callAI, que despacha por proveedor y completa la URL base. El error
del proveedor queda en el log del servidor y el mensaje llega entero a la vista;
si la respuesta no trae mensaje, la vista muestra el status para distinguir un
fallo de la app de uno del proxy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 19:07:03 -05:00

41 lines
1.4 KiB
Go

package services
import (
"fmt"
"strings"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)
// CompletarTextoIA hace una llamada simple (sin tools, sin streaming) al
// proveedor configurado para el servicio dado y devuelve el texto.
//
// Reusa callAI, que es el mismo despachador del bot de Telegram: sabe hablar
// Anthropic y OpenAI-compatible, y completa la URL base cuando la config la
// tiene vacía. Escribir una segunda implementación acá fue un error: no
// soportaba Anthropic y armaba una URL relativa cuando faltaba la base, así
// que fallaba con la config que ya estaba en producción.
func CompletarTextoIA(servicio, sistema, usuario string) (string, error) {
config, err := models.GetAiConfigForService(servicio)
if err != nil {
return "", fmt.Errorf("no hay configuración de IA activa; configurá una en /app/ai-config")
}
if strings.TrimSpace(config.ModelName) == "" {
return "", fmt.Errorf("la configuración de IA %q no tiene modelo definido (/app/ai-config)", config.Nombre)
}
msg, _, err := callAI(config, []agentMessage{
{Role: "system", Content: sistema},
{Role: "user", Content: usuario},
}, nil)
if err != nil {
return "", fmt.Errorf("%s (%s): %w", config.Nombre, config.Provider, err)
}
texto, _ := msg.Content.(string)
if strings.TrimSpace(texto) == "" {
return "", fmt.Errorf("%s no devolvió texto", config.Nombre)
}
return texto, nil
}