Cloud Functions for Firebase(Python)でHTTPリクエスト経由でOpen AIのAPIを使ってみた

2024.05.14

こんにちは、ゲームソリューション部のsoraです。
今回は、Cloud Functions for Firebase(Python)でHTTPリクエスト経由でOpen AIのAPIを使ってみたことについて書いていきます。
シークレットキーの登録、権限周りの接続エラーに対する設定変更についても記載します。

firebase initでCloud Functions用のフォルダの作成することなどは解説しません。
「Cloud Functions for FirebaseをPythonで使ってみた」ことについては、Firebase CLIのインストールなどから以下記事にて記載しています。

シークレットキーの登録

まずOpen AIのAPIを使用するためのAPIキーをシークレットキーとして登録します。

ちなみに、無料枠もあって、Firebaseプロジェクトに対して、1カ月あたり6シークレットを無料で使用できます。
アクセスに対する課金は、1つのシークレットに対して、毎月1万回のアクセスが無料です。

# シークレットキーの登録
$ firebase functions:secrets:set OPENAI_KEY
# ⇒実行後に値を入力する

# 確認
## 値の確認
$ firebase functions:secrets:access OPENAI_KEY
# ⇒値が表示される
## バージョンと状態の確認
$ functions:secrets:get SECRET_NAME

# 削除
$ firebase functions:secrets:destroy OPENAI_KEY
? Are you sure you want to destroy OPENAI_KEY@1 Yes
i  Destroyed secret version OPENAI_KEY@1
i  No active secret versions left. Destroying secret OPENAI_KEY

# 参照されていないシークレットを削除
$ functions:secrets:prune

シークレットキーを使用してローカルでテストする場合は、.secret.localファイルや.env.localなどにSECRET_NAME=valueの形で記述して、functionsディレクトリに配置しておくとテストできます。
エミュレータのサポート

コードの解説

コードは以下です。
リージョンはデフォルトでus-central1になっているため、asia-northeast1(東京)にしています。

main.py

from firebase_functions import https_fn, options
from firebase_functions.params import SecretParam
from firebase_admin import initialize_app
from openai import OpenAI
import os

initialize_app()

# リージョンの指定
options.set_global_options(region=options.SupportedRegion.ASIA_NORTHEAST1)

# 設定したsecretsの設定
@https_fn.on_request(secrets=["OPENAI_KEY"])
def test_api(req: https_fn.Request) -> https_fn.Response:
    client = OpenAI(
        # secretsの値を取得
        api_key = os.environ.get('OPENAI_KEY'),
    )
    # リクエストパラメータの取得
    req_text = req.args['message']
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "あなたはAIではありません。人間として自然な会話をしてください。"},
            {"role": "user", "content": req_text}],
    )
    res_text = response.choices[0].message.content
    return res_text

openaiのライブラリも忘れずに追加しておきます。

requirements.txt

firebase_functions~=0.1.0
openai

デプロイ・実行確認

コードが完成したためデプロイします。

# 仮想環境上でライブラリのインストール
$ /home/{user}/test/functions/venv/bin/activate" && python3.12 -m pip install -r requirements.txt

# 仮想環境の終了(実行しなくても問題はない)
(venv):~$ deactivate

# デプロイ
firebase deploy --only functions:test_api

リクエストパラメータ(?message=感動する話をしてください)を含めてアクセスすると、以下のように回答が表示されました。

接続の権限エラーが発生した場合

最初、ここまでの流れでデプロイまで行いアクセスしてみると、以下のようなエラーが出ました。
調べてみると、Cloud Runにてアクセスに認証必須となっているため、「未認証の呼び出しを許可」にすることでアクセスが可能になります。
(今回はテスト用ですぐに削除するものなため認証なしにしていますが、誰でもアクセスできるようになるため本番利用時は注意してください)

最後に

今回は、Cloud Functions for Firebase(Python)でHTTPリクエスト経由でOpen AI APIを使ってみたことを記事にしました。
どなたかの参考になると幸いです。