Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions pkg/seahorse/short_bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,3 +334,37 @@ func BenchmarkBootstrap_500Messages(b *testing.B) {
}
}
}

// --- Compaction formatting benchmarks ---

func benchSummaryMessages(n int) []Message {
msgs := make([]Message, n)
base := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
for i := range msgs {
msgs[i] = Message{
Role: "user",
Content: fmt.Sprintf("Conversation message %d with enough content to summarize.", i),
CreatedAt: base.Add(time.Duration(i) * time.Minute),
TokenCount: 15,
}
}
return msgs
}

func BenchmarkFormatMessagesForSummary(b *testing.B) {
msgs := benchSummaryMessages(200)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = formatMessagesForSummary(msgs)
}
}

func BenchmarkTruncateSummary(b *testing.B) {
msgs := benchSummaryMessages(200)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = truncateSummary(msgs)
}
}
25 changes: 15 additions & 10 deletions pkg/seahorse/short_compaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"
"sort"
"strings"
"time"

"github.com/sipeed/picoclaw/pkg/logger"
Expand Down Expand Up @@ -744,20 +745,20 @@ func (e *CompactionEngine) runCondensedLoop(ctx context.Context, convID int64) {
// --- Helper functions ---

func formatMessagesForSummary(messages []Message) string {
var result string
var b strings.Builder
for _, m := range messages {
ts := m.CreatedAt.Format("2006-01-02 15:04 MST")
content := m.Content
if content == "" && len(m.Parts) > 0 {
content = partsToReadableContent(m.Parts)
}
result += fmt.Sprintf("[%s]\n%s\n\n", ts, content)
fmt.Fprintf(&b, "[%s]\n%s\n\n", ts, content)
}
return result
return b.String()
}

func formatSummariesForCondensation(summaries []Summary) string {
var result string
var b strings.Builder
for _, s := range summaries {
earliest := ""
if s.EarliestAt != nil {
Expand All @@ -767,9 +768,9 @@ func formatSummariesForCondensation(summaries []Summary) string {
if s.LatestAt != nil {
latest = s.LatestAt.Format("2006-01-02")
}
result += fmt.Sprintf("[%s - %s]\n%s\n\n", earliest, latest, s.Content)
fmt.Fprintf(&b, "[%s - %s]\n%s\n\n", earliest, latest, s.Content)
}
return result
return b.String()
}

func buildLeafSummaryPrompt(sourceText, previousSummary string, targetTokens int) string {
Expand Down Expand Up @@ -847,14 +848,16 @@ Output requirements:
}

func truncateSummary(messages []Message) string {
content := ""
var b strings.Builder
for _, m := range messages {
c := m.Content
if c == "" && len(m.Parts) > 0 {
c = partsToReadableContent(m.Parts)
}
content += c + "\n"
b.WriteString(c)
b.WriteByte('\n')
}
content := b.String()
if len(content) > 2048 {
content = content[:2048]
}
Expand All @@ -863,10 +866,12 @@ func truncateSummary(messages []Message) string {
}

func truncateCondensedSummaries(summaries []Summary) string {
content := ""
var b strings.Builder
for _, s := range summaries {
content += s.Content + "\n"
b.WriteString(s.Content)
b.WriteByte('\n')
}
content := b.String()
if len(content) > 2048 {
content = content[:2048]
}
Expand Down
Loading