Skip to content

Commit 27eb744

Browse files
committed
feat: add kwargs support and StepWindowMemory
- Add kwargs field in model config for LiteLLM params (temperature, reasoning_effort, etc.) - Add StepWindowMemory for step-based history trimming with image support - Update config_example.yaml with detailed usage examples - Bump version to 0.1.1
1 parent bb8394b commit 27eb744

File tree

4 files changed

+81
-3
lines changed

4 files changed

+81
-3
lines changed

easyagent/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from easyagent.memory import BaseMemory, SlidingWindowMemory, SummaryMemory
55
from easyagent.tool import Tool, ToolManager, register_tool
66

7-
__version__ = "0.1.0"
7+
__version__ = "0.1.1"
88
__all__ = [
99
# Agent
1010
"ReactAgent",

easyagent/memory/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from easyagent.memory.base import BaseMemory
22
from easyagent.memory.sliding_window import SlidingWindowMemory
3+
from easyagent.memory.step_window import StepWindowMemory
34
from easyagent.memory.summary import SummaryMemory
45

5-
__all__ = ["BaseMemory", "SlidingWindowMemory", "SummaryMemory"]
6+
__all__ = ["BaseMemory", "SlidingWindowMemory", "StepWindowMemory", "SummaryMemory"]
67

easyagent/memory/step_window.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from __future__ import annotations
2+
3+
from typing import List
4+
5+
from easyagent.memory.base import BaseMemory
6+
from easyagent.model.schema import Message
7+
8+
9+
class StepWindowMemory(BaseMemory):
10+
"""Memory strategy that limits history by user message steps, with optional image trimming."""
11+
12+
def __init__(self, text_steps: int = 10, image_steps: int = 3) -> None:
13+
self._text_steps = text_steps
14+
self._image_steps = image_steps
15+
self._messages: List[Message] = []
16+
17+
def add(self, message: Message) -> None:
18+
self._messages.append(message)
19+
20+
def get_messages(self) -> list[Message]:
21+
messages = self._trim_text(self._messages)
22+
return self._trim_images(messages)
23+
24+
def clear(self) -> None:
25+
self._messages.clear()
26+
27+
@property
28+
def token_count(self) -> int:
29+
return len(self._messages)
30+
31+
def _trim_text(self, messages: List[Message]) -> List[Message]:
32+
if self._text_steps is None or self._text_steps <= 0:
33+
return list(messages)
34+
user_indices = [idx for idx, msg in enumerate(messages) if msg.role == "user"]
35+
if len(user_indices) <= self._text_steps:
36+
return list(messages)
37+
start = user_indices[-self._text_steps]
38+
return list(messages[start:])
39+
40+
def _trim_images(self, messages: List[Message]) -> List[Message]:
41+
if self._image_steps is None:
42+
return list(messages)
43+
44+
user_positions = [idx for idx, msg in enumerate(messages) if msg.role == "user"]
45+
if self._image_steps <= 0:
46+
cutoff = len(messages)
47+
elif len(user_positions) > self._image_steps:
48+
cutoff = user_positions[-self._image_steps]
49+
else:
50+
return list(messages)
51+
52+
trimmed: List[Message] = []
53+
for idx, msg in enumerate(messages):
54+
if msg.role == "user" and idx < cutoff:
55+
trimmed.append(_strip_images(msg))
56+
else:
57+
trimmed.append(msg)
58+
return trimmed
59+
60+
61+
def _strip_images(message: Message) -> Message:
62+
content = message.content
63+
if isinstance(content, list):
64+
filtered = [
65+
item
66+
for item in content
67+
if not (isinstance(item, dict) and item.get("type") == "image_url")
68+
]
69+
return message.model_copy(update={"content": filtered})
70+
if isinstance(content, dict):
71+
cleaned = dict(content)
72+
if "images" in cleaned:
73+
cleaned["images"] = []
74+
if "image_urls" in cleaned:
75+
cleaned["image_urls"] = []
76+
return message.model_copy(update={"content": cleaned})
77+
return message

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "easy-agent-sdk"
7-
version = "0.1.0"
7+
version = "0.1.1"
88
description = "A lightweight AI Agent framework built on LiteLLM with ReAct reasoning, tool calling, and smart memory."
99
readme = "README.md"
1010
license = {text = "MIT"}

0 commit comments

Comments
 (0)