# CLAUDE.md 本文件为 Claude Code (claude.ai/code) 在本仓库中工作时提供指引。 ## 项目概述 CamTalk 是一款多模态实时 AI 视觉对话助手。用户通过摄像头和麦克风与 AI 交互,AI 理解视觉场景和语音输入后,以文字和语音形式给出自然回应。项目目前处于设计文档阶段,源代码正在逐步构建。 > **文档优先原则:** 执行任何开发任务前,先读取 `docs/` 下的相关设计文档(架构、接口、技术选型等),以文档为最高依据。代码实现应与文档一致;若有偏差,优先更新文档(尤其是接口文档)。 ## 架构 三层系统: 1. **浏览器客户端**(React 18 + TypeScript, Vite)—— 媒体采集、边缘预处理(VAD 通过 `@ricky0123/vad-web`、关键帧检测通过 ONNX Runtime Web)、UI 渲染。核心 Hook:`useVisionSession()` 2. **Go 网关**(gorilla/websocket, Redis, Viper, Zap)—— WebSocket 服务器、会话管理、模型路由、AI 编排、速率限制。每个 WebSocket 连接一个 goroutine。 3. **云端 AI 服务** —— GPT-4o(LLM)、Deepgram(STT)、OpenAI TTS。仅通过 Go 网关访问,浏览器不直连。 **关键模式**:LLM 文本流和 TTS 音频流并行推送给客户端,以最小化感知延迟。 **存储**:冷热分离 —— Redis 存实时会话状态,PostgreSQL 存对话历史和用量统计(MVP 后引入)。Repository 接口模式(`HistoryRepository`、`UsageRepository`),MVP 用内存实现。 ## 技术栈 | 层级 | 技术 | |------|------| | 前端 | React 18, TypeScript, Vite, ONNX Runtime Web, @ricky0123/vad-web | | 后端 | Go, gorilla/websocket, Redis, Viper, Zap | | LLM | GPT-4o(主), Claude Sonnet(备) | | STT | Deepgram(主), FunASR(自部署备选) | | TTS | OpenAI TTS(主), Edge TTS(免费替代) | | 模型路由 | GPT-4o-mini 用于轻量分类 | ## 构建与运行命令 ```bash # 前端 cd frontend && npm install npm run dev # Vite 开发服务器 npm run build # 生产构建 npm run lint # ESLint 检查 npm run test # Vitest 测试 # 后端 cd backend && go mod download go run ./cmd/server # 启动网关,监听 :8080 go build -o bin/camtalk ./cmd/server go test ./... # 运行所有测试 go test -run TestName ./path # 运行单个测试 go vet ./... # 静态分析 ``` 基础设施:Redis 为会话状态必需。PostgreSQL 为 MVP 可选(内存回退)。 ## WebSocket 协议 端点:`ws://localhost:8080/ws` 所有消息为 JSON 文本帧,统一信封格式 `{type, request_id?, timestamp?}`。完整契约见 `docs/03-接口文档.md`。 **客户端 → 服务端**:`query`(图像 Base64 + 音频 Base64)、`config`、`interrupt`、`ping` **服务端 → 客户端**:`connected`、`stt_result`、`llm_chunk`、`llm_done`、`tts_audio`、`error`、`pong` **心跳**:客户端每 30 秒 ping,服务端 60 秒无 ping 断开连接。 **重连**:指数退避 + 抖动 —— 1s, 2s, 4s, 8s… 最大 30s。 ## REST API(辅助) - `GET /api/health` — 健康检查(版本、运行时间、活跃会话数) - `POST /api/sessions` — 创建会话(可选,MVP 在 WS 连接时自动创建) - `DELETE /api/sessions/{id}` — 销毁会话 ## 错误码 `INVALID_MESSAGE`、`SESSION_NOT_FOUND`、`RATE_LIMITED`、`IMAGE_TOO_LARGE`、`AUDIO_TOO_SHORT`、`LLM_TIMEOUT`、`LLM_ERROR`、`STT_ERROR`、`TTS_ERROR`、`INTERNAL_ERROR` ## 前端组件结构 | 组件 | 职责 | |------|------| | `CameraManager` | 摄像头流采集 | | `MicManager` | 麦克风音频采集 | | `EdgeProcessor` | VAD + 关键帧检测(ONNX Runtime) | | `WebSocketManager` | WebSocket 连接生命周期管理 | | `ChatPanel` | 消息展示 | | `VideoPreview` | 摄像头画面预览 | ## 后端模块结构 | 模块 | 职责 | |------|------| | WebSocket Hub | 连接管理、广播/定向推送 | | Session Manager | 会话状态、对话历史(Redis + TTL) | | Model Router | 按请求选择 AI 模型(规则引擎 + 成本阈值) | | AI Orchestrator | 并行/串行 AI 调用编排,context 超时控制 | | Rate Limiter | 按用户的令牌桶速率限制 | ## 编码规范 - **Go**:遵循标准 Go 规范。所有 AI 调用使用 `context.Context` 做取消/超时。并发 map 访问使用 `sync.RWMutex`。结构体标签用 `json:"snake_case"`。 - **TypeScript**:严格模式。所有数据模型用接口定义。WebSocket 消息类型用可辨识联合类型(`type` 字段)。 - **提交信息**:Conventional Commits 格式,描述用中文。示例:`feat: 添加 WebSocket 连接管理`、`fix: 修复心跳超时判断`、`docs: 更新接口文档` - **禁止自动 push**:除非用户明确要求。 - **文档优先**:实现功能前先读取 `docs/` 下的相关设计文档。实现与文档不一致时,优先更新 `docs/` 下的接口文档。