From 0a4fc51bf78e31c4562a72a0f14e98f6372b183b Mon Sep 17 00:00:00 2001 From: Alejandro Rosales Date: Mon, 16 Feb 2026 11:28:13 -0600 Subject: [PATCH] feat: add definitions for perishables and origin schemas in new notebook --- notebooks/conversations-openai.ipynb | 19 ++- notebooks/definitions-openai.ipynb | 218 +++++++++++++++++++++++++++ 2 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 notebooks/definitions-openai.ipynb diff --git a/notebooks/conversations-openai.ipynb b/notebooks/conversations-openai.ipynb index 92ce72f..c40fe43 100644 --- a/notebooks/conversations-openai.ipynb +++ b/notebooks/conversations-openai.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "89b3fffb", "metadata": {}, "outputs": [], @@ -636,7 +636,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 100, "id": "c68073e8", "metadata": {}, "outputs": [ @@ -646,7 +646,20 @@ "text": [ "{\n", " \"source\": \"openai\",\n", - " \"items\": []\n", + " \"items\": [\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\": {\n", + " \"perfil_de_ingreso\": \"El aspirante debe haber concluido el bachillerato con perfil Área 1 (Ciencias Físico-Matemáticas). Se requieren fundamentos sólidos en matemáticas (álgebra lineal, cálculo, análisis), física (mecánica clásica y electromagnetismo a nivel de bachillerato; introducción a la física cuántica) y química básica, así como razonamiento lógico, capacidad de análisis de problemas y habilidades de lectura científica. Se valorará experiencia en actividades de laboratorio y en el manejo de herramientas computacionales para simulación (p. ej., programación en Python, MATLAB u otros). El candidato debe demostrar autonomía en el aprendizaje, claridad en la comunicación escrita y oral, facilidad para trabajar en equipo, ética en la investigación y un interés demostrado por problemáticas complejas de la física teórica y su relación con la tecnología y el modelado computacional. Se espera disposición para abordar conceptos avanzados de forma progresiva, con competencia para supervisar proyectos cortos y colaborar de forma responsable.\",\n", + " \"programa_de_investigacion\": \"Propuesta de programa de investigación orientado al Bachillerato en Gravedad Cuántica de Bucles: Línea principal: Modelos simplificados de redes de espín para ilustrar la geometría cuántica emergente. Objetivos: (i) implementar simulaciones simples de redes de espín en 2D; (ii) estudiar observables básicos que permitan visualizar la transición entre estructuras discretas y conceptos geométros; (iii) desarrollar recursos didácticos (cuadernos de ejercicios, cuadernos Jupyter) para divulgación y aprendizaje. Vinculación con asignaturas: Física y Matemáticas (bases teóricas), Informática (programación y simulación). Metodología: prácticas computacionales con Python/NumPy, análisis de resultados y presentaciones; evaluación a través de bitácoras, informes reproducibles y presentaciones orales. Perfil docente: docentes con experiencia en física teórica, simulación numérica y didáctica de conceptos complejos. Observaciones: el programa se adecua a un plan de Bachillerato con enfoque pedagógico y reproducibilidad.\",\n", + " \"ai-message\": \"Se mejoró la redacción del perfil de ingreso para mayor claridad y se propuso un tema de investigación orientado a líneas didácticas y prácticas computacionales para la gravedad cuántica de bucles.\"\n", + " }\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"Dale mejor redacción al perfil de ingreso y sugiere tema de investigación.\"\n", + " }\n", + " ]\n", "}\n" ] } diff --git a/notebooks/definitions-openai.ipynb b/notebooks/definitions-openai.ipynb new file mode 100644 index 0000000..ae139c7 --- /dev/null +++ b/notebooks/definitions-openai.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "id": "902bff53", + "metadata": {}, + "outputs": [], + "source": [ + "import { load } from \"jsr:@std/dotenv\";\n", + "import OpenAI from \"jsr:@openai/openai\";\n", + "\n", + "const env = await load({\n", + " export: true,\n", + "});\n", + "\n", + "const openai = new OpenAI();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68f89168", + "metadata": {}, + "outputs": [], + "source": [ + "const perishables = {\n", + " expiryDate: { type: \"string\", format: \"date\" },\n", + " batchNumber: {\n", + " type: \"string\",\n", + " maxLength: 20,\n", + " description: \"Puede ser inventado\",\n", + " },\n", + " storageTempC: {\n", + " type: \"number\",\n", + " minimum: -30,\n", + " maximum: 10,\n", + " description: \"Temperatura de almacenamiento en grados Celsius\",\n", + " },\n", + "};\n", + "\n", + "const origen = {\n", + " country: { type: \"string\", maxLength: 50 },\n", + " city: { type: \"string\", maxLength: 50 },\n", + "};\n", + "\n", + "// Transformar las definiciones: poner en properties, agregar required, y additionalProperties: false\n", + "\n", + "const perishablesWithMetadata = {\n", + " ...perishables,\n", + " type: \"object\",\n", + " required: Object.keys(perishables),\n", + " additionalProperties: false,\n", + "};\n", + "\n", + "const origenWithMetadata = {\n", + " ...origen,\n", + " type: \"object\",\n", + " required: Object.keys(origen),\n", + " additionalProperties: false,\n", + "};\n", + "\n", + "\n", + "\n", + "const combinedSchema = {\n", + " type: \"object\",\n", + " $defs: {\n", + " perishables: perishablesWithMetadata,\n", + " origen: origenWithMetadata,\n", + " },\n", + " properties: {\n", + " nombre: { type: \"string\", maxLength: 100 },\n", + " fabricante: { type: \"string\", maxLength: 100 },\n", + "\n", + " // Agregar campo del preset\n", + " perishables: { $ref: \"#/$defs/perishables\" },\n", + " origen: { $ref: \"#/$defs/origen\" },\n", + " },\n", + " required: [\"nombre\", \"fabricante\", \"perishables\", \"origen\"],\n", + " additionalProperties: false,\n", + "};\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "1403c789", + "metadata": {}, + "outputs": [], + "source": [ + "const combinedSchema = {\n", + " type: \"object\",\n", + " $defs: {\n", + " perishables: {\n", + " type: \"object\",\n", + " properties: {\n", + " expiryDate: { type: \"string\", format: \"date\" },\n", + " batchNumber: {\n", + " type: \"string\",\n", + " maxLength: 20,\n", + " description: \"Puede ser inventado\",\n", + " },\n", + " storageTempC: {\n", + " type: \"number\",\n", + " minimum: -30,\n", + " maximum: 10,\n", + " description:\n", + " \"Temperatura de almacenamiento en grados Celsius\",\n", + " },\n", + " },\n", + " required: [\"expiryDate\", \"batchNumber\", \"storageTempC\"],\n", + " additionalProperties: false,\n", + " },\n", + " origen: {\n", + " type: \"object\",\n", + " properties: {\n", + " country: { type: \"string\", maxLength: 50 },\n", + " city: { type: \"string\", maxLength: 50 },\n", + " },\n", + " required: [\"country\", \"city\"],\n", + " additionalProperties: false,\n", + " },\n", + " },\n", + " properties: {\n", + " nombre: { type: \"string\", maxLength: 100 },\n", + " fabricante: { type: \"string\", maxLength: 100 },\n", + "\n", + " // Agregar campo del preset\n", + " perishables: { $ref: \"#/$defs/perishables\" },\n", + " origen: { $ref: \"#/$defs/origen\" },\n", + "\n", + " perecedero: { type: \"null\", \"x-column\": \"perishable\", const: null },\n", + " },\n", + " required: [\"nombre\", \"fabricante\", \"perishables\", \"origen\", \"perecedero\"],\n", + " additionalProperties: false,\n", + "};\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "1fbda124", + "metadata": {}, + "outputs": [], + "source": [ + "const result = await openai.responses.create({\n", + " model: \"gpt-5-nano\",\n", + " input:\n", + " \"Genera un producto con el siguiente formato JSON, sin texto adicional:\",\n", + " text: {\n", + " format: {\n", + " type: \"json_schema\",\n", + " name: \"producto\",\n", + " schema: combinedSchema,\n", + " },\n", + " },\n", + "});\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "85e7967a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " nombre: \u001b[32m\"Galletas de avena premium\"\u001b[39m,\n", + " fabricante: \u001b[32m\"Industrias Gourmet S.L.\"\u001b[39m,\n", + " perishables: {\n", + " expiryDate: \u001b[32m\"2026-12-31\"\u001b[39m,\n", + " batchNumber: \u001b[32m\"BATCH-00123\"\u001b[39m,\n", + " storageTempC: \u001b[33m4\u001b[39m\n", + " },\n", + " origen: { country: \u001b[32m\"España\"\u001b[39m, city: \u001b[32m\"Valencia\"\u001b[39m },\n", + " perecedero: \u001b[1mnull\u001b[22m\n", + "}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "JSON.parse(result.output_text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dae842ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}