Files
Atlas/internal/service/chat/title.go
T
renjue 4bc1b8d2e3
CI / docker (push) Has been cancelled
实现 Atlas AI 平台一期能力并完成品牌化改造。
引入用户端对话/生图与管理端 Provider 配置,统一 invoke 编排、Gateway、请求日志与模型管理;前端按设计规范拆分布局,Go module 更名为 github.com/rose_cat707/Atlas;生图长任务 SSE 推送;管理端登录防爆破;协议与服务类型联动;Replicate 模型同步修复;用户端创作台 UI 重构;管理端创作历史替代请求日志。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 22:34:44 +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)
}