26a61cb57c
## 🐛 Bug 修复 - 修复前端对话无响应:消除 ChatContainer 中的双重 WebSocket 连接,优化 sendMessage 失败提示 - 修复 Memory-Service 数据库迁移失败:ai-core 和 memory-service 均添加 ALTER TABLE ADD COLUMN IF NOT EXISTS 模式演化 - 修复语音/STT 不可用:添加 MediaRecorder API 降级方案,修复 whisper-cli 输出文件名错误 - 修复仪表盘数据库按钮失效:补充按钮 ID 属性,重写 controlDB() 控制逻辑 ## 🎨 UI 修复 - 修正用户消息头像位置:从 flex-row-reverse 改为 justify-end - 移除空聊天列表的 emoji 占位图标 ## ✨ 新功能 - devtools 新增 STT 处理日志面板(环形缓冲区 + WebSocket 广播 + 可视化表格) - 新增 ADMIN_NICKNAME 环境变量,支持自定义管理员昵称 ## 🔧 改进 - 注册流程增加昵称必填字段(前后端同步) ## 🏗️ 架构重构 - 重构自主思考逻辑:从定时器轮询改为事件驱动(对话后触发 + 静默检测),优化提示词使其更自然人性化 - 实现主-子会话架构:新增 4 种子会话类型(general/memory/iot/knowledge),意图分析 → 并行分发 → 结果合成流程 ## 📄 新增文档 - docs/architecture/main-session-sub-session-design.md — 子会话架构设计文档
97 lines
4.4 KiB
Go
97 lines
4.4 KiB
Go
package ws
|
|
|
|
// MessageAttachment 消息附件 (图片等)
|
|
type MessageAttachment struct {
|
|
Type string `json:"type"` // image
|
|
URL string `json:"url"` // 图片 URL 或 data URL
|
|
ThumbnailURL string `json:"thumbnail_url,omitempty"`
|
|
Filename string `json:"filename,omitempty"`
|
|
Width int `json:"width,omitempty"`
|
|
Height int `json:"height,omitempty"`
|
|
Size int64 `json:"size,omitempty"` // 文件大小 bytes
|
|
Description string `json:"description,omitempty"` // AI 对图片的描述
|
|
}
|
|
|
|
// 客户端 → 服务端消息
|
|
type ClientMessage struct {
|
|
Type string `json:"type"` // message | voice_input | ping | history
|
|
SessionID string `json:"session_id"`
|
|
Mode string `json:"mode"` // text | voice_msg | voice_assistant
|
|
Content string `json:"content"`
|
|
AudioData string `json:"audio_data,omitempty"` // base64
|
|
Attachments []MessageAttachment `json:"attachments,omitempty"` // 图片等附件
|
|
Timestamp int64 `json:"timestamp"`
|
|
}
|
|
|
|
// 服务端 → 客户端消息
|
|
type ServerMessage struct {
|
|
Type string `json:"type"` // response | segment | audio | error | device_update | pong | history_response | stream_chunk | stream_end | background_thinking | notification | multi_message | stream_segments
|
|
MessageID string `json:"message_id"`
|
|
Text string `json:"text,omitempty"`
|
|
Content string `json:"content,omitempty"` // stream_chunk 的增量文本
|
|
Role string `json:"role,omitempty"` // stream 消息的角色
|
|
SessionID string `json:"session_id,omitempty"` // 会话 ID
|
|
Segments []VoiceSegment `json:"segments,omitempty"` // 断句数组
|
|
FullAudioURL string `json:"full_audio_url,omitempty"`
|
|
ResponseMode string `json:"response_mode"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
Timestamp int64 `json:"timestamp"`
|
|
Messages []Message `json:"messages,omitempty"` // 历史消息列表
|
|
Devices []IotDeviceInfo `json:"devices,omitempty"` // IoT 设备状态
|
|
ThinkingStatus string `json:"thinking_status,omitempty"` // 后台思考状态
|
|
Notification *NotificationInfo `json:"notification,omitempty"` // 通知推送
|
|
MultiMessage *MultiMessagePayload `json:"multi_message,omitempty"` // 多条消息批量发送
|
|
}
|
|
|
|
// MultiMessagePayload 多条消息的容器 (对应昔涟的多消息回复风格)
|
|
type MultiMessagePayload struct {
|
|
Messages []MultiMessageItem `json:"messages"`
|
|
}
|
|
|
|
// MultiMessageItem 多消息中的单条
|
|
type MultiMessageItem struct {
|
|
Index int `json:"index"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
// NotificationInfo 通知推送信息
|
|
type NotificationInfo struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"` // info | warning | success | thinking | reminder
|
|
Title string `json:"title"`
|
|
Body string `json:"body"`
|
|
Timestamp string `json:"timestamp"`
|
|
Data map[string]interface{} `json:"data,omitempty"`
|
|
}
|
|
|
|
// IotDeviceInfo IoT 设备信息(用于 WebSocket 推送)
|
|
type IotDeviceInfo struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
Status string `json:"status"`
|
|
Brightness int `json:"brightness,omitempty"`
|
|
Color string `json:"color,omitempty"`
|
|
Temperature float64 `json:"temperature,omitempty"`
|
|
Mode string `json:"mode,omitempty"`
|
|
Position int `json:"position,omitempty"`
|
|
Value float64 `json:"value,omitempty"`
|
|
Unit string `json:"unit,omitempty"`
|
|
Battery int `json:"battery,omitempty"`
|
|
LastUpdated string `json:"last_updated"`
|
|
}
|
|
|
|
type VoiceSegment struct {
|
|
Index int `json:"index"`
|
|
Text string `json:"text"`
|
|
AudioURL string `json:"audio_url"`
|
|
DurationMs int `json:"duration_ms"`
|
|
}
|
|
|
|
type ToolCall struct {
|
|
Name string `json:"name"`
|
|
Arguments map[string]interface{} `json:"arguments"`
|
|
Result interface{} `json:"result,omitempty"`
|
|
}
|