【GPTs Actions】GPTsの外部API連携方法

# 目的
昨今話題のGPTs、皆さんは触ってみたでしょうか。
GPTをカスタマイズできるこの機能ですが、あらかじめGPTに何をやらせたいか程度の指示を与えるだけではその魅力の数パーセントしか引き出せていません。
その程度であれば無印のGPTでも賄えますからね。

今回はGPTsの魅力を一気に加速させる外部APIとの連携方法の手順をまとめました。
原理原則というよりかはサクッと動くものを作ることに重心を置いています。

今回はQiitaから自身の投稿記事を取得するGPTsを作っていきます。

# 環境
- GPT4
言わずもがなGPTsを使うのに有料版が必要になります。
- https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems
今回たたくAPIになります。
自身の投稿記事を取得するものになります。

※あらかじめアカウントと個人用アクセストークンの作成までしておいてください。↓
https://qiita.com/settings/applications
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/29c2af17-da6e-650a-bd98-0a5648ae2ee6.png)


# 手順
ではサクッとやっていきます。

### GPTsの基本を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/e51ff589-dd9b-9d27-735f-1a45677a12cf.png)

| 項目 | 内容 |
|:-:|:-:|
| Name | Qiitaの記事ゲッター |
| Description | あなたのQiitaの記事を取得します |
| Instructions | Qiitaから記事を1つ取得してください |
| Conversation starters | 記事を取得 |

Knowledge, Capabilities は今回は無しにします。

### Actionsを設定
さて、本日メインのActionsになります。
公式ドキュメントはこちら → https://platform.openai.com/docs/actions/introduction

GPTsの画面の **Actions > Create new action** から設定画面へ遷移してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/802e4266-0655-8805-32cd-87b82e91a34a.png)

下記項目の設定ができる画面が表示されます。
| 項目 | 内容 |
|:-:|:-:|
| 認証 | APIの認証方法（None, API Key,OAuth）|
| スキーマ | API用のOpenAPI仕様を定義 |
| プライバシーポリシー | GPTsを使う人に向けてのプライバシーポリシー |

※プライバシーポリシーについてはGPTsを公開する場合のみ必要になるので、今回は割愛します。
必要な方はGoogle Sitesとかでサクッと作りましょう。
[参考:プライバシーポリシー](https://qiita.com/ishitoki47259/items/842c801a3c7b12b53c28#4-google-sites%E3%81%AB%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B)

###### 認証
**Authentication**が「None」となっているので、
あらかじめ作っておいたOpenWeatherのAPI Keyを設定します。
Qiitaの認証認可はBearerを使用します。
https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/881fef96-3dab-eed8-ca71-b7fe16775151.png)

###### Schema
ここでは、どのAPIをどのようなパラメータを含めて実行するか、そしてどのようなレスポンスを期待するかの定義が必要になります。

認証ユーザーの記事を取得するAPIの呼び出し方法は以下になります。
https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems
```bash
https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20
```

しかし、公式ドキュメントを見て手作業で定義していくにはあまりにも面倒な作業になります。
こんな時こそGPTsの手を借りましょう。
API用のOpenAPI仕様を定義するGPTsが公式から提供されています。

https://chat.openai.com/g/g-TYEliDU6A-actionsgpt

このGPTsに以下のプロンプトを投げてみてください。
```
このAPI用のOpenAPI仕様3.1を定義してください
OpenAPI 3.1.0を使用してください
https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20
```

そうするとGPTsからymlファイルが提供されるかと思います。
私の場合は以下になりました。
```yml
openapi: 3.1.0
info:
  title: Qiita API
  description: Qiitaの認証済みユーザーの投稿を取得するAPI。
  version: 1.0.0
servers:
  - url: https://qiita.com/api/v2
    description: Qiita API サーバ
paths:
  /authenticated_user/items:
    get:
      operationId: getAuthenticatedUserItems
      summary:、 認証済みユーザーの投稿を取得
      description: 認証済みユーザーの投稿リストをページネーションで取得します。
      parameters:
        - in: query
          name: page
          required: false
          description: ページ番号
          schema:
            type: integer
            default: 1
        - in: query
          name: per_page
          required: false
          description: 1ページあたりのアイテム数
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: 成功時のレスポンス
          content:
            application/json:
              schema: 
                type: array
                items: 
                  type: object
                  properties:
                    id:
                      type: string
                      description: 投稿のID
                    title:
                      type: string
                      description: 投稿のタイトル
                    created_at:
                      type: string
                      format: date-time
                      description: 作成日時
                    updated_at:
                      type: string
                      format: date-time
                      description: 更新日時

```

それを**Schema**に張り付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/beb240f1-e4b9-d0ed-33cf-7b434299df70.png)

構文にエラーがなければ**Available actions**に定義したAPIが表示されるはずです。

では、実際に動作を見てみましょう。
初めて実行する場合、リクエスト先のサイトの信頼の有無を問われます。
こちらはAllow、もしくはAlways Allowを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/11d67c51-8d87-384f-ac49-d8cbf88fbd1b.png)

無事取得できましたね。
ちなみに **[debug] Calling HTTP endpoint** や **[debug] Response received**を開くとリクエストやレスポンスの内容が見れますので、実際に動作しているか確認もしやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/623fb542-7558-2ee0-1ab7-ff0179fbe48d.png)

# まとめ
以上、GPTsで外部APIと連携する方法でした。
認証方法がOAuthとかになると、また設定がややこしくなりので、そこらへんも次回まとめようと思います。

これからの時代は生成系AIをいかに使いこなせるかが重要になってくるため、試行錯誤が楽しみですね。