Ahora se obtienen los modelos desde los secretos/variables de entorno. Adicionalmente se mejoraron prompts del sistema para genración de plan o de asignatura #28

Merged
Guillermo.Arrieta merged 2 commits from issue/26-poner-modelos-de-la-ia-en-variables-de-entorno into main 2026-02-16 19:52:22 +00:00
5 changed files with 48 additions and 8 deletions
+5 -1
View File
@@ -118,6 +118,10 @@ Deno.serve(async (req: Request): Promise<Response> => {
SERVICE_ROLE_KEY, SERVICE_ROLE_KEY,
); );
// Model name controlled via env var (single use)
const AI_GENERATE_PLAN_MODELO = Deno.env.get("AI_GENERATE_PLAN_MODELO") ??
"gpt-5-nano";
const formData = await req.formData(); const formData = await req.formData();
const validation = parseAndValidate(formData); const validation = parseAndValidate(formData);
if (!validation.success) { if (!validation.success) {
@@ -185,7 +189,7 @@ Deno.serve(async (req: Request): Promise<Response> => {
: {}; : {};
const aiStructuredPayload: StructuredResponseOptions = { const aiStructuredPayload: StructuredResponseOptions = {
model: "gpt-5-nano", model: AI_GENERATE_PLAN_MODELO,
input: [ input: [
{ role: "system", content: systemPrompt }, { role: "system", content: systemPrompt },
{ role: "user", content: userPrompt }, { role: "user", content: userPrompt },
+10 -1
View File
@@ -34,4 +34,13 @@ Antes de ejecutar el trabajo, comienza con una lista concisa (3-7 puntos) de los
# Validación de Salida # Validación de Salida
Después de generar el objeto, realiza una validación breve para asegurar que todos los campos requeridos estén presentes, que los valores cumplan los criterios normativos y que la estructura cumpla con el json_schema indicado. Después de generar el objeto, realiza una validación breve para asegurar que todos los campos requeridos estén presentes, que los valores cumplan los criterios normativos y que la estructura cumpla con el json_schema indicado.
Corrige cualquier inconsistencia detectada antes de finalizar la entrega.`; Corrige cualquier inconsistencia detectada antes de finalizar la entrega.
# REGLAS DE FORMATO PARA CAMPOS DE TEXTO (STRING)
1. **Prioridad:** Estas reglas aplican por defecto. Si el prompt del usuario solicita explícitamente un formato distinto, esa instrucción tiene prioridad sobre estas reglas.
2. **Estilo Visual:** Redacta el contenido exclusivamente para visualización en texto plano (estilo 'white-space: pre-wrap').
3. **Estructura Vertical:** Utiliza saltos de línea explícitos para romper líneas y doble salto de línea para separar párrafos.
4. **Indentación Estricta:** Usa exactamente 2 espacios para la indentación jerárquica. No uses tabuladores.
5. **Listas:** Utiliza un guion seguido de un espacio ("- ") para los elementos de lista.
6. **Prohibiciones:** No incluyas etiquetas HTML, sintaxis Markdown ni caracteres de escape literales visibles en el texto final.
`;
@@ -170,6 +170,14 @@ Deno.serve(async (req: Request): Promise<Response> => {
SERVICE_ROLE_KEY, SERVICE_ROLE_KEY,
); );
// Model names (override via environment variables)
const AI_GENERATE_SUBJECT_UPDATE_MODELO = Deno.env.get(
"AI_GENERATE_SUBJECT_UPDATE_MODELO",
) ?? "gpt-5-nano";
const AI_GENERATE_SUBJECT_INSERT_MODELO = Deno.env.get(
"AI_GENERATE_SUBJECT_INSERT_MODELO",
) ?? "gpt-5-nano";
// ----------------------------- // -----------------------------
// JSON update flow // JSON update flow
// ----------------------------- // -----------------------------
@@ -307,7 +315,7 @@ Deno.serve(async (req: Request): Promise<Response> => {
: {}; : {};
const aiStructuredPayload: StructuredResponseOptions = { const aiStructuredPayload: StructuredResponseOptions = {
model: "gpt-5-nano", model: AI_GENERATE_SUBJECT_UPDATE_MODELO,
input: [ input: [
{ role: "system", content: systemPrompt }, { role: "system", content: systemPrompt },
{ role: "user", content: userPrompt }, { role: "user", content: userPrompt },
@@ -510,7 +518,14 @@ Deno.serve(async (req: Request): Promise<Response> => {
} }
const systemPrompt = const systemPrompt =
"Eres un asistente experto en diseño curricular. Responde únicamente con JSON válido que cumpla estrictamente el JSON Schema proporcionado."; `Eres un asistente experto en diseño curricular. Responde únicamente con JSON válido que cumpla estrictamente el JSON Schema proporcionado.
# REGLAS DE FORMATO PARA CAMPOS DE TEXTO (STRING)
1. **Prioridad:** Estas reglas aplican por defecto. Si el prompt del usuario solicita explícitamente un formato distinto, esa instrucción tiene prioridad sobre estas reglas.
2. **Estilo Visual:** Redacta el contenido exclusivamente para visualización en texto plano (estilo 'white-space: pre-wrap').
3. **Estructura Vertical:** Utiliza saltos de línea explícitos para romper líneas y doble salto de línea para separar párrafos.
4. **Indentación Estricta:** Usa exactamente 2 espacios para la indentación jerárquica. No uses tabuladores.
5. **Listas:** Utiliza un guion seguido de un espacio ("- ") para los elementos de lista.
6. **Prohibiciones:** No incluyas etiquetas HTML, sintaxis Markdown ni caracteres de escape literales visibles en el texto final.`;
const userPrompt = const userPrompt =
`Genera un borrador completo completo de una ASIGNATURA con base en lo siguiente:\n` + `Genera un borrador completo completo de una ASIGNATURA con base en lo siguiente:\n` +
@@ -540,7 +555,7 @@ Deno.serve(async (req: Request): Promise<Response> => {
: {}; : {};
const aiStructuredPayload: StructuredResponseOptions = { const aiStructuredPayload: StructuredResponseOptions = {
model: "gpt-5-nano", model: AI_GENERATE_SUBJECT_INSERT_MODELO,
input: [ input: [
{ role: "system", content: systemPrompt }, { role: "system", content: systemPrompt },
{ role: "user", content: userPrompt }, { role: "user", content: userPrompt },
@@ -29,6 +29,13 @@ app.options(
); );
const prefix = "/create-chat-conversation"; const prefix = "/create-chat-conversation";
// Model names (module-level) — pueden ser sobrescritos por variables de entorno
const CREATE_CHAT_CONVERSATION_NONSTRUCTURED_MODELO = Deno.env.get(
"CREATE_CHAT_CONVERSATION_NONSTRUCTURED_MODELO",
) ?? "gpt-5-nano";
const CREATE_CHAT_CONVERSATION_STRUCTURED_MODELO = Deno.env.get(
"CREATE_CHAT_CONVERSATION_STRUCTURED_MODELO",
) ?? "gpt-5-nano";
app.get(`${prefix}/health`, (c) => withCors(jsonResponse({ ok: true }))); app.get(`${prefix}/health`, (c) => withCors(jsonResponse({ ok: true })));
@@ -241,7 +248,7 @@ app.post(`${prefix}/conversations/:id/messages`, async (c) => {
if (!wantsStructured) { if (!wantsStructured) {
await openai.responses.create({ await openai.responses.create({
conversation: row.openai_conversation_id, conversation: row.openai_conversation_id,
model: "gpt-5-nano", model: CREATE_CHAT_CONVERSATION_NONSTRUCTURED_MODELO,
input: [ input: [
{ {
role: "system", role: "system",
@@ -284,7 +291,7 @@ app.post(`${prefix}/conversations/:id/messages`, async (c) => {
const schema = pickSchemaFields(definicion, body.campos); const schema = pickSchemaFields(definicion, body.campos);
const planForPrompt = safePlanForPrompt(plan); const planForPrompt = safePlanForPrompt(plan);
const model = "gpt-5-nano"; const model = CREATE_CHAT_CONVERSATION_STRUCTURED_MODELO;
const prompt = body.user_prompt ?? body.content; const prompt = body.user_prompt ?? body.content;
const resp = await openai.responses.create({ const resp = await openai.responses.create({
@@ -160,6 +160,11 @@ Deno.serve(async (req: Request): Promise<Response> => {
SERVICE_ROLE_KEY, SERVICE_ROLE_KEY,
); );
// Model name controlled via env var
const GENERATE_SUBJECT_SUGGESTIONS_MODELO = Deno.env.get(
"GENERATE_SUBJECT_SUGGESTIONS_MODELO",
) ?? "gpt-5-mini";
const { data: plan, error: planError } = await supabaseService const { data: plan, error: planError } = await supabaseService
.from("planes_estudio") .from("planes_estudio")
.select("id,nombre,nivel,tipo_ciclo,numero_ciclos,datos") .select("id,nombre,nivel,tipo_ciclo,numero_ciclos,datos")
@@ -276,7 +281,7 @@ Deno.serve(async (req: Request): Promise<Response> => {
} }
const options: StructuredResponseOptions = { const options: StructuredResponseOptions = {
model: "gpt-5-mini", model: GENERATE_SUBJECT_SUGGESTIONS_MODELO,
input: [ input: [
{ role: "system", content: systemPrompt }, { role: "system", content: systemPrompt },
{ {