最近借着 AIGC 的潮流, 用 Tauri 做了个根据 OpenAI 和 Azure OpenAI Service 的谈天机器人, 现在正式版现已放出, 欢迎咱们去 hyperchat.yancey.app/ 下载和运用. 代码放在了 github.com/orgs/HyperC…, 欢迎一同建造和优化.

Functions

Hyper Chat 的跨平台根据 tauri, 老实说比起 electron, 尽管 tauri 无需安装粗笨的 chromium, 但 webkit 本身缺失了太多的功用, 如 window.navigator.onLine, onCompositionStart 等等, 所以在实现上一些效果并不令人满意.‘

Hyper Chat 的初衷是绝不搜集用户信息, 如 OpenAI Secret Key 和谈天记录. 因而咱们运用 indexedDB 来存储数据. 在设置中, 咱们支撑导入和导出数据. 当然假如你有爱好提供一个服务端, 前端代码也是很容易修正的, 你只需要将 src/hooks/useDB.ts 中的函数换成你的 API 接口即可.

用 Tauri 写一个 ChatGPT AI Bot.

在大前端上, 首要运用了 React + Vite + TailwindCSS + Recoil 的组合. 这也是我第一次运用 TailwindCSS, 从抵触到真香, 往往只有一步之遥.

此外, 咱们支撑 OpenAI 和 Azure OpenAI Service 两种接口, 后续会考虑增加 Claude 2 和 Google Bard. 咱们还支撑亮色, 暗色, 以及跟随体系主题视觉效果. 为进步趣味性, 在谈天框中, 咱们支撑修正助理的头像.

用 Tauri 写一个 ChatGPT AI Bot.

Customizable ChatBox

在谈天框区域, 关于每种模型 API, 咱们都有和官方一致的装备参数可供用户选择.

用 Tauri 写一个 ChatGPT AI Bot.

此外是一些零零散散的小功用, 如支撑修正会话的头像和标题, 删除会话, 添加会话等.

用 Tauri 写一个 ChatGPT AI Bot.

Chat Completion

用 Tauri 写一个 ChatGPT AI Bot.

Hyper Chat 最中心的功用是支撑 Chat Completion, 整个 APP 最花心思的就是这个模块. 和 ChatGPT 网页效果一样, 咱们默认支撑 stream 模式. 此外, 咱们选用贪心策略, 每次回话中尽或许多的带上下文:

// 获取用户 prompt 的 token 数
const userMessageTokensCount = getTokensCount(prompt, model);
// 总的 token 数等于用户 prompt 的 token 数 + 体系消息的 token 数 + 本次希望 Assistant 返回的最大 token 数
let tokensCount = userMessageTokensCount + systemMessageTokensCount + maxTokens;
// 获取当前模型最大支撑的 token 数, 如 GPT-3.5-turbo 最多支撑 4097 个 token
const tokensLimit = models.find((m) => m.name === model)?.tokensLimit || 0;
// 假如用户输入的 prompt 的 token 数现已超过阈值, 就提示过错
if (tokensCount > tokensLimit) {
  toast.error(
    `This model's maximum context length is ${tokensLimit} tokens. However, you requested ${tokensCount} tokens (${
      tokensCount - maxTokens
    } in the messages, ${maxTokens} in the completion). Please reduce the length of the prompt.`
  );
  return;
}
// 从新到旧依次遍历过往的 message, 尽或许的多的将上下文交给模型处理
const context: CreateChatCompletionRequest["messages"] = [];
currConversation.messages
  .slice()
  .reverse()
  .forEach(({ tokensCount: historyTokensCount, content, role }) => {
    tokensCount += historyTokensCount;
    if (tokensCount > tokensLimit) return;
    context.unshift({
      role,
      content,
    });
  });

Text Completion

用 Tauri 写一个 ChatGPT AI Bot.

咱们也支撑 Text Completion, 不过 OpenAI 最新官方文档表示这个 API 归于 legacy, 或许后边就废弃了, 且用且爱惜.

Audio Transparent and Translation

尽管 OpenAI 早已开源了 Whisper-1, 但咱们还是接入了它的接口, 咱们支撑音频的转录和翻译. 在右下角先选择音频文件, 再敲击回车即可提交, 你也能够输入 prompt, 不过在 Audio 中, 它是可选的.

用 Tauri 写一个 ChatGPT AI Bot.

Image Generation

咱们支撑根据 DALL-E 的图片生成接口, 建议在装备中选择更小尺度的图片, 这样生成起来会比较快. 此外, 图片有过期时刻(约为 1 天), 请及时将生成的图片下载到本地.

用 Tauri 写一个 ChatGPT AI Bot.

最后

欢迎咱们体验和运用, 有任何建议都能够通过 Official Discussion 一同评论.