zhuchenyu2008/AI-Commute

GitHub: zhuchenyu2008/AI-Commute

基于 AI Agent 的个人通勤规划与提醒应用,通过自然语言一句话生成多段路线方案并自动推送出发与路线变化提醒。

Stars: 21 | Forks: 1

# AI Commute

AI Commute Logo

你的 AI 通勤规划与提醒助手

功能亮点 · English · Docker 部署 · 本地开发

Next.js TypeScript Prisma License Docker

## 项目简介 AI Commute 是一个面向个人通勤场景的智能规划应用。它使用 Next.js、Prisma/SQLite、高德地图能力和兼容 OpenAI 的规划运行器,把地点搜索、路线方案、天气参考、行程提醒、Telegram 对话和邮件通知串成一个完整的通勤工作流。 适合这些场景: - 每天需要根据到达时间倒推出发时间。 - 希望 AI 结合偏好、路线和天气生成通勤方案。 - 希望通过 Telegram 继续和 Agent 对话或切换行程。 - 希望通过邮件/Telegram 接收到点提醒和路线变化提醒。 ## 功能亮点 - **AI 路线规划**:从自然语言目标创建 Agent 会话,调用地点、路线、天气和持久化工具生成行程。 - **多段行程与缓冲**:支持路线分段、天气/交通缓冲、最晚出发时间和提醒计划。 - **行程分享**:创建可撤销的公开只读链接,并生成带二维码、最长不超过 9:16 的 PNG 分享图。 - **用户级设置**:保存默认城市、默认出发点、通勤偏好、Telegram Chat ID、邮件接收人和路线变化阈值。 - **通知闭环**:内置 scheduler、Telegram worker、邮件模板和通知发送日志。 - **部署友好**:支持本机一键启动,也支持 Docker Compose 同时运行 Web、scheduler 和 Telegram worker。 ## 界面截图 | 首页 | 历史 | 记忆 | | --- | --- | --- | | 首页 | 历史行程 | 通勤记忆 | ### 邮件提醒

出发提醒邮件 路线变化邮件

## 技术栈 - Next.js 15 / React 19 / TypeScript - Prisma / SQLite - Tailwind CSS / lucide-react - Vitest / Playwright - Nodemailer / Telegram Bot API - OpenAI-compatible Chat Completions ## 本地开发 1. 复制并填写环境变量: cp .env.example .env 2. 安装依赖: npm install 3. 准备数据库: npm run prisma:deploy npm run prisma:seed 4. 启动开发服务: npm run dev 默认种子账号: user@example.com / password ## 常用脚本 npm run dev npm run build npm run start npm run lint npm test npm run test:watch npm run prisma:generate npm run prisma:migrate npm run prisma:deploy npm run prisma:seed npm run scheduler:tick npm run email:test-templates npm run email:test-departure-reminder npm run email:test-route-change npm run telegram:poll ## Docker 同时运行 Web、scheduler 和 Telegram worker: docker compose up --build `migrate` 一次性服务会先执行 `npx prisma migrate deploy && npm run prisma:seed`。`web`、`scheduler` 和 `telegram` 都通过 `service_completed_successfully` 依赖它,确保 SQLite schema 和种子账号在长驻服务启动前准备完成。 - `web`:运行 `npm run start`,暴露 `3000:3000`。 - `scheduler`:每 60 秒执行一次 `npm run scheduler:tick`。 - `telegram`:`TELEGRAM_BOT_TOKEN` 已配置时运行 `npm run telegram:poll`;为空时保持容器空闲,避免 `unless-stopped` 反复重启。 - SQLite 数据持久化到宿主机 `./data`,容器内路径为 `/app/data`。 `web`、`scheduler` 和 `telegram` 都使用 `restart: unless-stopped`,服务器重启或进程异常退出后会自动恢复;`migrate` 是一次性迁移服务,仍保持 `restart: "no"`。 ## 本机一键部署 Windows: .\start-all.ps1 也可以双击 `start-all.cmd`。如果 PowerShell 执行策略拦截脚本,请使用 `start-all.cmd`,它会以 `ExecutionPolicy Bypass` 调用 PowerShell 入口。 Linux: chmod +x ./start-all.sh ./start-all.sh 可用参数: npm run start:all -- --configure npm run start:all -- --yes ## Telegram 双向入口 Telegram polling worker 需要在 `.env` 中配置: TELEGRAM_BOT_TOKEN= 用户登录网站后,需要在设置页保存自己的 Telegram Chat ID,worker 才能把 Telegram 对话和站内用户关联起来。 常用命令: - `/new 明天九点到外事学校` 创建新行程。 - `/new` 后发送下一条普通文本创建新行程。 - 普通文本会继续当前 Agent 对话。 - `/trips` 通过 inline buttons 切换当前 Telegram 对话绑定的行程。 - `/cancel` 取消当前行程监控。 ## 邮件提醒 SMTP 配置完整后,scheduler 可以发送出发提醒和路线变化提醒。接收人由用户在设置页填写,不放在 `.env`。 SMTP_HOST= SMTP_PORT=587 SMTP_SECURE=false SMTP_USER= SMTP_PASS= SMTP_FROM= SMTP_TLS_USE_SYSTEM_CA=false 本地发送 mock 邮件模板: npm run email:test-templates npm run email:test-departure-reminder npm run email:test-route-change ## 环境变量 核心配置: - `DATABASE_URL`:Prisma 数据库连接,默认可使用 SQLite。 - `DEFAULT_CITY`:默认城市。 - `DEFAULT_TIMEZONE`:默认时区,例如 `Asia/Shanghai`。 - `AMAP_API_KEY`:高德 Web Service Key;留空时使用 mock AMap client。 - `OPENAI_API_KEY`:兼容 OpenAI 的规划运行器凭证;留空时使用内置 fallback planner。 - `OPENAI_BASE_URL`:兼容 OpenAI 接口的自定义 base URL。 - `OPENAI_MODEL`:规划运行器模型名。 - `SEED_USER_EMAIL`:种子账号邮箱。 - `SEED_USER_PASSWORD`:种子账号密码。 - `SCHEDULER_TICK_SECRET`:保护 scheduler tick API 的 shared secret。生产环境建议显式配置一段足够长的随机字符串;如果生产环境为空,Web 进程会自动生成临时内存密钥以避免公网 tick API 裸奔。需要外部手动调用 tick API 时,请配置固定密钥。 - `TELEGRAM_BOT_TOKEN`:Telegram bot token。 ## 测试 单元测试和集成测试: npm test 类型检查: npm run lint 生产构建: npm run build Playwright E2E: npm run test:e2e -- tests/e2e/commute-flow.spec.ts --reporter=line --workers=1 npm run test:e2e -- tests/e2e/trip-sharing.spec.ts --reporter=line --workers=1 ## 致谢 - CodeX - GPT-Image-2 - stitch - Linux Do - 啃果干儿^-^
标签:Prisma, 定时提醒, 消息通知, 版权保护, 特征检测, 自动化攻击, 通勤路线规划, 高德地图