The Problem
Developers building LLM‑driven agents often have to stitch together disparate pieces – prompt orchestration, tool calling, memory, observability – while keeping the codebase understandable and reproducible. Missing abstractions lead to duplicated glue code, fragile import cycles, and opaque side‑effects (file I/O, network calls) that make production deployment risky.
What This Does
agentscope supplies a ready‑made framework that defines a Message hub, Agent base classes, Tool registration, and Model adapters. Core symbols live in src/agentscope/ – e.g. src/agentscope/message/__init__.py (the hub, 81 importers) and src/agentscope/agent/_agent_base.py (the main agent implementation, 603 lines). The examples/ folder shows concrete agents:
examples/agent/a2a_agent/main.py– a minimal ReAct‑style agent that can converse and invoke tools.examples/agent/a2ui_agent/...– a web UI built with React‑lite, bundled by Vite (vite.config.ts).
The package ships a Python API (installable from PyPI) and a small front‑end stack (npm‑managed) so teams can run a full stack from a single repo.
How It Is Wired
Execution begins at examples/agent/a2a_agent/main.py (main at line 10). The function:
- Prints a banner (
print– 143 calls) and registers built‑in tools viaregister_tool_function(28 calls). - Instantiates a
ReActAgent(src/agentscope/agent/_react_agent.py) which pulls insrc/agentscope/message/__init__.py(the hub) andsrc/agentscope/tool/_toolkit.py. - The agent’s
replymethod builds aMsgobject (src/agentscope/message/_message_base.py, 122 imports) and may invoke a model (src/agentscope/model/_dashscope_model.py, 22 imports) – this is the only outbound model inference path (10 functions total).
From main the shortest external‑effect path is:
main → get_agent_card → pathlib.Path.open (filesystem)
Other flows include:
startinexamples/integration/alibabacloud_api_mcp/oauth_handler.py→urllib.request.urlopen(network) →wave.open(filesystem).react_agent_solutioninexamples/evaluation/ace_bench/main.py→self.session.execute(SQLite) →file_dir.mkdir(filesystem).
The Message hub (src/agentscope/message/__init__.py) is the biggest blast radius: 81 modules import it, and it participates in a circular import cycle with src/agentscope/types/__init__.py and src/agentscope/_utils/_common.py. Changing this file risks ripple effects across the entire codebase.
The Agent base (src/agentscope/agent/_agent_base.py) is an “oversized file” (603 lines) that handles observation, reply, and audio block processing; it opens files without a context manager and therefore leaks handles on error.
How To Use It
# 1. Clone the repo
git clone https://github.com/moses-y/agentscope
cd agentscope
# 2. Install the Python package (requires Python 3.10+)
pip install . # pyproject.toml provides the build backend
# 3. Run the example ReAct agent
python examples/agent/a2a_agent/main.py
For the web UI example:
cd examples/agent/a2ui_agent/samples/client/lit
npm ci # uses package-lock.json
npm run dev # Vite dev server as defined in vite.config.ts
No additional configuration files (e.g., .env) are present; any required API keys must be supplied at runtime as per the README examples.
Real‑World Use
A product team can embed agentscope as the orchestration layer for a customer‑service chatbot. The Python agent handles intent parsing, calls external tools (e.g., ticket‑system APIs) via the ToolResponse class, and stores conversation history in the built‑in short‑term memory module (src/agentscope/agent/_agent_base.py). The same repository can spin up the React UI for a human‑in‑the‑loop dashboard without leaving the codebase.
Code Health & Issues
- HIGH – GitHub Actions use version tags (
.github/workflows/*.yml). Pin to commit SHAs. - HIGH – No lockfile for
pyproject.toml. Generate (pip freeze > requirements.txtorpoetry lock) and commit. - MEDIUM – Workflows lack explicit
permissions:forGITHUB_TOKEN. Add least‑privilege scopes. - MEDIUM – No Dependabot/Renovate config (
.github/dependabot.yml). Add to automate security updates. - MEDIUM – CI pipelines lack a dependency‑vulnerability scan. Insert
dependency-review-actionorosv-scanner. - MEDIUM –
actions/checkoutruns with persisted credentials. Usepersist-credentials: false. - LOW – Workflow jobs have no
timeout-minutes. Define reasonable limits.
Static analysis also reported:
- 35 import‑cycle members (e.g.,
src/agentscope/message/__init__.py). Breaking these cycles will reduce coupling. - Broad
except:blocks in_utils/_common.pyandmcp/_stateful_client_base.py. Replace with specific exceptions. - Deep nesting (max indent 6) in several core files; refactor with early returns.
No critical or secret‑leak findings were detected.
The Bottom Line
agentscope delivers a cohesive, production‑oriented stack for building LLM agents, with clear entry points and a usable UI example. The primary technical debt lies in import cycles, an oversized agent base, and several CI hygiene gaps. Teams comfortable with Python 3.10+ and npm can adopt it quickly, but should prioritize fixing the high‑severity CI issues and refactoring the hub module before extensive custom development.