Releases: lshhhhhhh/OpenMeido
Release list
v0.3.5 — readWebPage 死循环修复 · demo 台词泄漏 · SoVITS .env 兜底
修几个真实用户反馈的问题
readWebPage 死循环 → 一个字都答不出来
有用户问时效性问题(比如"现在比特币多少钱"),结果女仆疯狂调用 readWebPage 十几次、最后什么都没回。
测下来根因:web_search 本身是好的(单独用能给实时数据),但函数工具在场时 GLM 的选择行为出问题——它不用自动联网搜索,反而去调 readWebPage 瞎编 URL,抓取失败后反复换 URL 重试,步数耗尽,回复为空。
修了三层:
- 重复调用拦截:同一工具 + 同一参数一轮内重复 → 短路,逼模型停手直接回话
- readWebPage 单轮次数上限:挡"每次换个 URL"的循环(readEmail 这种需要多次的不受限)
- 收紧 readWebPage 说明:明确"只在你明确给了 URL 时用;时效性问题直接答,别瞎编 URL"
效果:最坏情况从"死循环 + 空回复"变成"最多试两次就停下来正常回答"。
莫名其妙的台词泄漏("主任…尼尼孩孩…major 冠军")
有用户触发了一句完全莫名其妙的话。这是 demo 模式的占位台词——demo 热键功能(Ctrl+Shift+D + 数字键)之前对所有用户都生效,而且默认台词里塞了开发时的占位内容。真实用户焦点不在输入框时按个 '1' 就触发了。
修了:整个 demo 热键功能 gate 在 demo 模式后面。真实用户不会再 seed 这些台词、也碰不到触发。(之前残留 demos.json 的用户也不受影响——非 demo 模式下直接忽略。)
GPT-SoVITS 本地语音的 .env 兜底(开发/录制向)
给本地跑 GPT-SoVITS 的用户加了个便利:选了 GPT-SoVITS 后端时,如果 Settings 里参考音频 / 参考文字字段是空的,自动从 .env 的 SOVITS_REF_AUDIO / SOVITS_REF_TEXT 等读。省得每次 demo 重来都要手填。普通用户没 .env,无感知;选别的引擎也完全照常。
邮件折叠在 demo 模式下不生效
之前加的"促销/通知邮件自动折叠"会把 demo 用的展示邮件也折叠掉。现在 demo / 假邮件模式下关闭折叠,所有邮件逐封展示;真实邮箱照常折叠。
v0.3.4 — 紧急修复:升级用户记忆崩溃 (no such column: kind)
紧急修复:升级用户记忆系统崩溃(no such column: kind)
如果你从 0.3.0 之前的版本升级到 0.3.x,可能在设置里看到:
记忆模块初始化失败 / 未启用。
no such column: kind
这一版修了。 升级后记忆系统会自动恢复,你的聊天历史、好感度、提炼的事实全部都在,没有丢。
出了什么事
0.3.0 加 lore 系统时,给 episodes 表加了个 kind 列 + 对应索引。但索引的创建语句被错误地放在了建表块里(在加列的迁移之前执行)。
对于全新安装:建表时 kind 列就有,没问题。
对于从旧版本升级的用户:建表是 no-op(老表没有 kind 列),然后建索引时引用了还不存在的 kind 列 → 抛 no such column: kind → 整个记忆模块初始化崩溃。加 kind 列的迁移本来排在后面,但根本没机会执行。
讽刺的是,那段代码顶部的注释自己就写着"索引必须放在列迁移之后"——0.3.0 加 kind 索引时违反了这条规矩。
修复
- 把
idx_episodes_kind索引从建表块里挪走 - 放到 kind 列迁移之后无条件创建(幂等,兼顾全新安装和升级两条路径)
- 加了回归测试
smoke-memory-upgrade.mjs:模拟一个 0.3.0 之前的数据库(无 kind 列),跑完整初始化路径,验证不崩 + kind 列补上 + 老数据保留为 'chat' + lore 功能正常。6/6 通过。
影响范围
只影响从 < 0.3.0 升级的用户。全新安装 0.3.x 的用户不受影响(建表自带 kind)。如果你之前看到这个报错,升到 0.3.4 后记忆自动恢复,不用手动清空或重装。
v0.3.3 — Kimi 联网 · 邮件折叠 · 总结文档 · 表情节奏匹配
一次小迭代 · 主要是邮件折叠 + Kimi 联网 + 文档总结
Kimi $web_search 联网搜索(之前不支持)
之前选 Kimi 作为 AI backend,"联网搜索"开关会被显示为不兼容("Kimi $web_search 协议与流式客户端不兼容")。这版改了——通过 fetch 双向 munging 让 Kimi 的 server-side 搜索能正常通过 Vercel AI SDK 的流式解析。
- 请求侧:往 body 注入
$web_searchbuiltin function tool entry - 响应侧:SSE 流里
type:'builtin_function'的 tool_call chunk 在到达 Vercel 解析器之前被剥掉。Moonshot 服务端自动执行搜索,模型继续输出 grounded 回答
Settings → AI → 联网搜索:Kimi backend 的 capability 改成 ✓ Kimi $web_search(服务端执行)。Gemini / GLM 之前就有,现在加上 Kimi 三家都齐。
邮件自动折叠促销/通知(之前会逐封展开)
之前看邮件,她会把订单确认、AliExpress 促销、Medium 周报、LinkedIn 通知都一封一封列出来——信号被淹没。
这版只改 listRecentEmails 工具描述加了一段:"从 from / subject / snippet 你能看出来哪些是营销邮件 / 订阅推送 / 自动通知,把它们合并成一行计数总结,不要逐封展开。值得用户决定怎么处理的(真人邮件 / 回信 / 询问)才逐封展开。"
实现思路:让 LLM 自己判断哪些是垃圾邮件,不在代码里写 regex / 关键词列表。LLM 本来就在读邮件,让它顺手分类比写一堆规则更准确、更适应新场景。
实测 DeepSeek 给出的输出长这样:
**需要主人关注的工作邮件(共 7 封):**
1. [P2 告警] api-gateway 5xx 率 0.62% ...
2. Erin · Re: 周三现场部署 — 催发 VPN 的 SSO 帐号
...
**订阅 / 通知 / 营销邮件(共 5 封,已折叠):**
- LinkedIn 猎头查看 · AliExpress 大促 · Medium 推荐 · 淘宝订单 · InfoQ 周刊
总结文档 chip + PDF 支持
主界面快捷 chip 把"✨ 总结一下"(之前作用是"总结今天聊了什么",使用率低)换成"📄 总结文档":点 → 模型弹文件选择器 → 选 PDF / Word / 文本 → 总结 3-5 条要点 + 3 个值得追问的问题。
新增 PDF 支持:之前 readFile 工具明确拒绝 PDF("PDF 暂时不支持"),现在走 pdfjs-dist legacy build 抽纯文本。丢失版式和图片,但保留全部文字内容用于 LLM 总结。
表情持续时间随回复长度
之前 Live2D 表情默认挂 8 秒,不管她说一个字还是一段话。这版加了文字长度感知:每字约 220ms + 1.5s 收尾 buffer,钳在 [3s, 25s]:
- 短回复("嗯。")→ 表情挂 3 秒
- 中等段落(30 字)→ 8 秒
- 长段(80 字)→ 19 秒
- 长篇大论(200+ 字)→ 25 秒(封顶)
效果:表情和说话节奏对上了,不再有"她已经说完半天表情还在那里挂着"或"她刚开始说表情就消失了"的脱节感。
妹妹默认好感度 20(之前从 0 起步)
妹妹是发小设定,从"陌生人 Lv.1"开始违反人设。这版改成 per-persona 初始值:
- maid / butler / ojou / 自定义:默认 5(保持"才到岗的新人"陌生感)
- imouto:默认 20(已经熟,但还没那么亲)
- API 设置成功 +5 庆典 → 妹妹 25(Lv.2 中段)
新装用户选妹妹立刻就能感受到"哥你回来啦"的语气,不用先聊几十轮把好感度刷上来。
其他小修
- 末尾乱码 backtick:模型偶尔结尾输出
`/``` ``——是流式过滤器没处理孤立的 fence opener。修了:尾部 2+ 个 backticks 在 flush 时丢弃,单个 backtick 保留(合法的 inline-code 标记) - "没配 AI" banner 字体融背景:实色 amber pill + 深棕字(之前的半透明亮字在深色 chat 面板上看不清)
- Settings → 人物 → 好感度小数太长:persona chip 现在
Math.round(score),不再显示❤️22.4732948... - 去掉"预制台词"面板:本来给 advanced user 编辑
lines.json,但对普通用户太复杂。功能保留(高级用户直接编辑%APPDATA%/openmeido/lines.json即可),UI 入口删了 - Wizard butler → imouto:首次安装的二选一从"女仆 / 管家"改成"女仆 / 妹妹"——管家还没打磨到首屏推荐质量。管家在 Settings → 人物 还能选
- UI 不再 hardcode "女仆":banner / 输入框 placeholder / 侧栏 placeholder 都根据当前 persona 显示对应名称
- 测试默认只跑 DeepSeek:smoke test 不再默认 4 backend 并行烧 token,跑全套用
TEST_ALL_BACKENDS=1
升级体验
从 0.3.2 升级走 electron-updater blockmap delta,估计 5-15MB 增量(这一版主要改 JS 逻辑 + tools,资源没动)。国内用户记得在 Settings → 关于 → 下载源切到 ghproxy。
v0.3.2 — 删 Haru 模型,安装包 337MB → 270MB
安装包再瘦一刀(337MB → 270MB)
把 Haru Live2D 模型从默认 bundle 里删了——69MB raw,压缩后省了 67MB。
从 0.3.0 起累计减重:400MB → 270MB(-32.5%)。
为什么删 Haru:
- 默认 maid → 用 hiyori(精致版女仆)
- 默认 butler → 用 natori(成熟英伦男)
- Haru 是另一个女性形象,但她跟 hiyori 重合度高,绝大多数用户用不到
- 想要她的用户从 Live2D 官方样本库下载即可(30 秒的事)
想要更多 Live2D 模型?
Settings → Live2D,在"导入 zip"下面加了官方样本库链接:
下载任意 zip(Haru / Hiyori 不同版本 / Mark / Wanko 等),导回来一键加载。
升级注意
已经安装过 Haru 的老用户:你的 userData/live2d-models/haru_greeter_pro_jp/ 保留不动。Haru 还在你那里,照常使用。
新装用户:默认看不到 Haru。想要的话去 sample 库下载导入。
Delta 升级体感
0.3.1 → 0.3.2 只是删了静态资源 + 改了一行 UI 文案。delta 应该非常小(< 5MB),秒到。
v0.3.1 — 安装包瘦身 400MB → 337MB
安装包瘦身 ~63MB(400MB → 337MB)
之前 0.3.0 安装包接近 400MB。这版从 onnxruntime-node 里砍掉了用不上的死重,最终安装包 337MB(NSIS LZMA 压缩比已经很高,所以最终节省没有原始体积那么夸张,但是实打实的减少):
- 删 macOS binary(~75MB)—— 我们只发 Windows 包
- 删 Linux binary(~75MB)—— 同上
- 删 Windows ARM64 binary(~65MB)—— 我们只发 x64
- 删 DirectML GPU 加速 stack(~37MB,
DirectML.dll/dxcompiler.dll/dxil.dll)—— 我们走 CPU 推理(transformers.js + ONNX CPU provider),不用 GPU
完全不影响功能:CPU 推理速度和之前一模一样,长期记忆 embedding / 模型加载等等照旧。
配合 0.3.0 的 delta 升级
从 0.3.0 → 0.3.1 这次升级走 electron-updater 的 blockmap delta 机制,只下变化的 chunk,预期 5-20MB 而不是 200MB 全量。已经装 0.3.0 的用户应该体感很快。
后续可能继续瘦身的方向(暂未做)
- 字体只默认打 xiaolai,其他懒下载(省 ~15MB)
- Haru Live2D 模型改为可选下载(省 ~69MB)→ 安装包能进一步降到 130MB 左右
如果觉得 337MB 还是大,告诉我,可以做。
给国内用户的提示
如果是从 0.2.x 升级到 0.3.x 的第一跳(没有 blockmap 可比对),还是要下完整安装包。但 0.3.0+ 加了 Settings → 关于 → 下载源 切换,国内用户可以切到 ghproxy 镜像,速度从几十 KB/s 提到 1-5 MB/s。
v0.3.0 — 角色有了内心 · 妹妹 persona · ghproxy 国内镜像
角色有了"内心"——女仆 / 妹妹 都不再是 ChatGPT 套皮
这一版重写了 OpenMeido 的角色塑造方式。之前选 maid 拿到的就是"穿女仆装的 GPT-5",温顺、礼貌、什么观点都没有。这次开始给她真实的内心,每个 persona 都有自己天然契合的关系背景。
主要变化
Wizard 改成 女仆 / 妹妹 二选一
- 之前是女仆 / 管家。管家还没打磨好,先撤掉
- 妹妹是新加的主推 persona——发小设定(从小一起长大、毒舌爱顶嘴、心软是真心的)
每个 persona 各有"关系背景"(自动种入,不用配置)
- 女仆:才到岗的新人。"主人是我接的第一份工,我到岗不久" → 紧张拘谨,对你还在熟悉,分寸感是她的安全感
- 妹妹:从小一起长大。"我家族三代侍奉主人家,我从 6 岁起就跟在主人身边" / 兄妹设定 → 默认就熟,不用从零建立关系
两层记忆体系
- 锚点 facts(3 条/persona,always-on):进每轮 system prompt,告诉她"她是谁、和你什么关系"
- lore 记忆碎片(6-7 条/persona,RAG 召回):她内心一侧的细节(镜子前练招呼 / 偷偷藏过桂花蜜 / 玩偶兔耳朵被哥哥用胶带缠回去……)。聊到相关话题才浮上来,平时不污染上下文
关键约束:lore 严格不写"你过去做过什么"——任何编造的"主人那年..."听起来都像 AI 幻觉。只写她自己一侧的内心,玩家不需要"我记得这事"她也能讲。
妹妹默认好感 20(不是从 0 起步)
- 女仆默认 5(陌生服务者)
- 妹妹默认 20(Lv.2 入口·已经熟)
- API 设置成功 +5 → 妹妹 25(Lv.2 中段)
Settings → 人物 → 关系背景(仅 maid / imouto 显示)
- 显示当前已种入的锚点 + 记忆碎片数
- "重新种入她的记忆" 按钮——任何时候清掉旧的、写入当前 persona 的最新预设内容
UI 改进
banner 下载嵌入模型——之前进度条小到看不见,现在全宽橘色 + MB 数 + 当前文件 + 进度百分比
Settings → 关于 → 立即检查更新——之前点了要回到首页看右下角 banner 才能看到下载进度。现在所有阶段(发现 / 下载中 / 已就绪 / 安装)都在原地显示
UI 不再 hardcode "女仆"——主界面 banner、输入框 placeholder、busy 提示、侧栏 placeholder 都根据当前 persona 显示对应的名称(妹妹 / 大小姐 / 管家 / 自定义)
自动更新加国内镜像源
国内用户从 GitHub Releases 直连下 ~70MB 安装包经常卡到几十 KB/s,要 10 分钟以上。这版加了 ghproxy 镜像支持。
- Settings → 关于 → 版本与更新,底下新增"下载源"切换:
- GitHub(默认)官方源,海外更快
- ghproxy(国内镜像)大陆 1-5 MB/s
- 切换即时生效,不用重启 app。下次检查更新走新源
- 同样的 .exe + 同样的代码签名——ghproxy 只是 transport,不修改包内容
国内卡的用户去 Settings 切到 ghproxy 就好。后续如果发现 ghproxy 也不稳,再考虑加我们自己的对象存储镜像。
Bug 修复
banner 跟 Settings 状态打架:之前下完模型 banner 还在催下载。根因是 main 进程内的 naiveMode flag 没翻 + 没广播。修了:exitNaiveMemoryMode 现在自动广播到所有窗口;isNaiveMemoryMode 调用时自检文件状态自愈
"全部清空"不删长期记忆模型:root cause 是显式删 hf-cache 目录的逻辑没有,依赖 readdir 迭代偶尔漏掉。修了:显式删 hf-cache / live2d-models / fonts / backgrounds 4 个重模型目录,配合详细日志
wizard 偷偷下载嵌入模型:seedLoreEpisode 在 naive 模式下会触发 transformers.js 的 remote fallback 偷偷下载 ~50MB,导致 banner 进度条根本看不到(点下载时文件已经在硬盘)。修了:naive 模式下跳过 lore 写入,让用户从 banner 显式下载
spending 模式选了童年契约女仆"不认识我":旧版本锚点 fact 写在第三人称("她家族三代...")并塞到 "[关于用户的已知事实]" header 下——模型把这些当成关于第三方"她"的属性,不内化成自身身份。修了:拆出独立的 "[你的身份与关系背景]" header;anchor 值全部第一人称("我家族...")
Gemini multi-step tool 报错:"function call turn comes immediately after a user turn..."——@ai-sdk/google 把 assistant {text + tool-call} 拆成两个连续 model turns 触发。修了:发给 Gemini 前剥掉 assistant 消息里的 text 部分,只留 tool-call
Memory 数据库 schema 迁移:episodes 表加 kind TEXT NOT NULL DEFAULT 'chat' 列;老数据自动落到 'chat',lore 写入用 'lore'。recent / sessions / count 过滤只显示 chat,KNN 搜索两类都召回(lore 才能 RAG 浮起来)。配套加 clearLore / deleteFactsByKeyPrefix / countLore API
升级注意
老用户升级会保留所有聊天记录和好感度。但新的 lore 系统需要重新种入:
- 选 maid 的用户:Settings → 人物 → 关系背景 → 点 "重新种入她的记忆",会写入"我才到岗的新人"档
- 想试试妹妹:Settings → 人物 切换到妹妹,关系背景会自动配套
如果嫌麻烦想从零开始:Settings → 危险操作 → 全部清空(这次真的会删干净 hf-cache 等)。
v0.2.8 — Gemini 报错修复 + 闲聊话题展开
Gemini 报错 + 闲聊话题踢回去 两个修复
1. Gemini:"function call turn comes immediately after a user turn..."
如果你的 AI 选的是 Gemini(gemini-2.0-flash / 2.5 等),在某些多步工具调用(看邮件→读邮件→总结)的时候,会偶发性蹦出这个红字报错。
根因是 Vercel AI SDK 把 assistant {一段话 + 工具调用} 翻译给 Gemini 时,会拆成两个连续的 model turn(先纯文字、再纯 functionCall),Gemini 拒收。OpenAI/Anthropic 宽松,所以一直没事,Gemini 是严格派。
修:在发给 Gemini 之前,把 assistant 消息里同时含工具调用和文字的,把文字部分剥掉,只保留工具调用。等于让 maid 在调工具前不说话——本来 system prompt 就是这么要求的,所以损失基本为零。
万一边缘 case 还触发,错误提示会换成"Gemini 拒绝了消息序列…可以临时换 GLM/Qwen/Doubao"的友好版,不会再看到一行裸的 API 报错。
2. 说"随便聊聊"她不接茬
之前如果你说"跟我随便聊聊吧",maid 会回"好的,您想聊什么尽管告诉我"——把球踢回来,等于没聊。这是 LLM 默认的"礼貌助理"反射。
修:renderer 加了一个 macro 表,几个常见闲聊触发短语("随便聊聊"、"跟我聊聊"、"陪我聊会儿"、"跟我随便聊聊吧")在发给模型前会偷偷展开成"你先开个话题——聊看到的、想到的、或者好奇问我点什么"的明确指令。
你聊天框里看到的还是你输入的短句,model 那边收到的是完整指令。下次再敲"随便聊聊",她应该会主动起话题,而不是干等。
要加新的 macro(比如"夸夸我"、"测试一下"),编辑 src/renderer/src/App.tsx 的 USER_MACROS 表即可,不污染 system prompt。
v0.2.7 — 邮箱正文读不到的修复
邮箱读不到正文的修复
之前几个版本里,如果邮件是 HTML-only(AliExpress / Uber / 验证码邮件 / 银行通知 — 现在大多数营销和事务邮件都是这样),打开邮件正文是空的,maid 不知道里面写啥,没法总结也没法回信。
根因是 mailparser 对 HTML-only 邮件 parsed.text 是 undefined(没有 text/plain part),代码只读了 text。
修:加 fallback——先看 parsed.text,没有就找 parsed.textAsHtml,再没有就自己剥 HTML 标签。AliExpress 的促销邮件实测从 0 字变成 1345 字可读文本。
如果你用 Gmail / Outlook / 网易 + 任何 IMAP 邮箱,这次更新后邮件功能恢复正常。
v0.2.6 — 冷启动 banner 文字对比度修复
冷启动 banner 文字看不见的修复
v0.2.4 加的"还没配置 AI"banner 文字色对比度不够,在 chat 面板半透明深色背景上几乎隐形。这版加深文字 + 加重背景 alpha,看得清楚了。
仅 UI 颜色调整,没动逻辑。
v0.2.5 — Demo 模式
Demo 模式(开发者向)
加 --demo flag 启动 → 自动切到独立的 openmeido-demo/ userData 沙箱:
- 真实安装的数据完全不动
- 自动用 fake 邮箱(合成内容,没真实邮件泄露)
- 预先种好 L3 facts + Lv.3 熟络好感度 + 3 个 demo 任务,演示一开就是"她已经认识你"的状态
- 顶部居中 🎬 DEMO 紫色药丸常驻,让录屏观众一眼知道这是演示
启动方式:
- Dev:
npm run dev:demo - 打包后: 桌面创建
OpenMeido.exe --demo的快捷方式
退出 --demo flag 即回到真实安装,两边完全隔离。