Current section

Files

Jump to
puck lib puck compaction sliding_window.ex
Raw

lib/puck/compaction/sliding_window.ex

defmodule Puck.Compaction.SlidingWindow do
@moduledoc """
Sliding window compaction strategy.
This strategy keeps the most recent N messages, discarding older ones.
Simple and predictable, but loses conversation history.
## Configuration
- `:window_size` - Number of messages to keep (default: 20)
## Example
{:ok, compacted} = Puck.Compaction.compact(context, {Puck.Compaction.SlidingWindow, %{
window_size: 30
}})
"""
@behaviour Puck.Compaction
alias Puck.Context
@default_window_size 20
@impl true
def compact(%Context{} = context, config) when is_map(config) do
window_size = Map.get(config, :window_size, @default_window_size)
messages = Context.messages(context)
if length(messages) <= window_size do
{:ok, context}
else
kept = Enum.take(messages, -window_size)
{:ok, %{context | messages: kept}}
end
end
@impl true
def should_compact?(%Context{} = context, config) when is_map(config) do
window_size = Map.get(config, :window_size, @default_window_size)
Context.message_count(context) > window_size
end
@impl true
def introspect(_config) do
%{
strategy: "sliding_window",
description: "Keeps last N messages"
}
end
end