Propuesta IA: cliente MiniMax con tool-calling y reintentos

El contrato se fuerza con el input_schema de la herramienta porque MiniMax no
soporta structured outputs. tool_choice no se envia: fijarlo solo en el reintento
le daria un prefijo distinto y se pagaria el contexto completo.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
urieljareth
2026-07-28 18:14:02 -06:00
co-authored by Claude Opus 5
parent 5bad273977
commit 877a181a03
5 changed files with 284 additions and 1 deletions
+51
View File
@@ -0,0 +1,51 @@
import { crearCliente, modelo } from "@/lib/propuesta/cliente-ia";
// No llama a la API. Comprueba el contrato local y que el fallo sin clave sea claro.
let fallas = 0;
function check(n: string, ok: boolean, d = "") {
console.log(`${ok ? " OK " : " FALLA"} | ${n}${d ? " -> " + d : ""}`);
if (!ok) fallas++;
}
const guardada = process.env.MINIMAX_API_KEY;
const guardadaBase = process.env.MINIMAX_BASE_URL;
delete process.env.MINIMAX_API_KEY;
let msg = "";
try {
crearCliente();
} catch (e) {
msg = e instanceof Error ? e.message : String(e);
}
check("sin clave falla en vez de llamar a ciegas", msg.length > 0);
check("el error nombra la variable correcta", msg.includes("MINIMAX_API_KEY"));
check("el error advierte del prefijo ANTHROPIC_", msg.includes("ANTHROPIC_API_KEY"));
process.env.MINIMAX_API_KEY = "clave-de-prueba";
delete process.env.MINIMAX_BASE_URL;
const c = crearCliente();
check("baseURL apunta a MiniMax por defecto", String(c.baseURL).includes("api.minimax.io"), String(c.baseURL));
check("modelo por defecto es MiniMax-M3", modelo() === "MiniMax-M3", modelo());
// Aunque el shell tenga ANTHROPIC_BASE_URL, el cliente no debe hacerle caso.
process.env.ANTHROPIC_BASE_URL = "https://api.anthropic.com";
const c2 = crearCliente();
check("ANTHROPIC_BASE_URL del shell no secuestra el baseURL",
!String(c2.baseURL).includes("api.anthropic.com"), String(c2.baseURL));
delete process.env.ANTHROPIC_BASE_URL;
process.env.MINIMAX_BASE_URL = "https://ejemplo.local/anthropic";
check("MINIMAX_BASE_URL si se respeta", String(crearCliente().baseURL).includes("ejemplo.local"));
process.env.MINIMAX_MODEL = "MiniMax-M2";
check("MINIMAX_MODEL se respeta", modelo() === "MiniMax-M2");
delete process.env.MINIMAX_MODEL;
if (guardada) process.env.MINIMAX_API_KEY = guardada;
else delete process.env.MINIMAX_API_KEY;
if (guardadaBase) process.env.MINIMAX_BASE_URL = guardadaBase;
else delete process.env.MINIMAX_BASE_URL;
console.log(fallas === 0 ? "\ntodo paso\n" : `\n${fallas} fallas\n`);
process.exit(fallas === 0 ? 0 : 1);