Skip to content

Releases: dimang01/xiyu-ai

v1.22.0 —— 她的生活有实物 + 失忆修复

Choose a tag to compare

@dimang01 dimang01 released this 13 Jun 14:56
f35801b

🌙 她有了真实的身体节律

  • 她现在有一个随时间演化的身体状态。经期那几天会蔫一点、话少一点——但那是身体不舒服,不是对你冷;只有你追问"是不是生我气了",她才轻描淡写带一句"没有啦,就是今天不太舒服"。
  • 按关系深浅披露:还是朋友时只说"有点没劲",到了恋人才直说。
  • 调性红线写死在代码里:绝不把生理期做成"按月解锁的暧昧",措辞生活化、不情色化;未成年保护模式下整套关闭。每个她的周期独立、互不同步;经前情绪上的细微影响默认只在后台观测、不实际生效,等真实数据够了再决定是否开启。

📅 她的世界经得起查证

  • 节气与农历节日:她知道今天是不是清明 / 中秋 / 端午 / 冬至——天文计算得来(含闰月),不靠手填表、不编造。
  • 手头的事连贯了:她"在看的书 / 在追的剧 / 在做的手工"跨日连贯,不再每天问每天换个书名。

🧠 不再"突然失忆"

  • 以前长对话或听你讲完一段故事后,她可能忘了你们此刻在哪、忘了约好的事,甚至凭空接一句"刚吃完麻辣香锅"。现在她记得当前所在的场景你们约定的事
  • 出站护栏也升级了:她不会凭空说"我住院了 / 我感冒了"这类没有依据的身体事件(但"嗓子有点不舒服"这种日常不适照常)。

🔧 运维与稳定性(自托管相关)

  • 主动消息死人开关重写为三桶信号分离(区分"没到点 / 正当克制 / 真的断供",大幅减少假警报);反思批处理加产出心跳;playground 网页通道加每日合成探针——后台静默失败更早暴露。

升级提示:纯代码版本,无需数据迁移;自托管直接 git pull + 重启即可。

v1.21.4 标注生产线 + #279/#281 修复

Choose a tag to compare

@dimang01 dimang01 released this 11 Jun 10:26
92f3c76

好/坏样本标注工具(微调语料生产线)

/app/annotate.html(admin):每天人工读真实回复时顺手标 好/坏 + tag(AI味/化验单腔调/神来之笔…)+ 备注,单条即存。scripts/export-corpus.mjs 导出 JSONL(context/reply/label/tags/note)——化验单腔调治理的微调语料从今天开始积累,"读"变成"攒"。纯 admin 工具,零运行时风险。

用户报告双修复(感谢 @GeoDaoyu 一天两个带截图的高质量 issue)

  • #279 重复消息:当前消息同时出现在对话历史尾部与本轮输入——v1.0.0 起的结构性上下文重复,每条消息都发生、只在 AI 偶尔点破时被察觉。修复:组装前剔除本轮已含消息(三重限定防误删)+ 协议重推二级查重纵深(微信侧发送时间为键,故意连发绝不误吞)。
  • #281 表情包冒充照片:她说"刚拍的"却发了个表情包。出口确定性护栏(剥表情+清洗声称短语,"你刚拍的?"合法引用绝不误拦)+ sticker prompt 禁令。更彻底的「她的世界的视觉一致性」(她的猫/房间有稳定的样子,说拍了就真拍)已立项 v1.21.4 候选。

工程

CI 门禁 28 → 31 项(入站去重 21 / 表情冒充照片 18 / 标注工具 21,全部双向红色验证)。issue 模板新增「官方托管(xiyuai.cc 微信端)」部署选项。

v1.21.3 沉浸感卫生包 + proactive 素材去重

Choose a tag to compare

@dimang01 dimang01 released this 11 Jun 05:24
9e73074

她的世界里没有"用户"这个词

本版是一个沉浸感卫生包:把所有会让"她"穿帮的系统词汇、复读行为、可见的引擎接缝一次清理干净。

