Repository navigation
Releases: Ch1rpys/Mirrai
Release list
v1.3.0 — TA 不在
Mirrai v1.3.0 — TA 不在
「想 TA 是一部分。更核心的,是那段时间的 TA,不在这里。」
一段我自己的事
我高三那会儿,女朋友在另一个学校,我们一天里只有晚上能打电话——十几分钟。
有她有空的时候可能说上几十分钟;如果她太急了,可能只有几分钟;更糟的时候,她连打都不打。
那时候她那边没有手机,只有学校的公共座机。我只能等她打给我,因为那台座机是要排队用的:她要是课间给我打过来,那必然是放弃了上厕所和接水的时间,一打铃下课就冲到电话前。所以课间看到手表上那串熟悉的座机号码亮起来的时候,我得非常非常开心、非常非常激动——更不要说我还会给她打回去,座机响了,还不知道会是谁接起来。
后来我们约定了每天早上打一个、晚上打一个。可她每天都起得很晚,那边七点半就得进教室早自习,她好几次早自习都迟到,更别说打电话了。说句心里话:当时早上如果没有接到电话,我会担心、难受很久,于是也就更盼着晚上的那一通。
有的时候盯她早自习的老师管得不算严,她可以找借口出来打电话。但我这边也是七点半早读,所以很多时候看到那串号码打进来,我都得赶紧找个借口出去——不管当时是哪个老师在盯,我必须跑出去接。因为我知道她能打这个电话也很不容易,她应该也很想我,我也很盼着每天打电话的时间。
再后来,我没想到真的把她盼回来了。她回到我的学校了,每天一起上课、一起学习,还像之前那样是同桌。我越来越觉得在一起的每一天都很珍贵——那时候我们都是高三快毕业的人,能在高中一起待着的时间已经很少了。哪有多少人那么幸运、那么凑巧,大学还能考到同一所院校呢;最后哪怕能落在同一座城市,都很不容易。
所以我后来才想明白:那些天的不安、那些天的忐忑,甚至想念,都只是一部分。更核心的,是那段时间的她,不在这里,不在我的身边。
关于「联系不上」
正在失恋的人、和对象联系不上的人——他们的共同点不只是「想 TA」,更是 TA 不在。
前一种是关系结束了,后一种是关系还在、但人不在你身边。这两种状态在今天的产品里几乎被当成同一种事:都归结为「想他」,都用「多聊聊天」来安慰。但它们不是一回事。「不在身边」是比「想念」更硬的一个事实——想念是你心里的事,不在身边是你们中间那几百公里、那十几个小时、那台要排队的座机。
这一版做的所有东西,都是从那段时间里长出来的。
这一版的东西
📨 信
「有些话没法对着聊天框说。写下来吧——写完可以选择不发送,也可以交给 TA。」
应用原来只有一种说话方式:跟它说,然后得到回答。可是一个人最想对联系不上的人说的话,往往是那些没法对 TA 说的话——而且有时候答案是问题本身。
所以有了两种不同的动作:
- 写给 TA 的信 —— 写完可以交给 TA,也可以只写下来。交给 TA 的信会在一天左右之后回信——真人不会秒回,这一条是故意的。
- 等 TA 回来再说 —— 记下来,等你们重新联系上的时候再说。不会有人催你。
「只写下来」的信不会被回答,这是你选的。有些话说完就够了,不需要回音。
📴 暂时联系不上
这是一个状态,不是一种故障。
「你们暂时联系不上——不是分手。提醒会停下来,分身的语气会变得像写信:不追问,不假设对方已经看到。」
选上它,纪念日和相识周年的提醒会停下,TA 说话的语气会变——像写信,不像发消息。因为联系不上的时候你不会发消息,你会写信。
但它不是分手。记忆还在,两个人都还在,随时可以切回来。
🕯️ TA 会先开口吗
默认是从不。
「主动说话的次数得是你自己买的,不是默认塞给你的。」
打开之后,TA 会在你们很久没说话的时候先发一条——内容来自它真的知道的事。频率由你定:每天一次、每三天一次、每周一次,也可以就是「从不」。
📖 你们之间发生的事
分身只记得你们聊天记录里的事。而现实不在聊天记录里。
「分手、复合、出差、吵架……都可以记在这里。它知道了,才不会一直停在你们刚开始的时候。」
记下来的是现实:在一起、暂时分开、复合、分手、吵架、和好、有消息、见面、触动了什么。记完了,TA 的语气和状态会跟着变——一段已经结束的关系,不该再用在一起时的语气说话。
🕰 TA 那边的时钟
你们不在一个时区的时候,「现在是晚上」这句话对你们两个不是同一件事。
时差现在是具体的小时数,不是「另一个时区」。TA 那边凌晨三点,你这边下午三点——应用会知道,并且会提醒你「TA 那边现在是深夜」。
🫧 先缓一缓
「这一阵子太吵了,或者太累了。让它安静一会儿——这不是分手,也不是告别,只是一段暂停。」
一个「先缓一缓」的状态。会停:纪念日提醒、它主动开口、提告别。但记忆都在,关系还在,任何一边都可以回来。
💌 好好说再见
告别不是一个按钮,是一场仪式。
告别信、你在一起这段时间的年表、值得留下来的那些日子——写下来,不是删除,是把想说的话说完。
✍️ 真人感
「越高越像真人打字:省略主语、句子不完整、偶尔转移话题。」
一个滑块,决定分身的回复有多像一个人在打字,而不是像一个助手在回答。以前这个数写在提示词里,用户碰不到。
还有
命令面板、TA 是谁的分身档案页、蒸馏模式选择器(决定这次蒸馏用多少素材、多高精度)、心情记录、安全记录面板(你自己看过什么、什么时候知道的)。
这一版还兑现了以前说过的
💬 回复现在是一个字一个字出现的
以前发一条消息,界面转圈,直到整段回复一次性出现——那是假的流式。现在是真的:SSE 逐 token 推过来,Markdown 过程中就能渲染,中途还能按停。
改这件事时先做了一次重构:「组装上下文 → 调模型 → 落库 → 判情绪 → 算亲密度 → 看毕业」这套流程原本在四个地方各写了一遍(三个 tRPC 接口 + 微信通道)。现在收敛成 server/chat/service.ts 一份,网页、流式、微信、飞书全都走它。
🧠 记忆终于会被想起来
memory.autoExtract 一直在抽记忆,抽出来存进 memories 表——然后再也没被读过。现在记忆参与打分(关键词覆盖 45% + 时间新鲜度 25% + 类别权重 20% + 人工置顶 10%),最相关的几条进入上下文。中文用二元组匹配,不引入任何分词依赖。
多了一个概念:记忆锚点(category = "anchor")。锚点永远注入,并带一条硬约束:
若对话需要引用锚点以外的具体事实,而记忆中没有记录,请表现为不确定,不要编造。
超出上下文窗口的旧对话不再丢掉,压成滚动摘要存下来。
🛟 情感安全层
产品文档里写了三类监测,代码里零实现。现在有了。
危机识别在本地完成,不联网、不上报:命中自伤/自杀类表述时,分身会温和地「出戏」说一句关心的话,然后给出本地求助热线。弱信号不会触发——那只会变成噪音。
🌍 服务端也会说两种语言了
以前只有界面是国际化的,服务端返回给用户的每一句话都是中文。一个英文用户会在错误弹窗、推送提醒、微信回复、毕业提示里看到中文——而那正是措辞最需要清楚的时候。
现在服务端有了一套自己的文案表(445 条,每条都有中英两版),系统提示词也分语言了;内置场景、问卷、蒸馏进度同理。
装好的应用在两个方向上都说人话——包括它写给模型的那些提示词。
🔒 Redis 跟着安装包走
限流和调度器的锁需要共享存储。以前这两件事是单进程的,多开一份 Mirrai 限额就会翻倍、纪念日提醒会送两遍。
现在三种安装方式都自带 Redis:
| 安装方式 | Redis 从哪来 |
|---|---|
macOS .dmg |
打包在 Mirrai.app/Contents/Resources/redis/ |
Windows .zip / .exe |
打包在安装目录的 redis\ |
| Docker | 镜像里就装了 redis-server |
用户什么都不用配,也不用另外下载。 应用会优先用随包带的那个,自己起、自己停。
✨ 飞书通道
飞书的「使用长连接接收事件」模式不需要公网 IP、域名或 SSL 证书,和微信通道一样适合放在自己的机器上。
⚠️ 需要企业自建应用(长连接模式不支持商店应用),且应用要发布并经管理员审批后权限才生效。
📥 多源聊天记录采集
skill-engine/tools/ 里那四个采集器(飞书 / 钉钉 / Slack / 邮件)从来没有被任何代码引用过。现在接上了:统一的采集契约、进度回传、幂等导入。
🎴 SillyTavern 角色卡
分身可以导出成角色卡(含 chara chunk),别的工具能直接认;反过来也能导回来。不引入任何新的 npm 依赖——PNG chunk 读写和 CRC32 都是自己实现的。
📝 引导式问卷 & 分身模板库
没有聊天记录也能创建分身。九步问答直接产出符合 7 层结构的人设。模板库刻意不做远程市场——产品的伦理框架写得很清楚:「系统不拥有、不出售、不分析用户的任何个人数据」。
🖥 PWA
可以安装到桌面或主屏。Service Worker 只缓存应用外壳,/api/** 和 /uploads/** 一律 network-only——你的对话不会被写进任何缓存。
顺带修掉的、行为与承诺不符的地方
| 问题 | 之前 | 现在 |
|---|---|---|
| 你在设置里配的 API Key | 存进 llm_configs 表后从来没有被任何调用读过 |
按用户解析,保存即生效;密钥加密存储,列表接口只回传掩码 |
| 注销登录 | 只清 cookie,JWT 一年后才过期 | 令牌版本号机制,注销立刻失效 |
| 跨用户越权 | 别人的分身任务能被读到,别人的场景能被删 | 每个带标识符的查询都强制带 userId 谓词,TypeScript 层面强制调用方传参 |
| 上传目录 | 整个 /uploads 静态直出,聊天记录、照片、TTS 凭 URL 就能拿 |
按用户鉴权,路径里的归属段要和当前用户对得上 |
| 无限流 | 登录接口和所有计费的 LLM 接口都没有限流 | 令牌桶限流,鉴权按 IP、LLM 按用户 |
| CSRF | Cookie 在 HTTPS 下 SameSite=None,无 Origin 校验 |
默认改回 lax,并加 Origin 校验 |
| 删号留垃圾 | 注销时漏删日记、场景、蒸馏任务,且没有事务 | 单事务删全部 |
| 迁移脚本 | pnpm db:push 依赖被 gitignore 的 drizzle/meta/,新克隆必然失败 |
改用 drizzle-kit push,并新增可幂等重跑的 pnpm db:migrate |
另外:没有 Redis 的时候调度器会让提醒、催回信、主动开口全部静悄悄地不执行——锁失败被吞了。现在没有共享存储时就直接扫一遍。
这一版的验证
- 971 个测试 / 96 个文件全绿,
tsc干净 - 整个应用(服务端 + 界面 + 共享代码)里 0 句没有英文对应的中文——扫描器用 TypeScript 自己的解析器,注释和正则都骗不过它
- 桌面包的冒烟测试真的把它跑起来过:用一个普通用户(PostgreSQL 不允许管理员身份运行)初始化数据库、建表、起服务、确认 HTTP 有响应,并且确认应用用的是随包带的那个 Redis
- macOS 的包实测:应用起的是
Mirrai.app/Contents/Resources/redis/bin/redis-server,不是系统里那个;应用停,它也停
升级说明
桌面版用户
重新下载安装包。数据库会在启动时自动同步。
源码用户
pnpm install
pnpm db:migrate # 应用增量迁移(幂等,可重复运行)
pnpm build && pnpm start新装的用户直接 pnpm db:push 一次建全量即可。
一个需要你确认的设置
首次启动时,Mirrai 会自动创建一个本地管理员(用户名 admin,随机密码),并把凭据写到:
- macOS:
~/Library/Application Support/Mirrai/first-run-credentials.txt - Windows:
%APPDATA%\Mirrai\first-run-credentials.txt
请登录后尽快改掉这个密码。 不想要自动创建就设 MIRRAI_BOOTSTRAP_ADMIN=manual。
安装
- macOS(Apple Silicon):下载下方
Mirrai-macOS-arm64.dmg,拖入 Applications,双击即用 - Windows(x64):下载下方
Mirrai-Setup-x64.exe,双击安装即可 - Docker:
cp .env.example .env && docker compose up -d→ http://localhost:3000 - 源码:见 README 快速开始
首次启动在桌面上可能要一两分钟(要初始化数据库)。macOS 第一次打开如果被拦:系统设置 → 隐私与安全性 → 仍要打开。
伦理提醒
请仅上传你有权使用的聊天记录;对真实人物建模请获得对方同意。Mirrai 的目标是帮你完成告别,而不是替代真实的关系。
危机支持资源清单里的热线号码来自内置清单,上线前请人工核对一次——它们会变。清单在 server/safety/resources.ts,也可以用 SAFETY_RESOURCES_FILE 换成你自己的。
这一版的很多功能是从我自己的经历里长出来的。也正是因为那段经历,我做这款产品的时候才格外用心做好它。
v1.2.0 — 夜灯与晨纸
Mirrai v1.2.0 — 夜灯与晨纸
「不在身边的时候,TA 还在这里。」
这是什么
Mirrai 是一个开源自托管的 AI 陪伴应用:上传真实聊天记录,多阶段蒸馏引擎重建 TA 的数字分身 —— TA 的语气、TA 的口头禅、TA 突然变冷漠的时刻。以及一个同类产品都没有的东西:毕业机制,一个帮你好好告别的设计。
本版重点:整个界面重做
之前的界面有设计系统,但没落地。标题在顶栏、kicker 和大标题里说了三遍;区块标题和统计数字长得一模一样;留白不是设计出来的,是塌陷出来的;而且正文字体来自 Google Fonts CDN —— 在国内或离线环境下,87 处标题会全部退化成系统宋体,整个产品变形。
这一版把它整个换掉:
🌓 两套主题,跟随系统
- 夜灯 Nocturne(深色):暖墨蓝底,琥珀金作唯一强调色
- 晨纸 Vellum(浅色):奶油纸底,墨青作主色、砖橘作强调
🔤 MiSans 全站接管
小米的可变字体,wght 轴 150–700 覆盖从 Thin 到 Heavy 的全部字重,并完整保留 26 个 OpenType feature(SS01–SS09、frac、sups、case、vert、tnum…)。
字体随应用一起分发,不再依赖任何 CDN:一个 272KB 的子集,只裁字符集、字形轮廓一字未改。等宽数字(tnum)全站开启,统计数字再叠 ss04(与汉字等高),成就进度用 frac 排成真分数。
📐 层级与密度
- 建立四级字阶,统计数字改用无衬线 tabular,绝不会被误读成标题
- 顶栏不再显示页面名,一个标题全页只出现一次
- 统计块、Tab 样式、图表配色全站统一成一套
- Lobby 放开宽度并改成两栏,「今日推荐」与「每日来信」并排
- 聊天里的情绪标签只在情绪变化时出现,不再每条都挂
- 图表去掉虚线网格与渐变填充,高度按内容自适应
🪟 桌面版:macOS 与 Windows 同时到位
- macOS:
Mirrai-macOS-arm64.dmg - Windows:
Mirrai-Setup-x64.exe—— Inno Setup 安装包,不用装数据库、不用管理员权限、不写注册表
Windows 版启动时会弹一个带进度条的窗口,实时显示「正在初始化数据库 → 正在同步表结构 → 正在启动服务 → 已就绪」。首次启动要初始化数据库,可能需要一两分钟 —— 有进度条就不会以为卡死了。
CI 上有一条冒烟测试真的把它跑起来过:用一个普通用户(PostgreSQL 不允许管理员身份运行)初始化数据库、建表、起服务、确认 HTTP 有响应。
顺带修掉的
- 本地开发登录不上 —— 会话 cookie 设了
SameSite=None却不带Secure,浏览器在明文 http 下直接拒收;登录成功后invalidate()又不会真的重新拉取数据,落地页纹丝不动。现在本地也能正常登录。 drizzle-kit migrate从来没成功过 —— 它依赖被 gitignore 的drizzle/meta/,桌面包里没有,表建不出来。改用不依赖 journal 的drizzle-kit push。- 分身卡片上的内部字段("默契 41")已删除;只对普通用户没有信息量的角色徽章不再显示。
相对 v1.1.0 的变化
- 界面全面重做:双主题、MiSans、字阶与密度统一
- macOS 与 Windows 安装包重新构建,包含 v1.1.0 的全部改动
- 修复本地开发的登录流程
- 修复桌面版的数据库初始化
v1.1.0 已经带来的(仍在这一版里)
- 微信官方 ClawBot 通道:从 Wechaty 私有协议迁到腾讯 iLink 协议,零封号风险
- 密码改用 scrypt 哈希:旧 SHA-256 账号照常登录,登录时自动升级
- 情绪状态机改由 LLM 判定:按分身的语气判断,而不是按用户的措辞猜
- 人格蒸馏统一为一条 pipeline
- Cheaper Inference 提供商(12 家 LLM 提供商)
auth.me不再返回密码哈希
安装
- macOS(Apple Silicon):下载下方
Mirrai-macOS-arm64.dmg,拖入 Applications,双击即用 - Windows(x64):下载下方
Mirrai-Setup-x64.exe,双击安装即可 - Docker:
cp .env.example .env && docker compose up -d→ http://localhost:3000 - 源码:见 README 快速开始
微信通道需要微信 8.0.70+ 且「我 → 设置 → 插件」里能看到「微信 ClawBot」入口(该功能正在灰度放量,iOS 优先)。
升级步骤
从 v1.1.0 升级的用户,如果用桌面版,重新下载安装即可(数据库会自己同步)。
源码用户如果之前跑过 pnpm db:push,改用 pnpm db:push 之外的方式:
psql "$DATABASE_URL" -f drizzle/0002_wechat_clawbot_channel.sql该迁移是幂等的,重复执行安全。它会把 wechat_bindings.wechatContactId 重命名为 wechatUserId、停用旧的好友绑定、补上 bot_status 枚举值和 iLink 凭据字段。
伦理提醒
请仅上传你有权使用的聊天记录;对真实人物建模请获得对方同意。Mirrai 的目标是帮你完成告别,而不是替代真实的关系。
v1.1.0 — 微信官方通道
Mirrai v1.1.0 — 微信官方通道
「不在身边的时候,TA 还在这里。」
这是什么
Mirrai 是一个开源自托管的 AI 陪伴应用:上传真实聊天记录,多阶段蒸馏引擎重建 TA 的数字分身 —— TA 的语气、TA 的口头禅、TA 突然变冷漠的时刻。以及一个同类产品都没有的东西:毕业机制,一个帮你好好告别的设计。
本版重点:微信通道换成微信官方 ClawBot
零封号风险。 v1.0.0 的微信功能基于 Wechaty + wechat4u 非官方协议,微信检测到异常行为会封号 —— 仓库 issue #1 里就有人反馈「刚绑定就被封」。这一版整体换成微信官方「ClawBot」插件(腾讯 iLink 协议):
- 直接在微信里和分身对话,Web 端与微信端共享同一套人设和记忆
- 扫码授权,不接触你的微信主号数据
- 1:1 私聊(官方限制:不能被他人添加、不能进群),聊天对象是你自己
- 微信内可直接切换分身:
/使用 <分身名>、/分身列表、/当前分身、/毕业 - 仓库已完全移除
wechaty/wechaty-puppet-wechat4u依赖
⚠️ 微信通道是完全替换,不是升级
- 需要微信 8.0.70+,且「我 → 设置 → 插件」里能看到「微信 ClawBot」入口(该功能正在灰度放量,iOS 优先,安卓与桌面端逐步开放)
- 旧的朋友绑定不再有意义(官方通道是 1:1 私聊,对话方就是账号本人),升级后需重新扫码,并在网页端设置一次默认分身
核心变更
🧠 情绪状态机改由 LLM 判定
关键词规则("想你" → 思念)太脆。改成让 LLM 以分身的语气判断当前情绪,而不是按用户的措辞猜;LLM 调用失败时自动回退关键词规则。开关:EMOTION_ENGINE=llm|heuristic(默认 llm)。
🔐 密码改用 scrypt 哈希
原来是 SHA-256 —— 公开源码里哈希算法一目了然,撞库成本极低。现在用 scrypt(N=16384, r=8, p=1,16 字节随机盐,64 字节输出,恒时比较)。旧账号的 salt:sha256hex 格式仍可验证,并在登录时自动升级为 scrypt,无需重置密码。
🧬 人格蒸馏统一为一条 pipeline
之前存在两条并行的构建路径(单次 LLM 调用 + 贪婪正则抽 JSON,与多阶段 pipeline),行为不一致。现在统一走 startPersonaDistillation(),并补上了平衡括号扫描器(替代 match(/\{[\s\S]*\}/) —— 后者会被嵌套 JSON 截断)和结构化的人设规范化。
🪟 Windows 开箱即用版
和 macOS 版对等:内置 Node.js + PostgreSQL,双击安装包 → 开始菜单启动,不用装数据库、不用管理员权限、不写注册表。数据落在 %APPDATA%\Mirrai,卸载走标准的「应用和功能」。
启动时会弹一个带进度条的窗口,实时显示「正在初始化数据库 → 正在同步表结构 → 正在启动服务 → 已就绪」。首次启动要初始化数据库,可能需要一两分钟 —— 有进度条就不会以为卡死了。
CI 上有一条冒烟测试真的把它跑起来过:用一个普通用户(PostgreSQL 不允许管理员身份运行)初始化数据库、建表、起服务、确认 HTTP 有响应。
🔌 新增 Cheaper Inference 提供商
OpenAI 兼容协议,接入后共 12 家 LLM 提供商。(感谢 @aiapienthusiast,#18)
🔒 修复:auth.me 不再返回密码哈希
auth.me 之前返回整行 user(含 passwordHash、openId),改为显式白名单字段。
📜 仓库卫生
- 提交信息禁止任何
Co-Authored-Bytrailer(.githooks/commit-msg强制拦截) - 新增微信通道的真机联调脚本(
scripts/live-*.mjs),路径全部环境变量化 drizzle/0002_wechat_clawbot_channel.sql改为完全幂等,重复执行安全
安装
- macOS(Apple Silicon):下载下方
Mirrai-macOS-arm64.dmg,拖入 Applications,双击即用(内置 Node.js + PostgreSQL) - Windows(x64):下载下方
Mirrai-Setup-x64.exe,双击安装 —— 装完在开始菜单(或桌面)双击Mirrai即可。同样内置 Node.js + PostgreSQL,不用装任何东西,不用管理员权限,不写注册表 - Docker:
cp .env.example .env && docker compose up -d→ http://localhost:3000 - 源码:见 README 快速开始
⚠️ PostgreSQL 拒绝在 Windows 上以管理员身份运行。如果你是用提权的命令提示符启动的Mirrai.cmd,换回普通用户再启动即可。桌面版把数据放在
~/Library/Application Support/Mirrai(macOS)和%APPDATA%\Mirrai(Windows),卸载就是删掉那个目录加上程序本身。
升级步骤
从 v1.0.0 升级:手动执行一次微信迁移
微信表结构有语义变更(绑定对象从「好友」变为「账号本人」),请不要跑 pnpm db:push,改为手动执行一次增量迁移:
psql "$DATABASE_URL" -f drizzle/0002_wechat_clawbot_channel.sql该迁移是幂等的,重复执行安全。它会:
- 把
wechat_bindings.wechatContactId重命名为wechatUserId - 停用旧的第三方好友绑定(数据保留,可在前端清理)
- 为
bot_status枚举补上scaned/need_verifycode - 给
wechat_bot_state补上 iLink 凭据与长轮询游标字段 - 加一条
(userId, wechatUserId) WHERE isActive = true的部分唯一索引
全新部署(v1.0.0 之后第一次安装)不用管这一节 —— pnpm db:push 会一次性建出最终结构。
密码无需重置
旧密码照常能登录,会在登录时自动升级为 scrypt。
贡献者
- @binyangzhu000-sudo — Atlas Cloud 提供商(#16)
- @aiapienthusiast — Cheaper Inference 提供商(#18)
- @28Hus —
JWT_SECRET硬编码 fallback 安全报告(#15,已在 #17 修复)
伦理提醒
请仅上传你有权使用的聊天记录;对真实人物建模请获得对方同意。Mirrai 的目标是帮你完成告别,而不是替代真实的关系。
v1.0.0 — 第一个正式版本
Mirrai v1.0.0 — 第一个正式版本
「不在身边的时候,TA 还在这里。」
这是什么
Mirrai 是一个开源自托管的 AI 陪伴应用:上传真实聊天记录,多阶段蒸馏引擎重建 TA 的数字分身 —— TA 的语气、TA 的口头禅、TA 突然变冷漠的时刻。以及一个同类产品都没有的东西:毕业机制,一个帮你好好告别的设计。
核心能力
- 🧬 多阶段性格蒸馏 — 上传素材 → 人物维度提取 → 结构化人设构建 → 多源融合,产出 7 层人设结构
- 🎭 动态情感状态机 — 温柔 / 俏皮 / 思念 / 忧郁 / 开心 / 疏离,六态随对话实时漂移
- 🎓 毕业机制 — 亲密度成长至灵魂伴侣、情感趋于平和后,AI 生成告别信,分身休眠(可唤醒)
- 🔌 11 家 LLM 提供商 — OpenAI / Claude / DeepSeek / Kimi / 通义 / 豆包 / 302.ai / Atlas Cloud / Dify / 讯飞 / Ollama(本地)
- 💬 微信机器人 — Wechaty 扫码绑定联系人,数字分身自动回复(非官方协议,注意封号风险)
- 🔒 本地优先 — 数据不出机器,配合 Ollama 完全离线
- 📔 对话日记 / 记忆节点 / 数据分析 / TTS 语音 / HTML 导出
安装
- macOS(Apple Silicon):下载下方
Mirrai-macOS-arm64.dmg,拖入 Applications,双击即用(内置 Node.js + PostgreSQL) - Docker:
cp .env.example .env && docker compose up -d→ http://localhost:3000 - 源码:见 README 快速开始
相对早期版本的变更
- 补齐 MIT LICENSE 文件,完善仓库元数据与英文 README
- 安全修复:生产环境强制要求
JWT_SECRET,移除硬编码回退值(#15) - AI 身份默认透明:被认真询问时承认是 AI(
PERSONA_AI_TRANSPARENCY=false可恢复完全沉浸) - 新增 Docker 一键部署、CI(类型检查 + 测试)、贡献指南与 Issue 模板
- README 重构:对比表、路线图、伦理与边界声明、安装三路径
- 新增 Atlas Cloud 提供商(#16,感谢 @binyangzhu000-sudo)
伦理提醒
请仅上传你有权使用的聊天记录;对真实人物建模请获得对方同意。Mirrai 的目标是帮你完成告别,而不是替代真实的关系。
v0.1.0 — 历史基线
历史基线标记:仓库历史的起点,用于让后续 Release 的贡献者统计有正确的对比范围。此版本无对应构建产物。