目前在国内访问 OpenAI 还是需要“科学”上网的,更不用说调用 OpenAI API。所以我尝试用 Node.js 写了个代理小程序,并部署在 Codesandbox 上,然后就可以在本地用习惯的前后端分离的方式调用 OpenAI API。使用比较简单,特写本文和大家分享。好用话请帮忙 Star 一下我的 repo。
获取 API 密钥
本文假设我们已经注册了 OpenAI 账号,如果还没有创建 API 密钥,可以如下图进行操作。
OpenAI 注册文章一大堆,最关键的是要输入一个可用的手机号完成验证,没有的话可租用,我是花了 12 卢布,不到人民币 2 元,所以自己动动手,真没必要花几十元买奸商的账号。
代理实现
其实多数语言都能模拟客户端调用实现类似网络爬虫,这里仅以Node.js为例。实现代码比较简单,主要是用 express
和 http-proxy-middleware
实现的。
// ...
app.use(express.static(path.join(__dirname, "public")));
app.use(
"/v1/",
createProxyMiddleware({
target: "https://api.openai.com",
changeOrigin: true,
onProxyReq: (proxyReq, req, res) => {
console.log(req.originalUrl);
proxyReq.setHeader("Authorization", `Bearer ${process.env.API_KEY}`);
},
onProxyRes: (proxyRes, req, res) => {
proxyRes.headers["Access-Control-Allow-Origin"] = "*";
proxyRes.headers["Access-Control-Allow-Headers"] =
"Content-Type,Content-Length, Authorization, Accept,X-Requested-With";
}
})
);
// ...
完整示例代码参看 repo 中的 index.js。createProxyMiddleware
的用法就不细说了。有几点需要注意:
onProxyReq
事件回调中我们设置了请求标头Authorization
,将 API 密钥保存到了代理代码中,这样前端调用时就不用加代理验证了。但问题来了,我们的将代码部署到国外主机上安全吗?这就担心过头了。一来目前注册一个账号就买一根冰棒的钱,二来很多云平台可以使用环境变量配置 API 密钥。幸运的是,Codesandbox 就可以。onProxyReq
事件回调中我们通过设置了响应标头Access-Control-Allow-Origin
为*
,这意味着任何人都可以访问我们的代理服务。当然如果不想被“白嫖”,我们可以根据需要固定几个IP。- 本地调试时,记得“科学”上网,还要将
${process.env.API_KEY}
替换成你自己的 KEY。
出于安全,官方不建议使用前后端分离方式开发 OpenAI Web 应用,我们搭建的代理刚好能回避这个问题。
验证
当然最好是用页面来验证,以下代码了演示怎样使用 axios 调用我们之前搭建的代理服务。
axios.post('http://localhost:3000/v1/completions', {
model: 'text-davinci-003',
max_tokens: 1024,
prompt: prompt
})
.then(response => {
// ...
})
.catch(error => {
// ...
})
完整示例代码参看 repo 中的 public/index.html,这应该算是最简单的纯前端 OpenAI 应用了。
和普通 Ajax 调用没啥区别。当然也可以使用官方提供的 openai 之类的库,只要将 basePath
设置代理服务地址(如本示例中的 http://localhost:3000/v1
)即可。Node.js 版本的 openai 的其实是依赖 axios 的,社区的各种库也只是基于某种语言或业务场景对 OpenAI API 的封装,所以看看 OpenAI API 文档没啥难度。访问不了文档的可以让 ChatGPT 来帮忙?。
API 常见的就是 Ajax 请求了。OpenAI API 也不例外。后端对界面不太关注的同学用 curl、postman 之类的工具也可以验证。
免费部署
代码测试好后还要部署在国外才行。目前,免费部署 Node.js 应用的云平台并不是很多,推荐 Codesandbox。
Codesandbox
Codesandbox 简直就是一个神器,我们不仅可以使用它来写代码,还能在上面托管应用,甚至是 Node.js 应用。
- 登录 Codesandbox 账号
没有 Codesandbox 账号的话最好关联自己的 Github 注册一个账号,以后我们就可以在这两个平台之间同步自己的项目了,非常方便。
- 新建工程
单击 “Create”,选择一个 Node.js 模板,新建 Node.js 工程。
- 添加依赖
在 package.json
中添加以下依赖:
"dependencies": {
"express": "^4.18.2",
"http-proxy-middleware": "^2.0.6"
}
- 替换代码
将 index.js
中的代码替换为完整的代理代码。可以从我的 repo 获取。
如果觉得前面几步操作麻烦,可以直接 Fork 一下我的示例项目,然后继续。
- 配置 API 密钥
左上角菜单 > “Project Settings” > “Env Variables”,填入先前生成的 API 密钥,如下图所示:
- 重启服务
左上角菜单 > “Restart Sandbox”重启服务,若能在右侧看到以下预览页面说明部署没大问题。预览页面地址栏显示的就是最终生成的代理服务地址。如本项目的 https://ge68te-3000.csb.app。
如果不打算分享服务,可以将 CodeSandbox 项目移动到草稿中私有化,以提高服务的安全性。
其他选择
- Vencel
Vencel 部署的应用目前国内要“科学”上网才可以访问,不推荐。
国内倒是能访问,不过官方不支持 Express 模板,要用 Netlify function“曲线救国”,操作起来有些麻烦。还有部署生成服务地址也感觉怪怪的,所以也不推荐。
- 其他平台
像 AWS、腾讯云等平台也可以部署 Node.js 项目,但有一定的免费期限。我们的程序很简单,有点杀鸡用牛刀的感觉。
当然最好的办法是使用 VPN 访问或搞到国外主机,不过俺是穷人。?
总结
- 直接 Fork我的示例项目
- 使用环境变量配置 API 密钥
重启服务就搭建好了,很简单吧?
以前老觉得 AI 高深莫测,打通 OpenAI API 的“任督二脉”之后, 我们应该对 AI 开发充满信心。
评论 (0)