「ねこGPT」GPTsのActionsを理解して、外部APIをコールする

GPTsのActionsを使って、カスタムアクションを定義して、外部APIをコールできるようになるまでのハウツーです。

[公式のActionsのドキュメント](https://platform.openai.com/docs/actions
)を読んでもいまいちピンと来なかったので、CAAS(Cats as a Service)こと、[The Cat API](https://thecatapi.com/)からねこ画像を取得してアンサーしてくれるGPTsを実装してみました。完成したサンプルは[こちら](https://chat.openai.com/g/g-rJmOTXDdz-nekogpt
)から。

https://chat.openai.com/g/g-rJmOTXDdz-nekogpt

![スクリーンショット 2023-11-11 21.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/8e72c36b-6164-663c-e19f-3c40d0d8c57a.png)


# The Cat API
まずはThe Cat APIの利用方法です。サンプルでは、以下のエンドポイントをGPTsからコールしてねこ画像を取得します。

### ランダムでねこ画像を取得する
`https://api.thecatapi.com/v1/images/search?breed_ids=beng`
 breed_idsで品種、猫種？を指定できます。bengはベンガルネコです。
 
### 猫種の一覧を取得する
 `https://api.thecatapi.com/v1/breeds`
Abyssinian - abys
Aegean - aege
American Bobtail - abob .... など

# GPTs

左側のメニューバーから「Explore」->「Create a GPT」をクリックして、GPTSの編集画面に入ります。

「ねこ画像を表示するねこねこGPTを作成します。」とします。ここは何でも構いません。入力内容に合わせて基本設定と、プロフィール画像のアイコンを生成してもらいます。

![スクリーンショット 2023-11-11 22.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/8c64b1bc-9f83-39f7-f6c0-09d71ed2fa03.png)

「Configure」に切り替えて、手動で設定していきます。既に多くの部分が、自動的に入力されているはずです。

![スクリーンショット 2023-11-11 22.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/14ee1442-aa72-19a8-f85b-725b8283829e.png)

さて、いくつかの変更を行います。`Instructions`には、期待する動作内容を記述します。ここでは、説明のため極力シンプルに以下のようにします。

|ねこGPTはユーザーが「ねこ画像を見せて」とリクエストした際に、api.thecatapi.comを使用して「/v1/images/search」エンドポイントからランダムなねこ画像を取得して提供します。|
|:-|

ここでは、APIから取得したデータだけを利用したいので、`Web Browsing`、`DALL·E` `Image Generation`、`Code Interpreter`はオフにしておきます。

![スクリーンショット 2023-11-11 22.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/849d6100-bf8b-b0c4-e62f-bdbfe421bd36.png)


`Actions`から「Add Actions」をクリック。

右上の「Example」から「Get wether data」をクリック。これ自体はダミーのAPIであり動作しませんが、記述方法は参考になります。

それではCat APIからデータを取得するために、Schemaを以下に置き換えてください。

``` JSON
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get cat images",
    "description": "Retrieves cat images.",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://api.thecatapi.com"
    }
  ],
  "paths": {
    "/v1/images/search": {
      "get": {
        "description": "Get ther url of random cat image.",
        "operationId": "GetRandomCat",
        "parameters": [
          {
            "name": "breed_ids",
            "in": "query",
            "description": "Used to filter cat based on their bleed. For example, ?breed_ids=beng will return bengal cat.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}
```
descriptionの内容にしたがって（＝ここでは、ねこ画像が必要な場合）、AIは外部のAPI`https://api.thecatapi.com/v1/images/search`を呼び出します。

また、the cat apiは以下のように猫種の指定をすることもできました。`https://api.thecatapi.com/v1/images/search?breed_ids=beng`
ここでは`breed_ids`をparametersとして設定しています。`required`がfalseになっているので、このパラメーターは必須ではなく、AIがAPIのリクエストにパラメーターを付加するかどうかを判断します。つまり、ユーザーが特定の猫種について知りたい（とAIが判断した）場合、AIはbreed_idsを指定してAPIリクエストを行います。


それでは、最後に`Privacy Policy`には以下のURLを記述します。

```
https://thecatapi.com/terms
```

![スクリーンショット 2023-11-11 22.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/9fa16020-a4f7-84ff-84ca-716a37d48a0e.png)

以上で、設定は完了です。

# ねこの画像を見せて！
画面右側のプレビューから「ベンガルネコの画像をみせて！」とお願いしてみましょう。

「このサイトを信頼しますか？（Some info will be sent to api.thecatapi.com, only do this for sites you trust）」と聞かれるので、「Allow」をクリックして許諾

![スクリーンショット 2023-11-11 22.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/60c6c134-3110-7372-862e-c9bd7af78880.png)

ベンガルネコの画像、表示されたでしょうか？

`Talked to api.thecatapi.com`という文字をクリックすると、bengというパラメーターがAIにより設定されて、データ取得が行われたことがわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/05c2ccbb-d9bd-06b5-529d-3579045aedf6.png" width="60%"> 

ここでは設定していませんが、breed_idsはエンドポイント `https://api.thecatapi.com/v1/breeds`から取得できます。schemaを変更して、こちらもAIから呼び出しできるようにしてあげると、AIにとってできることが広がっていきます。

それでは、楽しいねこライフをお送りくださいね！


![スクリーンショット 2023-11-11 22.49.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661777/9cf22429-1760-3245-05a8-e41428f10cfe.png)