# LLM 도구를 위한 JSON 형식

## 소개

프로그램이나 툴 편집기에 빠르게 추가할 수 있는 방식으로 도구를 공유하는 것은 도구를 표현하고 사용하는 방법에 대한 표준 방식이 있다면 크게 향상될 것입니다. 우리는 다음과 같은 기능을 가능하게 하고 싶습니다:

* 도구를 시각적으로 나타내는 아이콘
* 프롬프트를 위한 메타 데이터:
  * 도구의 이름
  * 도구에 대한 설명
  * 도구 사용법에 대한 참고 사항
* 도구 문자열에 포함된 플레이스홀더 매개변수
* 예상 출력
* 버전 및 타임스탬프.

## JSON 형식 규격

```json
{
  "version": "문자열 또는 정수",
  "model_prompt": "{{변수_이름}} 플레이스홀더가 있는 문자열",
  "metadata": {
    "prompt_name": "문자열",
    "description": "문자열",
    "usage_notes": "문자열",
    "model_version": ["문자열", "문자열", …],
    "creator": {
      "name": "문자열",
      "email": "문자열",
      "organization": "문자열"
    },
    "parameters": {
      "temperature": "실수",
      "max_tokens": "정수",
      "top_p": "실수",
      "frequency_penalty": "실수",
      "presence_penalty": "실수"
    },
    "variables": [
      {
        "name": "변수 이름 1",
        "type": "텍스트",
        "description": "문자열",
        "default": "문자열",
      },
      {
        "name": "변수 이름 2",
        "type": "단일 선택",
        "description": "문자열",
        "default": "값1",
        "allowed_values": ["값1", "값2", "값3"]
      },
      {
        "name": "변수 이름 3",
        "type": "다중 선택",
        "description": "문자열",
        "default": ["값1", "값2"]
        "allowed_values": ["값1", "값2", "값3"]
      },
      ...
    ],
    "expected_output": {
      "type": "문자열 (예: 텍스트, 코드, 제한)",
      "format": "문자열 (선택, 예: JSON, XML, CSV)",
      "language": "문자열 (선택, 예: Python, JavaScript)",
      "allowed_values": ["문자열1", "문자열2", ...] (선택)
    },
    "avatar_type": "문자열 (예: url, base64)",
    "avatar": "문자열 (URL 또는 base64 인코딩된 이미지), 권장 해상도 256x256 픽셀",
    "timestamp": "문자열 (ISO 8601 형식)"
  }
}
```

