Skip to content

anyuxurl/retro-chat

Repository files navigation

RetroChat

一个能在 iPhone 5s 上跑的 AI 聊天客户端。

RetroChat 是面向老旧设备的网页 AI 聊天应用。它的核心目标是在 iPhone 5s(iOS 12 / Safari 12)这类 10 年前的设备上仍能流畅使用。默认接入小米 xiaomi-mimo-v2.5-pro 模型,并允许用户自定义任意 OpenAI 兼容 endpoint。

特点

  • 极致兼容性:原生 ES5 + jQuery slim,全部 Flexbox 布局,避免 ReadableStream / 可选链 / CSS Grid 等老 Safari 不支持的特性
  • 流式响应:通过 XHR onprogress 增量读取 responseText 实现 SSE 流式输出,无需 ReadableStream
  • 零后端存储:会话和密钥仅存在浏览器 localStorage,可一键导入/导出 JSON
  • 多模型支持:内置小米 MiMo 开箱即用,自定义任意 OpenAI 兼容 API(DeepSeek、通义、Kimi、本地 Ollama 等)
  • 复古主题:CRT 绿屏 / 老 Mac 灰白 双主题切换
  • PWA 安装:可"添加到主屏幕"作为独立 app 启动;Service Worker 离线缓存让重复访问几乎秒开(iPhone 5s / iOS 12 同样支持)
  • Vercel 一键部署:一个 Serverless Function 做 SSE 代理,前端纯静态

项目结构

retro-chat/
├── index.html
├── css/style.css
├── js/
│   ├── storage.js   # localStorage 封装
│   ├── stream.js    # XHR 流式读取
│   ├── chat.js      # 消息渲染与会话管理
│   ├── settings.js  # 设置面板
│   └── app.js       # 入口
├── api/
│   └── chat.js      # Vercel Serverless Function — SSE 代理
├── vercel.json
└── package.json

本地开发

# 1) 复制环境变量模板,填入你的 mimo Base URL 和 Key
cp .env.example .env.local
# 编辑 .env.local,填上 MIMO_BASE_URL 和 MIMO_API_KEY

# 2) 启动本地服务(无需安装依赖,纯 Node.js)
npm run dev
# 等价于:node dev-server.js

# 3) 浏览器访问
open http://localhost:3000

设置面板里 Base URLAPI Key 留空即可,请求会自动用 .env.local 里的值。

部署到 Vercel

# 用 Vercel CLI
npm i -g vercel
vercel deploy --prod

或直接把仓库连到 Vercel Dashboard,自动部署。

关键:在 Vercel Dashboard 配置环境变量

进入项目 → Settings → Environment Variables,添加:

Name Value Environments
MIMO_BASE_URL https://token-plan-cn.xiaomimimo.com/v1 Production, Preview, Development
MIMO_API_KEY tp-... (你的 mimo key) Production, Preview, Development

⚠️ 不要把 API Key 写进前端代码或 commit 到 git —— 它会暴露在 bundle 里被任何人查看。

Vercel 会自动:

  • 把仓库根作为静态资源
  • api/chat.js 部署为 Serverless Function
  • 把环境变量注入到 Function 运行时
  • 透传 SSE 流(已在 vercel.json 关闭缓存)

注意:Hobby 套餐 Function 单次响应上限 10 秒。如果你的模型响应较长,建议 Pro 套餐(60s)或在客户端设置 maxTokens 上限。

Web Analytics

部署到 Vercel 后默认接入了 Vercel Web Analytics,统计聚合的页面访问量、访问国家、设备类型 —— 不使用 cookie、不做指纹识别、不收集个人数据,符合 GDPR / CCPA。

要让它生效,需要在 Vercel Dashboard → Analytics 标签页手动 Enable 一次。

不想要的话:

  1. 删掉 index.html<script src="/js/analytics.js"></script> 这行
  2. 在 Dashboard 关掉 Analytics

RetroChat 的核心隐私承诺不变:所有会话内容和 API Key 仍然只存在你的浏览器 localStorage,从未上传到任何后端(除了你配置的 AI endpoint)。

凭据优先级

后端 api/chat.js 按以下顺序选用上游凭据:

  1. 请求体里的 baseUrl + apiKey(用户在设置面板填的)
  2. 环境变量 MIMO_BASE_URL + MIMO_API_KEY(兜底默认)
  3. 都没有 → 返回 400 错误

注意:要么两个都用用户的,要么两个都用环境变量的 —— 不会混搭。如果用户只填了 baseUrl 没填 apiKey(或反之),前端会高亮报错让用户补全。

使用其他模型

设置面板里只有两个预设:MiMo(开箱即用)Custom(自定义)。选 Custom 时填入你自己的 Base URL 和 API Key —— 服务器环境变量只兜底 mimo。

任何符合 OpenAI Chat Completions 协议(POST /v1/chat/completions + stream:true SSE 输出)的服务都能用,包括:

  • DeepSeek https://api.deepseek.com
  • 通义 / DashScope https://dashscope.aliyuncs.com/compatible-mode
  • Moonshot / Kimi https://api.moonshot.cn
  • 本地 Ollama http://127.0.0.1:11434

老设备兼容性测试

  • 桌面 Safari 模拟:菜单栏 Develop → User Agent → Safari iOS 12
  • 真机:iPhone 5s 升级到 iOS 12.5.7 后访问 Vercel preview URL
  • iOS 模拟器:Xcode → Window → Devices and Simulators,下载 iOS 12 runtime

数据导出 / 导入

设置面板底部有 Export JSON / Import JSON 按钮,可备份所有会话与配置(API Key 也会被导出,妥善保管)。

已知限制

  • 长对话超过浏览器 localStorage 容量(约 5MB)时会自动剔除最旧会话
  • iOS 12 可能不支持部分新 Markdown 特性(如表格渲染样式)

License

MIT

About

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors