(t *testing.T)
| 34 | } |
| 35 | |
| 36 | func TestExtractMessages(t *testing.T) { |
| 37 | t.Parallel() |
| 38 | |
| 39 | newMsg := func(role chat.MessageRole, content string) session.Item { |
| 40 | return session.NewMessageItem(&session.Message{ |
| 41 | Message: chat.Message{Role: role, Content: content}, |
| 42 | }) |
| 43 | } |
| 44 | |
| 45 | tests := []struct { |
| 46 | name string |
| 47 | messages []session.Item |
| 48 | contextLimit int64 |
| 49 | additionalPrompt string |
| 50 | wantConversationMsgCount int |
| 51 | }{ |
| 52 | { |
| 53 | name: "empty session returns system and user prompt only", |
| 54 | messages: nil, |
| 55 | contextLimit: 100_000, |
| 56 | wantConversationMsgCount: 0, |
| 57 | }, |
| 58 | { |
| 59 | name: "system messages are filtered out", |
| 60 | messages: []session.Item{ |
| 61 | newMsg(chat.MessageRoleSystem, "system instruction"), |
| 62 | newMsg(chat.MessageRoleUser, "hello"), |
| 63 | newMsg(chat.MessageRoleAssistant, "hi"), |
| 64 | }, |
| 65 | contextLimit: 100_000, |
| 66 | wantConversationMsgCount: 2, |
| 67 | }, |
| 68 | { |
| 69 | name: "messages fit within context limit", |
| 70 | messages: []session.Item{ |
| 71 | newMsg(chat.MessageRoleUser, "msg1"), |
| 72 | newMsg(chat.MessageRoleAssistant, "msg2"), |
| 73 | newMsg(chat.MessageRoleUser, "msg3"), |
| 74 | newMsg(chat.MessageRoleAssistant, "msg4"), |
| 75 | }, |
| 76 | contextLimit: 100_000, |
| 77 | wantConversationMsgCount: 4, |
| 78 | }, |
| 79 | { |
| 80 | name: "older messages dropped when they exceed the summarization budget", |
| 81 | messages: []session.Item{ |
| 82 | newMsg(chat.MessageRoleUser, strings.Repeat("a", 80_000)), // ~20k tokens |
| 83 | newMsg(chat.MessageRoleAssistant, strings.Repeat("b", 80_000)), // ~20k tokens |
| 84 | newMsg(chat.MessageRoleUser, "second message"), |
| 85 | newMsg(chat.MessageRoleAssistant, "second response"), |
| 86 | }, |
| 87 | // The two small messages form the kept tail (keep budget |
| 88 | // 32k/5). Of the two ~20k-token compact candidates only the |
| 89 | // newest fits contextAvailable ≈ 0.75×32k − prompts ≈ 23.8k; |
| 90 | // the older one is dropped from the summarizer's input. |
| 91 | contextLimit: 32_000, |
| 92 | wantConversationMsgCount: 1, |
| 93 | }, |
nothing calls this directly
no test coverage detected