Skip to content

Releases: lshhhhhhh/OpenMeido

v0.3.5 — readWebPage 死循环修复 · demo 台词泄漏 · SoVITS .env 兜底

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 26 May 04:21

修几个真实用户反馈的问题

readWebPage 死循环 → 一个字都答不出来

有用户问时效性问题(比如"现在比特币多少钱"),结果女仆疯狂调用 readWebPage 十几次、最后什么都没回。

测下来根因:web_search 本身是好的(单独用能给实时数据),但函数工具在场时 GLM 的选择行为出问题——它不用自动联网搜索,反而去调 readWebPage 瞎编 URL,抓取失败后反复换 URL 重试,步数耗尽,回复为空。

修了三层:

  1. 重复调用拦截:同一工具 + 同一参数一轮内重复 → 短路,逼模型停手直接回话
  2. readWebPage 单轮次数上限:挡"每次换个 URL"的循环(readEmail 这种需要多次的不受限)
  3. 收紧 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 里参考音频 / 参考文字字段是空的,自动从 .envSOVITS_REF_AUDIO / SOVITS_REF_TEXT 等读。省得每次 demo 重来都要手填。普通用户没 .env,无感知;选别的引擎也完全照常。

邮件折叠在 demo 模式下不生效

之前加的"促销/通知邮件自动折叠"会把 demo 用的展示邮件也折叠掉。现在 demo / 假邮件模式下关闭折叠,所有邮件逐封展示;真实邮箱照常折叠。

v0.3.4 — 紧急修复:升级用户记忆崩溃 (no such column: kind)

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 25 May 21:53

紧急修复:升级用户记忆系统崩溃(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 联网 · 邮件折叠 · 总结文档 · 表情节奏匹配

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 10:32

一次小迭代 · 主要是邮件折叠 + Kimi 联网 + 文档总结

Kimi $web_search 联网搜索(之前不支持)

之前选 Kimi 作为 AI backend,"联网搜索"开关会被显示为不兼容("Kimi $web_search 协议与流式客户端不兼容")。这版改了——通过 fetch 双向 munging 让 Kimi 的 server-side 搜索能正常通过 Vercel AI SDK 的流式解析。

  • 请求侧:往 body 注入 $web_search builtin 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

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 09:18

安装包再瘦一刀(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"下面加了官方样本库链接:

live2d.com/learn/sample

下载任意 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

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 09:10

安装包瘦身 ~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 国内镜像

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 09:02

角色有了"内心"——女仆 / 妹妹 都不再是 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 报错修复 + 闲聊话题展开

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 06:22

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.tsxUSER_MACROS 表即可,不污染 system prompt。

v0.2.7 — 邮箱正文读不到的修复

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 06:02

邮箱读不到正文的修复

之前几个版本里,如果邮件是 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 文字对比度修复

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 03:00

冷启动 banner 文字看不见的修复

v0.2.4 加的"还没配置 AI"banner 文字色对比度不够,在 chat 面板半透明深色背景上几乎隐形。这版加深文字 + 加重背景 alpha,看得清楚了。

仅 UI 颜色调整,没动逻辑。

v0.2.5 — Demo 模式

Choose a tag to compare

@lshhhhhhh lshhhhhhh released this 24 May 02:42

Demo 模式(开发者向)

--demo flag 启动 → 自动切到独立的 openmeido-demo/ userData 沙箱:

  • 真实安装的数据完全不动
  • 自动用 fake 邮箱(合成内容,没真实邮件泄露)
  • 预先种好 L3 facts + Lv.3 熟络好感度 + 3 个 demo 任务,演示一开就是"她已经认识你"的状态
  • 顶部居中 🎬 DEMO 紫色药丸常驻,让录屏观众一眼知道这是演示

启动方式:

  • Dev: npm run dev:demo
  • 打包后: 桌面创建 OpenMeido.exe --demo 的快捷方式

退出 --demo flag 即回到真实安装,两边完全隔离。