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.0
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.0.tar.gz | 61.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mechaharness-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 126.1 kB
Release files / mechaharness-0.1.0.tar.gz
| Download URL | mechaharness-0.1.0.tar.gz |
|---|---|
| Size | 61.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f940e582651ae5beabcf75e459a26caaaca0f726877399862b8f4882df3a2314
|
|
BLAKE2b-256 checksum How to use checksums |
b74d333cf87c57f0a82f3231785281bc68176669301fe8e510eedbf43dae5e50
|
| 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.0-py3-none-any.whl
| Download URL | mechaharness-0.1.0-py3-none-any.whl |
|---|---|
| Size | 64.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6db22e6fe7911da18ecda1b9087266af7c5b94b57f788de817250c434c23cafc
|
|
BLAKE2b-256 checksum How to use checksums |
99c556b3de5d4fa8acc37e344b0098d5202ec0d0beb268b8c69cf549e62b7953
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|