우리의 샘플 JSON은 [여기](https://skydeck-public-assets.s3.amazonaws.com/sample_tool.json)에서 다운로드 받으실 수 있습니다.

## 필드 설명

* **model\_prompt**: GPT 모델 프롬프트가 포함된 문자열입니다.
* **metadata**: GPT 모델 프롬프트에 대한 추가 정보를 포함하는 객체입니다. 다음과 같은 하위 필드가 있습니다:
  * **model\_version**: 사용된 GPT 모델의 버전을 나타내는 문자열입니다.
  * **creator**: GPT 모델 프롬프트의 창시자에 대한 정보를 포함하는 객체로, 다음과 같은 하위 필드들을 가지고 있습니다:
    * **name**: 창시자의 이름을 나타내는 문자열입니다.
    * **email**: 창시자의 이메일을 나타내는 문자열입니다.
    * **organization**: 창시자가 속한 조직을 나타내는 문자열입니다.
  * **parameters**: GPT 모델 파라미터에 대한 정보를 포함하는 객체로, 다음과 같은 하위 필드들을 가지고 있습니다:
    * **temperature**: 출력물의 무작위성을 제어하기 위해 사용된 온도를 나타내는 실수입니다.
    * **max\_tokens**: 생성된 응답에서 토큰의 최대 수를 나타내는 정수입니다.
    * **top\_p**: 핵심 샘플링 확률 임계값을 나타내는 실수입니다.
    * **frequency\_penalty**: 데이터셋에서의 토큰 빈도에 기반한 토큰에 적용되는 패널티를 나타내는 실수입니다.
    * **presence\_penalty**: 프롬프트에서의 새 토큰의 존재에 기반한 토큰에 적용되는 패널티를 나타내는 실수입니다.
  * **timestamp**: GPT 모델 프롬프트가 생성되거나 마지막으로 수정된 날짜와 시간을 나타내는 ISO 8601 형식의 문자열입니다.
  * **expected\_output (선택 사항)**: `model_prompt`에서 기대되는 출력과 관련된 필드를 포함하는 객체로, 다음과 같은 하위 필드를 포함합니다:
    * **type**: `model_prompt`에서 기대되는 출력의 타입을 나타내는 문자열입니다.
    * **format (선택 사항)**: 해당되는 경우 기대되는 출력의 형식을 나타내는 문자열입니다.
    * **language (선택 사항)**: 타입이 `code`인 경우 기대되는 출력의 프로그래밍 언어를 나타내는 문자열입니다.
    * **allowed\_values (선택 사항)**: 타입이 `limited`인 경우 허용되는 출력값의 목록을 포함하는 문자열 배열입니다.
  * **variables (선택 사항)**: f-string 스타일로 `model_prompt` 문자열에 삽입될 수 있는 변수가 포함된 목록입니다. 각 변수는 다음과 같은 하위 필드를 포함합니다:
    * **name**: 변수 이름을 나타내는 문자열입니다.
    * **type**: 변수의 타입을 나타내는 문자열입니다. 현재 `type`의 가능한 값은 기본 변수용 `text`와 선택 변수용 `single-select` 또는 `multi-select`입니다.
    * **description**: 변수의 설명을 나타내는 문자열로, 사용법과 예시를 포함합니다.
    * **default**: 변수의 기본 값을 나타내는 값입니다. 이 값은 `type`이 `text` 또는 `single-select`인 경우 문자열이고, `multi-select`인 경우 문자열 배열입니다.
    * **allowed\_values**: 변수 타입이 `single-select` 또는 `multi-select`인 경우 허용된 값의 목록을 포함하는 문자열 배열입니다.
  * **avatar (선택 사항)**: 프롬프트의 아바타나 아이콘 역할을 하는 그래픽 이미지와 관련된 필드를 포함하는 객체입니다. 다음과 같은 하위 필드들이 있습니다:
    * **avatar\_type**: 아바타 데이터의 타입을 지정하는 문자열입니다.
    * **avatar**: \`avatar\_type\`이 URL인 경우 이미지를 가리키는 URL을 포함하는 문자열이거나, \`avatar\_type\`이 base64인 경우 이미지를 나타내는 base64로 인코딩된 문자열입니다.
  * **prompt\_name (선택 사항)**: 프롬프트의 이름을 나타내는 문자열입니다.
  * **description (선택 사항)**: 도구와 그 목적에 대한 간략한 설명을 제공하는 문자열입니다.
  * **usage\_notes (선택 사항)**: 도구 사용에 있어서 창작자가 제공하는 자유 형식의 노트나 특정 고려사항들을 포함하는 문자열입니다.

`model_prompt`에서 기대되는 출력의 형식을 지정하려면 `metadata` 객체 내에 `expected_output` 객체를 추가할 수 있습니다. 기대되는 출력의 타입에 따라 `expected_output` 객체에 관련 하위 필드를 포함할 수 있습니다.

f-string 스타일로 `model_prompt` 문자열에 삽입될 수 있는 변수 필드를 포함시키려면 `metadata` 객체 내에 별도의 `variables` 목록을 추가할 수 있습니다.

프롬프트 이력에 대한 아바타나 아이콘이 될 그래픽 이미지를 포함시키려면 `metadata` 객체 내에 `avatar` 필드를 추가할 수 있습니다.

`expected_output` , `variables`, `avatar`, `prompt_name`, `description`, 그리고 `usage_notes` 필드들을 `metadata` 객체 내에 포함시키면 프롬프트에 대한 모든 맥락 정보를 한 곳에 모아 관리하고 이해하는 데 도움이 됩니다.

JSON 객체의 최상위 레벨에 `version` 필드를 사용하여 전체 JSON 파일의 버전을 명시적으로 추적할 수 있습니다
