# 스마트 도구를 위한 JSON 형식

## 전체적으로 <a href="#lgmg27qgfdrg" id="lgmg27qgfdrg"></a>

SkyDeck.AI에서 스마트 도구를 생성하려면 파일 구조 섹션에 언급된 사양에 따라 파일 세트를 업로드해야 합니다. 업로드가 완료되면, 플랫폼이 초기 설정을 수행하며, 이 작업은 몇 분 정도 걸릴 수 있습니다. 이후에 도구는 GenStudio 워크스페이스에서 사용할 수 있게 됩니다.

## 파일 구조 <a href="#id-7dcm0ac78x60" id="id-7dcm0ac78x60"></a>

### \<tool\_name>.json <a href="#xvdq6eic1eed" id="xvdq6eic1eed"></a>

도구의 동작은 JSON 파일을 통해 구성됩니다. 다음은 구성의 주요 필드에 대한 간략한 개요입니다:

* **version**: 도구의 현재 버전입니다.
* **tool\_name**: 도구의 이름입니다. 이 이름은 여러분의 작업 공간에서 유일해야 합니다.
* **tool\_code**: 실행할 Python 코드가 포함되어 있습니다. 이 필드에 대한 자세한 내용은 다음 섹션에서 다룰 것입니다.
* **description**: 도구가 하는 일에 대한 간략한 설명입니다.
* **usage\_notes**: 도구 사용 방법에 대한 지시사항입니다.
* **model\_version**: 후속 질문에 사용할 수 있는 모델을 지정합니다. 모든 모델을 지정하려면 \_\["gpt-4", "gpt-3.5", "claude", "chat-bison"]\_를 사용합니다.
* **creator**: 도구 제작자에 대한 정보가 포함되어 있습니다. 이름, 이메일, 조직 등이 포함됩니다.
* **variables**: 도구에서 사용하는 변수의 배열입니다. 각 변수는 이름, 설명, 기본 값이 있습니다. UI에서 변수의 순서는 이 배열의 순서를 따릅니다.
* **expected\_output**: 도구가 생성하는 출력 유형입니다. 개발 단계에서는 값이 항상 텍스트여야 합니다.
* **avatar\_type**: 도구 UI에서 사용되는 아바타의 형식입니다.
* **timestamp**: 도구가 마지막으로 업데이트된 날짜와 시간입니다.
* **requirements**: tool\_code의 스크립트를 실행하기 위해 필요한 패키지를 지정합니다.
* **avatar**: 이 도구의 로고를 나타내는 문자열입니다

### tool\_code 규칙: <a href="#id-177qobv2sfe9" id="id-177qobv2sfe9"></a>

이 스크립트는 도구의 작동 방식을 개요화합니다. 이 스크립트의 주요 구성 요소는 다음 요구 사항을 가진 *execute* 함수입니다:

* 함수는 *variables* 라는 단일 입력 파라미터를 가져야 합니다. 이것은 딕셔너리입니다. 이 딕셔너리의 각 키는 사용자가 도구에 입력하려는 필드에 해당합니다.
* 함수는 문자열을 반환해야 하며, 이는 GenStudio UI에서 응답으로 표시됩니다.

## 예제 도구 <a href="#h9o86a5lgfut" id="h9o86a5lgfut"></a>

### DALL-E 2를 사용한 이미지 생성 <a href="#quzi31gwxka6" id="quzi31gwxka6"></a>

**설명:**

이 도구는 이미지 설명을 입력으로 받아 이미지에 해당하는 URL을 생성합니다. 출력에는 URL과 만료 주의사항이 포함됩니다. 이 도구는 쿼리를 OpenAI DALL-E API에 전송하고 응답을 받아오는 방식으로 작동합니다.

**입력:**

* 설명: 이미지 설명, 예: "하얀 털이 가득한 고양이"

**출력:**

* 생성된 이미지 URL과 만료 주의사항이 포함된 메시지

#### 파이썬 스크립트 (image\_generation.json 내의 필드가 될 것):

```python
import openai
def execute(변수들):
    openai.api_key = '<사용자 API 키>'
    description = 변수들['설명']
    response = openai.Image.create(
        prompt=description,
        n=1,
        size="1024x1024"
    )
    image_url = response['data'][0]['url']
    return f"당신의 이미지 링크는 다음과 같습니다:{image_url}. 링크는 1시간 후에 만료됩니다."
```

#### image\_generation.json <a href="#id-4q3mtb2zf8gt" id="id-4q3mtb2zf8gt"></a>

