Files
CamTalk/CLAUDE.md
cfy666 3dc2015a91 docs: 更新技术文档,同步 Eino 重构和默认 provider 变更
- 架构设计:更新为 Eino Graph 声明式编排,增加三级存储架构说明
- 接口文档:AI 编排器章节重写为 Eino Graph,更新 LLM 服务接口
- 技术选型:新增 Eino 框架选型章节,修正 STT/LLM/TTS 默认方案
- 语音交互:Pipeline 描述改为 Eino Graph
- 成本控制:模型引用修正为 qwen3-vl-plus
- 技术名词解释:新增 Eino 框架相关术语
- README:增加 10/11/12 Eino 文档索引
- 10-Eino重构方案:状态更新为已实施
- CLAUDE.md:同步所有变更
2026-06-20 13:24:53 +08:00

6.3 KiB
Raw Blame History

CLAUDE.md

本文件为 Claude Code (claude.ai/code) 在本仓库中工作时提供指引。

项目概述

CamTalk 是一款多模态实时 AI 视觉对话助手。用户通过摄像头和麦克风与 AI 交互AI 理解视觉场景和语音输入后,以文字和语音形式给出自然回应。

文档优先原则: 执行任何开发任务前,先读取 docs/ 下的相关设计文档(架构、接口、技术选型等),以文档为最高依据。代码实现应与文档一致;若有偏差,优先更新文档(尤其是接口文档)。

架构

三层系统:

  1. 浏览器客户端React 18 + TypeScript, Vite—— 媒体采集、边缘预处理VAD 通过 @ricky0123/vad-web、关键帧检测通过 Canvas 像素比较、UI 渲染。核心 HookuseVisionSession()
  2. Go 网关Gin, gorilla/websocket, Viper, Zap—— WebSocket 服务器、会话管理、AI 编排(基于 CloudWeGo Eino Graph。每个 WebSocket 连接一个 goroutine。
  3. 云端 AI 服务 —— 通过 OpenAI 兼容接口可灵活切换。默认DashScope qwen3-vl-plusLLM、MiMo ASRSTT、MiMo TTSTTS。仅通过 Go 网关访问,浏览器不直连。

关键模式AI 编排基于 Eino Graph 声明式 DAGSTART → STT → History → ChatModel → Msg2Str → Splitter → TTS → Done → ENDLLM token 通过 Callback 实时推送TTS 逐句合成并行推送,最小化感知延迟。

存储三级存储架构TieredManager—— L1 Memory → L2 Redis → L3 PostgreSQL自动降级。Repository 接口模式UserRepository、MessageRepository、SessionRepositoryPostgreSQL + 内存双实现。

技术栈

层级 技术
前端 React 18, TypeScript, Vite, @ricky0123/vad-web
后端 Go, Gin, gorilla/websocket, Viper, Zap
AI 编排 CloudWeGo Eino Graph声明式 DAG 编排)
LLM DashScope qwen3-vl-plus默认通过 eino-ext OpenAI ChatModel 接入)
STT MiMo ASR默认 / Deepgram
TTS MiMo TTS默认 / OpenAI TTS

构建与运行命令

# 前端
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 ./...                 # 静态分析

基础设施三级存储架构L1 Memory → L2 Redis → L3 PostgreSQL通过配置控制启用层级。

WebSocket 协议

端点:ws://localhost:8080/ws?token=<access_token>&conversation_id=<uuid>

所有消息为 JSON 文本帧,统一信封格式 {type, request_id?, timestamp?}。完整契约见 docs/02-接口文档.md

客户端 → 服务端query(图像 Base64 + 音频 Base64configinterruptping 服务端 → 客户端connectedstt_resultllm_chunkllm_donetts_audioerrorpong

心跳:客户端每 30 秒 ping服务端 60 秒无 ping 断开连接。 重连:指数退避 + 抖动 —— 1s, 2s, 4s, 8s… 最大 30s。

REST API辅助

  • GET /api/health — 健康检查(版本、运行时间、活跃会话数)
  • POST /api/auth/register — 注册
  • POST /api/auth/login — 登录
  • POST /api/auth/refresh — 刷新 Token
  • POST /api/auth/logout — 登出
  • GET /api/conversations — 对话列表
  • POST /api/conversations — 创建对话
  • GET/PUT/PATCH/DELETE /api/conversations/:id — 对话 CRUD
  • GET /api/conversations/:id/messages — 获取对话消息

错误码

INVALID_MESSAGESESSION_NOT_FOUNDRATE_LIMITEDIMAGE_TOO_LARGEAUDIO_TOO_SHORTLLM_TIMEOUTLLM_ERRORSTT_ERRORTTS_ERRORINTERNAL_ERRORUSERNAME_TAKENINVALID_CREDENTIALSINVALID_TOKENINVALID_INPUT

前端组件结构

组件 职责
AuthPage 登录/注册表单
CameraManager 摄像头流采集
MicManager 麦克风音频采集
EdgeProcessor VAD + 关键帧检测Canvas 像素比较)
WebSocketManager WebSocket 连接生命周期管理
ChatPanel 消息展示、流式回复、文本输入、场景选择
VideoPreview 摄像头画面预览
SessionSidebar 左侧抽屉式对话列表
ConfigPanel 右侧抽屉式配置面板
Toast 轻量通知提示

核心 HookuseVisionSession() 封装一次完整的视觉对话会话。

后端模块结构

模块 职责
WebSocket Handler 连接管理、JWT 认证、单播消息推送
Session Manager 会话状态、对话历史三级存储Memory/Redis/PostgreSQL30 分钟 TTL
Eino 编排层 基于 Eino Graph 的声明式 AI 编排7 节点 DAGStream 模式Callback AOP
AI Orchestrator EinoOrchestrator 适配器,包装 Graph 实现 Orchestrator 接口
AI Service Layer AI 服务抽象层STT/TTS 多 providerLLM 通过 eino-ext ChatModel
Auth JWT 双 token 轮转认证bcrypt 密码哈希
Store 持久化存储层UserRepository/MessageRepository/SessionRepository内存 + PostgreSQL
REST API 健康检查、认证、对话管理Gin 路由)
Models 数据模型定义
Migrations 数据库版本化迁移(嵌入式 SQL
Model Router 按请求选择 AI 模型(规划中)
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/ 下的接口文档。