
GPTsのカスタムGPTをActionsで外部APIを呼び出す
前回の記事でカスタムGPTsを作りましたが、外部API連携のActionsのところをもうちょっと深掘りしていこうかと思います。
前回作りかけだったカスタムGPTが、Explore > My GPTs > Untitled で保存されている。
そこから Untitled > Edit > Configure > Actions > api.esa.io が登録されているはずだ。
import from URLに下記のOpenAPI Schemaを登録した状態だ。
- https://raw.githubusercontent.com/suin/esa-openapi/main/esa-api.json
前回はここでActionsの実行を試みたものの、Authenticationの設定をしていなかったので認証エラーになってしまった。
前回はここまで。
Actionsに登録したAPIに認証情報を付加する
今回はそれに続けて認証情報を設定していこうと思う。
ここら辺の説明はOpenAIの公式資料ではさっぱり分からない。ドキュメントは準備できなかったので、ハックしたい人はハックすれば良いじゃないと言うスタンスなんだろう。
私はPluginもFunction Callingもひと通り触っているので何となくイメージはついているんだが、公式ドキュメントが不十分な中で、非エンジニアの友人にそれなりに説明をしてあげたい。
色々調べたりChatGPTに聞いていたりしたが、一筋縄では行かなかった。
もうこうなったら、より詳しい何かに聞くしかない!!
とういわけで、GPTsに特化したカスタムGPTに聞いてみることを思いついた。
その名も「Custom GPT Creator」!!
こいつはきっとやってくれるはずだ!!
これを提供してくださった方に感謝しつつ、早速いろいろ聞いてみる。
聞いた結果はこちらにまとまっている。
提供者の名前がOpenAI公式ではなく、なんか見覚えある名前だけど、それはまあ良しとしよう。
単純な質問では確認したいことに辿り着かなかったので、細かいやりとりは上記の見てもらいつつ、この記事にはざっくりとまとめようと思う。
Authentcation TypeのAPI KeyとOAuth
どちらを使っても実現できるのだが、連携先のサービス(今回の例ではesa.io)によって対応状況が違う場合があるので都度確認してほしい。
それぞれのTypeの違いをざっくりとまとめると下記の通り。
None: ログインやユーザの識別が不要でAPIなどが一般公開されてる場合はこちらを選択
API Key: 一般公開せずに自分だけで楽しむ場合(Only me)の設定や、そのアカウントで見られて困るものがない場合はこちらを選択
OAuth: サービス運営者などで、Client Secretなどを発行でき、ログインユーザごとに表示を変えてあげたい場合はこちらを選択
とりあえずNoneでやって、ダメならAPI Keyを使用しよう。OAuthは理解してないなら選択しない方が良い。
API KeyでChatGPTと外部サービスを連携してみる
サービス連携したChatGPTを手っ取り早く試したいなら、まずは簡単に自分だけの利用に向いているAPI KeyでカスタムGPTを設定するのがおすすめだ。
さっそくChatGPTのConfigureで設定したいところだが、連携先の方も準備が必要なのでそちらから始める。
連携先サービス(esa.io)でアクセストークンを発行
いきなりアクセストークンとは何ぞやと思うかもしれないが、API Key = アクセストークン である。
アクセスするためのトークン(ワンタイムパスワード)であり、APIにアクセスするための鍵のことだ。
esa.ioでは下記URLから発行できることがesa.ioの公式API仕様に記載されている。
https://[team].esa.io/user/applications
チーム名がnajimino-software-engineerだとすると、アクセストークンを発行できるURLは下記のようになる。
https://najimino-software-engineer.esa.io/user/applications
アクセスすると下記のような画面になる。

Personal access tokens の Generate new tokenボタンからアクセストークンを発行できる。
ボタンを押すと下記のようなダイアログにフォームが表示される。
New personal access token
Token description: 発行するアクセストークンの説明として、何に使うかメモしておくと良い
Select scopes: そのトークンの権限。両方チェックすると発行するトークンを使って読み書きができるようになる
Read: 読込権限
Write: 書込権限

Saveボタンでアクセストークンが発行される。XXXXXXX-XXX_XXXXX_-XXXXXXXXXXXXXXXXXXXXXXXXと記載されている箇所にアクセストークンが表示される。

