Skip to main content

Route Hermes delegate_task(background=True) to named, persistent AgentMint subagents.

Project description

agentmint-hermes-runner

Python adapter that bridges Hermes' delegate_task(background=True) to named, persistent AgentMint subagents — specialists that accumulate /workspace/MEMORY.md across calls.

One install path: monkey-patch delegate_task so every async delegation can route to AgentMint. The LLM picks the target subagent via either default_agent_name (set at install) or by including "agentmint-<name>" in the toolsets list (per-call routing).

The Hermes-installable skill that drives this adapter lives in a separate catalog repo: mesutcelik/agentmint-skillshermes skills install mesutcelik/agentmint-skills/hermes-delegate-task. The skill references this package by its PyPI name (pip install agentmint-hermes-runner).

Status

v0.9.0 — alpha. Auth backends: BearerAuth (any rail — Stripe-Link / x402 / Tempo MPP), TempoAuth (Tempo USDC.e — Tier 1 direct only; the delegate_task patches require Bearer).

Breaking change in 0.9.0: the agentmint_delegate plugin tool has been removed. There is now exactly one routing surface — the patched delegate_task. If you were using set_dispatcher(...) to register the plugin tool, replace it with install_delegate_task_wrapper(dispatcher, default_agent_name="..."). The toolsets=["agentmint-<name>"] per-call routing hack keeps working unchanged.

Routing model

There are exactly two ways the runner picks the target subagent. They serve different intents — don't conflate them.

default_agent_name Role
"general-worker" (or similar generic name) Catch-all for unrouted delegations. Use when Hermes wants to offload arbitrary subtasks to a single persistent worker whose MEMORY.md accumulates as the session breadcrumb trail. The default should always be a generic worker — never a specialist. Naming a specialist as the default breaks the moment you add a second specialist.
None (no default) Unrouted delegations fall through to Hermes-native delegate_task. Use when AgentMint involvement is opt-in per call.
toolsets=["agentmint-<name>"] directive Role
Per-call specialist routing. LLM dispatches to a specific named expert (pr-reviewer, data-analyst, slack-bot, …). Each specialist has its own MEMORY.md. Always use this for specialists — not the default slot.

Setup — generic offload

Every unrouted delegate_task(background=True) lands in one persistent worker:

import os
from agentmint_hermes_runner import AgentMintDispatcher, BearerAuth, install_delegate_task_wrapper

dispatcher = AgentMintDispatcher(auth=BearerAuth(jwt=os.environ["AGENTMINT_JWT"]))
install_delegate_task_wrapper(dispatcher, default_agent_name="general-worker")

Pre-mint general-worker once (agent.create via curl). Its MEMORY.md grows across every delegation that doesn't carry a specialist directive.

Setup — per-call specialist routing

The LLM picks the target specialist on each call via the toolsets list:

# Operator setup is identical — generic default + LLM-driven overrides.
install_delegate_task_wrapper(dispatcher, default_agent_name="general-worker")

# The LLM then dispatches like this:
delegate_task(
    background=True,
    goal="Review PR 42 in mesutcelik/agentmint-mono",
    toolsets=["terminal", "file", "agentmint-pr-reviewer"],
)

The adapter parses agentmint-pr-reviewer from toolsets, routes that call to that subagent (overriding default_agent_name), and strips the entry from the toolset list before composing the prompt the subagent receives.

This is a workaround for Hermes' delegate_task not accepting a dispatcher-target argument. A formal proposal is in docs/hermes-feature-request.md — when an upstream extension lands, this hack will be deprecated in favor of a first-class dispatcher or metadata parameter.

Pattern discipline

  • default_agent_name → generic worker only (general-worker, default-worker, etc.)
  • Specialists → only via toolsets=["agentmint-<name>"]
  • Never name a specialist as the default. Specialists scale; defaults are catch-all.

See examples/persistent.py for a complete operator setup snippet.

Install

pip install agentmint-hermes-runner

Test

pip install -e ".[dev]"
pytest
ruff check .

Lower-level surface

If you want to drive AgentMint directly without the delegate_task patch:

result = dispatcher.dispatch(
    agent_name="reviewer-myrepo",
    goal="Review the diff at /workspace/pr-42.diff and flag risks.",
    context="Project at /workspace, Python 3.11, uses Flask + PyJWT.",
    toolsets=["terminal", "file"],     # "web" raises UnsupportedToolset
    role="leaf",                        # or "orchestrator"
    max_iterations=50,
    child_timeout_seconds=600,
    workspace_files=[                   # ship inputs into the sandbox before the run
        {"path": "/workspace/pr-42.diff", "content": "diff --git a/foo ..."},
    ],
    cleanup_paths=["/workspace/pr-42.diff"],  # wipe them after the run
)

# Batch dispatch (Hermes tasks=[…] analog):
results = dispatcher.dispatch_batch(
    tasks=[
        Task(agent_name="researcher-wasm", goal="WASM 2026 survey"),
        Task(agent_name="researcher-riscv", goal="RISC-V 2026 survey"),
    ],
    max_concurrent_children=3,
    child_timeout_seconds=900,
)

Known unsupported

  • toolsets=["web"] — no canonical AgentMint web-fetch skill yet. Raises UnsupportedToolset.
  • max_spawn_depth — AgentMint sandboxes aren't structurally bounded by depth.
  • Tempo + the delegate_task patches — polling against agent.run.status is Bearer-only. Tempo customers can use Tier 1 (direct curl) but not the install/plugin paths above.

License

MIT

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

agentmint_hermes_runner-0.9.1.tar.gz (23.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentmint_hermes_runner-0.9.1-py3-none-any.whl (18.4 kB view details)

Uploaded Python 3

File details

Details for the file agentmint_hermes_runner-0.9.1.tar.gz.

File metadata

  • Download URL: agentmint_hermes_runner-0.9.1.tar.gz
  • Upload date:
  • Size: 23.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agentmint_hermes_runner-0.9.1.tar.gz
Algorithm Hash digest
SHA256 ee89d363e7b8f54f2a4003b5aa71ee1272c34e4086df35274a4ccc524ddeea15
MD5 f6beb814d87ec5b05c9402a46f3a9521
BLAKE2b-256 fc57733e1c2078e12217c9714824dbf601d5a16b4a076dc5810a156ac8c8a172

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentmint_hermes_runner-0.9.1.tar.gz:

Publisher: release.yml on mesutcelik/agentmint-hermes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agentmint_hermes_runner-0.9.1-py3-none-any.whl.

File metadata

File hashes

Hashes for agentmint_hermes_runner-0.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e6f7fabd7a12b931b65b0dc16a98c2812032d3f8b1461d2496c64c38b8fa5412
MD5 ce741e3e2a064bd8f05993854a566bad
BLAKE2b-256 de08f5d6df32ec8ac4ed7c70a5ee2a4f232c691fa948ffd79d718ab10a1c212a

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentmint_hermes_runner-0.9.1-py3-none-any.whl:

Publisher: release.yml on mesutcelik/agentmint-hermes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page