|
|
62baa656ee
|
feat: 实现 ConversationHandler(对话 CRUD + 消息查询 + 权限校验 + 路由注册)
- List: GET /api/conversations 获取当前用户对话列表(分页)
- Create: POST /api/conversations 创建新对话
- Get: GET /api/conversations/:id 获取对话详情
- UpdateTitle: PATCH /api/conversations/:id 更新对话标题
- Delete: DELETE /api/conversations/:id 删除对话
- GetMessages: GET /api/conversations/:id/messages 获取消息列表
- 所有端点通过 AuthMiddleware 认证
- getSessionForUser 校验 session.UserID == claims.UserID
- 返回 404 而非 403 避免信息泄露
|
2026-06-14 17:39:20 +08:00 |
|
|
|
ec8555d44b
|
feat: 编写 Session Manager 新方法测试(ListByUser 分页、UpdateTitle、自动标题生成)
|
2026-06-14 17:36:38 +08:00 |
|
|
|
6487a8ecab
|
feat: 扩展 Session Manager 接口,新增 ListByUser、UpdateTitle 方法
- Manager.Create 签名新增 userID 参数
- 新增 ConversationSummary 类型和 ListByUser 分页查询
- 新增 UpdateTitle 方法
- MemoryManager 实现:ListByUser 遍历+过滤+排序,UpdateTitle,自动标题生成
- RedisManager 实现:user:{id}:sessions 索引,ListByUser 通过 SMEMBERS 查询
- AppendMessage 自动更新标题(首条 user 消息时,取前 20 字符)
- 更新 ws handler、api/session.go、orchestrator mock 的 Create 调用
|
2026-06-14 17:35:20 +08:00 |
|
|
|
9ff971fd89
|
feat: 扩展 Session 模型,新增 UserID、Title、UpdatedAt 字段
|
2026-06-14 17:30:59 +08:00 |
|
|
|
c01ee1d14c
|
feat: 编写 AuthHandler API 测试(httptest + mock AuthService,覆盖全部端点)
|
2026-06-14 17:28:13 +08:00 |
|
|
|
15b437043f
|
feat: 实现 AuthHandler(注册/登录/刷新/登出端点 + 输入校验 + 路由注册)
|
2026-06-14 17:25:50 +08:00 |
|
|
|
fdea3aa9d1
|
feat: 新增认证相关错误码(USERNAME_TAKEN, INVALID_CREDENTIALS, INVALID_TOKEN, INVALID_INPUT)
|
2026-06-14 17:24:57 +08:00 |
|
|
|
f878988048
|
feat: 编写 AuthService 单元测试(mock UserRepository)
|
2026-06-14 17:18:22 +08:00 |
|
|
|
e455af6b2d
|
feat: 编写 TokenManager 单元测试
|
2026-06-14 17:17:28 +08:00 |
|
|
|
5211d14d50
|
feat: 定义并实现 AuthService(注册/登录/刷新/登出)
|
2026-06-14 17:14:52 +08:00 |
|
|
|
5b8cbb025f
|
feat: 实现 JWT 认证中间件(AuthMiddleware)
|
2026-06-14 17:13:54 +08:00 |
|
|
|
fca9108882
|
feat: 实现密码哈希与校验工具(bcrypt)
|
2026-06-14 17:07:51 +08:00 |
|
|
|
20597101f5
|
feat: 实现 TokenManager(JWT 签发/校验/哈希)
|
2026-06-14 17:07:12 +08:00 |
|
|
|
9842b4a457
|
feat: 编写 UserRepository 单元测试
|
2026-06-14 16:56:29 +08:00 |
|
|
|
ce13e5a048
|
feat: 实现内存 UserRepository(测试用)
|
2026-06-14 16:55:44 +08:00 |
|
|
|
36827edfea
|
feat: 实现 PostgreSQL UserRepository
|
2026-06-14 16:55:12 +08:00 |
|
|
|
af73e78aa3
|
feat: 定义 UserRepository 接口及 User 数据模型
|
2026-06-14 16:54:21 +08:00 |
|
|
|
c9c174f400
|
feat: 扩展 models 新增 User 结构体
|
2026-06-14 16:53:54 +08:00 |
|
|
|
0edafbbf8a
|
feat: 实现 PostgreSQL 连接池
- 新增 internal/store/db.go
- 实现 NewPostgresPool(ctx, dsn) 创建连接池
- 添加 pgx/v5 依赖
- 最大连接数设置为 10
|
2026-06-14 16:41:50 +08:00 |
|
|
|
4b30e67c2e
|
feat: 扩展 Config 结构体,新增 AuthConfig 配置
- 新增 AuthConfig 结构体(JWTSecret, AccessTTL, RefreshTTL)
- 在 Config 中添加 Auth 字段
- 设置默认值:access_ttl=15分钟,refresh_ttl=10080分钟(7天)
- JWTSecret 必须通过环境变量 CAMTALK_AUTH_JWT_SECRET 设置
|
2026-06-14 16:40:06 +08:00 |
|
|
|
4ef1e9f08b
|
refactor: 彻底移除 .env 依赖,配置统一由 config.yaml + 环境变量驱动
|
2026-06-14 14:54:55 +08:00 |
|
|
|
4ebac835de
|
chore: 删除 deepgram_test.go 测试文件
|
2026-06-14 14:04:30 +08:00 |
|
|
|
da5c727d8c
|
fix: 修复语音与文字不同步的问题,改为句子级流式播放
之前前端 TTSPlayer 攒齐所有音频片段后才播放,导致文字全部显示后才开始语音。
改为后端每句 TTS 发送 is_last: true,前端收到每句即加入播放队列,第一句到达即开始播放。
- 后端 Chunk 结构体新增 Final 字段,区分句子结束和整轮结束
- 前端 TTSPlayer 重写为队列式播放,onended 回调自动衔接下一句
- 同步更新接口文档和测试用例
|
2026-06-14 13:54:49 +08:00 |
|
|
|
312e762aff
|
fix: 修复文本输入时 LLM API 报错的问题
- 移除 contentPart.Text 的 omitempty 标签
- 确保 text 字段始终存在于 JSON 请求中
|
2026-06-14 13:02:07 +08:00 |
|
|
|
51ed6aa563
|
feat: 添加文字输入对话功能
- 后端 WsQuery 添加 text 字段,支持文本输入模式
- Pipeline 支持文本查询时跳过 STT 直接使用输入文本
- 前端 ChatPanel 添加文字输入框,连接状态下可用
- useVisionSession 添加 sendTextMessage 方法
- 更新接口文档,添加文本输入模式说明
|
2026-06-14 12:52:39 +08:00 |
|
|
|
f6a2348c04
|
fix:修复语音对话配置
|
2026-06-14 12:29:46 +08:00 |
|
|
|
96cf009228
|
test: 更新测试文件适配构造函数签名变更
|
2026-06-14 11:55:29 +08:00 |
|
|
|
544716fe27
|
fix: pipeline.go TTS 输出格式/采样率从配置读取
- New() 改为接收 *config.Config 参数
- OutputFmt/SampleRate 从 config.AI.TTS 读取
|
2026-06-14 11:55:24 +08:00 |
|
|
|
8a966c29b7
|
fix: TTS 服务去除重复默认值,新增 httpClientTimeout 参数
- 去除 model/voice/endpoint 的 fallback 默认值
- HTTP Client 超时从 config 传入
|
2026-06-14 11:55:20 +08:00 |
|
|
|
aae0629b2d
|
fix: LLM 服务去除重复默认值,新增 httpClientTimeout 参数
- 去除 model/endpoint 的 fallback 默认值
- HTTP Client 超时从 config 传入
|
2026-06-14 11:55:19 +08:00 |
|
|
|
03b3566822
|
fix: STT 服务去除重复默认值,新增 timeout 参数
- Deepgram/MiMo STT 超时从 config 传入
- 去除 model/endpoint 的 fallback 默认值,由 config 层保证
|
2026-06-14 11:55:18 +08:00 |
|
|
|
f1ce28966c
|
fix: handler.go 心跳/版本号/CheckOrigin/历史上限改为配置驱动
- 心跳间隔和超时从 config.Server 读取
- ServerVersion 从 config.App.Version 读取
- CheckOrigin 通过 config.Server.AllowedOrigins 控制
- GetHistory limit 从 config.Session.MaxHistory 读取
|
2026-06-14 11:55:15 +08:00 |
|
|
|
22aefbc216
|
feat: 扩展配置结构,新增 Session/Heartbeat/Shutdown/STT Timeout/HTTP Client/TTS Output 配置项
|
2026-06-14 11:55:06 +08:00 |
|
|
|
00abc6c1e1
|
fix: 修复 pipeline_test.go 中 New 函数调用参数不足的问题
|
2026-06-14 11:18:58 +08:00 |
|
|
|
eb7ebecfc0
|
fix:修复了模型语音问题
|
2026-06-14 11:12:49 +08:00 |
|
|
|
e967d89e7e
|
feat: 添加 MiMo TTS 语音合成服务
实现基于 Xiaomi MiMo TTS API 的语音合成 provider,使用冰糖音色。
- 新增 MiMoService 实现 tts.Service 接口
- 使用 chat/completions 格式,与 MiMo STT 保持一致
- 在 main.go 添加 TTS provider 切换逻辑(mimo/xiaomi)
- 配置文件默认音色设为冰糖
- 包含完整测试覆盖(9 个测试用例)
|
2026-06-14 10:05:56 +08:00 |
|
|
|
6e0c67e1cb
|
docs: 文档与代码一致性检查与修复
- 修复心跳 Bug:应用层 ping 不更新 lastPong,60 秒后连接会被错误断开
- 03-接口文档:audio/mpeg→audio/mp3、STTConfig/TTSConfig 补充 Model 字段、
APP_ENV 环境变量名修正、配置搜索路径补充、.env 加载说明、Vite proxy 说明修正
- 02-系统架构:补充 ConfigPanel/Toast 组件、Model Router/Rate Limiter 标注规划中、
补充 Gin 框架、MVP 存储改为 Memory、AI 服务 provider 更新、Orchestrator 伪代码对齐
- 04-技术选型:新增 AI 服务栈选型章节(STT/LLM/TTS)、PostgreSQL 标注规划中
- 06-语音交互:VAD 参数名修正、STT 改为一次性识别描述、音频编码格式补充
- 07-视觉理解:关键帧检测代码改为 TypeScript、分辨率修正、阈值逻辑统一
- 08-成本控制:变量名修正、未实现功能标注规划中、对话历史裁剪策略补充
- CLAUDE.md:同步更新技术栈、模块结构、存储策略描述
|
2026-06-14 08:52:36 +08:00 |
|
|
|
322061c387
|
fix: MiMo ASR 认证头改为 Authorization: Bearer
MiMo API 使用标准 Bearer Token 认证,而非自定义 api-key 头。
|
2026-06-13 21:57:56 +08:00 |
|
|
|
3d3de828fc
|
feat: 添加 Xiaomi MiMo ASR 语音识别提供者
- 新增 MiMoService 实现 stt.Service 接口,通过 HTTP POST 调用 OpenAI 兼容的 /chat/completions 接口
- 自动将原始 PCM 数据封装为 WAV 格式(MiMo 仅支持 mp3/wav)
- 语言代码映射:zh-CN→zh、en-US→en、其他→auto
- main.go 添加 provider 选择逻辑(mimo/xiaomi → MiMo,其他 → Deepgram)
- 更新 config.yaml 使用正确的 model 名称 mimo-v2.5-asr
- 添加完整单元测试
|
2026-06-13 21:31:58 +08:00 |
|
|
|
b0a7ce885e
|
fix: 修复返回给前端的 totalTokens 为0的问题并提供示例 .env
|
2026-06-13 21:09:56 +08:00 |
|
|
|
0d9d3db73b
|
feat: 更新配置文档
|
2026-06-13 19:57:35 +08:00 |
|
|
|
0b2bbb827d
|
feat: Phase 8.1 - WS 集成测试 (handler_test.go)
使用 Gin test server + gorilla/websocket client 验证完整 WebSocket 流程:
- connected 连接建立、ping/pong 心跳
- 完整 query→stt_result→llm_chunk→tts_audio→llm_done 流程
- interrupt 中断、disconnect 断开清理
- 无效 JSON、未知消息类型错误处理
- 多次查询、无图片查询、TTS 未启用等场景
- 每次连接创建独立会话
|
2026-06-13 16:37:51 +08:00 |
|
|
|
b7e803fa90
|
feat: Phase 6.1 - 实现 Session REST API 路由 (POST/DELETE)
|
2026-06-13 16:21:09 +08:00 |
|
|
|
085e19038b
|
fix: Phase 5.3 - 统一使用 client.sessionMgr 调用 UpdateConfig
|
2026-06-13 16:15:17 +08:00 |
|
|
|
314554ded7
|
feat: Phase 5.2 - 实现 query 处理逻辑
- 创建可取消的 context 并存储 cancel func
- 获取对话历史并传递给 orchestrator
- 启动 orchestrator.ProcessQuery goroutine 处理查询
- 请求完成后自动清理 cancel func 和活跃请求标记
|
2026-06-13 16:14:20 +08:00 |
|
|
|
19535e6a37
|
feat: Phase 5.1 - Client 扩展,添加 orchestrator 依赖
- 扩展 Client 结构体,添加 sessionManager、orchestrator、cancelFuncs 字段
- 创建 WSClient 适配器实现 orchestrator.Sender 接口
- 更新 ServeWS 函数签名,接收 orchestrator 参数
- 在 main.go 中初始化 AI 服务和 Orchestrator
|
2026-06-13 16:13:22 +08:00 |
|
|
|
c9c697fe64
|
feat: 实现 AI Orchestrator(核心编排)
- 实现 Orchestrator 接口(4.1)
- 实现 Sender 接口(4.2)
- 实现 STT → LLM → TTS 流式并行管道(4.3)
- 实现句子切分器(4.4)
- 实现错误降级处理(4.5)
- 实现 Interrupt 支持(4.6)
- 编写完整的单元测试(4.7)
|
2026-06-13 16:05:18 +08:00 |
|
|
|
29e186c062
|
test: 编写 TTS 测试(mock HTTP,覆盖成功/API 错误/超时/空文本/取消/部分失败/自定义 voice)
|
2026-06-13 15:48:55 +08:00 |
|
|
|
acc7dfce43
|
feat: 实现 OpenAI TTS 服务(逐句合成 + 5s 超时 + 静默跳过失败)
|
2026-06-13 15:47:43 +08:00 |
|
|
|
450c2c66c3
|
feat: 定义 TTS Service 接口(SynthesizeStream + Options/Chunk)
|
2026-06-13 15:46:48 +08:00 |
|