GPTsのActionsからローカル環境のFastAPIを呼ぶ
はじめに
今回はGPTsのActionsの機能とローカル環境のFastAPIとの連携を試してみました。
開発環境
Macbook Air, M1, 2020
Sonoma 14.2.1
FastAPI
ngrok
ChatGPT Plus
手順
FastAPIのセットアップおよび実行
FastAPIはpythonで実行できるWebAPIサーバです。以下のようにpipでインストールすることが可能です。(筆者はpipenvを利用しますが、読者の環境の管理は多様な方法があると思いますので、ここでは省略します。)
セットアップのために以下を実行してください。
pip install fastapi
pip install uvicorn
公式サイトにあるサンプルコード(main.py)を作成してください。
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
上記を以下のようにして実行してください。
uvicorn main:app --reload
以下テキストが表示されたら、実行成功です。
試しにhttp://127.0.0.1:8000に任意のブラウザでアクセスして、正しくWebサーバが立ち上がっていることを確認してください。
ngrokのセットアップおよびトンネリングの実行
ngrok(エングロック)は、ローカルのサーバーをインターネット上からアクセス可能にするトンネリングサービスです。
[ローカルサーバ] ---- [ngrokクライアント] ---- [ngrokサーバ] ---- [インターネット]
まず、ngrokのアカウントの作成してください(無料)。(ここでは説明を省略します。)
次のEdgeを作成してください。
「New Edge+」ボタンからEdge(エンドポイント)を作成し、エンドポイントのアドレスとEdge情報を控えます。
次にngrokのクライアントの設定を行います。
各OSのインストール方法に従い、ngrokのクライアントをインストールしてください。(参照:https://ngrok.com/download)
ダウンロード後、Authtokenを設定してください。Authtokenはngrokのサイトから入手します。
以下コマンドで登録します。
ngrok config add-authtoken <token>
ここまでで準備は完了しました。ngrokのトンネリングを使ってインターネットからローカルのFastAPIに接続してみましょう。FastAPIのローカルサーバーを起動した後、以下を実行してください。
ngrok tunnel --label edge=<先ほど作成したedge情報> http://127.0.0.1:8000
これにより、ローカルホスト(127.0.0.1:8000)だけでなく、ngrokのトンネリングを利用してインターネットからアクセスできるようになります。URLはngrokのサイトで表示されたものです。(https://xxxxx-yyyyy-zzzzz.ngrok-free.app/のような形式)
FastAPIのOpenAPIスキーマの取得
GPTsのActionsと連携するためには、OpenAPIのスキーマの取得が必要です。FastAPIでは、スキーマ情報を以下のURLから容易に取得できます。
<FastAPIのサーバURL>/openapi.json
そうすると以下のようなスキーマファイルが取得されます。(この後で加工が必要。)
{
"openapi": "3.1.0",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"paths": {
...
},
"components": {
...
}
}
上記に対して、GPTsがアクセスできるように以下の"servers"の情報を追加します。
{
"openapi": "3.1.0",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"servers": [
{
"url": "https://xxxxx.yyyyy.zzzzz.ngrok-free.app/"
}
],
"paths": {
...
これでGPTs用のOpenAPIのスキーマファイルが完成しました。
GPTsのActionsのセッティング
GPTsの作成時に以下のようにActionsを設定してください。
GPTsではインストラクションを書くことで様々な操作が可能ですが、今回は動作確認のため以下の情報だけを記載しました。
FastAPIを利用できるかのサンプルです。
FastAPIのmain.pyの修正
ここまでで動作するはずですが、試したところGPTsがWebAPIにアクセスする際にスラッシュを重ねてしまい、「Not found」が返ってくる現象が発生しました。(原因不明)
これを回避するために、FastAPI側でダブルスラッシュをスラッシュに変換するコードを挿入します。(なお本コードはChatGPTに聞いた回答)
from typing import Union
from fastapi import FastAPI, Request
from starlette.responses import RedirectResponse
app = FastAPI()
# 以下ダブルスラッシュ回避用のコード
@app.middleware("http")
async def redirect_double_slash(request: Request, call_next):
if "//" in request.url.path:
new_path = request.url.path.replace("//", "/")
new_url = str(request.url.replace(path=new_path))
return RedirectResponse(new_url)
return await call_next(request)
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
動作確認
全て設定できたら、作成したGPTsに対して「何かAPIを実行して」と問いかけてみましょう。ローカルサーバーまでリクエストが届き、応答が返ってきます。
これでGPTsのActionsの機能を使って、ローカル上にたてたFastAPIと連携することができました。
まとめと注意
ここまでお読みいただきありがとうございます。今回、ローカルサーバにたてたFastAPIをGPTsのActionsから実行することに成功しました。
最後に、http接続およびngrokを利用したトンネリングはセキュリティ上のリスクもありますので、自己責任でお願いします。