本文对chatgpt就不展开做更多的介绍了(正儿八经技术文),主要是用其对外开放的 API 能力来帮我们 DIY 一个自己的 web 小应用。做这个的初衷一个是捣鼓一下 API 耍耍,还有一个最重要的原因就是优化个人使用的体验,DIY 能提供更多的自由度让我们“调教”chatgpt来做更多有趣的事。很多最近使用chatgpt的小伙伴应该也发现访问其官网不太稳定,即使使用了 🪜,许多网络节点(香港/台湾/日本等)仍然并不可使用,但是 API 没做额外的限制,下面我给大家介绍自己做的一个简单 demo,大家可以作为参考来折腾更好玩的功能,项目仓库和体验地址将会在文末贴出,那么 let’s go ~
效果预览
Demo 主要是使用了OpenAI的生成图片和对话的 API 接口,实现了如下两个功能 先放上几张效果图大伙们感受一下:
Home Page
示例-1: 根据描述生成图片 & 翻译
示例-2: 智能 AI 对话
实现
这里将会有一些前面的准备工作需要做:
网络环境 ok,有 vpn
要使用OpenAI对外的 API 能力必须得有OpenAI的账号并且创建一个 key,这个 key 就是我们调用oepnai API 的凭证信息,可以理解成 token。这里对创建账号和生成 key 不额外介绍(已有很多相关教程),贴一下OpenAI的链接地址,生成 key 和后续查阅 API 文档都会用到 https://platform.OpenAI.com/
最终我们的项目调用OpenAI API 采用的是vercelEdge Functions 的模式,因此可以先行创建vercel账号,推荐 github 授权即可,免注册 https://vercel.com/
const stream = newReadableStream({ asyncstart(controller) { // callback functiononParse(event: ParsedEvent | ReconnectInterval) { if (event.type === 'event') { const data = event.data // https://beta.OpenAI.com/docs/api-reference/completions/create#completions/create-stream if (data === '[DONE]') { controller.close() return } try { const json = JSON.parse(data) const text = json.choices[0].delta?.content || '' if (counter < 2 && (text.match(/\n/) || []).length) { // this is a prefix character (i.e., "\n\n"), do nothing return } const queue = encoder.encode(text) controller.enqueue(queue) counter++ } catch (e) { // maybe parse error controller.error(e) } } }
// stream response (SSE) from OpenAI may be fragmented into multiple chunks // this ensures we properly read chunks and invoke an event for each SSE event stream const parser = createParser(onParse) // https://web.dev/streams/#asynchronous-iteration forawait (const chunk of res.bodyasany) { parser.feed(decoder.decode(chunk)) } }, })