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>
41 lines
1.4 KiB
Go
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
|
|
}
|