見出し画像

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

以下テキストが表示されたら、実行成功です。

FastAPI実行成功時の表示

試しにhttp://127.0.0.1:8000に任意のブラウザでアクセスして、正しくWebサーバが立ち上がっていることを確認してください。

FastAPIのルートアクセス時の画面

ngrokのセットアップおよびトンネリングの実行

ngrok(エングロック)は、ローカルのサーバーをインターネット上からアクセス可能にするトンネリングサービスです。

[ローカルサーバ] ---- [ngrokクライアント] ---- [ngrokサーバ] ---- [インターネット]

まず、ngrokのアカウントの作成してください(無料)。(ここでは説明を省略します。)

次のEdgeを作成してください。

ngrokのサイトのEdge作成をするためのメニュー

「New Edge+」ボタンからEdge(エンドポイント)を作成し、エンドポイントのアドレスとEdge情報を控えます。

Endpointsを作成後の画面

次にngrokのクライアントの設定を行います。

各OSのインストール方法に従い、ngrokのクライアントをインストールしてください。(参照:https://ngrok.com/download

ダウンロード後、Authtokenを設定してください。Authtokenはngrokのサイトから入手します。

ngrokのAuthtokenを入手するためのメニュー

以下コマンドで登録します。

 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/のような形式)

ngrokトンネリングを利用してローカルFastAPIにアクセスした時の表示

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上のスキーマ設定
(JSONを貼り付けてFormatボタンを押すと整形されます)

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へのアクション実行の動作確認

これでGPTsのActionsの機能を使って、ローカル上にたてたFastAPIと連携することができました。

まとめと注意

ここまでお読みいただきありがとうございます。今回、ローカルサーバにたてたFastAPIをGPTsのActionsから実行することに成功しました。

最後に、http接続およびngrokを利用したトンネリングはセキュリティ上のリスクもありますので、自己責任でお願いします。

この記事が気に入ったらサポートをしてみませんか?