Files
Atlas/internal/service/chat/title.go
T
renjue 2b020bb782
CI / docker (push) Successful in 2m58s
实现 Atlas AI 平台一期能力并完成品牌化改造。
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 23:35:19 +08:00

69 lines
1.4 KiB
Go

package chat
import (
"encoding/json"
"strings"
"unicode/utf8"
)
const (
titleSummaryRoundThreshold = 3
titleSummarySystemPrompt = "你是会话标题生成器。根据对话内容输出一条简洁的中文标题,不超过20字,不要引号、书名号或句号,只输出标题本身。"
)
func conversationParams(raw string) map[string]any {
out := map[string]any{}
if raw == "" {
return out
}
_ = json.Unmarshal([]byte(raw), &out)
return out
}
func conversationParamsJSON(params map[string]any) string {
if len(params) == 0 {
return "{}"
}
data, err := json.Marshal(params)
if err != nil {
return "{}"
}
return string(data)
}
func titleAlreadySummarized(params map[string]any) bool {
v, ok := params["title_summarized"].(bool)
return ok && v
}
func sanitizeTitle(title string) string {
title = strings.TrimSpace(title)
title = strings.Trim(title, `"'""''《》`)
title = strings.ReplaceAll(title, "\n", " ")
if title == "" {
return ""
}
if utf8.RuneCountInString(title) > 30 {
runes := []rune(title)
title = string(runes[:30])
}
return title
}
func parseChatCompletionContent(body []byte) string {
var resp struct {
Choices []struct {
Message struct {
Content string `json:"content"`
} `json:"message"`
} `json:"choices"`
}
if err := json.Unmarshal(body, &resp); err != nil {
return ""
}
if len(resp.Choices) == 0 {
return ""
}
return strings.TrimSpace(resp.Choices[0].Message.Content)
}