目前在国内访问 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 密钥验证了。但问题来了,我们的将代码部署到国外主机上安全吗?这就担心过头了。一来目前注册一个账号就买一根“冰棒”的钱,二来很多云平台可以使用环境变量配置 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
)即可。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”重启服务,若能在右侧看到以下预览页面说明部署没大问题。预览页面地址栏显示的就是最终生成的代理服务地址。如本项目的 ge68te-3000.csb.app。
如果不打算分享服务,可以将 Sandbox 项目移动到草稿中私有化,可以提高服务的安全性。
其他选择
- Vencel
Vencel 部署的应用目前国内要“科学”上网才可以访问,不推荐。
国内倒是能访问,不过官方不支持 Express 模板,要用 Netlify function“曲线救国”,操作起来有些麻烦。还有部署生成服务地址也感觉怪怪的,所以也不推荐。
- 其他平台
像AWS、腾讯云等平台也是可以部署 Node.js 项目,但有一定的免费期限。我们的程序很简单,有点杀鸡用牛刀的感觉。
当然最好的办法是使用 VPN 访问或搞到国外主机,不过俺是穷人。😓
总结
-
直接 Fork我的示例项目
-
使用环境变量配置 API 密钥
重启服务就搭建好了,很简单吧?
以前老觉得 AI 高深莫测,打通 OpenAI API的“任督二脉”之后, 我们应该对 AI 开发充满信心。