A lightweight AI Agent framework built on LiteLLM with ReAct reasoning, tool calling, and smart memory.
Project description
EasyAgent
English | 简体中文
A lightweight AI Agent framework built on LiteLLM, featuring multi-model support, tool calling, sandbox execution, and intelligent memory management.
~1200 lines of code, production-ready Agent capabilities — Multi-model adapters, tool calling, sandbox isolation, smart memory, ReAct reasoning, DAG pipelines, debug tracing.
Features
- Multi-Model Support - Unified interface via LiteLLM for OpenAI, Anthropic, Gemini, and more
- Tool Calling - Protocol-based tool definition with
@register_tooldecorator - Sandbox Execution - Isolated code execution in Docker or local environment
- Memory - Sliding window + auto-summarization strategies for context management
- ReAct Loop - Standard think → act → observe reasoning cycle
- DAG Pipeline - Directed Acyclic Graph workflow orchestration with parallel execution
- Debug Friendly - Colored logging, token usage and cost tracking
Installation
pip install easy-agent-sdk
With optional dependencies:
# Docker sandbox support
pip install easy-agent-sdk[sandbox]
# Web tools (SerperSearch)
pip install easy-agent-sdk[web]
# All optional dependencies
pip install easy-agent-sdk[all]
From source:
git clone https://github.com/SNHuan/EasyAgent.git
cd EasyAgent
pip install -e ".[dev]"
Quick Start
1. Configuration
Create a config file config.yaml:
debug: true
summary_model: gpt-4o-mini
models:
gpt-4o-mini:
api_type: openai
base_url: https://api.openai.com/v1
api_key: sk-xxx
kwargs:
max_tokens: 4096
temperature: 0.7
Set environment variable:
export EA_DEFAULT_CONFIG=/path/to/config.yaml
2. Define Tools
from easyagent.tool import register_tool
@register_tool
class GetWeather:
name = "get_weather"
type = "function"
description = "Get the weather for a city."
parameters = {
"type": "object",
"properties": {"city": {"type": "string", "description": "City name"}},
"required": ["city"],
}
def init(self) -> None:
pass
def execute(self, city: str) -> str:
return f"The weather in {city} is sunny, 25°C."
3. Create Agent
import asyncio
from easyagent import ReactAgent
from easyagent.config import ModelConfig
from easyagent.model.litellm_model import LiteLLMModel
config = ModelConfig.load()
model = LiteLLMModel(**config.get_model("gpt-4o-mini"))
agent = ReactAgent(
model=model,
tools=["get_weather"],
system_prompt="You are a helpful assistant.",
max_iterations=10,
)
result = asyncio.run(agent.run("What's the weather in Beijing?"))
print(result)
4. SandboxAgent (Code Execution)
import asyncio
from easyagent import SandboxAgent
from easyagent.config import ModelConfig
from easyagent.model.litellm_model import LiteLLMModel
config = ModelConfig.load()
model = LiteLLMModel(**config.get_model("gpt-4o"))
# Local sandbox (for development)
agent = SandboxAgent(model=model)
# Docker sandbox (for production)
agent = SandboxAgent(
model=model,
sandbox_type="docker",
image="python:3.12-slim",
cpu_limit=2.0,
memory_limit="1g",
network=True,
)
result = asyncio.run(agent.run("Write a fibonacci program and run it"))
print(result)
SandboxAgent comes with built-in tools:
bash- Execute shell commandswrite_file- Write files (handles complex content safely)read_file- Read files
Core Components
Agent
| Class | Description |
|---|---|
ReactAgent |
ReAct loop: think → act → observe |
ToolAgent |
Tool registration and execution |
SandboxAgent |
ReactAgent with isolated code execution |
Sandbox
from easyagent import DockerSandbox, LocalSandbox, create_sandbox
# Factory function
sandbox = create_sandbox("docker", image="python:3.12-slim")
# Or direct instantiation
sandbox = DockerSandbox(
image="python:3.12-slim",
memory_limit="512m",
cpu_limit=1.0,
network=True,
)
async with sandbox:
result = await sandbox.exec_command("python --version")
print(result.output)
await sandbox.write_file("hello.py", "print('Hello!')")
result = await sandbox.exec_command("python hello.py")
Memory
from easyagent.memory import SlidingWindowMemory, SummaryMemory
# Sliding window
memory = SlidingWindowMemory(max_messages=20, max_tokens=4000)
# Auto-summary for long tasks
memory = SummaryMemory(task_id="task_001", reserve_ratio=0.3)
Pipeline
DAG-based workflow with parallel execution:
import asyncio
from easyagent.pipeline.base import BaseNode, BasePipeline, NodeContext
class FetchData(BaseNode):
async def execute(self, ctx: NodeContext) -> None:
ctx.data = "raw_data"
class ProcessA(BaseNode):
async def execute(self, ctx: NodeContext) -> None:
ctx.result_a = f"{ctx.data}_A"
class ProcessB(BaseNode):
async def execute(self, ctx: NodeContext) -> None:
ctx.result_b = f"{ctx.data}_B"
fetch = FetchData()
process_a = ProcessA()
process_b = ProcessB()
fetch >> [process_a, process_b] # Parallel branches
pipeline = BasePipeline(root=fetch)
ctx = asyncio.run(pipeline.run())
Built-in Tools
| Tool | Description | Required |
|---|---|---|
bash |
Execute shell commands in sandbox | SandboxAgent |
write_file |
Write files to sandbox | SandboxAgent |
read_file |
Read files from sandbox | SandboxAgent |
serper_search |
Google search via Serper API | SERPER_API_KEY env |
Project Structure
easyagent/
├── agent/ # ReactAgent, ToolAgent, SandboxAgent
├── model/ # LiteLLMModel, Message, ToolCall
├── memory/ # SlidingWindowMemory, SummaryMemory
├── tool/ # ToolManager, @register_tool
│ ├── code/ # bash, write_file, read_file
│ └── web/ # serper_search
├── sandbox/ # DockerSandbox, LocalSandbox
├── pipeline/ # BaseNode, BasePipeline
├── config/ # ModelConfig, AppConfig
├── prompt/ # Prompt templates
└── debug/ # Logger, LogCollector
License
MIT License © 2025 Yiran Peng
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easy_agent_sdk-0.1.4.tar.gz.
File metadata
- Download URL: easy_agent_sdk-0.1.4.tar.gz
- Upload date:
- Size: 29.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11196304049b97c27b6d9b624ef13b1211a92f6efae99ddfa42e3de2957f59fe
|
|
| MD5 |
47b44b7a47de8da804e3ad04528b6919
|
|
| BLAKE2b-256 |
5aa3e12014f51d61304168ec9b1ef6e33e2487decf3652f9a2cdd69d1599b66c
|
Provenance
The following attestation bundles were made for easy_agent_sdk-0.1.4.tar.gz:
Publisher:
publish.yml on SNHuan/EasyAgent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
easy_agent_sdk-0.1.4.tar.gz -
Subject digest:
11196304049b97c27b6d9b624ef13b1211a92f6efae99ddfa42e3de2957f59fe - Sigstore transparency entry: 836183442
- Sigstore integration time:
-
Permalink:
SNHuan/EasyAgent@397b1f6e7b1a394cba134e442fef7419a0e515c0 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/SNHuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@397b1f6e7b1a394cba134e442fef7419a0e515c0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file easy_agent_sdk-0.1.4-py3-none-any.whl.
File metadata
- Download URL: easy_agent_sdk-0.1.4-py3-none-any.whl
- Upload date:
- Size: 39.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65c862d9eec42588747ea29524a280e1929f2e55627abb6bae026b90b2aa28c1
|
|
| MD5 |
1d6bd79ea66f36a0bcda8525c4106c56
|
|
| BLAKE2b-256 |
3f5d56c2c4ae31a51583ab6a62cc64934c2bd1dc1139fdd95e61025a00c6e3f4
|
Provenance
The following attestation bundles were made for easy_agent_sdk-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on SNHuan/EasyAgent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
easy_agent_sdk-0.1.4-py3-none-any.whl -
Subject digest:
65c862d9eec42588747ea29524a280e1929f2e55627abb6bae026b90b2aa28c1 - Sigstore transparency entry: 836183443
- Sigstore integration time:
-
Permalink:
SNHuan/EasyAgent@397b1f6e7b1a394cba134e442fef7419a0e515c0 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/SNHuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@397b1f6e7b1a394cba134e442fef7419a0e515c0 -
Trigger Event:
release
-
Statement type: