0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

えーえすAdvent Calendar 2024

Day 20

Firebase Functionsを使ってChatGPTのAPIを作る

Last updated at Posted at 2024-12-19

はじめに

ChatGPTのAPI Keyを見えないようにしながらAPIを呼び出すためには、呼び出す用のエンドポイントを作成する必要があります。

しかし、そのためにサーバーをデプロイするのは少し大変。

そこで、Firebase Functionsを用いてサーバーレスでエンドポイントを作成していきましょう!

Firebaseプロジェクトの作成

Firebaseを開きます。

プロジェクトを作成します。

image.png

プロジェクトに名前をつけます。

image.png

今回はAnalyticsは必要ありません。

image.png

Functionsは課金プランでしか使えないので、支払い情報を追加します。

image.png

支払いアカウントを追加すると、以下のような画面になります。

image.png

Firebaseプロジェクトとローカルを繋ぎこむ

先にFirebase CLIをダウンロードしておきます。

npm install -g firebase-tools

次にプロジェクトを作成するディレクトリに移動したら、以下を実行します。

firebase init

Functions ...を、↑↓キーで移動し、Spaceで選択します。

スクリーンショット 2024-12-17 20.53.41.png

先ほど作成したプロジェクトを登録したいので、Use an existing projectを選択します。

スクリーンショット 2024-12-17 20.54.08.png

↑↓キーで、先ほど作成したプロジェクトを選択します。

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2823873_fb7d78c8-97c5-fdb6-6f23-40ae9366ca33のコピー.jpg

今回はJavaScriptを選択します。

スクリーンショット 2024-12-17 20.55.00.png

するとプロジェクトの生成が始まります。うまくいけば、以下のように表示されます。

スクリーンショット 2024-12-17 20.55.41.png

ここまでくると、プロジェクトのファイルが生成されます。

スクリーンショット 2024-12-19 17.36.08.png

パッケージを追加

functionsに移動します。

cd functions

npmで、dotenvとopenaiを追加します。

npm install dotenv openai

コードを書こう

functionsの中のpackage.jsonを開きます。

スクリーンショット 2024-12-19 17.45.03.png

4行目に以下を追加します。

"name": "functions",
"description": "Cloud Functions for Firebase",
"type": "module",←この行を追加

また、下の方にある行も変更します。

"main": "index.js",
↓以下に変更
"main": "index.mjs",

保存したら、functionsの中のindex.jsを開きます。

スクリーンショット 2024-12-19 17.37.39.png

ファイル名をindex.mjsに変更します。

スクリーンショット 2024-12-19 17.48.14.png

以下のコードに書き換えます。

index.mjs
import 'dotenv/config';
import { onRequest } from "firebase-functions/v2/https";
import OpenAIApi from "openai";

import {setGlobalOptions} from "firebase-functions/v2";
setGlobalOptions({
  region: "asia-northeast1",
});

const client = new OpenAIApi({
  apiKey: process.env["OPENAI_API_KEY"]
});

export const chatgpt = onRequest(async (req, res) => {
  // CORS対策(必要に応じて調整)
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.set('Access-Control-Allow-Headers', '*');

  if (req.method === 'OPTIONS') {
    res.status(204).send('');
    return;
  }

  if (req.method !== "POST") {
    return res.status(405).send({ error: "Only POST method is allowed." });
  }

  const prompt = req.body.prompt;
  if (!prompt) {
    return res.status(400).send({ error: "Prompt is required." });
  }

  try {
    const response = await client.chat.completions.create({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: prompt }]
    });

    const result = response.choices[0].message.content;
    return res.status(200).send({ result });
  } catch (error) {
    console.error("OpenAI API error:", error);
    return res.status(500).send({ error: "Internal server error." });
  }
});

最後に、functionsの中に .envというファイルを作成します。

スクリーンショット 2024-12-19 17.49.25.png

.envに、ChatGPTのAPI Keyを入力します。

.env
OPENAI_API_KEY=(あなたのAPI Key)

デプロイする

FirebaseFunctions-Sampleディレクトリに戻ります。

cd ..

デプロイのコマンドをうちます。

firebase deploy --only functions

デプロイが成功すると「✔ Deploy complete!」と表示されます。

このとき、デプロイしたエンドポイントのURLは以下から確認できます。

✔  functions[chatgpt(asia-northeast1)] Successful create operation.
Function URL (chatgpt(asia-northeast1)): (ここにURLが書かれている)
i  functions: cleaning up build files...

また、Firebase側でも表示を確認することができます。

Capture-2024-12-19-175509.png

デプロイ前にテストをしたい場合

以下のコマンドを打つと、localhostで実行できるようになります。

firebase emulators:start --only functions

image.png

まとめ

Firebase Functions、個人利用くらいならほぼ無料で使えるのでみなさんどんどん使っていきましょう!
資料も少ないので、もし改善点等ありましたら教えていただけますと幸いです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?