Chats de ia en segundo plano para asignaturas

fix #51
This commit is contained in:
2026-03-09 16:27:27 -06:00
parent 244bf9bd38
commit 16092e94a3
4 changed files with 205 additions and 117 deletions
@@ -45,36 +45,48 @@ export function pickSchemaFields(
return out;
}
export function pickSchemaAsignaturaFields(
definicion: any,
campos: string[],
) {
// Si no hay definición válida, devolvemos un objeto vacío seguro
// 1. Validación inicial
if (!definicion || definicion.type !== "object" || !definicion.properties) {
return { type: "object", properties: {}, required: [], additionalProperties: false };
return {
type: "object",
properties: {
"ai-message": { type: "string" },
"is_refusal": { type: "boolean" }
},
required: ["ai-message", "is_refusal"],
additionalProperties: false
};
}
// Clonamos para no mutar el original
const out = structuredClone(definicion);
// 1. Filtrar las propiedades: solo las que el usuario pidió en 'campos'
const entries = Object.entries(out.properties).filter(([k]) =>
campos.includes(k)
// 2. Filtrar solo las propiedades técnicas que el usuario pidió
const filteredProperties = Object.fromEntries(
Object.entries(definicion.properties).filter(([k]) => campos.includes(k))
);
out.properties = Object.fromEntries(entries);
// 2. Filtrar los requeridos: solo si están en el nuevo set de propiedades
if (Array.isArray(out.required)) {
out.required = out.required.filter((k: string) => campos.includes(k));
} else {
out.required = [];
}
// 3. RECONSTRUIR el esquema incluyendo SIEMPRE los campos de control
const finalSchema = {
type: "object",
properties: {
"ai-message": {
type: "string",
description: "Tu respuesta conversacional dirigida al profesor."
},
"is_refusal": {
type: "boolean",
description: "Indica si la solicitud es inapropiada o no relacionada."
},
...filteredProperties // Aquí entran objetivo, contenido, etc.
},
// Forzamos que ai-message e is_refusal sean obligatorios siempre
required: ["ai-message", "is_refusal", ...Object.keys(filteredProperties)],
additionalProperties: false
};
// 3. Limpieza de OpenAI: Forzar additionalProperties a false
out.additionalProperties = false;
return out;
return finalSchema;
}
export function safePlanForPrompt(plan: any) {