A minimal, hackable agentic framework: LLM calls via litellm, @tool-decorated functions, and MCP server support.
Project description
agentropic
A small, hackable agentic framework in ~500 lines you fully own and can read top to bottom in an afternoon:
- LLM calls go through litellm, so you get every provider (OpenAI, Anthropic, Gemini, Ollama, Bedrock, 100+ more) for free.
@tooldecorator turns any python function into an LLM-callable tool with an auto-generated JSON schema (from type hints + docstring).- MCP support — connect to any Model Context Protocol server (stdio or SSE) and its tools show up in your agent automatically, indistinguishable from local tools.
- Agent loop handles the call → tool-call → tool-result → call cycle for you, with memory, streaming, and a max-iteration safety valve.
Install (once published)
pip install agentropic
Quick start
import asyncio
from agentropic import Agent, tool
@tool()
def get_weather(city: str) -> str:
"""Get the current weather for a city."""
return f"It's sunny in {city}."
async def main():
agent = Agent(
name="assistant",
model="gpt-4o-mini", # any litellm model string
instructions="You are helpful and concise.",
tools=[get_weather],
)
print(await agent.arun("What's the weather in Paris?"))
asyncio.run(main())
Sync usage: agent.run("...") (wraps arun in asyncio.run for you).
Using MCP servers
from agentropic import Agent
from agentropic.mcp import StdioServer
agent = Agent(
name="fs-agent",
model="gpt-4o-mini",
mcp_servers=[
StdioServer(command="npx", args=["-y", "@modelcontextprotocol/server-filesystem", "."]),
],
)
print(await agent.arun("List the files in the current directory."))
Requires the optional MCP dependency: pip install "agentropic[mcp]".
Architecture
src/agentropic/
├── __init__.py # public API surface
├── agent.py # the run loop: LLM <-> tools <-> memory
├── llm.py # thin litellm wrapper (swap providers here)
├── tools.py # @tool decorator, Tool, ToolRegistry, schema generation
├── memory.py # in-memory conversation history (swap for your own store)
└── mcp/
└── client.py # MCP stdio/SSE client -> Tool adapter
Everything is a plain, editable python file — no hidden magic, no plugin
registry you can't inspect. Read agent.py first; that's the whole loop.
Extending it
- Custom memory / persistence: implement
.add(),.get(),.clear()matchingMemoryand passmemory=YourMemory()toAgent. - Streaming with tool calls:
astream()currently falls back to a non-streamedarun()when tools are registered — extend it if you need token-level streaming mid-tool-loop. - Multi-agent handoff: compose multiple
Agentinstances and route between them yourself, or wrap one agent'sarunas a tool for another.
Project details
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 agentropic-0.2.2.tar.gz.
File metadata
- Download URL: agentropic-0.2.2.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca10da60f200295970a12b26a17c3a352f7a0c77e4121f8bb26b2b3ac5ba7d99
|
|
| MD5 |
dc46f86d513dd95a7c3f53c0eb4e6920
|
|
| BLAKE2b-256 |
5f6674848dccedb47ae1c32afe0c7c078ced82e72ff20e275044c0e11d7c1ddf
|
File details
Details for the file agentropic-0.2.2-py3-none-any.whl.
File metadata
- Download URL: agentropic-0.2.2-py3-none-any.whl
- Upload date:
- Size: 16.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00b6f029b8dd72f12dc565f5f46350cb087f00e46addde2337aa614231d5ef02
|
|
| MD5 |
54096f6c42ae2b148243b8fd5fb899f6
|
|
| BLAKE2b-256 |
b8cb71518fae098887de4eddd8bb21bfec3278f9035089b01402e34bc3e09e03
|