@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user