-
Notifications
You must be signed in to change notification settings - Fork 780
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
把 mi-gpt 包装成 Electron 时遇到了问题 #111
Comments
我对 prisma 底层的实现也不是很熟,他们是有自己的 shcema 和 query 的语法,在 MiGPT 里的所有 db 操作都是基于 prisma 最上层的语法来使用的,如果能 hook 到他们最底层的 db 操作,应该能达到你说的这个目的。 |
如果你是直接基于当前的 要想有不错的使用体验和完善的功能交互,需要 MIGPT 内部针对 GUI 的场景,对外暴露更多的操作接口。 |
或者还有一个办法,就是反过来把核心代码部分(连接小米云服务、控制音箱发声等)抽出来做成一个单独的包例如 然后我就可以用 |
其实已经算是做到了,除了卡在了最后一步——把 prisma 打包进 electron 这个问题 😂
对的我就是这个意思 😂 |
这是一个好的提议,实际上从最开始设计 MiGPT 的时候,他的核心控制模块和 AI 对话模块就是分离的,只不过为了方便运行放在了同一个项目内管理。但我现在还没想好应该怎么去处理这部分:把他们重新按照模块分开并定义好互连的接口。 上面你提到的 prisma 问题的核心是:当前 而重构后的框架,应该就是你上面提到的,与平台无关的核心业务逻辑可以抽象到 core 层,其他的诸如网络请求、文件存储、和 db 操作等,由各平台实现。 |
看了一下,目前代价最小的解决方案应该是找到一个跨平台的 db 方案,然后重写之前使用 prisma 进行的所有 db 操作。 或者骚操作一些,看看能不能在 electron 宿主机中开辟出来一个完整的 nodejs 运行时,让 mi-gpt 跑在里面。 |
electron 上我没找到啥好用的 db 方案,之前我都是直接往
这个我还真想过。我的想法是把 比较麻烦的点在于要处理不同平台 win、darwin x64、darwin arm64、linux 的 prisma 二进制文件,也就是实现类似 prisma 的 不过这样一来似乎跟前面在 Electron 里打包 prisma 的做法差不多 |
另外,按照目前我对这个项目的理解,我想象中的 import { MiCtrl, AICtrl } from 'mi-gpt-core'
const aiCtrl = new AICtrl({
systemTemplate: 'xxx',
bot: {...},
master: {...},
room: {...},
onAsk: (prompt, onStream) => {
// 由开发者自行接入各种 AI 服务来获取回答
return new Promise((resolve, reject) => {
if (onStream) {
// 通过 stream 传递回答
onStream('我是傻妞')
onStream('我是傻妞,请问有什么')
onStream('我是傻妞,请问有什么可以帮你?', true) // true 表示结束了
resolve('我是傻妞,请问有什么可以帮你?')
} else {
// 一次性传递整个回答
resolve('我是傻妞,请问有什么可以帮你?')
}
})
}
})
const miCtrl = new MiCtrl({
userId: '111111',
password: '22222',
did: '小爱音箱Pro',
ttsCommand: [5, 1],
wakeUpCommand: [5, 3],
playingCommand: [3, 1, 1],
exitKeepAliveAfter: 60,
keywords: {
call: ["请", "傻妞"],
wakeUp: ["召唤傻妞", "打开傻妞"],
exit: ["退出傻妞", "关闭傻妞"],
}
})
// 监听到用户说了特定关键词时触发的事件
miCtrl.on('keyword', (payload) => {
ctrl.mute() // 让小爱的回答静音
switch (payload.keyword) {
// 单次调用 AI 响应用户消息
case 'call':
Promise.all([
miCtrl.tts('让我先想想'), // speaker.onAIAsking
aiCtrl.ask(payload.message, {timeout: 10}),
]).then(async ([_, res]) => {
await miCtrl.tts(res) // 播放 AI 的回答
await miCtrl.tts('我说完了') // speaker.onAIReplied
}).catch((err) => {
miCtrl.tts('出错了,请稍后再试吧!') // speaker.onAIError
})
break
case 'wakeUp':
miCtrl.wakeUp()
break
case 'exit':
miCtrl.exit()
break
}
})
// 进入唤醒模式时触发的事件
miCtrl.on('wakeUp', (wakeUpHandler) => {
miCtrl.tts('你好,我是傻妞,很高兴认识你') // speaker.onEnterAI
// 用户在唤醒模式下每说一句话都会触发此事件
wakeUpHandler.on('message', (message) => {
Promise.all([
miCtrl.tts('让我先想想'), // speaker.onAIAsking
aiCtrl.ask(message, {timeout: 10}),
]).then(async ([_, res]) => {
await miCtrl.tts(res) // 播放 AI 的回答
await miCtrl.tts('我说完了') // speaker.onAIReplied
}).catch((err) => {
miCtrl.tts('出错了,请稍后再试吧!') // speaker.onAIError
})
})
})
miCtrl.on('exit', () => {
miCtrl.tts('傻妞已退出') // speaker.onExitAI
}) |
首先,感谢你给出的提案,我看到了以下几个方面:
我觉得 这本来是 所以 我觉得新的架构可以从以下几点出发:
先写到这,后面有时间我们继续探讨。 最后,再次感谢你对 另外我想询问一下你的意见,是否感兴趣加入 |
很感谢你详细介绍了此项目未来的规划!我对于你提出的两个目标非常认同。也很感谢你邀请我加入核心开发工作,我对此仔细思考了一番。 从前面的规划来看,重构的工作量不小,但我不能保证我有多少时间参与其中 😂 最近正是 Chrome 即将下架 Manifest V2 的关键时间节点,我正在全力将我个人的项目迁移到 Manifest V3,这于我而言是个很不稳定的因素。 在你提到的两个目标当中,我对 |
😂 哈哈,没关系。上面只是探讨下 我个人近期的空闲时间也不是很多,短期内没有继续向下扩展新功能或者重构的规划。 后面我会把精力放到创作其他更有趣和有价值的开源项目上,帮助更多的人, PS:我今天刚刚把火狐浏览器上的翻译插件换到了划词翻译(之前的沙拉查词好像下架搜不到了),开箱即用还是挺方便的 👍 |
@lmk123 最后祝你的浏览器插件能够顺利完成迁移 🎉 |
我已经将Mi-GPT的改成支持RAG,支持智谱AI,并成功运行。 问题就是慢,偶尔人说话听不见。 |
我尝试把 mi-gpt 包装成一个 electron 应用,目前在开发阶段(也就是用
electron .
启动)已经成功了,项目地址 https://github.com/lmk123/migpt-gui但现在我卡在了打包流程上,原因是 Prisma 这个模块在 Electron 里运行时有很多问题。现在能找到的解决方案有以下两个,但是(在我这个从没用过 Prisma 的人眼里 😂)每个都非常复杂且“黑科技”:
我在想有没有可能把数据库操作解耦出来,这样我就可以用别的方式实现数据存储,就像这样:
The text was updated successfully, but these errors were encountered: