아 도무지 에러가 안잡혀서, 지난 에러에 대해 글을 쓰기로 했다. 짤막하게.
openAI api를 쓰려면 api key가 필요하다. 아주 소중한 api key.
처음에는 코드를 이렇게 썼었다.
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const { onDocumentWritten } = require("firebase-functions/v2/firestore");
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
그랬더니, 이 함수를 firebase functions에 deploy 하려고 `firebase deploy --only functions`이렇게 하면 어김없이 에러를 마주해야 했다.
OpenAIError: The OPENAI_API_KEY environment variable is missing or empty;
either provide it, or instantiate the OpenAI client with an apiKey option,
like new OpenAI({ apiKey: 'My API Key' }).
at new OpenAI(내 작업 주소)
블라블라
블라블라blah blah blah
functions가 함수를 deploy 하기 전에 한 번 싸악 parsing 할텐데, 그 때, process.env 위치에는 api key가 없다. 그래서 저 에러가 나는거였다. 저 process.env 위치는 구글 클라우드 시크릿 매니저를 이용해서 그 자리에 넣어둔 값을 참조하란 뜻이었기 때문이다.
그래서 저 api key 참조하는 부분을 함수 안으로 넣었더니, 해결이 잘 되었다.
바뀐 코드는 다음과 같다.
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const { onDocumentWritten } = require("firebase-functions/v2/firestore");
const { onCall } = require("firebase-functions/v2/https");
const { defineSecret } = require("firebase-functions/params");
const openAiApiKey = defineSecret("OPENAI_API_KEY");
// OpenAI는 함수 내부에서 생성 (배포 전 파싱 시점 오류 방지)
const { OpenAI } = require("openai");
....
exports.generateWod = functions.https.onCall(async (data, context) => {
...
const openai = new OpenAI({
apiKey: openAiApiKey.value(),
});
...
이렇게 했더니 아주 기쁘게도!
Deploy complete! 이라는 메세지를 터미널에서 확인할 수 있었다.
그리고 나는 그 기쁨을 한껏 누려볼 새도 없이, 그 찰나의 기쁨을 누려보지도 못하고, 또 다른 에러를 맞이하여 허우적거리고있다.
아니야 허우적거리지 않아 실패는 성공의 어머니 ,, 어머니가 너무 많아..