+51
-3
@@ -26,6 +26,11 @@ type activeProfileRequest struct {
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type createConversationRequest struct {
|
||||
Preset string `json:"preset"`
|
||||
PresetPrompt string `json:"preset_prompt"`
|
||||
}
|
||||
|
||||
func (s *Server) indexHandler(c *gin.Context) {
|
||||
profile := s.aiState.ActiveProfile()
|
||||
c.HTML(http.StatusOK, "chat.html", gin.H{
|
||||
@@ -89,7 +94,15 @@ func (s *Server) listConversationsHandler(c *gin.Context) {
|
||||
}
|
||||
|
||||
func (s *Server) createConversationHandler(c *gin.Context) {
|
||||
conv, err := s.store.Create()
|
||||
var req createConversationRequest
|
||||
if c.Request.Body != nil {
|
||||
_ = c.ShouldBindJSON(&req)
|
||||
}
|
||||
preset := req.PresetPrompt
|
||||
if strings.TrimSpace(preset) == "" {
|
||||
preset = req.Preset
|
||||
}
|
||||
conv, err := s.store.CreateWithPreset(preset)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "创建对话失败: " + err.Error()})
|
||||
return
|
||||
@@ -118,6 +131,41 @@ func (s *Server) deleteConversationHandler(c *gin.Context) {
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func conversationPresetPrompt(store *conversation.Store, id string) string {
|
||||
id = strings.TrimSpace(id)
|
||||
if id == "" || store == nil {
|
||||
return ""
|
||||
}
|
||||
conv, err := store.Get(id)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return strings.TrimSpace(conv.PresetPrompt)
|
||||
}
|
||||
|
||||
func conversationContextMessages(messages []message.ChatMessage, preset string) []message.ChatMessage {
|
||||
preset = strings.TrimSpace(preset)
|
||||
if preset == "" {
|
||||
return append([]message.ChatMessage(nil), messages...)
|
||||
}
|
||||
cleaned := filterRequestPresetMessages(messages)
|
||||
contextMessages := make([]message.ChatMessage, 0, len(cleaned)+1)
|
||||
contextMessages = append(contextMessages, message.ChatMessage{Role: "system", Content: preset, Hidden: true})
|
||||
contextMessages = append(contextMessages, cleaned...)
|
||||
return contextMessages
|
||||
}
|
||||
|
||||
func filterRequestPresetMessages(messages []message.ChatMessage) []message.ChatMessage {
|
||||
filtered := make([]message.ChatMessage, 0, len(messages))
|
||||
for _, msg := range messages {
|
||||
if msg.Hidden && strings.EqualFold(msg.Role, "system") {
|
||||
continue
|
||||
}
|
||||
filtered = append(filtered, msg)
|
||||
}
|
||||
return filtered
|
||||
}
|
||||
|
||||
// chatHandler 流式 SSE 对话接口
|
||||
func (s *Server) chatHandler(c *gin.Context) {
|
||||
var req message.ChatRequest
|
||||
@@ -163,8 +211,8 @@ func (s *Server) chatHandler(c *gin.Context) {
|
||||
usage := stream.NewTracker()
|
||||
ctx = stream.ContextWithTracker(ctx, usage)
|
||||
|
||||
contextMessages := req.Messages
|
||||
chatWindow := contextwindow.ApplyChatWindow(req.Messages, profile.Config.ContextWindowTokens)
|
||||
contextMessages := conversationContextMessages(req.Messages, conversationPresetPrompt(s.store, req.ConversationID))
|
||||
chatWindow := contextwindow.ApplyChatWindow(contextMessages, profile.Config.ContextWindowTokens)
|
||||
if chatWindow.Removed > 0 || chatWindow.Overflow {
|
||||
emitTrace("context_window", "chat", "success", "已清理对话历史上下文", map[string]any{"max_tokens": chatWindow.MaxTokens, "before_tokens": chatWindow.BeforeTokens, "after_tokens": chatWindow.AfterTokens, "removed_messages": chatWindow.Removed, "overflow": chatWindow.Overflow, "base_overflow": chatWindow.BaseOverflow})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user