extractMessages returns the messages to send to the compaction model, plus the index (into sess.Messages) of the first message that is kept verbatim after compaction. The caller is responsible for actually preserving that tail; this function only computes the boundary. The returned messages always
(sess *session.Session, _ *agent.Agent, contextLimit int64, additionalPrompt string)
| 286 | // (contextLimit − summary budget − prompt-overhead), older messages |
| 287 | // are dropped from the front of the to-compact list to make room. |
| 288 | func extractMessages(sess *session.Session, _ *agent.Agent, contextLimit int64, additionalPrompt string) ([]chat.Message, int) { |
| 289 | messages, sessIndices := gatherCompactionInput(sess) |
| 290 | |
| 291 | splitIdx := compaction.SplitIndexForKeep(messages, keepTokenBudget(contextLimit)) |
| 292 | firstKeptEntry := firstKeptSessionIndex(sess, sessIndices, splitIdx) |
| 293 | messages = messages[:splitIdx] |
| 294 | |
| 295 | systemPromptMessage := chat.Message{ |
| 296 | Role: chat.MessageRoleSystem, |
| 297 | Content: compaction.SystemPrompt, |
| 298 | CreatedAt: time.Now().Format(time.RFC3339), |
| 299 | } |
| 300 | userPrompt := compaction.UserPrompt |
| 301 | if additionalPrompt != "" { |
| 302 | userPrompt += "\n\n" + additionalPrompt |
| 303 | } |
| 304 | userPromptMessage := chat.Message{ |
| 305 | Role: chat.MessageRoleUser, |
| 306 | Content: userPrompt, |
| 307 | CreatedAt: time.Now().Format(time.RFC3339), |
| 308 | } |
| 309 | |
| 310 | contextAvailable := max(int64(0), |
| 311 | contextLimit-summaryTokenBudget(contextLimit)- |
| 312 | compaction.EstimateMessageTokens(&systemPromptMessage)- |
| 313 | compaction.EstimateMessageTokens(&userPromptMessage)) |
| 314 | firstIndex := compaction.FirstIndexInBudget(messages, contextAvailable) |
| 315 | if firstIndex < len(messages) { |
| 316 | messages = messages[firstIndex:] |
| 317 | } else { |
| 318 | messages = nil |
| 319 | } |
| 320 | |
| 321 | messages = append([]chat.Message{systemPromptMessage}, messages...) |
| 322 | messages = append(messages, userPromptMessage) |
| 323 | return messages, firstKeptEntry |
| 324 | } |
| 325 | |
| 326 | // firstKeptSessionIndex translates a split index produced against the |
| 327 | // chat-message list returned by [gatherCompactionInput] back to an |