+17
-4
@@ -10,6 +10,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"aichat/contextwindow"
|
||||
"aichat/conversation"
|
||||
"aichat/llm"
|
||||
"aichat/message"
|
||||
@@ -162,19 +163,31 @@ 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)
|
||||
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})
|
||||
}
|
||||
contextMessages = chatWindow.ChatMessages
|
||||
|
||||
// 用 Function Calling 工具循环替代旧的路由+隐藏上下文机制
|
||||
messages, err := toolrouter.RunAgentToolLoop(ctx, s.toolRouterState, profile, req.Messages, s.searchState, s.sqlState, emit)
|
||||
messages, err := toolrouter.RunAgentToolLoop(ctx, s.toolRouterState, profile, contextMessages, s.searchState, s.sqlState, emit)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "Agent 工具循环失败:", err)
|
||||
messages, err = message.BuildArkMessages(req.Messages)
|
||||
messages, err = message.BuildArkMessages(contextMessages)
|
||||
if err != nil {
|
||||
emitError(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
promptTokens := stream.EstimateChatMessagesTokens(req.Messages)
|
||||
arkWindow := contextwindow.ApplyArkWindow(messages, profile.Config.ContextWindowTokens)
|
||||
if arkWindow.Removed > 0 || arkWindow.Overflow {
|
||||
emitTrace("context_window", "model", "success", "已清理最终模型上下文", map[string]any{"max_tokens": arkWindow.MaxTokens, "before_tokens": arkWindow.BeforeTokens, "after_tokens": arkWindow.AfterTokens, "removed_messages": arkWindow.Removed, "overflow": arkWindow.Overflow, "base_overflow": arkWindow.BaseOverflow})
|
||||
}
|
||||
messages = arkWindow.ArkMessages
|
||||
promptTokens := arkWindow.AfterTokens
|
||||
|
||||
if llm.IsOllamaProfile(profile) && message.HasImageMessage(req.Messages) {
|
||||
if llm.IsOllamaProfile(profile) && message.HasImageMessage(contextMessages) {
|
||||
emitTrace("model", "request", "running", "正在通过 Ollama 原生接口调用视觉模型", nil)
|
||||
err = stream.StreamOllamaChat(ctx, profile, messages, promptTokens, usage, emit, func(content string) {
|
||||
if req.ConversationID != "" {
|
||||
|
||||
Reference in New Issue
Block a user