(t *testing.T)
| 730 | } |
| 731 | |
| 732 | func TestCompactionInput(t *testing.T) { |
| 733 | t.Parallel() |
| 734 | |
| 735 | newMsg := func(role chat.MessageRole, content string) Item { |
| 736 | return NewMessageItem(&Message{Message: chat.Message{Role: role, Content: content}}) |
| 737 | } |
| 738 | |
| 739 | t.Run("empty session returns empty", func(t *testing.T) { |
| 740 | t.Parallel() |
| 741 | sess := New() |
| 742 | messages, sessIndices := sess.CompactionInput() |
| 743 | assert.Empty(t, messages) |
| 744 | assert.Empty(t, sessIndices) |
| 745 | }) |
| 746 | |
| 747 | t.Run("system messages on the session are filtered out", func(t *testing.T) { |
| 748 | t.Parallel() |
| 749 | sess := New(WithMessages([]Item{ |
| 750 | newMsg(chat.MessageRoleSystem, "sys"), |
| 751 | newMsg(chat.MessageRoleUser, "u1"), |
| 752 | newMsg(chat.MessageRoleAssistant, "a1"), |
| 753 | newMsg(chat.MessageRoleSystem, "sys2"), |
| 754 | newMsg(chat.MessageRoleUser, "u2"), |
| 755 | })) |
| 756 | |
| 757 | messages, sessIndices := sess.CompactionInput() |
| 758 | require.Len(t, messages, 3) |
| 759 | assert.Equal(t, []int{1, 2, 4}, sessIndices) |
| 760 | assert.Equal(t, "u1", messages[0].Content) |
| 761 | assert.Equal(t, "a1", messages[1].Content) |
| 762 | assert.Equal(t, "u2", messages[2].Content) |
| 763 | }) |
| 764 | |
| 765 | t.Run("prior summary surfaces synthetic message and starts at FirstKeptEntry", func(t *testing.T) { |
| 766 | t.Parallel() |
| 767 | items := []Item{ |
| 768 | newMsg(chat.MessageRoleUser, "u0"), |
| 769 | newMsg(chat.MessageRoleAssistant, "a0"), |
| 770 | newMsg(chat.MessageRoleUser, "u1-kept"), |
| 771 | newMsg(chat.MessageRoleAssistant, "a1-kept"), |
| 772 | {Summary: "prior summary", FirstKeptEntry: 2}, |
| 773 | newMsg(chat.MessageRoleUser, "u2"), |
| 774 | newMsg(chat.MessageRoleAssistant, "a2"), |
| 775 | } |
| 776 | sess := New(WithMessages(items)) |
| 777 | |
| 778 | messages, sessIndices := sess.CompactionInput() |
| 779 | |
| 780 | require.Len(t, messages, 5) |
| 781 | assert.Equal(t, chat.MessageRoleUser, messages[0].Role) |
| 782 | assert.Contains(t, messages[0].Content, "Session Summary: prior summary") |
| 783 | // The synthetic message maps back to the prior summary item; the |
| 784 | // kept-tail then resumes at the prior FirstKeptEntry, skipping |
| 785 | // the (non-message) summary item itself. |
| 786 | assert.Equal(t, []int{4, 2, 3, 5, 6}, sessIndices) |
| 787 | }) |
| 788 | |
| 789 | t.Run("prior summary without FirstKeptEntry starts strictly after the summary", func(t *testing.T) { |
nothing calls this directly
no test coverage detected