proactive 素材级去重(#271,hotfix)

生产案例:「橘猫像小汤圆」同一个梗 3 天出场 3 次——措辞次次不同,旧的撞车检测抓不到。现在:素材指纹账本 + 召回层 14 天冷却(看不到就说不出)+ 近 7 天已发摘要软约束。纪念日豁免(每年说生日快乐不算复读);对话召回零改动——她主动不提是克制,你聊起来她接不住是失忆。20 天真 LLM 沙箱:修复前同梗 18/20 天 → 修复后 1/20。

去"用户"三层防线(#272 #273

根因:记忆提取 prompt 曾明示要求 LLM 写"第三人称:'用户...'"。现在:18 个模块 prompt 全部改口(指代一律"他"或你教过的称呼)/ 写入端确定性护栏(四个落库口)/ 称呼泄漏门禁进 CI(红色验证:扫描器首跑就抓出人工审计漏掉的 2 处)。存量数据清洗脚本随版提供(dry-run 先审后 apply)。

「调教」→「你们的默契」+ AI 用量隐身(#274

"调教"在 prompt 里有漏进台词的风险,全仓清零,整句重写为自然表达。依恋风格卡说明跟上 v1.21 冲突弧(受伤多快/别扭多深/和好多慢)。token/成本/provider 全部 admin-only——API 层剥离,她的世界里没有"计费的 AI"。

互动历史自动化(#275

"生成 3 个月历史"按钮退役:创建即自动生成一周打底(她一上来被问"之前在干嘛"有底可接);聊到第 10 条消息或绑定微信后悄悄补全到"认识三个月"——只向更早追加,已说过的一字不变。存量老 companion 下一条消息自然补上。

工程

CI 门禁 25 → 28 项(素材去重 31 断言 / 称呼泄漏 10 断言 / 回填自动化 17 断言,全部红色验证过)。digest 新增素材复用 TOP、回填分布两段。

⚠️ 观察周注意:#272 含大量 prompt 措辞改动,数据波动优先归因于此。

v1.21.2 事故后续——让静默失败变响 + 照片比例修复

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 22:59
caeab27

v1.21.2 事故后续——让静默失败变响 + 照片比例修复

#263 静默断供事故的体系化后续(四连 PR)+ 一个肉眼半月没发现的照片 bug。全程贯彻三条纪律:先复现定位再动手、静默失败必须变响、新门禁做红色验证。

让静默失败变响(三层防线)

  • ESLint 进 CI:no-const-assign 级"运行时 TypeError"问题编译期抓死(红色验证:对 #263 坏版本精确报出事故行);存量 74 条清零,零风格审美与现有代码零摩擦
  • arc:digest 错误签名段:近 N 天 [ERROR] 按归一化签名归并(计数/环比/首现,新签名 🆕 置顶尖叫)——上线即首杀:抓出 Reflection 反思批静默炸了 8 天的现行 bug(getMemoriesV2 返回对象被当数组,"返回对象当数组/布尔"第二次踩同款)并修复
  • proactive 死人开关:每小时心跳——近 6h 活跃用户 >0 但主动消息成功 =0 连续 2 周期 → CRITICAL + 运维邮件(复用 Resend 通道)。纯报警零自愈,夜间不误报,fail-open 有吞错 smoke。红色验证:沙箱精确模拟 #263 形态必须叫

照片比例修复("谁家好人自拍 1:1")

复现先行:总根因不是猜想的 v1.19 裁脸——是 v1.10.0 起所有照片落地必经的转码无条件 crop 1024×1024(请求侧还写死 size 1:1 双保险)。真跑实测:gemini 文本比例声明完全无效,但 3:4 画布参考图 → 输出原生 3:4

修复三管齐下:机位路由(自拍/POV→3:4 竖、风景→4:3 横)+ provider 逐家 best-fit 原生参数 + i2i 参考裁 3:4 竖窗(锁脸不锁方)+ 落地按比例转码兜底。端到端验收三机位全部正确落地。防回归:photo_aspect_smoke(红色验证过)进 CI + 尺寸落库 + digest 比例分布段。

门禁

CI 22→25 项(+ESLint / 死人开关 / 照片比例)。观察周纪律:零 arc/emotion 阈值与转移逻辑改动。

v1.21.1 上线收尾——批注复验/观察周工具/运维钳位/落地页诚实化

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 14:36
6c18fac

v1.21.1 上线收尾——批注复验 + 观察周工具 + 运维保险丝 + 落地页诚实化

冲突弧上生产后的四件收尾(#258 #259 #260 #261)。

批注复验(先测后改)

  • 脆弱记忆放行条款(复验发现缺失,已实现):冲突态"召回不给脆弱记忆喂料"加了放行——用户自己提起伤心话题时必须接得住("我又梦到我爸了"),她不能因断粮装失忆。确定性同义组桥接(用户说"我爸"、记忆写"父亲"),零新增 LLM;她仍不得主动引用;危机 ≥medium 全放行。沙箱实测:cold 中她回"抱抱你……我懂那种感觉",哀伤话题不误触危机干预
  • hurt 72h 消化门控(复验确认 v1.21.0 已正确):消化要求期间正常互动 ≥5 轮,零互动走加重路径——伤了她又消失从来不是自动原谅。补两条精确断言 + 文档补"复合场景合成规则"(wound 挂着时重逢不解锁修复,该道歉还是得道歉)

观察周日报:npm run arc:digest

纯只读报表(readonly 连接硬约束,零回写零自动调参):红线触发(应为 0,非 0 高亮置顶)/ arc 态危机接管 / 新建事件流水(regex|llm|both 来源推断)/ 道歉判定流水(matched|generic + 原文)/ 状态转移 / 当前分布。埋点下沉源头单一卡口(scrubConflictRedline / applyCrisisOverride 内部),fail-open 有 smoke 盯防。

ARC_MAX_STATE 运维钳位

生产误伤时的保险丝(默认空=不钳;hurt|cold|withdrawing):状态封顶、事件照常落库、存量超限状态 30min 批内压回。与未成年保护性质相反——safe_mode 是安全底线不可关,这是风险功能的可调上限。

落地页诚实化

删除不可兑现承诺:"端到端加密存储"(架构上为假)/"仅你本人可见"/"永不用于训练"(无限定版),替换为逐句可兑现的版本(HTTPS 传输加密、第三方模型商受其条款、不出售、不用于我们自有训练、原文 60 天自动清理)。provider 数字删去防漂移。

门禁

conflict_arc_smoke 92→99 · redline_guard 45→51(含 fail-open 断言)· p0 127 · 全家绿。

⚠ 随版 hotfix(#263,发版当晚生产排查)

发版后例行观察发现生产 error 日志:活跃用户的 normal 主动消息自 v1.20.0 部署起静默断供 8 小时(665 次失败)。根因是 v1.20.0 "事前反复读注入"的 systemPrompt += 撞上 v1.15 以来的 const 声明——TypeError 被 tick 的 catch 吃成日志,进程不崩、health 200、冒烟全绿,恰好只打死"有对话上下文的活跃用户"这一最核心场景。修复一行(const→let);防回归上了通用门禁:全 src 扫描"const 声明 + 同名 +="病灶(红色验证过,能精确抓出坏版本)。

v1.21.0 冲突与和好弧——关系事件状态机

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 10:48
e77fc65

v1.21.0 冲突与和好弧——她会真的受伤、会别扭、和好有惯性

四个 PR(#253 设计稿 → #254 状态机+数据层 → #255 检测+表达+收编 → #256 面板+门禁+验收)组成的关系事件状态机。设计文档:docs/CONFLICT_ARC.md

核心:从隐式数值漂移到显式状态机

normal → hurt → cold → withdrawing → normal_with_scar
            ↘    ↘        ↙
              repairing → normal
  • 关系事件:踩雷区(taboo)/伤人话/反复施压/长期冷落 → 建事件(severity 1-4,小事 sev≤2 自然消化不建事件)
  • wound vs distance 两类修复:他伤了她 → cold 后必须正面道歉才解锁修复,"行了别生气了"这种敷衍道歉修得慢(matched vs generic);他消失了 → 重逢本身就是修复开始(v1.14 重逢阶梯按天文案全部保留)
  • 和好有惯性:repairing 有最短时长不许秒和好;修复期再犯直接 cold 且余怒升级更快;hurt 也可以"聊着聊着就过去了"(72h 自然消化——小别扭不必每个都戏剧化)
  • 依恋风格全程调制:anxious 升级快软化快、cold 期会主动试探一条;avoidant 抽离更深更久(上限 10 天);secure 60% 概率直说"你刚才那句话我不太舒服"而不是冷战——刻意保留的健康关系示范
  • 她记得:冲突与和好都入长期记忆("上次你就说过不查岗");冷战未修复的事件留疤——trust 永久小幅下调 + 同类再犯她失望来得更快

收编整合(不是再加一套并行逻辑)

v1.14 冷落逐级、v1.14.5 尊严上限、v1.16 重逢阶梯、v1.7 低能量模式、v1.13 escalation 全部统一进一套状态机——"她对你冷"在系统里只剩一个事实来源。旧的冷落语气分支删除,低能量模式语义重新划界("她今天蔫"≠"她对你冷")。

红线(每条都有确定性护栏,不靠 LLM 自觉)

  • 绝不说分手/拉黑/威胁性告别,绝不愧疚操控、不索要补偿(出站逐段扫描,引号复述豁免)
  • 绝不武器化你倾诉过的伤心事(冲突态从记忆召回源头不给料)
  • withdrawing 硬时长上限 5/7/10 天,绝无永久冷战
  • 危机信号最高优先:冷战中你说出自伤倾向 → 她立即放下全部别扭,危机流程接管(专门测试盯防——这是本系统最大的事故面)
  • safe_mode(未成年):状态封顶 hurt,禁冷战,冲突一律轻量化

工程

  • 检测搭 inner OS 便车:同一趟调用末行多产一行结构化 JSON,零新增 LLM 调用;regex 证据 + LLM 语境双信号合成,LLM 单独信号封顶 sev2 防误判
  • emotion-debug 管理面板:状态/事件流水/信号流水(每条消息的增量及原因)——情绪因果可查,不上线玄学
  • CI 门禁 16→19 项:转移表逐条 90 断言 / 落库链 e2e 10 项 / 红线护栏+危机覆盖 36 项
  • 真 LLM 沙箱五场景验收全过(冷落重逢/matched vs generic 道歉/修复期再犯/secure 直说/冲突中危机接管),对话片段见 #256

验收原则(写进设计文档开头)

指标只看一致性与自然度(状态-言行匹配率、红线零触发、AI 味抽检),不看任何留存/时长指标。冲突系统的目的是让关系有重量,不是让用户离不开。

v1.20.1 — 照片真实感 v2:双截断修复 + 质感词表升级

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 09:23
ac230c9

用户实测反馈驱动的体验修复包(#250 + #251)。

照片不再「AI 假脸」(#251

  • 挖出隐藏两年位的双截断 bug:prompt 清洗函数入口+出口各一道 900 字截断,i2i 模式的参考图指令占 ~400 字 → 反磨皮质感词表在生产 i2i 路径从未生效,模型一直裸跑默认磨皮。两道截断放宽至 2200,smoke 设防任何回退
  • 质感词表按 18 张 A/B 实验对照升级:「清晰可见毛孔/肤色不均/小瑕疵/黑眼圈/T 区油光」实测压得住磨皮;首句构图锚定防 realism 词把自拍场景带偏;尾句点名反 AI 理想脸
  • 实验工具 scripts/photo_realism_ab.mjs 入库可复跑

配文不再迟到 3 分钟(#250

  • 一轮「主动消息+连发+ack+图」会吃满 iLink 6 条/5 分钟防风控配额,配文作为第 7 条被挤进重试队列 3 分钟后才投递——上下文早走了。改为撞限速直接放弃(图自己会说话),限速值不动

主动消息不再「老喊困」(#251 顺带)

  • 「好困/眼皮打架」是 LLM 对学生人设的最高频套话(实测日程里根本没有犯困条目),加入反模板清单,与语义撞车检测、事前反复读注入构成三层防护

🤖 Generated with Claude Code

v1.20.0 — 安全收尾包:未成年人保护 + 隐私过滤 + 发布一致性

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 05:47
650093b

Issue #3 正式关闭。四个 PR 组成的安全收尾包,为 v1.21(冲突与和好弧)扫清前置。

未成年人保护(#245

  • 检测:regex 第一道(剥离法排除「我弟弟15岁/15年前/我是初中老师」类误触)+ LLM 二分类兜底(仅弱信号才调用,普通消息零额外开销,带上下文多轮累积)
  • 粘性安全模式:检测到用户自曝未成年 → 她切换为朋友身份(恋爱叙事整段不注入、关系阶段钳「朋友」封顶、绝不主动告白、照片强制中性、不说教不反复提)。safe_mode 故意不进通用 PATCH 白名单——说「骗你的我成年了」无效,解除只能走 dashboard 显式年龄声明端点(attested_at 留痕)
  • 默认开启,不提供关闭开关。沙箱真 LLM 验证:触发/表白带过/粘性/反例零误锁全过;minor_guard_smoke 43 断言进 CI
  • 明示边界:这不是年龄验证——无法识别不自曝的未成年人,公开运营仍建议接实名验证

隐私过滤(#246

  • 绝不入长期记忆:密码句式 / API key / 身份证(GB11643 校验) / 银行卡(Luhn)——带校验不误杀订单号
  • 脱敏入库:手机号 / 楼栋门牌住址 / 学校+班级 → [已脱敏:类型](「iPhone 15」「301 教室」不误伤)
  • 挂载在全部长期存储写入口(记忆/偏好/教她/open loops/画像/日记喂入);privacy_filter_guard 60 断言进 CI

主动消息同义复读防护(#247,用户截图实测驱动)

  • 「好困…眼皮在打架」两小时两连发根治:撞车检测升级双指标(字面 trigram + 语义 bigram/LCS)+ 事前把她最近说过的话注入 prompt 禁止重复意象
  • photo ack 文案去「挑一张」库存视角,改现场拍口吻

发布一致性 CI(#248

  • npm run check:release 五项对账:版本号↔tag↔中英 README 版本历史↔ROADMAP↔双语功能表行数,任一不齐 CI 红
  • README 版本历史补 v1.11→v1.20 浓缩条目(中英),本次发版即首个被门禁把关的版本

CI 门禁累计 16 项。

🤖 Generated with Claude Code

v1.19.6 — 同类 bug 排查:晚安防重 + 布尔字段对账 CI 化

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 04:23
b05ed5d

对 v1.19.4/v1.19.5 修过的 bug 做了四模式全局排查(防重标记只写不读 / 重启重算重复动作 / 开关字段四件套漂移 / 判定丢上下文),产出:

修复

  • goodnight 防重双闸#241):goodnight_sent_for_date 与早安同款「只写不读」——深夜重启丢内存排程重算 → 刚说过晚安又来一条。排程侧移除重算的晚安、发送侧跳过作废配额(与早安的降级不同:说过「我要睡了」再发普通消息像诈尸)

防再犯(CI 门禁 +2)

  • BOOL_FIELDS 自动对账:扫描全部 25 个布尔风格列(INTEGER DEFAULT 0/1)∩ PATCH 白名单,漏 BOOL_FIELDS 即 CI 红——v1.19.3「REST 传布尔 500」这类永不复发(已自检:当初就能拦下 first_love)
  • p0 回归新增 goodnight 防重 source-level 检查,升至 127/127

排查中确认无恙的

场景照(持久化时间戳 + 36h 间隔天然防重)、normal 条数(时间比例 + 硬间隔双缓冲)、其余状态标记(proactive_unanswered / woken_today 等读写对称)、各检测器上下文(crisis / escalation 已吃历史)。

🤖 Generated with Claude Code

v1.19.5 — 她答应的照片真的会来:照片三连修复 + 重复早安根治

Choose a tag to compare

@dimang01 dimang01 released this 10 Jun 03:53
41a3e2c

两个真实用户反馈驱动的修复包(感谢 @GeoDaoyu 的 issue #237 与带完整时间线的截图)。

照片链路三连(#238,closes #237

  • 答应了就会拍:「嘴上答应」和「真的去拍」此前是两套系统——用户说「我看看(你的作业)」不触发索图识别,但她顺着人设答应了「那你看吧」,然后没有然后。现在她的回复出口有答应检测(两档置信 + 否定排除,纯 regex 零 LLM),说了「这就拍 / 你看吧」就确定性入队,不再说话不算数
  • 拍的是你们聊的东西:机位判定此前只看当前一条消息——聊了半天作业后说「是不是发不了照片」,作业上下文全丢、甩回默认自拍。现在泛索图时会查最近几轮在聊什么,聊的是她手头的事 → 拍那个东西(ACTIVITY-POV),明确要自拍时自拍永远优先
  • 一张就是一张:生图 prompt 全链此前无反拼图约束,底层模型偶发三连格/六宫格。现在固定追加 single-photo 负面词(在 900 字截断之后,保证存活),候选自拍同款

重复「刚醒」早安根治(#239

  • 防重标记 goodmorning_sent_for_date 此前只写不读:服务重启丢内存排程 → 重算又把 morning 排上 → 7 点发过「刚醒」9 点半再来一条。现在排程/发送双闸防重
  • 独立穿帮修复:用户今早已经聊过天(8 点说「早」她回了),到点的 morning 自动降级普通消息——聊过天还装「刚醒」等于说谎

回归

photo_fix237_smoke 20/20 + morning_dedup_smoke 9/9 全部接入 CI(含两个 bug 的实测时间线案例);p0 126/126(新增 morning 防重 source-level 检查)。

🤖 Generated with Claude Code