MCPcopy Create free account
hub / github.com/astercloud/aster / WrapModelCall

Method WrapModelCall

pkg/middleware/summarization.go:136–251  ·  view source on GitHub ↗

WrapModelCall 包装模型调用,在调用前检查是否需要总结

(ctx context.Context, req *ModelRequest, handler ModelCallHandler)

Source from the content-addressed store, hash-verified

134
135// WrapModelCall 包装模型调用,在调用前检查是否需要总结
136func (m *SummarizationMiddleware) WrapModelCall(ctx context.Context, req *ModelRequest, handler ModelCallHandler) (*ModelResponse, error) {
137 messages := req.Messages
138 if len(messages) == 0 {
139 return handler(ctx, req)
140 }
141
142 // 计算当前消息的 token 数
143 totalTokens := m.tokenCounter(messages)
144
145 sumLog.Debug(ctx, "current tokens", map[string]any{"tokens": totalTokens, "threshold": m.maxTokensBeforeSummary})
146
147 // 如果未超过阈值,直接返回
148 if totalTokens <= m.maxTokensBeforeSummary {
149 return handler(ctx, req)
150 }
151
152 sumLog.Info(ctx, "token threshold exceeded, triggering summarization", nil)
153
154 // 如果启用了渐进式压缩,使用新的压缩策略
155 if m.enableProgressiveCompact {
156 compactedMessages, err := m.progressiveCompact(ctx, messages, m.maxTokensBeforeSummary)
157 if err != nil {
158 sumLog.Error(ctx, "progressive compact failed, using traditional method", map[string]any{"error": err.Error()})
159 // 失败时回退到传统方法
160 } else {
161 req.Messages = compactedMessages
162 newTokens := m.tokenCounter(compactedMessages)
163 sumLog.Info(ctx, "progressive compaction complete", map[string]any{
164 "before": len(messages),
165 "after": len(compactedMessages),
166 "tokens_before": totalTokens,
167 "tokens_after": newTokens,
168 })
169 return handler(ctx, req)
170 }
171 }
172
173 // 分离 system messages 和其他消息
174 var systemMessages []types.Message
175 var regularMessages []types.Message
176
177 for _, msg := range messages {
178 if msg.Role == types.MessageRoleSystem {
179 systemMessages = append(systemMessages, msg)
180 } else {
181 regularMessages = append(regularMessages, msg)
182 }
183 }
184
185 // 如果常规消息少于或等于要保留的数量,不进行总结
186 if len(regularMessages) <= m.messagesToKeep {
187 sumLog.Debug(ctx, "not enough messages to summarize", map[string]any{"have": len(regularMessages), "keep": m.messagesToKeep})
188 return handler(ctx, req)
189 }
190
191 // 计算要总结的消息
192 numToSummarize := len(regularMessages) - m.messagesToKeep
193 messagesToSummarize := regularMessages[:numToSummarize]

Calls 7

progressiveCompactMethod · 0.95
handlerFunction · 0.85
truncateStringFunction · 0.70
DebugMethod · 0.65
InfoMethod · 0.65
ErrorMethod · 0.65
EmitEventMethod · 0.65