用 Tauri 写一个 ChatGPT AI Bot. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yanceyofficial
V2EX    程序员

用 Tauri 写一个 ChatGPT AI Bot.

  •  1
     
  •   yanceyofficial 2023-08-03 17:13:16 +08:00 1256 次点击
    这是一个创建于 815 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近借着 AIGC 的潮流, 用 Tauri 做了个基于 OpenAI 和 Azure OpenAI Service 的聊天机器人, 目前正式版已经放出, 欢迎大家去 https://hyperchat.yancey.app/ 下载和使用. 代码放在了 https://github.com/orgs/HyperChatBot, 欢迎一起建设和优化.

    Functions

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

    Hyper Chat 的初衷是绝不收集用户信息, 如 OpenAI Secret Key 和聊天记录. 因此我们使用 indexedDB 来存储数据. 在设置中, 我们支持导入和导出数据. 当然如果你有兴趣提供一个服务端, 前端代码也是很容易修改的, 你只需要将 src/hooks/useDB.ts 中的函数换成你的 API 接口即可.

    import-export-db

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

    此外, 我们支持 OpenAI 和 Azure OpenAI Service 两种接口, 后续会考虑增加 Claude 2 和 Google Bard. 我们还支持亮色, 暗色, 以及跟随系统主题视觉效果. 为提高趣味性, 在聊天框中, 我们支持修改助理的头像.

    settings

    Customizable ChatBox

    在聊天框区域, 对于每种模型 API, 我们都有和官方一致的配置参数可供用户选择.

    configuration

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

    other-configuration

    Chat Completion

    chat-completions

    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

    text-completion

    我们也支持 Text Completion, 不过 OpenAI 最新官方文档表示这个 API 属于 legacy, 可能后面就废弃了, 且用且珍惜.

    Audio Transparent and Translation

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

    audio-transparent-and-translation

    Image Generation

    我们支持基于 DALL-E 的图片生成接口, 建议在配置中选择更小尺寸的图片, 这样生成起来会比较快. 此外, 图片有过期时间(约为 1 天), 请及时将生成的图片下载到本地.

    image-generation

    最后

    欢迎大家体验和使用, 有任何建议都可以通过 Official Discussion 一起讨论.

    horizon
        1
    horizon  
       2023-08-03 18:54:19 +08:00
    完成度不错。
    不过我还是用 poe 吧,哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5514 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:08 PVG 17:08 LAX 02:08 JFK 05:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86