Releases: SNHuan/EasyAgent
v0.6.6
EasyAgent 0.6.6 tightens multi-agent runtime semantics and improves MCP tool
result normalization. Runtime ticks now use a clearer observe/act/apply split,
and MCP integrations preserve structured provider results more reliably.
Changed
- Runtime tick execution now snapshots all active entity perceptions before
running entity actions, then applies actions in deterministic active-entity
order. - Multi-entity ticks now run the
act()phase concurrently with
asyncio.gather()while keeping the action log deterministic. - Runtime tick is now synchronized into worlds that expose
set_tick(), making
Perception.tickfollow the runtime tick source of truth. - Worlds may now expose
advance(tick)for optional per-tick world dynamics;
StatefulWorldforwards bothset_tick()andadvance()to its inner
world. - MCP result normalization now prefers
structuredContent/
structured_contentover less precisedatapayloads. - MCP structured values are converted through a JSON-safe normalizer before
serialization, including pydantic-stylemodel_dump(), legacydict(),
root, bytes, mappings, and iterables.
Fixed
- Avoided MCP result output falling back to opaque root-like object strings
when a structured content payload is available. - Preserved plain content output ahead of fallback
datawhen MCP providers
return both.
v0.6.5
[0.6.5] - 2026-06-10
EasyAgent 0.6.5 adds first-class wrappers for externally managed coding
agents. Claude Code SDK and Codex SDK can now be registered as runtime
entities, traced through the existing event system, and inspected in the local
dashboard.
Added
easyagent.externalwithExternalAgentEntity,ExternalResult,
ExternalRunner,ClaudeCodeRunner,CodexRunner,claude_code_entity,
andcodex_entity.- Optional dependency groups:
external,claude, andcodexfor installing
Claude Code SDK and Codex SDK integrations only when needed. - Real external agent examples:
examples/16_external_claude_code.pyexamples/17_external_codex.py
.env.exampleas the single local environment example for EasyAgent core,
Serper, Claude Code SDK, and Codex/OpenAI SDK configuration.register_token_usage_adapter()for provider-specific token usage
normalization.
Changed
- Runtime tracing now supports external agent provider events, including
messages, streaming deltas, tool calls, tool results, final results, failures,
and provider session ids. - The dashboard Messages view now renders external agent transcripts with
user prompts on the right and agent process/final messages on the left. - Claude Code and Codex tool results are summarized by default; long result
payloads stay collapsed until expanded in the dashboard. - Token usage normalization now understands OpenAI/Codex-style
input_tokens/output_tokenspayloads and Claude cache token details. - README and README_CN now reference the unified
.env.exampleand include the
updated dashboard screenshot.
Removed
- Removed the older
.example_envfile to avoid ambiguity with
.env.example.
Install
pip install -U easy-agent-sdk==0.6.5v0.6.4
EasyAgent v0.6.4
EasyAgent 0.6.4 adds a lightweight display protocol for custom trace events. SDK users can now persist user-defined events and tell the dashboard how to render them, without changing the trace store schema or modifying frontend code.
Highlights
- Added
CustomTraceEventfor user-defined trace events with explicit persisted event types. - Added
DisplayHintfor attaching dashboard rendering metadata to custom events. - Dashboard now supports rendering custom events in the Messages tab via
payload.display.surface == "messages". - Custom event
display.titleanddisplay.contentnow improve Timeline summaries. - Custom events can be hidden from Timeline with
display.surface == "hidden"while still being persisted and inspectable through payloads. - README and README_CN now include examples for publishing custom dashboard-visible events.
Example
await bus.publish(
CustomTraceEvent(
event_type="PlannerStepEvent",
session_id="sess_planner",
agent_id="planner",
summary="Planner selected search_docs",
payload={"step": "search_docs"},
display=DisplayHint.messages(
"Need to inspect README and pyproject first.",
role="assistant",
title="Planner step",
source="planner",
),
)
)v0.6.3
EasyAgent v0.6.3
EasyAgent 0.6.3 is a dashboard polish release for the runtime observability work introduced in 0.6.2. It improves runtime/session timeline rendering, preserves runtime navigation state, and fixes token usage tooltip positioning.
Highlights
- Added a runtime timeline view that mixes runtime events and child sessions in timestamp order.
- Runtime event selection now updates the Event Payload inspector directly.
- Runtime and session timeline connector lines are now rendered at the container level, fixing broken or misaligned lines caused by zoom level or variable row heights.
- Returning from a session opened from the runtime timeline now restores the runtime timeline tab instead of resetting to Overview.
- Token Usage bar chart tooltips now align correctly at chart edges, so first/last bar tooltips are not clipped.
- README dashboard guidance no longer references removed example scripts.
Verification
npm run lintnpm run buildpython -m pytest
All Python tests passed: 78 passed.
Install
pip install -U easy-agent-sdk==0.6.3v0.6.1
EasyAgent v0.6.1
EasyAgent 0.6.1 polishes the local dashboard experience for real streaming agent runs. The dashboard now updates while an LLM response is still being generated, keeps stream-heavy timelines readable, and presents token usage with clear current-session versus all-session scopes.
Highlights
- Added
LLMStreamChunkEventtrace events duringAgent.stream()andReactAgent.stream(). - Dashboard messages now render partial assistant output before the final
LLMRespondedEvent. - SSE trace updates now detect SQLite table changes instead of relying on DB file mtimes.
- Timeline collapses consecutive stream chunk events into one grouped row.
- Token Usage now has
CurrentandAllmodes. Currentshows the selected session input/output mix as a donut chart.Allshows all sessions as an hourly stacked bar chart.- Token totals now follow the selected Token Usage scope.
- Filter and Trace DB popovers now close on outside click or Escape.
- Event mix and token usage charts now include subtle reveal animations.
- Trace DB source is configured at startup with
easyagent dashboard --db path/to/traces.db. - Removed dashboard-only helper scripts from
apps/dashboard/scripts.
Install
pip install -U easy-agent-sdk==0.6.1v0.6.0
EasyAgent 0.6.0
EasyAgent 0.6.0 adds the observability loop for real agent development: session tracing, persistent stores, streaming responses, Agent Skills-compatible loading, and a bundled local dashboard launched from the CLI.
Highlights
- Added
easyagent dashboardto inspect local agent traces. - Added SQLite / JSONL / memory trace stores.
- Added structured tracing for agent lifecycle, LLM calls, tool calls, tool results, failures, and final messages.
- Added streaming model response support through
LLMStreamChunk. - Added Agent Skills-compatible
SKILL.mdloading with.easyagent/skillsandEA_SKILLS_DIR. - Removed default
end/thinktools; ReAct now finishes naturally when the model returns a plain assistant response. - Moved tests out of the package into top-level
tests/. - Added dashboard UI for sessions, timelines, messages, token usage, payloads, event mix charts, and resizable panes.
Install
pip install -U easy-agent-sdk==0.6.0v0.5.1: MCP Tool Integration
EasyAgent now supports MCP as an external tool source. Users can point the SDK
at a FastMCP/MCP config, discover remote tools, register them into a
ToolManager, and decide per AgentSession which tools are visible to the
model.
Added
MCP integration (easyagent/mcp/)
MCPToolset— discovers tools from a FastMCP-compatible source and exposes
them as EasyAgent tools.load_mcp_tools(source, *, servers=None, tags=None)— returns MCP-backed
tool adapters without mutating a registry.register_mcp_tools(tool_manager, source, *, servers=None, tags=None)—
incrementally registers discovered MCP tools into an existingToolManager
and returns the registered tool names.MCPToolAdapter— bridges MCP tool calls into EasyAgent'sToolprotocol.FastMCPClientAdapter— wrapsfastmcp.Clientwhile keeping FastMCP as an
implementation detail of the MCP module.MCPToolInfo/MCPToolResultplus result normalization helpers for MCP
text, structured content, resource blocks, and errors.
Tool selection
- MCP config server names can be used as natural categories via
servers=["literature"]. - FastMCP tool tags are preserved from
meta["_fastmcp"]["tags"]and can be
filtered withtags=[...]. - MCP tool registration is additive: registering one MCP server does not clear
existing local or remote tools.
Examples
examples/mcp/fastmcp_in_memory.py— in-memory FastMCP server consumed by
EasyAgent.examples/mcp/config_load.py— loadsmcp_config.example.json, registers a
selected MCP server's tools, and enables them on a session.examples/mcp/mcp_config.example.json— standardmcpServersconfig.examples/mcp/servers/literature_server.py— small local FastMCP server for
examples.
Tests
easyagent/test/test_mcp.pycovers MCP tool discovery, ToolManager
registration, tag filtering, server filtering, and result normalization.
Changed
easyagenttop-level exports now includeMCPToolset,load_mcp_tools,
andregister_mcp_tools.- Default installation now includes sandbox, web, and MCP dependencies:
docker,httpx, andfastmcp. requirements.txtnow mirrors the default runtime dependency set.README.mdandREADME_CN.mddocument MCP config loading and session-level
tool enablement.- MCP examples live under
examples/mcp/instead of the numbered learning
path, because MCP is an external integration rather than a core ladder step.
v0.4.0: Entity-World-Schedule Architecture
Breaking Changes
The multi-agent layer is rebuilt from scratch. easyagent/chat/ and
easyagent/runtime/ are deleted and replaced by three orthogonal protocols:
- Entity — id + async act(Perception) -> Action | None
- World — observe() / apply() / seed()
- Schedule — next(LoopState) -> list[str] | None
- Runtime — the perceive-act-apply loop wiring Entity + World + Schedule
The single-agent layer (Agent, ReactAgent, SkillAgent, SandboxAgent) is
unchanged.
What's New
Core Protocols
- Entity, World, Schedule — runtime-checkable protocols
- Perception with typed slices (MessagesSlice, SpatialSlice, StateSlice)
- Action hierarchy: Speak, Move, SetState, Silent, Composite
- Runtime — perceive-act-apply loop with optional EventBus
Worlds
- ConversationWorld — flat chat history, broadcast visibility
- PipelineWorld — entity N sees only seed + entity N-1
- SpatialWorld + Grid2D — 2D grid with range-limited perception
- StatefulWorld — decorator adding blackboard state to any World
Entities
- LLMEntity — wraps any Agent; rebuilds memory from Perception each turn
- TeamEntity — wraps a Runtime as a single Entity (recursive nesting)
- HumanEntity — asyncio.Queue or callback input
Schedules
- TakeTurns, RoundRobin, AllParallel, RandomOrder, Reactive
- Decorators: MaxTicks, UntilIdle, UntilPredicate
Presets
- sequential(), fanout(), debate(), chatroom(), groupchat()
Removed
- easyagent/chat/ — Orchestrator, Talker, LLMTalker, HumanTalker, RuntimeTalker,
strategies/* - easyagent/runtime/ — BaseRuntime, TickBasedRuntime, policies
Docs
- README, README_CN, CHANGELOG, docs/architecture.md all rewritten for the new
architecture - Examples 07–14 rewritten to demonstrate Entity-World-Schedule patterns
v0.3.0 — Chat layer + three-layer SDK
Release notes (markdown):
EasyAgent v0.3.0 is the biggest release since the SDK started. The runtime is
rebuilt around three layers, and a brand-new chat layer is the recommended
entry point for multi-agent collaboration.
Highlights
- 🆕
easyagent.chat— write multi-agent flows as plainawaitcalls. Wrap
anyBaseAgentwithLLMTalker, drop into a preset (sequential/fanout/
chatroom/groupchat/debate), or compose your ownOrchestratoralong
four pluggable axes (routing / turn-taking / stop / summarize). Containers nest
natively becauseOrchestratoritself implementsTalker. - 🧱 Three-layer SDK — a single-agent ladder (
Agent→ReactAgent→
SkillAgent/SandboxAgent), a tick-drivenruntimelayer for autonomous
group simulation, and the newchatlayer for everyday multi-agent work. - 📚 Examples ladder rebuilt — 15 single-concept examples, 00 through 14:
model call → memory/context → tools → skills → sandbox → custom tool → two-agent
talk → sequential → chatroom → groupchat → debate → nested → shared state →
advanced runtime.
What's new
Single-agent layer
BaseAgent/Agent/ReactAgent/SkillAgent/SandboxAgentclean
inheritance chain, with loop logic now inagent.step().AgentSession(renamed fromAgentRuntime) with anon_events(events)hook
for multi-agent participation.BaseAgent.observe(msg)— read-only memory absorption without triggering a
reply.Message.namefield andMessage.to_api_dict(include_reasoning=...).
Tools
EndTool— the canonical "I'm done" tool, on by default inReactAgent.ThinkTool— side-effect-free scratch pad, on by default inReactAgent.ToolManager/SkillManagerare now plain registries instead of
constructor-level singletons.
Events & runtime (easyagent.events, easyagent.runtime)
MessageEvent(visibility viato="*"orto=frozenset(...)),WaitEvent,
EventBus, telemetry events.BaseRuntime,TickBasedRuntime, presets (ParallelRuntime/
SequentialRuntime/ShuffledRuntime), policies (StepPolicy/
SchedulePolicy/StopPolicywith all built-ins).
Chat layer (easyagent.chat)
ChatMessage/Identityprimitives.Talkerprotocol with adapters:LLMTalker,HumanTalker,RuntimeTalker.Orchestrator+ strategies along four axes — see the README and
docs/architecture.md.MultiAgentFormatter— folds others' messages into a<history>block so an
agent never mistakes them for its own; auto-installed byLLMTalker.SharedState— versioned KV blackboard with subscriptions and async
wait_for.
Removed
easyagent/loop/(SingleTurnLoop/ReActLoop) — loop logic now lives in
agent.step().easyagent/pipeline/(Team/BaseNode/BasePipeline) — superseded by
chat.sequentialandOrchestrator.
Install
pip install -U easy-agent-sdk==0.3.0
Optional extras: [sandbox] (Docker sandbox), [web] (SerperSearch), [all].
Full changelog
See https://github.com/SNHuan/EasyAgent/blob/v0.3.0/CHANGELOG.md
---v0.1.4
[0.1.4] - 2026-01-20
Added
-
Message.reasoning_content字段:Message模型新增reasoning_content可选字段,用于存储 LLM 的推理/思考内容(如 Claude 的<think>块)。这使得 agent 的 memory 能够完整保留模型输出的所有信息。 -
Message.from_response()类方法: 新增从LLMResponse直接创建Message的便捷方法。自动将 response 中的content、reasoning_content和tool_calls映射到 Message 对应字段。 -
Message.to_api_dict()方法: 新增将 Message 渲染为 LLM API 所需 dict 格式的方法。在发送给 LLM 时,自动将reasoning_content以<think>...</think>格式合并到content中,确保对话上下文的完整性。
Changed
-
BaseAgent._build_messages(): 改用Message.to_api_dict()构建 API 请求消息,确保reasoning_content被正确渲染到对话历史中。 -
LiteLLMModelcost 计算: 移除 cost 计算失败时的静默降级(设为 0),现在会直接抛出异常。确保模型配置正确,避免隐藏潜在问题。
Why This Matters
现代 LLM(如 Claude、DeepSeek)支持 "思考" 模式,会在 reasoning_content 字段返回推理过程。之前的实现只存储 content,导致:
- 对话历史丢失了模型的推理上下文
- 多轮对话时模型无法"回忆"之前的思考过程
- 日志和 trajectory 无法完整记录模型行为
此次更新确保:
- ✅ Memory 完整存储
content+reasoning_content - ✅ 发送给 LLM 时正确合并为完整上下文
- ✅ 支持 trajectory 导出完整的 thinking 记录
Migration Guide
无破坏性变更。现有代码无需修改即可继续工作。
如需利用新功能:
# 之前的写法(仍然有效)
msg = Message.assistant(content="Hello")
# 新写法:从 LLMResponse 直接创建(推荐)
response = await model.call_with_history(msgs)
msg = Message.from_response(response)
# 或者手动指定 reasoning_content
msg = Message.assistant(
content="The answer is 42",
reasoning_content="Let me think step by step..."
)