Files
genesis-2/notebooks/definitions-openai.ipynb
T

6.4 KiB

import { load } from "jsr:@std/dotenv";
import OpenAI from "jsr:@openai/openai";

const env = await load({
    export: true,
});

const openai = new OpenAI();
const perishables = {
    expiryDate: { type: "string", format: "date" },
    batchNumber: {
        type: "string",
        maxLength: 20,
        description: "Puede ser inventado",
    },
    storageTempC: {
        type: "number",
        minimum: -30,
        maximum: 10,
        description: "Temperatura de almacenamiento en grados Celsius",
    },
};

const origen = {
    country: { type: "string", maxLength: 50 },
    city: { type: "string", maxLength: 50 },
};

// Transformar las definiciones: poner en properties, agregar required, y additionalProperties: false

const perishablesWithMetadata = {
    ...perishables,
    type: "object",
    required: Object.keys(perishables),
    additionalProperties: false,
};

const origenWithMetadata = {
    ...origen,
    type: "object",
    required: Object.keys(origen),
    additionalProperties: false,
};



const combinedSchema = {
    type: "object",
    $defs: {
        perishables: perishablesWithMetadata,
        origen: origenWithMetadata,
    },
    properties: {
        nombre: { type: "string", maxLength: 100 },
        fabricante: { type: "string", maxLength: 100 },

        // Agregar campo del preset
        perishables: { $ref: "#/$defs/perishables" },
        origen: { $ref: "#/$defs/origen" },
    },
    required: ["nombre", "fabricante", "perishables", "origen"],
    additionalProperties: false,
};
const combinedSchema = {
    type: "object",
    $defs: {
        perishables: {
            type: "object",
            properties: {
                expiryDate: { type: "string", format: "date" },
                batchNumber: {
                    type: "string",
                    maxLength: 20,
                    description: "Puede ser inventado",
                },
                storageTempC: {
                    type: "number",
                    minimum: -30,
                    maximum: 10,
                    description:
                        "Temperatura de almacenamiento en grados Celsius",
                },
            },
            required: ["expiryDate", "batchNumber", "storageTempC"],
            additionalProperties: false,
        },
        origen: {
            type: "object",
            properties: {
                country: { type: "string", maxLength: 50 },
                city: { type: "string", maxLength: 50 },
            },
            required: ["country", "city"],
            additionalProperties: false,
        },
    },
    properties: {
        nombre: { type: "string", maxLength: 100 },
        fabricante: { type: "string", maxLength: 100 },

        // Agregar campo del preset
        perishables: { $ref: "#/$defs/perishables" },
        origen: { $ref: "#/$defs/origen" },

        perecedero: { type: "null", "x-column": "perishable", const: null },
    },
    required: ["nombre", "fabricante", "perishables", "origen", "perecedero"],
    additionalProperties: false,
};
const result = await openai.responses.create({
    model: "gpt-5-nano",
    input:
        "Genera un producto con el siguiente formato JSON, sin texto adicional:",
    text: {
        format: {
            type: "json_schema",
            name: "producto",
            schema: combinedSchema,
        },
    },
});
JSON.parse(result.output_text)
{
  nombre: "Galletas de avena premium",
  fabricante: "Industrias Gourmet S.L.",
  perishables: {
    expiryDate: "2026-12-31",
    batchNumber: "BATCH-00123",
    storageTempC: 4
  },
  origen: { country: "España", city: "Valencia" },
  perecedero: null
}