MechaHarness
Python agent harness for hosts that compose inference safely — not a thin chat-client wrapper. Founding principles:
- Modular via dependency injection — pyiv
MechaHarnessConfig; hosts subclass and compose (no forked enums / string registries) - Multi-model / lanes native — reason, judge, and media lanes;
Completion/Judgement/Generationoutcomes - Cost in the object model —
CostAccountanton the harness path so runs cannot quietly go AWOL on spend - EventLog telemetry built in — queryable lifecycle, inference, tools, cost, and access events on every run
Also: deny-by-default grants / CompoundPolicy, and host-extendable open
identity. Docs: https://rl337.org/mechaharness/
Install
pip install mechaharness
Requires Python 3.9+. Unreleased main:
pip install git+https://github.com/rl337/mechaharness.git
Quick start
# List backends / harness families
mechaharness backends
mechaharness families
# Local LM Studio (OpenAI-compatible)
mechaharness run "What is 2+2?" \
--backend lmstudio \
--family tool_loop \
--model local-model
# OpenAI
export MECHA_API_KEY=sk-...
mechaharness run "Hello" --backend openai --model gpt-4o-mini
# HTTP API
mechaharness serve --port 8080
curl -s http://127.0.0.1:8080/health
Environment variables use the MECHA_ prefix (MECHA_API_KEY, MECHA_INFERENCE_BACKEND, MECHA_MODEL, MECHA_BASE_URL, …).
Library usage
Non-DI (OpenAPI-shaped):
import asyncio
from mechaharness import RunRequest, run
async def main() -> None:
result = await run(RunRequest(prompt="What is 19 + 23?", backend="lmstudio"))
print(result.final_text)
asyncio.run(main())
DI (pyiv Config hooks):
from pyiv import get_injector
from mechaharness.di import MechaHarnessConfig
from mechaharness.harness.base import AbstractHarness
from mechaharness.harness.tool_loop import ToolLoopHarness
from mechaharness.inference.openai_compat import OpenAICompatStrategy
class MyConfig(MechaHarnessConfig):
def get_inference_class(self):
return OpenAICompatStrategy
def get_harness_class(self):
return ToolLoopHarness
injector = get_injector(MyConfig)
harness = injector.inject(AbstractHarness)
See Dependency injection.
Extending
Subclass InferenceStrategy (constructor takes Settings) and return it from get_inference_class(), or merge it into SettingsConfig.inference_classes(). Subclass AbstractHarness and return it from get_harness_class().
Development
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,docs]"
./run_checks.sh
run_checks.sh is what CI runs: ruff, mypy, pytest, Sphinx, and CLI smoke. EventLog + cost without a GPU:
mechaharness run "What is 2+2?" --backend mock --family pass_through --model mock --json
Design notes
| Concern | Pattern | Why |
|---|---|---|
| Wiring | pyiv Config hooks | DI-first; hosts inject MechaHarness types |
| Provider I/O | Strategy | Swap cloud/local without touching agent logic |
| Agent loop | Template method hierarchy | Share turn accounting; specialize stop/tool rules per model family |
| Frontends | OpenAPI RunRequest / run() |
Same contract for CLI, HTTP, and non-DI Python |
| Bindings later | Pydantic + OpenAPI | Types stay serializable; API is the first non-Python client surface |
Release files for mechaharness 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mechaharness-0.1.2.tar.gz | 76.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mechaharness-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 151.6 kB
Release files / mechaharness-0.1.2.tar.gz
| Download URL | mechaharness-0.1.2.tar.gz |
|---|---|
| Size | 76.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
026876c86e0ae213388812118fb8f597c0d028482573f56e24ab83d0a3fb5f44
|
|
BLAKE2b-256 checksum How to use checksums |
ca84a52d05623eec33cad87d66994edeba55e2fe5f8a691f2e5778053983d725
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / mechaharness-0.1.2-py3-none-any.whl
| Download URL | mechaharness-0.1.2-py3-none-any.whl |
|---|---|
| Size | 75.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
98af64d1908921d497c97a362b4dc433c4f0ceb6cb8bbb1f778ea08467414e05
|
|
BLAKE2b-256 checksum How to use checksums |
438583a655d559039c32083846a4bd935d2de67230c22ff8a6588cb878477706
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|