69 lines
1.4 KiB
Go
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)
|
|
}
|