# Formato JSON para Herramientas LLM

## Introducción

Compartir una herramienta de una manera que se pueda agregar rápidamente a un programa o editor de herramientas se mejoraría enormemente con una forma estándar de representar una herramienta y cómo usarla. Queremos habilitar características como las siguientes:

* Un icono para representar visualmente la herramienta
* Metadatos para el aviso:
  * Un nombre para la herramienta
  * Una descripción de la herramienta
  * Notas de uso para la herramienta
* Parámetros de marcador de posición que se incluyen en la cadena de la herramienta
* Salida esperada
* Versiones y marcas de tiempo.

## Especificación de Formato JSON

```json
{
  "version": "cadena de texto o número entero",
  "model_prompt": "cadena de texto con marcadores de posición {{nombre_de_variable}}",
  "metadata": {
    "prompt_name": "cadena de texto",
    "description": "cadena de texto",
    "usage_notes": "cadena de texto",
    "model_version": ["cadena de texto", "cadena de texto", …],
    "creator": {
      "name": "cadena de texto",
      "email": "cadena de texto",
      "organization": "cadena de texto"
    },
    "parameters": {
      "temperature": "número fraccionado",
      "max_tokens": "número entero",
      "top_p": "número fraccionado",
      "frequency_penalty": "número fraccionado",
      "presence_penalty": "número fraccionado"
    },
    "variables": [
      {
        "name": "nombre de la variable 1",
        "type": "texto",
        "description": "cadena de texto",
        "default": "cadena de texto",
      },
      {
        "name": "nombre de la variable 2",
        "type": "selección-única",
        "description": "cadena de texto",
        "default": "valor1",
        "allowed_values": ["valor1", "valor2", "valor3"]
      },
      {
        "name": "nombre de la variable 3",
        "type": "selección-múltiple",
        "description": "cadena de texto",
        "default": ["valor1", "valor2"]
        "allowed_values": ["valor1", "valor2", "valor3"]
      },
      ...
    ],
    "expected_output": {
      "type": "cadena de texto (p. ej., texto, código, limitado)",
      "format": "cadena de texto (opcional, p. ej., JSON, XML, CSV)",
      "language": "cadena de texto (opcional, p. ej., Python, JavaScript)",
      "allowed_values": ["cadena de texto1", "cadena de texto2", ...] (opcional)
    },
    "avatar_type": "cadena de texto (p. ej., url, base64)",
    "avatar": "cadena de texto (URL o imagen codificada en base64), se recomienda 256x256 pixels",
    "timestamp": "cadena de texto (formato ISO 8601)"
  }
}
```

Puedes descargar nuestra muestra JSON [aquí](https://skydeck-public-assets.s3.amazonaws.com/sample_tool.json).

## Descripción de los Campos

* **model\_prompt**: Una cadena que contiene el prompt del modelo GPT.
* **metadata**: Un objeto que contiene información adicional sobre el prompt del modelo GPT, que incluye los siguientes subcampos:
  * **model\_version**: Una cadena que indica la versión del modelo GPT utilizado.
  * **creator**: Un objeto que contiene información sobre el creador del prompt del modelo GPT, con los siguientes subcampos:
    * **name**: Una cadena que representa el nombre del creador.
    * **email**: Una cadena que representa el correo electrónico del creador.
    * **organization**: Una cadena que representa la organización a la que está afiliado el creador.
  * **parameters**: Un objeto que contiene información sobre los parámetros del modelo GPT, con los siguientes subcampos:
    * **temperature**: Un flotante que indica la temperatura utilizada para controlar la aleatoriedad de la salida.
    * **max\_tokens**: Un entero que indica el número máximo de tokens en la respuesta generada.
    * **top\_p**: Un flotante que representa el umbral de probabilidad de muestreo del núcleo.
    * **frequency\_penalty**: Un flotante que representa la penalización aplicada a los tokens en función de su frecuencia en el conjunto de datos.
    * **presence\_penalty**: Un flotante que representa la penalización aplicada a los nuevos tokens basada en su presencia en el prompt.
  * **timestamp**: Una cadena en formato ISO 8601 que representa la fecha y la hora en que se creó o modificó por última vez el prompt del modelo GPT.
  * **expected\_output (Opcional)**: Un objeto que contiene campos relacionados con la salida esperada del model\_prompt, incluyendo los siguientes subcampos:
    * **type**: Una cadena que indica el tipo de salida esperada del model\_prompt.
    * **format (Opcional)**: Una cadena que representa el formato de la salida esperada si es aplicable.
    * **language (Opcional)**: Una cadena que representa el lenguaje de programación de la salida esperada si el tipo es `code`.
    * **allowed\_values (Opcional)**: Un array de cadenas que contiene una lista de valores de salida permitidos si el tipo es `limited`.
  * **variables (Opcional)**: Una lista que contiene variables que podrían insertarse en la cadena `model_prompt` en un estilo de f-string. Cada variable contiene los siguientes subcampos:
    * **name**: Una cadena que representa el nombre de la variable.
    * **type**: Una cadena que muestra el tipo de variable. Actualmente los valores posibles de `type` son `text` para la variable por defecto, y `single-select` o `multi-select` para las variables de selección.
    * **description**: Una cadena que muestra la descripción de la variable, incluyendo usos y ejemplos.
    * **default**: Un valor que muestra el valor por defecto de la variable. Este valor es una cadena si `type` es `text` o `single-select`, y un array de cadenas para `multi-select`.
    * **allowed\_values**: Un array de cadenas que contiene una lista de valores permitidos si el tipo de variable es `single-select` o `multi-select`.
  * **avatar (Opcional)**: Un objeto que contiene campos relacionados con la imagen gráfica que actúa como avatar o icono para el prompt, que incluye los siguientes subcampos:
    * **avatar\_type**: Una cadena que especifica el tipo de datos del avatar incluido.
    * **avatar**: Una cadena que contiene el URL que apunta a la imagen si el avatar\_type es `url`, o una cadena codificada en base64 que representa la imagen si el avatar\_type es `base64`.
  * **prompt\_name (Opcional)**: Una cadena que representa el nombre del prompt.
  * **description (Opcional)**: Una cadena que proporciona una breve descripción de la herramienta y su propósito.
  * **usage\_notes (Opcional)**: Una cadena que contiene notas de formato libre del creador sobre el uso o cualquier consideración específica relacionada con la herramienta.

Para especificar el formato de la salida esperada del model\_prompt, puedes agregar un objeto `expected_output` dentro del objeto `metadata`. Dependiendo del tipo de salida esperada, puedes incluir los subcampos relevantes en el objeto `expected_output`.

Para incluir campos para variables que podrían insertarse en la cadena `model_prompt` en un estilo de f-string, puedes agregar una lista `variables` separada dentro del objeto `metadata`.

Para incluir una imagen gráfica que actúa como avatar o icono para el prompt, puedes agregar un campo `avatar` dentro del objeto `metadata`.

Incluir los campos `expected_output`, `variables`, `avatar`, `prompt_name`, `description`, y `usage_notes` dentro del objeto `metadata` ayuda a mantener toda la información contextual sobre el prompt en un solo lugar, lo que facilita su gestión y comprensión.

Puedes usar el campo `version` en el nivel superior del objeto JSON para rastrear explícitamente la versión de todo el archivo JSON.
