当前
main分支属于 v3.0 MVP,正在向生产可用版本重构。 Phase 1(安全加固)合并完成之前,请勿将本仓库部署到任何公网环境。已知未修复的高危漏洞(按 issue 追踪,逐项关闭):
状态 Issue 漏洞 ✅ 已修 #6 JWT_SECRET默认空导致任意会话伪造✅ 已修 #11 日志泄露 API key / 用户 PII ✅ 已修 #4 跨用户写入对话消息 / 自拍 ⏳ 修复中 #8 tRPC mutation 无 CSRF 保护 ⏳ 修复中 #9 LLM 输出未消毒 → 存储型 XSS ⏳ Phase 1b #7 OAuth state 无 HMAC(随 OAuth 整体替换一起修) ⏳ Phase 1b #2, #3 用户 API key 明文存储 + tRPC 路由裸传 ⏳ Phase 1c #5, #10 无服务端限流 + 无订阅配额(运营成本可被刷爆) 完整重构计划见
docs/REFACTORING.md; 全部 issue 见 issue tracker; 重大决策见docs/adr/。
My Raze 是一个全栈 AI 虚拟女友 Web 应用,支持 PWA 安装到手机桌面。用户可以创建拥有独特人格的 AI 女友,与她进行智能文字/语音对话,让她根据聊天场景生成自拍照片,并通过亲密度系统建立深层情感连接。
项目采用 TypeScript 全栈开发,前后端共享类型定义,端到端类型安全。当前版本 v3.0,包含 22,000+ 行代码和 143 个自动化测试用例。
| 功能 | 说明 |
|---|---|
| 智能对话 | 基于 OpenRouter 接入 GPT-4o / Claude / Grok 等主流 LLM,支持流式输出 |
| AI 自拍 | 根据对话场景自动或手动触发,通过 fal.ai 生成高质量场景化自拍照片 |
| 语音对话 | 支持三种 TTS 方案(浏览器内置 / ElevenLabs / Fish Audio)+ Whisper 语音转文字 |
| 多女友系统 | 创建多个拥有不同人格、外貌、兴趣的 AI 女友,自由切换 |
| 亲密度系统 | 10 级亲密度等级,通过对话/语音/自拍等互动积累经验值,解锁专属称呼和内容 |
| 心情系统 | AI 女友拥有动态心情状态,根据聊天频率和内容实时变化 |
| 推送通知 | AI 女友会主动发送早安/晚安/想你了等消息 |
| 自拍画廊 | 浏览和管理所有 AI 生成的自拍照片 |
| 功能 | 说明 |
|---|---|
| 提示词分层架构 | 系统基础 → 全局用户 → 个体女友 → 结构化字段,四层提示词精细控制 AI 行为 |
| 6 种快捷人格模板 | 温柔体贴 / 活泼可爱 / 知性优雅 / 傲娇女王 / 元气少女 / 神秘冷艳 |
| 自定义头像 | 上传自定义头像(支持 JPG/PNG/GIF/WebP,最大 10MB) |
| 回复语言/长度控制 | 自定义 AI 回复的语言和字数范围 |
| 模型自由选择 | 通过 OpenRouter 接入 500+ 模型,支持收藏常用模型 |
| 功能 | 说明 |
|---|---|
| PWA 支持 | 可安装到手机桌面,支持离线缓存 |
| 响应式设计 | 全页面适配移动端,包括 iPhone 刘海屏和安全区域 |
| 手势操作 | 左滑返回 + 下拉刷新 |
| 触摸优化 | 按钮大小和间距适合手指操作 |
前端 后端 基础设施
├── React 19 ├── Express 4 ├── MySQL (TiDB)
├── TypeScript 5.9 ├── tRPC 11 ├── AWS S3
├── Tailwind CSS 4 ├── Drizzle ORM 0.44 ├── Manus OAuth
├── shadcn/ui + Radix UI ├── SuperJSON ├── Vite 7
├── TanStack Query 5 ├── Zod 4 ├── esbuild
├── Framer Motion └── Node.js 22 ├── Vitest
├── Wouter 3 └── pnpm
└── Lucide React
外部 AI 服务
├── OpenRouter (LLM 对话 - GPT-4o / Claude / Grok 等)
├── fal.ai (AI 图片生成)
├── ElevenLabs (TTS 语音合成)
├── Fish Audio (TTS 语音合成 - 中文优化)
└── OpenAI Whisper (语音转文字)
my-raze/
├── client/ # 前端代码
│ ├── public/ # 静态资源(PWA 图标、manifest)
│ └── src/
│ ├── pages/ # 页面组件(7 个页面)
│ │ ├── Home.tsx # 首页 - 女友卡片列表
│ │ ├── Chat.tsx # 聊天 - 消息/语音/自拍
│ │ ├── Setup.tsx # 创建/编辑女友
│ │ ├── Gallery.tsx # 自拍画廊
│ │ ├── Settings.tsx # API 配置/行为设定
│ │ └── ...
│ ├── components/ # 可复用组件(11 个)
│ │ ├── IntimacyPanel.tsx # 亲密度面板
│ │ ├── LevelUpAnimation.tsx # 升级动画
│ │ ├── VoiceRecordButton.tsx # 语音录制按钮
│ │ ├── NotificationBell.tsx # 通知铃铛
│ │ └── ui/ # shadcn/ui 基础组件
│ ├── hooks/ # 自定义 Hooks
│ ├── contexts/ # React Context
│ ├── lib/ # 工具函数
│ └── App.tsx # 路由配置
├── server/ # 后端代码
│ ├── routers.ts # tRPC API 路由(30+ 端点)
│ ├── db.ts # 数据库操作函数
│ ├── promptTemplates.ts # 提示词模板
│ ├── storage.ts # S3 存储操作
│ ├── *.test.ts # 测试文件(15 个)
│ └── _core/ # 框架层(认证/LLM/TTS 等)
├── shared/ # 前后端共享代码
│ ├── intimacy.ts # 亲密度等级系统
│ └── defaultGirlfriend.ts # 默认女友配置
├── drizzle/ # 数据库 Schema
│ └── schema.ts # 8 张表定义
├── package.json
├── vite.config.ts
├── tsconfig.json
└── vitest.config.ts
项目使用 MySQL (TiDB) 数据库,通过 Drizzle ORM 管理,共 8 张表:
| 表名 | 用途 | 核心字段 |
|---|---|---|
users |
用户账户 | openId, name, role |
girlfriends |
女友配置 | personality, appearance, intimacyLevel, avatarUrl |
conversations |
对话会话 | userId, girlfriendId, title |
messages |
聊天消息 | role, content, imageUrl |
selfies |
AI 自拍照 | imageUrl, prompt, mode |
apiConfigs |
API 配置 | llmApiKey, ttsProvider, globalPrompt |
girlfriendMoods |
心情追踪 | mood, moodScore, todayMessages |
notifications |
推送通知 | title, content, type, isRead |
- Node.js 22+
- pnpm 10+
- MySQL 8+ 或 TiDB
# 克隆仓库
git clone https://github.com/Do-fei/my-raze.git
cd my-raze
# 安装依赖
pnpm install
# 配置环境变量
cp .env.example .env
# 编辑 .env 填入数据库连接和必要的密钥
# 推送数据库 Schema
pnpm db:push
# 启动开发服务器
pnpm dev| 变量名 | 说明 | 必填 |
|---|---|---|
DATABASE_URL |
MySQL/TiDB 连接字符串 | 是 |
JWT_SECRET |
JWT 签名密钥 | 是 |
VITE_APP_ID |
OAuth 应用 ID | 是 |
OAUTH_SERVER_URL |
OAuth 服务端地址 | 是 |
用户的 API Key(OpenRouter、fal.ai、ElevenLabs、Fish Audio)在应用内的设置页面配置,无需写入环境变量。
# 构建生产版本
pnpm build
# 启动生产服务
pnpm start项目使用 Vitest 编写自动化测试,当前共 143 个测试用例,覆盖核心业务逻辑:
# 运行全部测试
pnpm test测试覆盖范围包括:亲密度计算、心情系统、提示词模板、API 配置验证、语音转写、头像上传、批量操作等。
| 版本 | 主要更新 |
|---|---|
| v3.0 | 亲密度等级系统(10 级、经验值、升级动画、防刷分机制) |
| v2.9 | 语音转写 API 配置(Manus 内置 / OpenAI 双方案) |
| v2.8 | 语音消息输入(按住说话、波形动画、上滑取消) |
| v2.7 | API 使用量监控(余额查询、用量统计、进度条) |
| v2.6 | 设置页增强(API Key 验证、模型收藏) |
| v2.5 | 独立保存生效按钮(语音/fal.ai 配置) |
| v2.4 | OpenRouter 配置保存生效 |
| v2.3 | 女友头像上传(S3 存储、格式校验) |
| v2.2 | 品牌 Logo + 推送通知 + 手势操作 |
| v2.1 | PWA 移动端适配(响应式、安全区域、触摸优化) |
| v2.0 | 提示词分层架构(四层提示词 + 6 种快捷模板) |
| v1.9 | 退出登录 + 默认深色模式 |
| v1.8 | 品牌更名 My Raze + 批量清理 + 回收站 |
| v1.7 | 首页女友卡片删除按钮 |
| v1.6 | 历史对话搜索 + 女友心情系统 |
| v1.5 | 默认女友 Raze + 删除功能 + 历史侧边栏 + 语速控制 |
| v1.4 | 语音双选方案(ElevenLabs + Fish Audio) |
| v1.3 | 手动触发自拍按钮 |
| v1.2 | OpenRouter 适配(500+ 模型) |
| v1.1 | 语音对话 + 多女友支持 + 暗黑模式 |
| v1.0 | 初始版本(智能对话 + AI 自拍 + 基础配置) |
| 指标 | 数值 |
|---|---|
| TypeScript 代码行数 | 22,244 |
| 总代码行数(含 CSS/JSON) | 29,660 |
| 数据库表 | 8 张 |
| 页面 | 7 个 |
| 自定义组件 | 11 个 |
| tRPC API 端点 | 30+ |
| 测试用例 | 143 个 |
| 测试文件 | 15 个 |
| 外部 AI 服务集成 | 5 个 |
| 版本迭代 | 20 次 |
- v3.1 — 长期记忆系统(记忆提取、语义检索、上下文注入)
- v3.2 — 动态用户画像 + 每日对话摘要
- v3.3 — 心跳主动消息 + PWA Push Notification
- v4.0 — 记忆与亲密度深度整合
本项目基于 MIT License 开源。
- OpenRouter — LLM 模型聚合平台
- fal.ai — AI 图片生成服务
- ElevenLabs — AI 语音合成
- Fish Audio — 中文语音合成
- shadcn/ui — 精美的 React 组件库
- tRPC — 端到端类型安全的 API 框架
- Drizzle ORM — 类型安全的 ORM
- OpenClaw — 记忆系统架构参考
Built with Dawei & Love
