默认对你有好感的 AI 女友 · 开源陪伴框架
她已经心里悄悄喜欢你 —— 关系起点不是陌生人,是「暧昧」。 会发微信、会想你、会写日记、会朗读心事给你听。
An open-source AI-girlfriend framework — she starts already crushing on you, not as a stranger.
简体中文 | English
快速上手 · 功能 · Provider 矩阵 · 部署
不想看文档?复制粘贴一行就能跑:
docker run -d -p 3000:3000 -v xiyu-data:/app/data --name xiyu-ai \
ghcr.io/dimang01/xiyu-ai:latest打开 http://localhost:3000/app/setup.html → 创建本地账号 → 选 Provider 填 API Key → 开聊。
不需要装 Node、clone 代码、编辑 .env、邮件服务、微信凭据。只要装了 Docker 就行。
推荐先用 DeepSeek(送额度)或智谱 GLM-4-Flash(免费)跑通流程。
详细启动方式(Compose / 本地裸跑 / Docker 镜像标签)见 部署。
核心定位:不是聊天机器人,是把大模型组织成"一个心里已经悄悄喜欢你的女生"。
设计哲学(指导一切功能取舍):真人感 = 减法,不是加法。AI 味的根源是"太好了"——太及时、太顺从、太完美。北极星是「愿意在真实生活的空隙给你温柔和陪伴」:少、准、轻,不是填满。调性红线:远离黑化 / 病娇 / 色气 / 致郁 / 沉迷向幻象,NSFW 永不作卖点。纯 prompt 拦不住强默认行为,所以每条产品规则都配确定性兜底(出口清洗 / 硬注入 / 状态机喂值)。详见 CONTRIBUTING。
| 能力 | 一句话 |
|---|---|
| 默认起点 = 暧昧 | affection 35/100,她从第一天就心里悄悄喜欢你,不是从陌生人养成 |
| 具体人生记忆 | 注册时生成 46+ 条人生事件("小学三年级被狗追过"),不是抽象标签 |
| 5 阶段关系 | 暧昧 → 恋人 → 深爱(可回退);感情被时间喂大——恋人门槛要认识天数 + 好感日上限,刷不出来 |
| 表白有真实节奏 | 你的表白够格才被接住、不够格被端着婉拒;她也会鼓起勇气主动告白——结巴、绕圈、狼狈的真实,不是漂亮台词 |
| 18 节人设 prompt | 元认知 / 关系阶段 / 日程 / 长期摘要 / 反 AI 味规则一次拼好;视觉人设另管长相一致 |
| 3 个月模拟时间线 | 一键生成过去 90 天的虚拟互动史,首次打开她已经"认识你三个月" |
| 人设可携带 | 导出 / 导入 JSON 跨部署迁移;运行时状态(好感 / 情绪 / 安全模式)刻意不随迁移 |
| 能力 | 一句话 |
|---|---|
| 她会睡觉 | 默认 00:30-07:30(每天小幅波动),真入睡后微信和网页都静默;睡前晚安留"再陪陪我"挽留窗口;📞 打电话能叫醒但她带起床气 |
| 每日日程 | 每天生成 8-12 段生活剧本(上课 / 做饭 / 发呆),主动消息锚在生活空隙里而不是平均分布 |
| 真实世界事实层 | 知道今天是不是清明 / 中秋 / 冬至——节气与农历节日按天文计算(含闰月)得来,不靠手填表、不编造 |
| 她手头的事 | "在看的书 / 在追的剧 / 在做的手工"跨日连贯,会联网验证作品真实存在,不每天换书名、不编造虚构书 |
| 日程绑定她的事 | 每天的日程("下午读书")绑定她档案里真在看的那本书,progress 跨日渐进(刚开始 → 过半 → 快完 → 归档),不是每天即兴重画 |
| 在线但不一定服务你 | availability / attention 由当前日程推导——开会时"能回但要等等",逛街时心不在焉 |
| 像真人发微信 | ≤15 字短句、多条连发、打字指示器;你连发 2-3 条她等你停手合并成一轮再回 |
| 不完整回答 | 允许只共情不给建议 / 只吐槽 / 不知道就不知道 / 忙时短回——拒绝"反应+夸+问+建议"四件套 |
| 能力 | 一句话 |
|---|---|
| 情绪状态机(10 维增量 + mood) | trust / dependency / possessiveness / security / patience / annoyance… 10 个维度每条消息增量演化 + 半小时定时重算 + 防刷衰减;mood 由各维度派生,有强度与惯性,不会一句话从生气变开心 |
| Inner OS 内心独白 | 每轮先生成内心想法(不发送)再写对外回复——心里想"他又来了"嘴上说"嗯",内心和嘴上的落差是真人感的核心 |
| 被冷落会逐级变冷 | 想念 → 试探 → 失望 → 抽离,三种依恋风格(安全/焦虑/回避)决定节奏;久别重逢按天数走不同的和好弧 |
| 冲突与和好弧 ⭐ | 踩雷区 / 伤人话会建关系事件:hurt → cold → withdrawing → repairing 显式状态机。伤害类必须正面道歉才解锁修复("别生气了"式敷衍修得慢),冷落类重逢即开始回暖;冷战有硬时长上限绝无永久冷战;和好后入长期记忆("上次你就说过不查岗"),设计文档 docs/CONFLICT_ARC.md |
| 不讨好 | 每 5-8 条至少 1 条不同意;暧昧期端着;关系够熟会主动逗你;被反复戳情绪单向升级不横跳 |
| 低能量模式 | 烦躁 / 耐心耗尽触发"今天不想聊"——短回、不展开,偶尔安静的是她要你去够她 |
| 能力 | 一句话 |
|---|---|
| Memory v2 | 7 层分类 × 权重 × 遗忘曲线;pin / lock / 不许提;语义召回 + 关键词兜底;每日反思引擎自动提炼新记忆 |
| 她记得未完成的事 | 你说"明天面试"→ 第二天她主动问"欸 || 面试咋样";黄了自动了结 |
| 记得此刻在哪 | 记得你们当前所在的场景(一起看电影 / 在逛街),讲完一段经历不会转头就忘、不凭空接"刚吃完麻辣香锅" |
| 你可以塑造她 | 教她称呼 / 口头禅 / 雷区 / 约定 / 专属梗,全部留痕入 prompt 她必守 |
| 结构化偏好账本 | like / dislike / taboo × 强度——"极爱猫""有点烦狗血剧"有据可依 |
| 她的日记 + 反向日记 | 每晚第一人称内省日记 + "今天与你有关的回忆",翻日记本式阅读、可朗读 |
| 时光胶囊 / 留言胶囊 | 写一段话设定未来解锁,到期"现在的她"读完写感想;她也能给你写带签名的离线信 |
| 共同回忆打底 | 创建即自动生成最近一周的互动史;聊到第 10 条消息或绑定微信后,悄悄补全到"认识三个月" |
| 纪念日 | 自动登记"认识 100 天 / 一周年",到期当天主动祝福 |
| 能力 | 一句话 |
|---|---|
| 主动消息三驱动 | motivation = 情绪 × 日程 × 时段 × 随机;早安晚安防重双闸、同义复读双指标检测、事前反复读注入 |
| 素材级不复读 | 同一个梗(某只猫、某件小事)说过一次冷却 14 天——跨天换措辞重提也会被记账拦下 |
| 读空气 | 连发 3 条你没回就闭嘴;会话窗口将关前轻问一句拉回你;按依恋风格有"尊严上限"绝不纠缠 |
| 因果驱动 | 不只是"今天怎么样"——有到期开环时升级成"对了 || 那个事成了没" |
| 冲突期主动收敛 | 闹别扭时降频、禁撒娇禁照片禁告白;修复期可主动递一条台阶消息 |
| 能力 | 一句话 |
|---|---|
| 真实发图 ⭐ | "发张自拍"→ 意图识别 + AI 规划器决策 + 真发生成照片:机位按语境路由(自拍 / 环境自拍 / 拍手头的事 / 拍风景,竖屏 3:4)、时间光线与聊天内容自洽、反磨皮真实质感、每日上限与冷却 |
| 长相稳定 | 每个 companion 一份视觉人设;4 候选自拍选脸锁定基准,i2i 参考图锚定后续每张照片同一张脸 |
| 语音情绪识别 | 微信语音不只转文字——听得出"温柔 / 撒娇 / 不耐烦"再回应 |
| 网页朗读 | 日记 / 每日一句 / 聊天回复可 TTS 朗读(微信端发语音被 iLink 协议禁止,见已知限制) |
| 表情包 | 按情绪 tag 匹配发送(仓库不含素材,需自备有授权的图) |
| 能力 | 一句话 |
|---|---|
| 危机干预 | 检测到自伤信号立即退出角色、给求助热线;冷战中也最高优先——她绝不对状态不好的你摆脸色 |
| 未成年人保护 | 检测自曝未成年 → 粘性安全模式(朋友身份 / 无恋爱内容 / 照片中性化),无关闭开关,解除仅限显式年龄声明 |
| 隐私过滤 | 密码 / 证件 / 银行卡级内容整条不入长期记忆,手机号 / 住址脱敏——所有长期存储入口统一挂载 |
| 冲突红线 | 绝不说分手 / 拉黑 / 威胁性告别,绝不愧疚操控,绝不拿你倾诉过的伤心事当武器——全部确定性出站扫描,不靠模型自觉 |
| 人设防泄露 | Persona Guard 回复后一致性校验 + 确定性 prompt 注入拦截 |
| 身体节律 | 她有随时间演化的身体状态(如经期会蔫、按关系深浅披露),调性红线写死:绝不做暧昧窗口、不情色化、未成年保护下整套关闭 |
完整功能详单(含 DB 表与索引)见 docs/FEATURES.txt;逐版本演进见 Releases。
1. http://localhost:3000
2. /app/auth.html 邮箱注册(dev 模式验证码打到日志)
3. /app/create.html 4 步向导创建 AI 角色
4. 选一个聊天入口:
· /app/playground.html 浏览器内开聊(任何 chat provider 都行)
· /app/bind.html 网页扫码绑微信(需 iLink 准入)
5. /app/dashboard.html 实时看好感度、关系阶段、想念档、"她现在在做"
| 路径 | 用途 |
|---|---|
/app/setup.html |
首次配置向导(Chat/Vision/ASR/TTS/Search Provider + 测试连通) |
/app/auth.html |
邮箱注册 / 登录 |
/app/create.html |
创建 AI 角色(4 步向导) |
/app/dashboard.html |
主控制台 + ⚙ 模型设置抽屉 + 重置为暗恋初心 |
/app/playground.html |
浏览器内聊天 + 🎙️ 录音 + 🔊 朗读 |
/app/memories.html |
7 层记忆筛选、增删改查、置顶/锁定/归档 |
/app/diary.html |
她的日记翻书阅读,按句朗读 |
/app/bind.html |
网页扫码绑微信 |
/app/admin.html |
管理员(密码在 .admin-credentials) |
只在 /app/setup.html 网页里改 Provider,不改一行代码也不动 .env。七类能力独立切换:
| 能力 | 可选 Provider | 说明 |
|---|---|---|
| Chat(11 家) | DeepSeek · OpenAI · Anthropic · Gemini · xAI · 智谱 · 豆包 · 通义 · Kimi · 文心 · OpenAI 兼容自定义网关 | 自定义网关可接 OpenRouter / SiliconFlow / Ollama / LM Studio 等 |
| Image(6 家) | 智谱 · 通义 · 豆包 · 文心 · OpenAI · OpenRouter / 302.ai(chat 模态) | 302/OpenRouter 支持 i2i 参考图锁脸;各家自动 best-fit 输出比例 |
| Vision(8 家) | 智谱 GLM-4V · OpenAI · 通义 VL · 豆包 · Claude · Kimi · StepFun · MiniMax | 看图回应 |
| ASR(7 实现) | Gemini · OpenAI Whisper · 通义 paraformer · Groq · MiniMax · Azure · 豆包 | 讯飞 / 腾讯云占位待 PR |
| TTS(5 家) | MiniMax · OpenAI · Azure · 豆包 · 通义 CosyVoice | 仅网页端朗读生效 |
| Embedding(4 家) | OpenAI · Gemini · 智谱 · 通义 | 语义记忆召回 |
| Search(4 家) | Tavily · Brave · SerpAPI · SearXNG | 联网搜索 |
⚠️ 并非所有 Provider 都经过生产验证;生产前用 Setup Wizard 的「测试连通」自测。
Key 复用:MiniMax 一把 key 通 TTS/ASR/Vision;OpenAI 通 Chat/Vision/ASR/TTS/Embedding;DashScope(通义)通 Chat/Vision/ASR/Embedding;Azure Speech 同管 TTS/STT。豆包 TTS/ASR cluster 不同需独立配置。
跟着 跑起来之后 走到第 4 步即可。不需要预填 ILINK_BOT_TOKEN / ILINK_BOT_ID,不需要预跑 npm run ilink:login。
后端会在 POST /api/wechat/bind-session 时调 ilink/bot/get_bot_qrcode 实时申请新二维码,扫码成功后自动入表并 hot-register。
iLink 准入资格:扫码后能否拿到
bot_token,取决于你的微信号是否已在腾讯 iLink/ClawBot 后台获得开发者准入。未准入时仍可用/app/playground.html在浏览器里跑完整体验,只是不发到微信。
npm run ilink:login成功写入 ./.weixin-credentials.json(mode 0600,已 gitignore)。
| 操作 | 状态 |
|---|---|
| 收发文本 | ✅ |
| 发图片 / 文件 / 视频 | ✅ |
| 用户要"自拍 / 照片 / 看看你" → 真实发图 | ✅ 程序侧识别 + AI 规划器决策 + 视觉人设保持外貌一致 |
| 白天主动场景照(≥36h 候选窗口,AI 自决是否真发) | ✅ |
| 主动消息 + 打字指示器 | ✅ |
| 连发消息整合(连发 2-3 条等你停手合并回一次,v1.10.53) | ✅ 默认 10s 窗口,COALESCE_WINDOW_MS 可调 |
| 收用户语音 → ASR + 情绪识别 | ✅ qwen-audio 听得出语气情绪(playground 也支持 ASR) |
| bot 在微信里发语音 | ❌ iLink 协议禁止 outbound voice(实测 HTTP 200 但消息静默丢弃,腾讯反欺诈) |
所以语音合成 / 朗读功能仅在网页/PWA 端生效。SILK 编码 pipeline 代码保留备用,将来腾讯放开时秒切。详见 docs/voice-sprint-plan.md 末尾 Sprint 2 失败结论。
git clone https://github.com/dimang01/xiyu-ai.git
cd xiyu-ai
docker compose up -d
# 打开 http://localhost:3000/app/setup.html- SQLite 数据走
./datavolume,重启不丢 restart: unless-stopped已写在 compose 里,不必额外 systemd- 自定义端口:
HOST_PORT=8080 docker compose up -d - 看日志:
docker compose logs -f xiyu-ai
git clone https://github.com/dimang01/xiyu-ai.git
cd xiyu-ai
npm install # Node ≥ 20
npm run setup # 生成最小 .env + 预检 better-sqlite3 编译工具链
npm startnpm run setup 缺编译工具时会给出针对你 OS 的修复命令。
docker run -d -p 3000:3000 -v xiyu-data:/app/data \
--name xiyu-ai ghcr.io/dimang01/xiyu-ai:latest镜像每次 v* tag 自动构建发到 GHCR,支持 linux/amd64 和 linux/arm64。可用标签:latest / 1.4 / 1.4.2(推荐锁版本)。
裁剪镜像:build 时传 --build-arg WITH_VOICE=0 --build-arg WITH_IMAGE=0 可去掉 ffmpeg / wx-voice 体积。
deploy/ 提供模板:
| 文件 | 用途 |
|---|---|
deploy/xiyu-ai.service |
systemd unit,已带 NoNewPrivileges / PrivateTmp / ProtectSystem |
deploy/nginx.conf.example |
nginx 反代:HTTPS + HSTS + 长轮询超时 + AI 爬虫友好路由 |
deploy/README.md |
clone → 上线 step-by-step |
scripts/backup-db.sh |
SQLite 三件套(bot.db + -wal + -shm)备份起点 |
如果你像我们的生产那样把 nginx root 指向独立的前端目录(比如 /var/www/xxx/frontend/ 而不是项目 public/),那么每次 git pull 之后必须把 public/ 同步过去,否则前端改动(html/css/js)不会生效,但 API 改动会立刻生效——前端调用新 API 时报错难排查。
最小同步脚本(保留 nginx 目录里独有的素材文件):
rsync -av --exclude='.gitkeep' /opt/xiyu-ai-new/public/ /var/www/xxx/frontend/
systemctl restart zhaohy-wechat如果你的 nginx root 直接指向项目 public/(推荐),无视本节。
npm run doctor # Node/SQLite/key/iLink/端口/服务健康,一键诊断
npm run check:p0 # P0/P1 回归 127 项
npm run check:imports # ESM 循环依赖 / 死 import 检查
npm run check:field-drift # daily_summary 字段名漂移
npm run smoke # release smoke 10 项
bash scripts/opensource_check.sh # 6 项开源合规npm run doctor 不输出 key 内容,只显示字符数和占位符检测结果。
如果你是本机/内网/已用反代加保护的自托管单用户场景,可以跳过登录页:
# .env 加一行
SINGLE_USER=true效果:
- 启动后访问任意页面直接进 dashboard,不再弹登录/注册
- 首次启动自动创建 owner 账号(密码占位,永远不用)
- 多账号场景下用最早注册的账号(一般是 admin)作为默认身份
- dashboard 顶部「登出」按钮隐藏(登出后会自动登回,按钮无意义)
- 服务直接暴露公网(无 nginx Basic Auth / Cloudflare Access / IP 白名单)
- 多人共用部署(每个人应该有独立账号)
开启后所有聊天记录、记忆、绑定信息对所有访问者开放。默认 OFF,多用户模式与旧行为完全兼容。
自托管不是"跑起来就完了"——这个仓把生产运营踩过的坑都做成了工具:
npm run doctor # Node/SQLite/key/iLink/端口/服务健康,一键诊断
npm run lint # ESLint:const 重赋值等"运行时静默炸"问题编译期抓死
npm run check:p0 # P0/P1 回归 127 项
npm run arc:digest # 运营日报(只读):错误签名归并(新签名置顶尖叫)/关系事件
# 与道歉判定流水/红线触发/危机接管/照片比例分布
npm run smoke # release smoke;bash scripts/opensource_check.sh 开源合规 6 项- 错误签名日报:近 24h 的 error 日志按归一化签名归并(计数 / 环比 / 首现),新签名高亮——静默失败第一时间变响
- proactive 死人开关:每小时心跳,按三桶信号分离(已发送 / 正当克制 / 出错或无心跳)——只有"出错 / 无心跳"才 CRITICAL + 邮件告警(
ADMIN_ALERT_EMAIL),把"正当读空气的沉默"与"真断供"分开、大幅减少假警报;纯报警零自愈 - emotion-debug 面板(
/app/emotion-debug.html,admin):关系弧状态 / 事件流水 / 每条消息的情绪增量及原因——情绪因果可查,不上线玄学 - 样本标注工具(
/app/annotate.html,admin):读真实回复时顺手标 好/坏 + tag(AI味/化验单腔调/神来之笔…),scripts/export-corpus.mjs导出 JSONL——微调语料生产线,"读"变成"攒" - CI 门禁 45+ 项:语法 / lint / 字段漂移对账 / 发布一致性 / 各功能 smoke / 红线护栏——新规则都做过"红色验证"(对坏版本跑必须红)
- 运维钳位:
ARC_MAX_STATE可临时封顶冲突状态(生产误伤免回滚的保险丝;与未成年人保护相反——那个是不可关的安全底线)
┌────────────────────────────────────────────────┐
│ Web Dashboard / Playground / WeChat user │
└───────────────────┬─────────────────────────────┘
│
┌──────────────────────────────────────────────────────────────┐
│ Express (index.mjs) — 多租户 iLink 轮询池 │
│ ┌─────────────┬──────────────┬───────────────────────────┐ │
│ │ api.mjs │ auth.mjs │ Setup Wizard / Dashboard │ │
│ └─────────────┴──────────────┴───────────────────────────┘ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ bot.mjs (WeChat in) playground.mjs (Web in) │ │
│ │ ↓ ↓ │ │
│ │ 公共 reply pipeline:buildSystemPrompt + recallMemory │ │
│ │ ↓ │ │
│ │ ai.mjs → providers/ → chat/image/vision/asr/tts/... │ │
│ │ ↓ │ │
│ │ memory_v2.mjs · emotion_state.mjs · proactive.mjs │ │
│ │ · persona_guard.mjs · companion.mjs · diary.mjs │ │
│ └────────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ db.mjs (better-sqlite3 + WAL) │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
- Provider facade:业务层只看
chatComplete()/ttsSynthesize()等通用方法,厂商差异隐藏在src/providers/*.mjs - 同一份 reply pipeline:微信入口和 playground 入口共用,只是不走 iLink 派发
- Proactive 防复读:发送前用字符 3-gram Jaccard 检测最近 5 条 assistant 内容;相似度 ≥ 0.6 升温重生
- 日程自愈:00:30 cron 失败时 proactive tick 检测到缺日程会按需补一次(30 分钟级 debounce)
- Persona Guard:回复后一致性校验,自动检测"我是 AI"、客服话术、阶段违规;轻问题后处理,重问题重生成
.
├── index.mjs Express 入口 + iLink 轮询池
├── src/
│ ├── ai.mjs 业务层 AI facade
│ ├── providers/ chat / image / vision / asr / tts / embedding / web_search
│ ├── api.mjs REST 路由
│ ├── bot.mjs 微信消息处理 + 连发合并
│ ├── playground.mjs 浏览器聊天
│ ├── companion.mjs 18 节 system prompt 合成
│ ├── memory_v2.mjs 7 层记忆 + 语义召回 + 遗忘曲线
│ ├── emotion_state.mjs 情绪状态机(10 维增量 + mood)+ presence
│ ├── inner_os.mjs Inner OS 内心独白 + 冲突弧结构化检测
│ ├── open_loops.mjs 她记得未完成的事
│ ├── proactive.mjs 主动消息 + 场景照调度
│ ├── photo_intent.mjs 用户照片请求意图识别
│ ├── photo_planner.mjs 照片 AI 决策器 + 机位/比例路由
│ ├── photo_sender.mjs 生图 → 比例转码 → 上传发送
│ ├── visual_identity.mjs 稳定视觉人设 + 参考图管理
│ ├── visual_identity_candidates.mjs 4 候选自拍生成 + 选脸锁定
│ ├── image_beautify.mjs 生图全局轻美颜后处理
│ ├── security/netguard.mjs SSRF 防护下载
│ ├── relationship_arc.mjs 冲突与和好弧状态机(+_runtime IO 层)
│ ├── moderation.mjs 危机干预 + 冲突红线出站护栏
│ ├── minor_guard.mjs 未成年人保护(粘性安全模式)
│ ├── privacy_filter.mjs 长期存储隐私过滤
│ ├── persona_guard.mjs 回复后一致性校验
│ ├── reflection.mjs 每日/每周 AI 反思
│ ├── diary.mjs 日记生成
│ ├── thoughts.mjs 今天她想对你说
│ ├── voice_pipeline.mjs mp3 → SILK 转码
│ ├── voice_inbound.mjs 入站语音 下载+解密+解码
│ ├── voice_emotion.mjs 语音情绪识别
│ ├── plan_tasks.mjs cron 调度(日 / 周 / 月)
│ ├── ilink.mjs iLink 协议封装
│ └── db.mjs SQLite + 全部 migrateXxx() 注册点
├── public/app/ 20 个前端页面(dashboard / playground / emotion-debug …)
├── deploy/ systemd + nginx 模板
├── scripts/ 110+ 个:setup / doctor / arc-digest / 各 smoke / 沙箱验收 / ...
├── docs/
│ ├── FEATURES.txt 完整功能清单(最权威)
│ ├── HANDOFF.md 新对话交接提示词
│ ├── CONFLICT_ARC.md 冲突与和好弧设计文档
│ ├── ROADMAP.md 路线完成情况与 2026-06 回顾
│ └── voice-sprint-plan.md 语音 sprint 计划
└── data/ 运行时数据(gitignored)
.env/.env.*/.auth-secret/.admin-secret/.admin-credentials/.weixin-credentials.json/data/bot.db*/data/user_memories/全部.gitignore- 管理员密码首次启动自动生成 20 位写入
.admin-credentials(0600),忘记可删文件重生 AUTH_SECRET留空会自动生成但每次重启重生(导致 token 全部失效)。生产请显式设 ≥32 字符随机串/api/health只输出 provider 名 / iLink configured 与否 / 邮件模式,绝不输出 token / 用户数据- iLink
bot_token从不打印;扫码脚本只显示 maskedbot_id/user_id - 默认 CORS 关;默认 rate limit (
src/ratelimit.mjs) 按个人量级设计,公开服务前置 WAF
- SSRF 防护:所有从用户 URL 下载的图片(如"从 URL 设头像")走
src/security/netguard.mjs:仅 http/https、DNS 解析后逐 IP 校验、拒绝 127/10/172.16-31/192.168/169.254/100.64/IPv6 ULA-link-local 等保留段、≤5MB、≤3 跳重定向、15s 超时 - 限流 IP 取值:
req.ip由 Express trust-proxy 链计算,不再裸读客户端X-Forwarded-For(可伪造)。反代场景配置TRUST_PROXY=true或具体 IP/CIDR - 首次初始化 token:
POST /api/setup/local-account默认只允许 localhost;如需远程一键初始化可设XIYU_SETUP_TOKEN=<随机串>,调用方通过xiyu-setup-tokenheader 提供,校验用crypto.timingSafeEqual防侧信道 - 管理端鉴权:
/api/admin/ilink-status加requireAdmin,返回字段去除 token / errmsg 截断 80 字 / bot_id 脱敏,避免泄漏运营态 - 越权防护:
/api/companions/user/:uid校验 companion 归属当前账号(IDOR 修复) - Setup 试 Provider:
/api/setup/test-chat加softAuth,匿名调用仅限"首次本机 + 用户数=0"白名单
- SQLite 默认
data/bot.db,含聊天历史 / 记忆 / 用户画像。自托管时数据完全在你机器上 - 对话历史默认保留 60 天 (
runHourlyCleanup),可调;删账号清空对应 companion 全部数据 - 未成年人 / 心理高风险场景请额外谨慎,见 Issue #3
- 邮箱:
xiyuai@proton.me - GitHub Security Advisories:https://github.com/dimang01/xiyu-ai/security/advisories/new
- 详细见 SECURITY.md
MIT 协议只覆盖代码,不覆盖你产出的内容、引用的第三方服务、运营行为。公开部署是运营者自己的责任。
7 项部署者自查清单(不构成法律意见):
| 维度 | 你需要做的 |
|---|---|
| 隐私政策 / 用户协议 | terms.html / privacy.html 是空模板,不能直接用 |
| AI 生成内容标识 | 中国大陆《生成式人工智能服务管理暂行办法》、欧盟 AI Act 等都要求显著标识 |
| 未成年人保护 | v1.20 起内置:检测用户自曝未成年(regex + LLM 兜底)→ 粘性安全模式(朋友身份、无恋爱内容、阶段封顶、照片中性化),解除仅限 dashboard 显式年龄声明。但这不是年龄验证——无法识别不自曝的未成年人,公开运营仍建议接入实名/年龄验证 |
| 个人信息保护 | PIPL / GDPR / CCPA 等需自行明示收集目的、提供删除接口 |
| 内容安全审核 | 仓库当前只有简单黑名单,对外开放前请接入云厂商审核 API |
| 危机话术 | 内置基础危机检测(自伤信号 → 退出角色 + 求助热线),但不替代专业审核,公开运营请额外接入 |
| Provider ToS | 每家 LLM/图像 provider 各有条款(是否允许虚拟人格、情感陪伴、商用),切换前自行确认 |
框架不预设角色性格 / NSFW 内容 / 越界互动。注册角色的人设由部署方或终端用户决定。仓库里所有人格模板都是中立示例。是否做向成年用户的情感陪伴、是否允许某些角色,是你的产品决策与合规决策,请自负其责。
| 限制 | 状态 / 跟踪 |
|---|---|
| bot 在微信里发语音 | 永久限制 — iLink 协议禁止 outbound voice;网页/PWA 端正常 |
| 讯飞 / 腾讯云 ASR 仅占位 | WebSocket + HMAC 协议复杂,需 PR |
| 内容审核 API 需运营者自接 | 危机干预与未成年人保护已内置;公开运营建议另接审核服务 |
| 生产部署指南未完善 | #5 |
| 微信对接依赖腾讯 iLink/ClawBot 准入 | 上游条件 |
| 实时语音通话 | 协议层做不到 |
发版节奏 / 完整 changelog 在 GitHub Releases;增量索引见 docs/FEATURES.txt;2026-06 路线回顾见 docs/ROADMAP.md。
主线脉络(一句话版):
- v1.22.0 她的生活有实物 + 失忆修复:她有了随时间演化的身体(生理期会蔫但不指向你、按关系深浅披露、绝不做暧昧窗口、未成年保护下关闭,情绪上的细微影响默认只后台观测);世界经得起查证(节气 / 农历节日天文计算含闰月、手头的书 / 剧 / 事跨日连贯);不再"突然失忆"(记得当前场景与你们的约定,讲完故事不再忘、不凭空编"刚吃完麻辣香锅",凭空重病声明也拦);运维侧死人开关三桶信号分离减少假警报、反思心跳、playground 探针
- v1.21.x 冲突与和好弧 + 工程加固:关系事件状态机(她会真的受伤、和好有惯性)统一收编全部"她对你冷"的逻辑;事故复盘后让静默失败变响(ESLint / 错误签名日报 / 死人开关);照片比例修复;沉浸感卫生包(她的世界里没有"用户"这个词、素材级防复读、互动历史自动打底);照片承诺兑现链(承诺前可行性闸门、拍不出能改期补发、月相锚定杜绝凭空满月);照片品类校准(像真实恋爱那样发照片:食物一等公民、天空靠 sun_times 日落窗口锚定、"看到这个想到你"、真实出版物封面护栏;先审计后改配比时还顺手揪出并修了一桩 1.5 天的静默断图 P0)
- v1.20.x 安全收尾:未成年人保护(粘性安全模式)、隐私过滤全口子、发布一致性 CI、照片真实感 v2(反磨皮质感词直达生产)
- v1.14 → v1.19 真人感纵深:被冷落逐级转变 + 依恋风格、留存漏斗(挽留/升温/读空气/破冰)、照片真实感大改(环境自拍/i2i 锁脸/机位路由)、初恋特质
- v1.6 → v1.13 体验底座:真实发图链路、反讨好系列、Inner OS、开环记忆、睡眠系统、连发合并、关系节奏(时间喂大感情)、中英双语
- v1.0 → v1.5 框架成型:人设引擎、Memory v2、情绪状态机、主动消息、日记、多 Provider 抽象
- 开发环境 / PR 约定 / 产品调性 → CONTRIBUTING.md(3 分钟读完)
- 找到 bug → 新 Issue
- 路线图 → Issues 带
enhancement/help wanted/good first issue标签的最适合上手 - 想贡献代码:fork → PR;保持改动小而聚焦,附带说明动机
- 致谢见 ACKNOWLEDGMENTS.md
MIT © 2026 溪语 AI Contributors
仓库不包含任何第三方表情包图片。assets/stickers/ 只有加载与 tag 匹配机制,启用表情包请自行准备有合法授权的素材。