feat: 后端统一消息类型分类 + 更新 API 文档

msg_type 现在由后端在所有消息路径上自动填充,前端无需解析内容猜测类型。
- chat_handler: SendSystemMessage → system_info, parseMultiMessage 返回 proactiveSegment{msgType}
- protocol: MultiMessageItem 增加 MsgType 字段
- useWebSocket: 所有 handler 直接读取 msg_type,移除前端类型推断
- docs/api/gateway-api.md: 文档化 msg_type 分类机制,移除已删除的每日简报章节

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 12:35:13 +08:00
parent 6f4056eefb
commit 2574f60823
5 changed files with 41 additions and 76 deletions
@@ -400,12 +400,13 @@ func (h *ChatHandler) streamResponse(client *ws.Client, mode string, reqBody []b
// 如果已有审查消息则跳过,避免与 review_messages 重复
multiParts := parseMultiMessage(fullText)
if !hasReview && len(multiParts) > 1 {
// 发送 multi_message 事件
// 发送 multi_message 事件(每条消息带 msg_type
var items []ws.MultiMessageItem
for i, part := range multiParts {
for i, seg := range multiParts {
items = append(items, ws.MultiMessageItem{
Index: i,
Content: part,
Content: seg.content,
MsgType: seg.msgType,
})
}
h.broadcastToUser(client.UserID, ws.ServerMessage{
@@ -669,6 +670,8 @@ func (h *ChatHandler) SendSystemMessage(userID, sessionID, text string) error {
Type: "response",
MessageID: "sys_" + generateID(),
Text: text,
Role: "system",
MsgType: "system_info",
Timestamp: time.Now().UnixMilli(),
}
@@ -931,18 +934,24 @@ func (h *ChatHandler) broadcastToUser(userID string, msg ws.ServerMessage) {
// parseMultiMessage 检测并解析多消息格式
// 如果文本包含空行分隔的多条消息,拆分为多条;否则返回单条
func parseMultiMessage(text string) []string {
func parseMultiMessage(text string) []proactiveSegment {
if text == "" {
return nil
}
// 按双换行(空行)分割
parts := strings.Split(text, "\n\n")
// 过滤空字符串并去除首尾空白
var result []string
// 过滤空字符串并去除首尾空白,检测消息类型
var result []proactiveSegment
for _, p := range parts {
p = strings.TrimSpace(p)
if p != "" {
result = append(result, p)
msgType := "chat"
// 检测括号包裹的动作标记
if (strings.HasPrefix(p, "(") && strings.HasSuffix(p, ")")) ||
(strings.HasPrefix(p, "") && strings.HasSuffix(p, "")) {
msgType = "action"
}
result = append(result, proactiveSegment{msgType: msgType, content: p})
}
}
// 如果只有一条,返回 nil 表示不是多消息格式