26 KiB
26 KiB
import { load } from "jsr:@std/dotenv";
import OpenAI from "jsr:@openai/openai";
const env = await load({
export: true,
});
const openai = new OpenAI();
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = Deno.env.get("SUPABASE_URL") || env.SUPABASE_URL;
const supabaseKey = Deno.env.get("SUPABASE_ANON_KEY") || env.SUPABASE_ANON_KEY;
const supabase = createClient(supabaseUrl, supabaseKey);
const ID_ASIGNATURA = "fe5eb09c-501b-4db6-b6d3-f02bdcfdc4b4";
console.log(
`Esperando a que la IA termine con la asignatura ${ID_ASIGNATURA}...`,
);
if (!supabase) {
console.log("No hay supabase");
} else {
// 2. Armas la "trampa" (el listener)
await new Promise((resolve) => {
const canal = supabase
.channel("test-asignatura")
.on(
"postgres_changes",
{
event: "UPDATE",
schema: "public",
table: "asignaturas",
filter: `id=eq.${ID_ASIGNATURA}`,
},
(payload) => {
const nuevoEstado = payload.new.estado;
if (nuevoEstado !== "generando") {
console.log(
`¡Proceso completado! El nuevo estado es: ${nuevoEstado}`,
);
supabase.removeChannel(canal);
resolve(true); // ¡Aquí destrabamos la celda de Jupyter!
} else {
console.log("Hubo un update, pero sigue generando...");
}
},
)
.subscribe((status) => {
if (status === "SUBSCRIBED") {
console.log(
"Conexión WebSocket establecida. La celda está esperando cambios...",
);
}
});
});
console.log("Script finalizado correctamente.");
}
console.log(`Iniciando conexión abierta y sin filtros...`);
await new Promise((resolve) => {
const canal = supabase
.channel("test-global-asignaturas")
.on(
"postgres_changes",
{
event: "*", // Escuchamos absolutamente TODO
schema: "public",
table: "asignaturas",
},
(payload) => {
// Imprimimos todo el objeto tal como llega del servidor
console.log("🚨 ¡EVENTO RECIBIDO EN CRUDO!", payload);
// Cerramos la conexión para liberar la celda
supabase.removeChannel(canal);
resolve(true);
},
)
.subscribe((status, err) => {
if (status === "SUBSCRIBED") {
console.log(
"Conectado. Esperando cualquier cambio en la tabla asignaturas...",
);
}
if (err) {
console.error("Error en el socket:", err);
}
});
});
console.log("Script finalizado.");
import("https://esm.sh/@supabase/supabase-js").then(({ createClient }) => {
const supabase = createClient(
"https://bxkskdxwppdlplrkidcz.supabase.co",
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImJ4a3NrZHh3cHBkbHBscmtpZGN6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzIwMzU2NDMsImV4cCI6MjA4NzYxMTY0M30.RIyvmB8Ij_qrsiMn0f65awiG5VaCUA5dvb117wuU3jo",
);
supabase.channel("prueba-consola")
.on("postgres_changes", {
event: "*",
schema: "public",
table: "asignaturas",
}, (payload) => {
console.log("🔥 ¡LLEGÓ EL EVENTO DESDE SUPABASE!", payload);
})
.subscribe((status) => console.log("Estado de la conexión:", status));
});
// plan Crear un plan en la base (sin datos) estado generando
const { data: plan, error } = await supabase.from("planes_estudio").insert({
"carrera_id": "8208da08-d549-4359-8865-9d806bc54f19",
"estructura_id": "69fb2b77-5a95-47e0-bf1f-389d384200e4",
"estado_actual_id": "18f49b67-8077-4371-be6e-2019a3be3562",
"nombre": "Ingeniearía en Cifbernética y Ciberseguridad (2025)",
"nivel": "Doctorado",
"tipo_ciclo": "Semestre",
"numero_ciclos": 8,
"activo": true,
"tipo_origen": "IA",
"creado_por": "11111111-1111-1111-1111-111111111111",
"actualizado_por": "11111111-1111-1111-1111-111111111111",
}).select("*").single();
plan.id;
let response = await openai.responses.create({
model: "gpt-5-mini",
input: "Hola mundo",
metadata: {
tabla: "planes_estudio",
id: '2',
},
text: {
format: {
type: "json_schema",
name: "response_schema",
schema: {
type: "object",
properties: {
"ai-message": {
type: "string",
description:
"Un mensaje de texto que la IA generará para el usuario final. Este mensaje debe ser claro y directo, proporcionando la información solicitada por el usuario o indicando que no se puede procesar la solicitud si no está relacionada con planes de estudio o asignaturas.",
},
"suggested-topic": {
type: "string",
description:
"Un tema de investigación sugerido por la IA que sea relevante para el plan de estudio o asignatura mencionada en la solicitud del usuario. Este tema debe ser específico y relacionado con el área de estudio correspondiente.",
},
},
required: ["ai-message", "suggested-topic"],
additionalProperties: false,
},
},
},
background: true,
});
response;
while (response.status === "queued" || response.status === "in_progress") {
console.log("Current status: " + response.status);
await new Promise((resolve) => setTimeout(resolve, 2000)); // wait 2 seconds
response = await openai.responses.retrieve(response.id);
}
response;
response.metadata;
await supabase.from(response.metadata.tabla).update({
datos: JSON.parse(response.output_text),
}).eq("id", response.metadata.id).select("*").single();