169 lines
5.9 KiB
Markdown
169 lines
5.9 KiB
Markdown
# DreamWeaver 梦语织机
|
||
|
||
AI 儿童故事生成应用,面向 3-8 岁儿童与家长,支持关键词生成故事、绘本页生成、封面图生成、语音朗读、孩子档案、故事宇宙与 Provider 管理。
|
||
|
||
当前仓库优先服务一个目标:本地 Docker 环境中稳定跑通完整产品闭环,便于求职演示和后续迭代。
|
||
|
||
## 技术栈
|
||
|
||
- 后端:FastAPI、SQLAlchemy async、PostgreSQL、Celery、Redis
|
||
- 前端:Vue 3、TypeScript、Pinia、Vue Router、Tailwind CSS、Vite
|
||
- 认证:OAuth 2.0 + JWT httpOnly cookie,本地演示支持 dev login
|
||
- AI:文本、图片、TTS、绘本结构生成均通过 adapter/provider router 接入
|
||
|
||
## 仓库结构
|
||
|
||
```text
|
||
backend/ FastAPI 后端、Celery 任务、数据库迁移
|
||
frontend/ 用户端 Vue 应用
|
||
admin-frontend/ 管理端 Vue 应用
|
||
docs/ 当前产品、规划与技术文档
|
||
docker-compose.yml
|
||
```
|
||
|
||
## 本地 Docker 演示
|
||
|
||
1. 准备环境文件:
|
||
|
||
```bash
|
||
cp backend/.env.example backend/.env
|
||
```
|
||
|
||
本地求职演示建议在 `backend/.env` 中使用:
|
||
|
||
```env
|
||
DEBUG=true
|
||
ENABLE_DEMO_PROVIDERS=true
|
||
TEXT_PROVIDERS=["demo", "gemini", "openai"]
|
||
IMAGE_PROVIDERS=["demo", "cqtai"]
|
||
TTS_PROVIDERS=["edge_tts", "minimax", "elevenlabs"]
|
||
STORYBOOK_PROVIDERS=["demo", "storybook_primary"]
|
||
```
|
||
|
||
`SECRET_KEY` 必须设置为强随机值。`backend/.env` 已被 git 忽略,不要提交真实密钥。
|
||
|
||
2. 启动完整本地栈:
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
3. 访问入口:
|
||
|
||
- 用户端:http://localhost:52080
|
||
- 本地开发登录:http://localhost:52080/auth/dev/signin
|
||
- 管理端:http://localhost:52888,默认演示账号来自 `backend/.env`
|
||
- 后端健康检查:http://localhost:52000/health
|
||
- 管理后端健康检查:http://localhost:52800/health
|
||
|
||
4. 常用命令:
|
||
|
||
```bash
|
||
docker compose ps
|
||
docker compose logs -f backend
|
||
./scripts/demo_smoke.sh
|
||
SMOKE_AUDIO=1 ./scripts/demo_smoke.sh
|
||
docker compose down
|
||
docker compose down -v
|
||
```
|
||
|
||
`scripts/demo_smoke.sh` 会检查健康状态、本地登录、统一生成、资产重试、故事列表和 Provider 能力分层。默认跳过 TTS;演示前需要验证语音链路时使用 `SMOKE_AUDIO=1`。
|
||
|
||
## 手动开发
|
||
|
||
后端:
|
||
|
||
```bash
|
||
cd backend
|
||
pip install -e ".[dev]"
|
||
alembic upgrade head
|
||
uvicorn app.main:app --reload --port 8000
|
||
```
|
||
|
||
Celery:
|
||
|
||
```bash
|
||
cd backend
|
||
celery -A app.core.celery_app worker --loglevel=info
|
||
celery -A app.core.celery_app beat --loglevel=info
|
||
```
|
||
|
||
用户前端:
|
||
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
管理前端:
|
||
|
||
```bash
|
||
cd admin-frontend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
## 质量检查
|
||
|
||
```bash
|
||
cd backend
|
||
pytest
|
||
ruff check app tests
|
||
|
||
cd ../frontend
|
||
npm run build
|
||
|
||
cd ../admin-frontend
|
||
npm run build
|
||
```
|
||
|
||
当前已知情况:完整后端测试可通过;全量 ruff 可通过。前端生产构建建议优先通过 Docker 验证,确保与本地演示环境一致。
|
||
|
||
## 核心接口
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
| --- | --- | --- |
|
||
| GET | `/auth/dev/signin` | 本地开发登录,仅 `DEBUG=true` 可用 |
|
||
| GET | `/auth/github/signin` | GitHub OAuth 登录 |
|
||
| GET | `/auth/google/signin` | Google OAuth 登录 |
|
||
| GET | `/auth/session` | 当前会话 |
|
||
| POST | `/api/generations` | 统一生成故事或绘本 |
|
||
| GET | `/api/generations/{story_id}` | 统一读取生成结果 |
|
||
| POST | `/api/generations/{story_id}/retry-assets` | 统一重试封面/语音资源 |
|
||
| GET | `/api/generations/jobs/{job_id}` | 查询生成任务事件流 |
|
||
| GET | `/api/generations/{story_id}/jobs` | 查询故事生成与重试历史 |
|
||
| GET | `/api/generations/{story_id}/provider-stats` | 查询 Provider 调用聚合指标 |
|
||
| GET | `/api/generations/ops-summary` | 查询最近任务运行概览、失败摘要和超时阈值 |
|
||
| GET | `/api/generations/provider-analytics` | 查询当前用户跨故事 Provider 运营摘要,支持 `days` / `capability` 筛选 |
|
||
| GET | `/api/audio/{story_id}/status` | 查询音频缓存状态,不触发生成 |
|
||
| DELETE | `/api/audio/{story_id}/cache` | 清理故事音频缓存 |
|
||
| GET | `/api/stories` | 故事列表 |
|
||
| GET | `/api/stories/{story_id}` | 故事详情 |
|
||
| DELETE | `/api/stories/{story_id}` | 删除故事 |
|
||
| GET/POST/PUT/DELETE | `/admin/providers` | Provider 管理,需开启管理后台 |
|
||
| GET | `/admin/providers/capabilities` | Provider 能力分层说明,需开启管理后台 |
|
||
|
||
## 文档入口
|
||
|
||
- `docs/product/job-search-relaunch-prd.md`:求职版产品重启 PRD
|
||
- `docs/product/unified-generation-workflow-prd.md`:统一生成工作流 PRD
|
||
- `docs/planning/week-1-execution-backlog.md`:短期执行 backlog
|
||
- `docs/planning/week-2-execution-backlog.md`:下一阶段执行 backlog
|
||
- `docs/planning/week-2-to-4-execution-backlog.md`:Week 2 到 Week 4 总执行 backlog
|
||
- `docs/planning/demo-checklist.md`:求职演示检查清单
|
||
- `docs/planning/demo-package.md`:求职版 Demo 包装页
|
||
- `docs/planning/demo-validation-log.md`:本地 Docker 演示验证记录
|
||
- `docs/planning/interview-pitch.md`:3 分钟项目讲解稿
|
||
- `docs/planning/week-1-sprint-review.md`:Week 1 复盘总结
|
||
- `docs/planning/week-4-sprint-review.md`:Week 4 复盘和生产化 backlog
|
||
- `docs/technical/architecture.md`:求职版架构说明
|
||
- `docs/technical/api-compatibility.md`:旧生成 API 兼容层策略
|
||
- `docs/technical/generation-job-state.md`:Generation Job 状态落库决策
|
||
- `docs/technical/memory-system-dev.md`:记忆系统技术说明
|
||
- `docs/technical/provider-routing.md`:Provider 能力与路由策略说明
|
||
|
||
## 当前取舍
|
||
|
||
仓库只保留一个 Docker Compose 入口:`docker-compose.yml`。生产部署、HA 演练、旧 Claude 原型和历史归档已从主仓库移除,避免干扰当前求职演示主线。音频缓存默认按 `STORY_AUDIO_CACHE_TTL_DAYS=30` 做后台清理,Celery beat 会每日执行一次 prune;生成任务默认按 `GENERATION_JOB_STALE_MINUTES=60` 判定卡住,后台会定时自动收敛为失败态,避免故事长期显示“永远在跑”。
|