```json
{
    "version": "0.1",
    "metadata": {
        "tool_name": "이미지 생성",
        "tool_code": "import openai\n\ndef execute(variables):\n openai.api_key = ''\n description = variables['Description']\n response = openai.Image.create(\n prompt=description,\n n=1,\n size=\"1024x1024\"\n )\n\n image_url = response['data'][0]['url']\n return f\"Here is the link to your image:{image_url}. The link will be expired in 1 hour.\"\n",
        "description": "OpenAI의 DALL-E 모델을 바탕으로 설명에 따른 이미지를 생성합니다.",
        "usage_notes": "상세한 이미지를 묘사하고 그것을 설명 필드에 넣어주세요. 이미지의 URL이 반환됩니다. URL의 유효기간은 약 1시간이므로 만료되기 전에 다운로드하는 것을 잊지 마십시오",
        "model_version": ["gpt-3.5","gpt-3.5-turbo", "gpt-4", "claude"],
        "creator": {
            "name": "SkyDeck AI",
            "email": "skydeck@eastagile.com",
            "organization": "East Agile"
        },
        "variables": [
            {
                "name": "Description",
                "description": "이미지 설명",
                "default": "하얀색 시암 고양이"
            }
        ],
        "expected_output": {
            "type": "text"
        },
        "avatar_type": "base64",
        "timestamp": "2023-05-23T10:00:00Z",
        "requirements": "openai>=0.27.4",
        "avatar": ""
    }
}
```

### Open-Meteo API를 사용한 실시간 날씨 보고서 <a href="#yhjv7lbl4mu0" id="yhjv7lbl4mu0"></a>

**설명**:

이 도구는 Open-Meteo API를 활용하여 사용자의 질문에 따르는 실시간 날씨 정보를 제공합니다. 온도, 강수량, 바람 상황 등에 대한 질문을 통해, 이 도구는 가장 관련성이 높고 최신의 데이터를 검색합니다.

이 도구의 작동은 LangChain 라이브러리의 APIChain 기능에 의존하여 Open-Meteo API 문서를 접근합니다. 이를 통해 도구가 올바른 API 호출을 어떻게 만드는지 학습하고 필요한 정보를 원활하게 가져올 수 있습니다.

**입력**:

* 질문: 날씨에 관한 구체적인 질문을 하십시오. 예: "현재 뉴욕시의 온도는 얼마인가요?"

**출력**:

* 요청된 날씨 정보를 제공하는 응답.

#### Python 스크립트 (weather\_reporter.json 내의 필드가 될 것입니다): <a href="#qw9m9923kptk" id="qw9m9923kptk"></a>

```python
from langchain.chains.api import open_meteo_docs
from langchain.chat_models import ChatOpenAI
from langchain.chains import APIChain
def execute(variables):
    question = variables['Question']
    llm = ChatOpenAI(
        model_name='gpt-3.5-turbo',
        openai_api_key='<사용자 API 키>'
    )
    api_chain = APIChain.from_llm_and_api_docs(
        llm, open_meteo_docs.OPEN_METEO_DOCS, verbose=False
    )
    result = api_chain.run(question)
    return result
```

#### weather\_reporter.json <a href="#bgnhw14oi99h" id="bgnhw14oi99h"></a>

```json
{
  "version": "0.1",
  "metadata": {
    "tool_name": "날씨 보고서",
    "tool_code": "from langchain.chains.api import open_meteo_docs\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.chains import APIChain\n\n\ndef execute(variables):\n question = variables['Question']\n llm = ChatOpenAI(model_name='gpt-3.5-turbo',\n openai_api_key='')\n api_chain = APIChain.from_llm_and_api_docs(\n llm, open_meteo_docs.OPEN_METEO_DOCS, verbose=False)\n result = api_chain.run(question)\n return result\n",
    "description": "Open-Meteo API를 활용하여 실시간 날씨 정보를 가져옵니다",
    "usage_notes": "제공된 필드에 날씨 관련 질문을 입력하세요",
    "model_version": ["gpt-3.5", "gpt-3.5-turbo", "gpt-4", "claude"],
    "creator": {
      "name": "SkyDeck AI",
      "email": "skydeck@eastagile.com",
      "organization": "East Agile"
    },
    "variables": [
      {
        "name": "Question",
        "description": "날씨 조건에 대해 문의하십시오",
        "default": "성화단위로 표현된 독일 뮌헨의 현재 기온은 어떻게 되나요?"
      }
    ],
    "expected_output": {
      "type": "text"
    },
    "avatar_type": "base64",
    "timestamp": "2023-07-13T10:00:00Z",
    "requirements": "openai>=0.27.4\nlangchain>=0.0.229",
    "avatar": ""
  }
}
```

## 제한 사항 <a href="#g32lfwd6xlxx" id="g32lfwd6xlxx"></a>

AWS Lambda는 기능을 최대 15분 동안, 10GB의 RAM으로 실행할 수 있습니다. 따라서 도구는 이 제약 조건 내에서 실행을 완료해야 합니다.
