Skip to content
Tironian
Documentation

Tironian docs

Everything you need to go from install to a small model answering your routine requests. If something here is unclear or wrong, open an issue.

Install

You need Hermes Agent 0.22.3 or newer, signed in to any model provider.

hermes plugins install angelraph/tironian
hermes plugins enable tironian

In Hermes Desktop you can also use the install link: Install in Hermes Desktop. Desktop shows what the plugin contains and asks before installing. To see the Tironian page, switch on its Desktop part in Capabilities, Plugins.

Plugins are off until you enable them, and the Desktop part is off until you switch it on. That is Hermes's rule, not ours, and a good one.

Your first report

hermes tironian report

or /tironian report in any session. Tironian reads your Hermes history read only, groups your requests into task families and shows how much of your work repeats and what it cost over the last 30 days. Nothing is sent anywhere and nothing is spent.

Your Tironian report · 47 sessions · 47 requests
64% of your requests are recurring tasks (30 requests).

Top task families:
  faa990c09  largest files · folder     10 req ·  6 good · needs 19 more good examples
  f7fe4b2c3  recent files · folder       8 req ·  8 good · needs 17 more good examples

A family becomes trainable at 25 good examples by default. Keep using Hermes normally: every good turn counts. You can speed things up with /tironian good after an answer you liked.

Your first model

  1. Set up the trainer once: hermes tironian trainer setup. It creates Tironian's own environment and installs the Modal client.
  2. Add your Modal token (see On Modal) and check it: hermes tironian trainer check. The check uses no compute.
  3. Train: hermes tironian train <family> --follow. You see the example counts and the cost before anything starts.
  4. Load the model in Hermes (see Loading a model), then test it: hermes tironian eval <student>.
  5. If it passes, try it in shadow mode: hermes tironian shadow <family>. When it agrees with your model often enough, hermes tironian promote <family> and switch on Let promoted students answer in the plugin settings.

Modal rents GPUs by the second. Tironian uses your own account, so your data and your bill stay yours.

  1. Create an account at modal.com. The free Starter plan includes monthly credit (a small amount without a card, more with one).
  2. In Modal, open Settings, API Tokens, New Token.
  3. Paste the two values into Settings, Plugins, Tironian in Hermes Desktop, or add them to Hermes's .env:
MODAL_TOKEN_ID=ak-...
MODAL_TOKEN_SECRET=as-...

A run on an L4 GPU costs about $0.15 for a 1.7B model (my runs: 180 examples, about ten minutes, $0.14). max_usd_per_run (default $1.00) is enforced as a timeout on the GPU job, so a run can never cost more. The first run builds the training image, which adds a few minutes. See Cost for an estimate based on your own numbers.

On your own GPU

With an NVIDIA card, training is free and nothing leaves your machine.

hermes tironian trainer setup --local
hermes config set plugins.entries.tironian.settings.train_backend local

The local option installs PyTorch and the training libraries into Tironian's own environment (a few GB). A 1.7B model trains comfortably on 8 GB of GPU memory.

Dry run

hermes tironian train <family> --backend dry-run --follow

Runs the whole job pipeline, from dataset to status updates to a placeholder model file, with no compute at all. Useful for trying Tironian out and for its own tests. A dry-run model is not a real model and can't pass a test.

Loading a model

Trained models are saved as GGUF files under Tironian's data folder; hermes tironian students prints the paths. Tironian loads the model for you: if you run Ollama it registers it there, using the same prompt format it was trained on, and Hermes's own local model server works too. Tironian talks to http://127.0.0.1:8080/v1 by default and switches to Ollama's http://127.0.0.1:11434/v1 when only Ollama has the model. Any other OpenAI-compatible server works if you set student_endpoint.

Any OpenAI compatible server works too: Ollama, LM Studio or a llama.cpp server you run yourself. Set student_endpoint to its address.

Slash command

CommandWhat it does
/tironianStatus: what's learned, answered locally, saved
/tironian reportRecurring tasks and spend in your history
/tironian familiesEach family, its status and last test
/tironian good [note]The last answer was right; learn from it
/tironian bad [note]The last answer was wrong; never learn from it
/tironian off · onStop or resume learning from this conversation
/tironian train <family>Build the dataset and show the cost; asks before starting
/tironian shadow|promote|demote <family>Change what a family's model is allowed to do
/tironian whyWhy the last request did or didn't go to a small model

