| 91 | } |
| 92 | |
| 93 | func TestPackNewestFirstWhole(t *testing.T) { |
| 94 | big := strings.Repeat("a", 4*1000) // 1000 tokens |
| 95 | history := []Message{ |
| 96 | {Role: RoleUser, Content: big}, |
| 97 | {Role: RoleAssistant, Content: big}, |
| 98 | {Role: RoleUser, Content: big}, |
| 99 | {Role: RoleAssistant, Content: big}, |
| 100 | } |
| 101 | r := Pack(history, 2500) |
| 102 | // Each message costs Tokens(4000 bytes)+8 = 1008. Budget 2500 keeps newest |
| 103 | // (1008) and msg3 (2016 <= 2500), breaks before msg2 (3024 > 2500), so |
| 104 | // exactly 2, pinning the `used+cost > budget` break against off-by-one. |
| 105 | if len(r.Messages) != 2 { |
| 106 | t.Fatalf("kept=%d want exactly 2", len(r.Messages)) |
| 107 | } |
| 108 | // last message must always be kept |
| 109 | if r.Messages[len(r.Messages)-1].Content != big { |
| 110 | t.Fatal("newest message not preserved") |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | func TestPackAlwaysKeepsNewest(t *testing.T) { |
| 115 | massive := strings.Repeat("z", 4*10000) |