From b1d431a683b192844c500165d8ff81dccf0cb197 Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Tue, 10 Feb 2026 17:23:45 -0600 Subject: [PATCH] =?UTF-8?q?Generaci=C3=B3n=20con=20IA=20funcional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supabase/functions/ai-generate-plan/deno.json | 5 +--- .../generate-subject-suggestions/deno.json | 2 +- .../generate-subject-suggestions/index.ts | 25 +++++++++++++------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/supabase/functions/ai-generate-plan/deno.json b/supabase/functions/ai-generate-plan/deno.json index 8b204ca..f5db280 100644 --- a/supabase/functions/ai-generate-plan/deno.json +++ b/supabase/functions/ai-generate-plan/deno.json @@ -1,8 +1,5 @@ { "imports": { - "zod": "https://deno.land/x/zod@v3.22.4/mod.ts", - "openai": "npm:openai@6.16.0", - "@supabase/supabase-js": "npm:@supabase/supabase-js@2", - "@supabase/functions-js/edge-runtime.d.ts": "jsr:@supabase/functions-js@^2/edge-runtime.d.ts" + "zod": "https://deno.land/x/zod@v3.22.4/mod.ts" } } diff --git a/supabase/functions/generate-subject-suggestions/deno.json b/supabase/functions/generate-subject-suggestions/deno.json index a42ac38..43cab55 100644 --- a/supabase/functions/generate-subject-suggestions/deno.json +++ b/supabase/functions/generate-subject-suggestions/deno.json @@ -1,6 +1,6 @@ { "imports": { - "zod": "https://deno.land/x/zod@v3.22.4/mod.ts", + "zod": "npm:zod@4.3.5", "openai": "npm:openai@6.16.0", "openai/helpers/zod": "npm:openai@6.16.0/helpers/zod", "@supabase/supabase-js": "npm:@supabase/supabase-js@2", diff --git a/supabase/functions/generate-subject-suggestions/index.ts b/supabase/functions/generate-subject-suggestions/index.ts index 4ec4ce3..2bb5ea1 100644 --- a/supabase/functions/generate-subject-suggestions/index.ts +++ b/supabase/functions/generate-subject-suggestions/index.ts @@ -16,26 +16,30 @@ export type DataAsignaturaSugerida = { creditos: Tables<"asignaturas">["creditos"] | null; horasAcademicas?: number | null; horasIndependientes?: number | null; - descripcion?: string; + descripcion: string; }; const AsignaturaSugeridaItemSchema: z.ZodType = z .object({ nombre: z.string().describe("Nombre de la asignatura a crear"), - codigo: z.string().optional().describe( + codigo: z.string().optional().nullable().describe( "Código o clave de la asignatura. Un string único que la identifique, como 'MAT101' o 'FIS202'. Opcional, pero recomendado para evitar confusiones.", ), tipo: z.enum(["TRONCAL", "OBLIGATORIA", "OPTATIVA", "OTRA"]).nullable(), creditos: z.number().nullable(), horasAcademicas: z.number().optional().nullable(), horasIndependientes: z.number().optional().nullable(), - descripcion: z.string().optional(), + descripcion: z.string(), }); const AsignaturaSugeridaSchema = z - .array(AsignaturaSugeridaItemSchema) - .length(6) - .describe("Arreglo de 6 sugerencias de asignatura"); + .object({ + sugerencias: z + .array(AsignaturaSugeridaItemSchema) + .length(6) + .describe("Arreglo de 6 sugerencias de asignatura"), + }) + .describe("Respuesta estructurada con 6 sugerencias de asignatura"); Deno.serve(async (req: Request): Promise => { const url = new URL(req.url); @@ -81,7 +85,7 @@ Deno.serve(async (req: Request): Promise => { } const options: StructuredResponseOptions = { - model: "gpt-4o-mini", + model: "gpt-5-mini", input: [ { role: "user", @@ -149,7 +153,12 @@ Deno.serve(async (req: Request): Promise => { ); } - return sendSuccess(parsed.data); + console.log( + `[${ + new Date().toISOString() + }][${functionName}]: Request processed successfully`, + ); + return sendSuccess(parsed.data.sugerencias); } catch (error) { if (error instanceof HttpError) { console.error(