后端修复: - main.go: 恢复 /api/v1/chat 路由中丢失的 handleChat 调用 (空响应回归) - orchestrator.go: splitChatByLines 改为双换行分割, 避免单换行误拆 - chat_handler.go: multi_message 增加 !hasReview 守卫, 消息延迟 200→800ms - thinker.go: RecordUserMessage 追踪活跃会话ID, 推送主动消息到正确会话 - thinker.go: 增强思考提示词 — 禁止在用户休息/离开时发送主动消息 前端修复: - useWebSocket.ts: stream_segments 不再创建消息气泡, 消除重复回复 - MessageBubble.tsx: 动作消息居左对齐无头像, 时间戳移至气泡外侧 hover 显示 - ChatInput.tsx: 昔涟输入提示移至输入框上方, 波点动画效果 - MessageList/TypingIndicator/ChatContainer: 清理冗余 isTyping 传递 - MemoryPanel.tsx: 新增记忆面板组件 文档重整: - docs/debug/ → docs/debug_log/ 重命名统一 - 新增 debug_log/README.md 索引 - .gitignore: 新增 android/ 排除规则 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
8.3 KiB
持续性调试第4轮: 子服务调试 + 数据库完整性
日期: 2026-05-20 (UTC+8 14:28 CST) 状态: ✅ 全部通过 Go 版本: 1.26.2
1. 编译与启动
| 服务 | 端口 | 状态 | 编译 | 进程 PID |
|---|---|---|---|---|
| Gateway | 8080 | ✅ 运行中 | 已有 | 19265 |
| AI-Core | 8081 | ✅ 运行中 | 已有 | 15037 |
| IoT Debug Service | 8083 | ✅ 运行中 | 已有 | 3063 |
| Memory Service | 8091 | ✅ 运行中 | 已有 | 2434 |
| Tool Engine | 8092 | ✅ 运行中 | 本轮新建 | 29391 |
| Voice Service | 8093 | ✅ 运行中 | 已有 | 7641 |
Tool Engine 为本轮唯一需要编译和启动的服务。编译命令:
cd backend && go build -o tool-engine/cmd/tool-engine ./tool-engine/cmd/
启动时传入环境变量: PORT=8092, IOT_SERVICE_URL=http://localhost:8083, DB_URL=postgres://..., DATA_DIR=/tmp/cyrene_data。
2. 健康检查
2.1 Memory Service (8091)
{"status": "ok", "service": "memory-service"}
数据库连接正常 (IsReady() == true),pgvector extension 已加载。
2.2 Tool Engine (8092)
{"status": "ok", "service": "tool-engine"}
已注册 13 个工具: calculator, datetime, text, crypto, random, markdown, json_ops, file_ops, http_request, web_search, web_fetch, iot_query, iot_control。
IoT 客户端已连接到 http://localhost:8083。
2.3 IoT Debug Service (8083)
{"status": "ok", "service": "iot-debug-service"}
模拟 8 个设备: 客厅灯, 卧室灯, 客厅空调, 卧室空调, 客厅窗帘, 温度传感器, 湿度传感器, 智能门锁。
传感器波动模拟每 30 秒运行一次。
2.4 Voice Service (8093)
{
"status": "ok",
"service": "voice-service",
"stt": {"available": true, "model_loaded": true, "model_name": "ggml-small.bin"},
"tts": {"available": false, "engine": "fallback (silent WAV)", "edge_tts": false}
}
- STT (Whisper): ✅ 可用,模型已加载 (
ggml-small.bin),支持 zh/en/ja/ko/auto - TTS (Edge-TTS): ⚠️ 降级 —
edge-ttsPython 包未安装,当前使用 fallback silent WAV。安装命令:pip install edge-tts
2.5 Gateway (8080)
{"status": "ok", "service": "cyrene-gateway", "ws_connections": 0}
3. Gateway 转发测试
3.1 Memory CRUD (通过 Gateway)
| 操作 | 端点 | 方法 | 结果 |
|---|---|---|---|
| 列出记忆 | /api/v1/memory |
GET | ✅ 返回已有记忆 |
| 创建记忆 | /api/v1/memory |
POST | ✅ {"status":"saved"} |
| 搜索记忆 | /api/v1/memory/search?q=测试 |
GET | ✅ 匹配成功 |
认证令牌: admin_yeij0942 (JWT 验证通过)
3.2 注意事项
Memory Service 端点实际路径为 /api/v1/memories (复数),Gateway 通过 memory_handler.go 代理到正确路径。搜索功能将 Gateway 的 GET /api/v1/memory/search?q=xxx 转发为 POST /api/v1/memories/query。
4. 工具引擎功能验证
4.1 计算器
POST /api/v1/tools/calculator/execute
{"arguments": {"expression": "2+3*4"}}
→ {"output": "表达式: 2+3*4\n结果: 14"}
✅ 正确计算 (优先乘除)
4.2 日期时间
POST /api/v1/tools/datetime/execute
{"arguments": {"action": "now"}}
→ {"output": "当前时间: 2026-05-20 14:27:13\n时区: Local\nUnix时间戳: 1779258433"}
✅ 时间戳正确
4.3 加密哈希
POST /api/v1/tools/crypto/execute
{"arguments": {"action": "hash", "algorithm": "sha256", "input": "hello"}}
→ {"output": "哈希算法: sha256\n输入长度: 5 字节\n哈希值 (hex): 2cf24dba..."}
✅ SHA256 哈希正确 (与 echo -n hello | sha256sum 一致)
4.4 调用日志存储
- 数据库表
tool_call_logs已创建并可使用 - 调用日志异步写入(go routine 方式)
5. IoT 端点测试
| 操作 | 端点 | 方法 | 结果 |
|---|---|---|---|
| 列出设备 | /api/v1/devices |
GET | ✅ 返回 8 个设备 |
| 获取设备 | /api/v1/devices/light-livingroom |
GET | ✅ 含状态历史 |
| 切换灯光 | /api/v1/devices/light-livingroom/toggle |
POST | ✅ on→off/off→on |
| 设置温度 | /api/v1/devices/ac-livingroom/set |
POST | ✅ 温度设为 28°C |
设备状态历史正确记录,状态变更带时间戳。
6. 数据库完整性
6.1 表清单 (15/15)
| # | 表名 | 用途 | 服务 |
|---|---|---|---|
| 1 | users |
用户账户认证 | Gateway |
| 2 | sessions |
会话管理 | Gateway |
| 3 | messages |
消息存储 | Gateway |
| 4 | memories |
旧版记忆表 | Gateway |
| 5 | memory_entries |
新版记忆表 (pgvector) | Memory Service |
| 6 | thinking_logs |
自主思考日志 | Memory Service |
| 7 | tool_call_logs |
工具调用日志 | Tool Engine |
| 8 | reminders |
提醒 | Gateway |
| 9 | daily_briefings |
每日简报 | Gateway |
| 10 | automation_rules |
自动化规则 | Gateway |
| 11 | automation_scenes |
自动化场景 | Gateway |
| 12 | files |
文件管理 | Gateway |
| 13 | knowledge_bases |
知识库 | Gateway |
| 14 | knowledge_documents |
知识文档 | Gateway |
| 15 | knowledge_chunks |
知识分块 (含全文搜索) | Gateway |
6.2 新增 users 表结构
| 列 | 类型 | 约束 |
|---|---|---|
id |
INTEGER | PK, NOT NULL |
username |
VARCHAR(255) | NOT NULL, UNIQUE |
password_hash |
VARCHAR(255) | NOT NULL |
is_admin |
BOOLEAN | NULLABLE |
created_at |
TIMESTAMPTZ | NULLABLE |
updated_at |
TIMESTAMPTZ | NULLABLE |
索引: users_pkey (btree id), users_username_key (unique btree username), idx_users_username (btree username)
6.3 外键关系 (3)
| 子表 | 列 | 父表 | 引用列 | 约束名 |
|---|---|---|---|---|
messages |
session_id |
sessions |
id |
messages_session_id_fkey |
knowledge_documents |
kb_id |
knowledge_bases |
id |
knowledge_documents_kb_id_fkey |
knowledge_chunks |
doc_id |
knowledge_documents |
id |
knowledge_chunks_doc_id_fkey |
6.4 索引统计
- 总计: 58 个索引
- 所有表均有主键索引 (btree)
- 性能关键索引覆盖:
user_id,session_id,created_at,category,priority,importance,status - 全文搜索:
knowledge_chunks有 GIN 索引 (idx_kc_tsv_gin) - 唯一约束:
users(username),daily_briefings(user_id, date) - JSONB:
tool_call_logs使用 JSONB 存储参数
6.5 注意事项
memories和memory_entries是两套独立的记忆表。memory_entries是 Memory Service 通过 pgvector 管理的版本,包含向量嵌入和更丰富的元数据(importance, keywords, source, access_count 等)。memories是 Gateway 的旧版表。users表使用 INTEGER 自增 ID,而非 UUID。Gateway 认证生成admin_{username}格式的 user_id,但不与数据库id直接关联。
7. 系统时间
UTC: Wed May 20 06:28:13 UTC 2026
北京时间: Wed May 20 14:28:13 CST 2026
时间正常,与预期一致。
8. 总结
通过 ✅
- 所有 4 个子服务编译成功并运行
- 所有健康检查返回
"ok" - Gateway 正确转发 Memory CRUD 请求
- Tool Engine 13 个工具全部注册,计算器/日期/加密工具验证通过
- IoT 设备模拟器 8 个设备正常工作,Toggle/Set 属性测试通过
- 数据库 15 张表完整,58 个索引,3 个外键关系正确
users表结构完整,含唯一用户名约束和管理员标记
待改进 ⚠️
- Voice Service TTS 降级:
edge-ttsPython 包未安装,当前使用 silent WAV fallback。建议安装:pip install edge-tts - 双记忆表:
memories和memory_entries共存,可能造成混淆,建议迁移合并 - users 表 ID 类型: 使用 INTEGER 自增和 VARCHAR user_id 的混合策略,未来可统一为 UUID
9. 端口占用全景
| 端口 | 服务 | PID | 二进制 |
|---|---|---|---|
| 8080 | Gateway | 19265 | /home/aska/Code/Cyrene/backend/gateway/cmd/gateway |
| 8081 | AI-Core | 15037 | ./main |
| 8083 | IoT Debug | 3063 | /home/aska/Code/Cyrene/backend/iot-debug-service/main |
| 8091 | Memory | 2434 | /home/aska/Code/Cyrene/backend/memory-service/main |
| 8092 | Tool Engine | 29391 | /home/aska/Code/Cyrene/backend/tool-engine/cmd/tool-engine |
| 8093 | Voice | 7641 | /home/aska/Code/Cyrene/backend/voice-service/main |