{ "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": null, "id": "1403c789", "metadata": {}, "outputs": [], "source": [ "import { title } from \"node:process\";\n", "\n", "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: {\n", " $ref: \"#/$defs/perishables\",\n", " \"x-column\": \"perishables\",\n", " },\n", "\n", " origen: { $ref: \"#/$defs/origen\" },\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 }