An exploration of making an agent sdk as lean as possible while being effective.
Project description
minimal-harness
Documentation: /docs
A lightweight Python agent harness for building LLM-powered agents with tool-calling support.
Latest version: 0.2.1
What This Project Is For
Minimal-harness is a lean framework for building agents that can call tools. It provides:
- Pluggable LLM providers - OpenAI, LiteLLM (optional), or implement your own
- Tool system - Create tools via decorators or directly; includes built-in tools (bash, file ops, grep, glob, ask_user)
- Interactive tools - Tools that pause execution to request user input mid-process
- Conversation memory - Tracks token usage across interactions
- AsyncIterator events - Real-time async iteration for chunks, tool start/end, execution start
How to Build an App
Project Structure
A typical app looks like this:
my-app/
├── cli.py # Entry point with argparse
└── tools.py # Your custom tools
1. Create Your Entry Point
import argparse
from minimal_harness.mhc import SimpleCli
from minimal_harness.tool.built_in import bash, read_file, ask_user
from minimal_harness.tool.registry import ToolRegistry
def main():
parser = argparse.ArgumentParser(description="My AI agent")
parser.add_argument("--base-url", required=True)
parser.add_argument("--api-key", required=True)
parser.add_argument("--model", default="qwen3.5-27b")
args = parser.parse_args()
# Register built-in tools
registry = ToolRegistry.get_instance()
registry.register(bash.bash_tool, bash.bash_handler)
registry.register(read_file.read_file_tool, read_file.read_file_handler)
registry.register(ask_user.ask_user_tool, ask_user.ask_user_first)
# Run the CLI
cli = SimpleCli(
api_key=args.api_key,
base_url=args.base_url,
model=args.model,
)
cli.run()
if __name__ == "__main__":
main()
2. Add Custom Tools
Use the @register_tool decorator to add your own tools:
from minimal_harness.tool.registration import register_tool
@register_tool(
name="get_weather",
description="Get weather for a location",
parameters={
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"],
},
)
async def get_weather(location: str) -> str:
return f"The weather in {location} is sunny."
The decorator auto-registers the tool. Just import it before cli.run().
3. Run
python cli.py --base-url https://api.openai.com/v1 --api-key sk-... --model gpt-4o
Or set environment variables:
export MH_BASE_URL=https://api.openai.com/v1
export MH_API_KEY=sk-...
export MH_MODEL=gpt-4o
python cli.py
Built-in Tools
| Tool | Description |
|---|---|
bash |
Execute shell commands |
read_file |
Read file contents |
create_file |
Create new files |
patch_file |
Patch existing files |
delete_file |
Delete files |
ask_user |
Request user input |
Environment Variables
| Variable | Description |
|---|---|
MH_BASE_URL |
API base URL |
MH_API_KEY |
API key |
MH_MODEL |
Model name (default: qwen3.5-27b) |
Running the Built-in CLI
mhc --base-url https://api.openai.com/v1 --api-key sk-... --model gpt-4o
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 minimal_harness-0.2.3.tar.gz.
File metadata
- Download URL: minimal_harness-0.2.3.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9526cd614f433a89d06551be46141382d17a9b366c2fab715b1dc61ae35a655
|
|
| MD5 |
2111eb982f81cc9664592d5de9bc1d84
|
|
| BLAKE2b-256 |
9192ccf1b5b23c1368b33294262ed1d2a17948095ef6912dc6d61db994b54a96
|
File details
Details for the file minimal_harness-0.2.3-py3-none-any.whl.
File metadata
- Download URL: minimal_harness-0.2.3-py3-none-any.whl
- Upload date:
- Size: 20.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98b7117499898ec9776ab44c0110dc92ce96434a60754de9660700029e43560e
|
|
| MD5 |
9ec5a3acbb4a590d614b2a317ef3e0e8
|
|
| BLAKE2b-256 |
b3746e364ef52555690a65170f37044eca2ba85b3fe9acd8f2ea091c67830679
|