feat(api): A3 backend skeleton with FastAPI + SQLModel

- 3 tables: Meeting / TranscriptSegment / Summary (with state machine)
- Routes: /api/upload-url + /api/upload-complete + meetings CRUD
- MinIO presigned PUT for direct browser upload
- BackgroundTasks state-machine stub for A5 to flesh out
- SQLite for local dev, PostgreSQL+asyncpg for prod
- CORS configured for frontend on 4490

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-13 19:14:16 +08:00
parent 4f064bb470
commit 3111c854c5
7 changed files with 272 additions and 0 deletions

37
api/README.md Normal file
View File

@@ -0,0 +1,37 @@
# MeetNote API
FastAPI 后端,端口 4491。
## 启动
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # 填 GROQ_API_KEY / POE_API_KEY
uvicorn app.main:app --reload --port 4491
```
## 路由
- `GET /health`
- `POST /api/upload-url` — 申请 presigned URL 创建会议
- `POST /api/upload-complete` — 通知后端上传完成,触发后台处理
- `GET /api/meetings` — 会议列表
- `GET /api/meetings/{id}` — 单个会议
- `GET /api/meetings/{id}/transcript`
- `GET /api/meetings/{id}/summary`
- `DELETE /api/meetings/{id}`
## 数据库
- 默认 `sqlite+aiosqlite:///./meetnote.db`(本地开发)
- 生产改 `DATABASE_URL=postgresql+asyncpg://...`
## 状态机
`pending → uploading → uploaded → splitting → transcribing → summarizing → done | failed`
## A3 vs A5
A3本提交只搭好骨架 + state-machine stub。A5 会接上:
- ffmpeg silencedetect 切片
- Groq Whisper 真实转写
- Poe Claude 真实总结