CLI

CommandWhat it does
hermes tironian statusSummary
hermes tironian import [--days 90]Read history read only and rebuild families
hermes tironian reportThe report
hermes tironian familiesFamilies and their status
hermes tironian dataset <family>Build a dataset without training
hermes tironian trainer setup [--local]Create the trainer environment
hermes tironian trainer checkCheck the Modal token (no cost)
hermes tironian train <family> [--yes] [--backend] [--follow]Train a model
hermes tironian jobs [--follow] · cancel <job>Watch or stop training
hermes tironian resume <job> [--follow]Reattach to a Modal run whose connection was lost, with no new GPU time
hermes tironian studentsTrained models, paths, whether loaded
hermes tironian eval <student> [--limit n] [--new-places]Held-out test and gate verdict. --new-places tests only folders the student never trained on
hermes tironian shadow|promote|demote <family>Change a family's mode
hermes tironian export <family> --out <dir>Write a dataset you can use anywhere
hermes tironian passport <student> · --verify <file>A sealed record of where a student came from and what it proved, and a check that nobody changed it
hermes tironian forget <session>Forget one session exactly, including from any student trained on it
hermes tironian demoThe whole loop in about 30 seconds, offline, on scripted history
hermes tironian purge --yesDelete everything Tironian captured

Settings

All settings appear in Hermes Desktop under Settings, Plugins, Tironian, or set them with hermes config set plugins.entries.tironian.settings.<name> <value>.

SettingDefaultMeaning
capture_enabledtrueLearn from sessions
routing_enabledfalseLet promoted models answer
promotion_modeshadowWhere a passing model goes first
exclude_platformscron, kanbanNever learn from these
redact_piitrueMask personal details as well as secrets
retention_days90Drop recorded contexts after this
judge_enabledfalseUse a blind judge when a student's answer differs from yours (held-out test and shadow mode)
spot_check_rate0.1Share of a live family's requests your usual model still answers while the student is judged in the background, to catch drift. Under 85% agreement over the last 20 sends it back to shadow mode. 0 turns spot checks off
holdout_byplaceplace keeps whole folder trees and drives out of training, so the test shows whether a student learned the job or just your usual paths. session only keeps whole conversations out
new_place_min_n10Steps on folders a student never trained on needed before a weak result there stops it serving
answer_badgedesktopWhere to show that your own model helped with a reply: desktop shows a small proof card in Hermes Desktop, always also adds a one-line note on other platforms, off shows nothing
base_modelqwen3-1.7bOr qwen3-4b
train_backendmodalOr local
modal_gpuL4Or A10G
max_usd_per_run1.0Hard cap per training run
promotion_threshold0.85Lower bound the test must clear
min_eval_n30Minimum held-out steps
min_family_turns25Good examples before a family can train
student_endpoint127.0.0.1:8080/v1Where the small model is served
student_timeout_s25After this, your model answers

Where files live

Everything is under <HERMES_HOME>/plugin-data/tironian/: the database (tironian.db), datasets/, jobs/, trained models in students/, and the trainer environment in sidecar/. Updating or removing the plugin keeps this folder, as Hermes intends for plugin data.

Troubleshooting

The report is empty

Tironian learns from sessions, so a fresh Hermes install has nothing to show yet. Use Hermes for a while, then run hermes tironian import.

A family never becomes trainable

Only good turns count. If your requests for one task are phrased very differently, they may form two smaller families; both will grow. /tironian good after answers you liked helps.

"Modal token missing" or "Token validation failed"

Check that both values are set and that the secret starts with as-. Run hermes tironian trainer check after changing them.

"the local model server doesn't list ..."

No local model server has the model yet. Install Ollama and run the test again, and Tironian will load it, or load the file into the server you use and set student_endpoint.

The model failed its test

That is the gate doing its job. The message says why (too few held-out steps, format errors or the lower bound). More data usually fixes it; train again later.

Nothing goes to the small model

Run /tironian why. Common reasons: routing is off, the family is still in shadow mode, or the request didn't match the family closely enough.

Uninstall

hermes tironian purge --yes
hermes plugins remove tironian

Purge first if you want the captured data gone; removing the plugin alone keeps its data folder. Delete your Modal token in Modal's settings if you no longer need it.