javascript 通过Firebase云函数访问ChatGPT API

mnemlml8  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(182)

下面是一个简单的Firebase云函数的一些代码,它可以调用ChatGPT API。部署此代码并从我的应用程序访问它会导致CORS错误。

import * as functions from "firebase-functions";
import {defineString} from "firebase-functions/v2/params";
import {Configuration, OpenAIApi} from "openai";

const openAIKey = defineString("OPEN_API_KEY");

export const getSummary = functions.https.onCall(async (data) => {
  const configuration = new Configuration({
    apiKey: openAIKey.value(),
  });
  const openai = new OpenAIApi(configuration);
  const completion = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: [
      {
        role: "user",
        content: data.prompt,
      },
    ],
  });
  const [choice] = completion.data.choices;
  return {
    response: choice.message ?? "no response",
  };
});

当我使用函数模拟器从我的应用程序访问它时,这个云函数工作得很好。只有当我将它部署到云并尝试使用它时,我才会收到CORS错误。
此外,我还部署了一个helloWorld函数,这样我就可以检查我的整个函数设置没有任何错误,而且它也工作得很好。此外,当我进入我的Cloud Functions Console并直接测试该功能时,它也可以工作。因此,问题显然与通过云函数生产环境访问API有关,特别是从应用程序。
更新:以下是客户端代码和确切的错误:

const getSummary = httpsCallable(functions, "getSummary");
async function askGPT() {
    const result = await getSummary({
      prompt: "Please summarize the question in the following text. Phrase your response in the form of a question, and use Markdown for any formatting you might need.\n\n" + question.text
    });
    question.question_summary = (
      (question.question_summary ?? "") // @ts-ignore
      + (result?.data?.response?.content || "").trim()
    );
  }

错误:
CORS策略已阻止从源“http://localhost:5173”访问“https://us-central1-my-documentation.cloudfunctions.net/getSummary”:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果一个不透明的响应满足了你的需求,将请求的模式设置为“no-cors”,以在禁用CORS的情况下获取资源。

s1ag04yj

s1ag04yj1#

这个问题的最佳解决方案是在出现CORS问题时避免使用onCall。相反:
1.为新的Firestore系列起个名字。
1.设置一个云函数,该函数由在该集合中创建新文档触发。
1.将与OpenAI API对话的逻辑放在云函数中。当你得到响应后,将其写入Firestore中的一个集合(无论你想在哪里)。
1.来自客户端:
1.当你想提出要求时,写信给上述的收藏。
1.订阅云函数写入的集合。
总之,来自客户端的新请求会导致这种级联:
1.对请求的Firestore集合的写入。
1.云函数读取该文档,加上API调用和任何其他必要的逻辑。
1.写入Firestore集合以获取响应。
1.客户端上响应该文档更新的更新。
需要这种替代方法的原因是onCall云函数与Firestore事件触发的云函数具有不同的CORS行为。

相关问题