Read Delete
Make sure to copy your new personal access token now. You won't be able to see it again!
XXXXXXX-XXX_XXXXX_-XXXXXXXXXXXXXXXXXXXXXXXX
マスクをしているので上記のままでは使用できない
発行されたアクセストークンをカスタムGPTのAPI Keyに入力して保存
ChatGPTの連携したいサービスの設定画面に戻ろう。
Explore > My GPTs > Untitled > Edit > Configure > Actions > api.esa.io > Authentication > Edit
下記画面が開くので、それぞれ下記を選択してSaveで保存しよう。
Authentication Type: API Key
API Key: 連携先サービス(esa.io)で発行されたアクセストークンを入力
Auth Type: Bearer

API Key認証で自分の情報が表示できる
さっそくPreviewに移って質問をしてみよう。
ログインしているユーザ情報を表示して。

個人情報まで含まれるのでこのままカスタムGPTを公開するのは良くない。
すばらしい!
ちゃんとUntitledのすぐ下にTalked to api.esa.ioとあるので正しく取得できたようだ!
もうひとつ試してみよう。
チームの一覧を表示するgetTeams APIを使うと所属しているチームの一覧が表示できる。
これが表示できるか試してみよう。
チームの一覧を表示して

1. najimino-software-engineer
- プライバシー設定: 閉じられた
- 説明: (説明なし)
- アイコン: 画像
- URL: najimino-software-engineer.esa.io
※この結果は都合により結果を一部削除しています
どうやらうまくいったようだ。
設定自体はこれで合っていそうだということがわかった。
うまくいかなかったこともチラホラ
ちなみに前回の記事でチャレンジしていた公式ドキュメントdocs.esa.ioの公開記事を見れるか確認したかったんですが、これはできなかった。
おそらく公開ドキュメントをAPI経由で取得することはesa.ioでは想定しておらず、自身が所属するチーム以外のデータは取得できないのだろう。
これはおそらく仕様。

1. Najimino Software Engineer (najimino-software-engineer) - ソフトウェアエンジニアリングに関するクローズドチーム。
これらのチームのいずれかの投稿一覧を取得したい場合は、そのチーム名をお知らせください。
しかしその他のAPIを色々試してみたものの、どれもこれもうまくいきませんでした。しかもChatGPTのレスポンスには十分なエラーログが表示されてないので検証が難しい状況です。

ちなみに書込権限をつけてテストをしてみましたが、これもうまくいきませんでした。
エラーに関することも含めて色々ChatGPTに聞いていたので確認してみてください。
ChatGPTを活用したデバッグでもエラーがちょいちょい出てしまい、特定するところまではできませんでしたが、何度かのやり取りでesa-api.jsonの'$ref'パラメータの処理が怪しいとにらんでいます。
https://chat.openai.com/share/ba4c4cb4-32bd-4e4c-85c4-0bd58acd0a10
esa-api.json自体は正しそうなので、ChatGPT側の処理に不具合があるのかもしれない。しかしこれは現状見えてる範囲では情報が不足していてなんとも言えない。
この辺りに詳しい方がいたら情報共有していただけると嬉しいです。
まとめ
GPTsだけで誰でもカスタムGPTが作成でき、そこでActionsを設定すれば外部サービスとの連携ができることがわかった。
ただしActionsの設定は他のカスタムGPTの設定と違って、誰でも気軽に設定できるようなものではなく、エンジニアの知識が必要であると感じた。
正しくOpenAPI Schemaの定義が取り込めれば誰でもできるかもしれないが、非エンジニアが誰でもできる内容ではないと思う。
とは言え、ActionsがなくてもカスタムGPTが簡単に作れること自体は神アップデートと言っても過言ではなく、システムの民主化が本格的に始まったと感じている。
そして敷居が高いとは言え、Actionsによって大規模なシステム開発が必要なく簡単にシステム連携できるようになったのも本当に素晴らしいことだ。
また、これらの知識はOpenAI API側の最新アップデートであるAssistants APIなどの理解にもつながるので、エンジニアだから関係ないと思わずにGPTsもぜひ触ってみて欲しい。
それから、APIおよびSchema.jsonを公開しているサービスがあったら教えてくれると嬉しいです。
関連記事のリンクを張っておくので、興味がある方はこちらの記事も読んでみてください。