annotations-orchestration
Generic Python library for orchestrating LLM evaluation runs: a resumable
parallel scheduler over experiment manifests, plus span metrics for
precision/recall/F1 against gold annotations — computed by
annotations-evaluate,
the family's spec-driven metrics library.
Part of the annotations-* family: the annotation pipeline lives in
annotations4all,
this library provides the evaluation/experiment infrastructure, and concrete run
projects combine both.
Features
- Decoupled scheduler: the existing
legacyrunner speaks a subprocess CLI contract (RunSpec → flags), not annotations4all types. The optionalstandardrunner, provider discovery and hints useannotations4all; the base installation does not require that library. - Conservative concurrency: documents within a run are processed
linearly;
remoteruns share a pool (execution.remote_parallelism, default 3);self_hostedruns get one sequential lane per host. The exact HU endpoint gets a separate serial lane regardless of mode, with at most 10 requests per minute; request-level pacing is implemented by the client. - Resumable: run state is persisted; completed runs are skipped, interrupted/failed runs re-execute on restart.
- Manifest-driven and validated: experiment YAMLs + optional controller
manifests (
defaults/execution/order). Run fields (model,host,port,context,shots,data_dir,net,api_url,api_key_env,reasoning,reasoning_effort,requests_per_minute,runner,annotation,tagger,nested) are checked for type and allowed values, and unknown keys are rejected instead of being ignored silently — with file, key and the list of allowed keys (plus a typo suggestion); errors are one line (error: …, exit code 2) instead of a traceback. - Metrics: span evaluation with precision/recall/F1, provided by
annotations-evaluate— the SemEval-2013 compatible flat schemes (strict, entity type, partial, exact) used for the run reports, and that library's nested standard report (levels, structure, decode rate) for nested annotations.
Installation
python -m pip install annotations-orchestration
Requires Python 3.11+.
The metrics library of the family,
annotations-evaluate,
is installed as a regular dependency from PyPI.
Quickstart
# Plan an experiments directory (no execution; writes runtime state)
annotations-orchestrate --experiments-dir experiments/ --dry-run
# Run the experiments
annotations-orchestrate --experiments-dir experiments/
Python API
from pathlib import Path
from annotations_orchestration import evaluate_classifier
# One record in the harness format: gold spans per annotation tool, predicted spans.
records = [
{
"ground_truth": {"prodigy": [{"start": 0, "end": 3, "label": "PER"}]},
"predictions": [{"start": 0, "end": 3, "label": "PER"}],
}
]
# Pass records in memory, or omit "predictions" to read a run directory.
overall, per_tag = evaluate_classifier(
eval_dir=Path("results"),
predictions=records,
)
f1 = overall["ent_type"]["f1"] # 1.0
CLI
annotations-orchestrate options: --manifest, --experiments-dir,
--state, --results-dir, --dry-run, --active-self-hosted,
--graceful-shutdown-seconds.
Config editor
Version 0.3.0 includes an optional Textual TUI for viewing, creating and editing single-/multi-run experiments and controller manifests. A structured form, full YAML editor and effective-run preview share the CLI's manifest semantics. Saves include a change diff, atomic replacement and protection against unsaved or externally modified documents.
Install it with the tui extra:
python -m pip install 'annotations-orchestration[tui]'
annotations-tui --experiments-dir experiments/
annotations-tui --manifest experiments/controller.yaml --read-only
From a source checkout, uv sync --extra tui installs the same entry points, so
uv run --extra tui annotations-tui … (or python -m annotations_orchestration.tui … with --file <path>) behaves identically.
For provider discovery, capabilities, hints and standard annotation, also install
the annotate extra; it requires annotations4all>=0.3.1 (the 0.2 series has
neither create_chat_client nor the capability modules). Local installation and
examples:
annotation workflow.
Interactive use requires a terminal; --help works without a TTY or the extra.
The existing CLI does not require the extra.
- Ctrl+N new, Ctrl+O open, Ctrl+S save, Ctrl+Shift+S save as.
- F2 Form / F3 YAML / F4 Preview / F5 Duplicate; Ctrl+R reload, Ctrl+B file list, Ctrl+Q quit, F1 help.
- Read-only viewing and raw editing of invalid YAML for repair.
- Responsive cards group model/prompting, annotation/input and connection, with contextual fields. Groups start expanded; manual collapse choices persist.
- Experiment → Defaults → Runs: consistent inheritance, newly added runs stay
{}; local overrides are red, custom inherited values normal, built-ins dim. Legacy headers remain readable and migrate only after explicit confirmation. - Runs can be added, duplicated, removed and reordered;
false,0, empty strings and Unset remain distinct. - Annotation dialog for labels/descriptions, context and language, plus a read-only data-directory inspector showing document/gold/span counts.
- Keyless manual configuration stays available. Current live effort metadata limits selection to the exact model levels plus Default/Unset; incompatible existing values are diagnosed, never silently rewritten.
- A separate green ✓ means positive live evidence for that exact model, reasoning or effort value, not guaranteed quality or successful inference.
- Contextual Hints… / F1 and More → Hints explain reasoning, costs, verification and evaluation from the central static library resource.
- F6 opens provider/model selection with a custom ENV name or manual model ID; provider-reported model lists have a per-credential session cache and Refresh.
- F8 manages local
.envkeys with masked display; F9 opens UI options. Packaged provider definitions are extended/overridden bycwd/models.yaml. - NerdFont icons are on by default;
--no-nerd-fontsoverrides this for the session. The theme is chosen in F9 or with--theme(session only), also viaCtrl+P; explicitly saved preferences live incwd/settings.yaml. - No experiment execution, run control or state/lock files in the editor. Explicit
network requests only read model metadata, not test completions; credentials
never enter experiment YAML/settings.
api_key_envremains an environment variable name, not a credential value.
For full controls, inheritance and storage guarantees, see the editor guide (English).
Declarative annotation
runner: standard with annotation configures Configurable/Per-Label jobs
without a custom Python frontend; runner: legacy remains the default for
existing consumers. The standard runner preflights all input before inference
and requires fresh output paths, even with --force-predict; no item resume.
Top-level Prodigy spans and ground_truth.prodigy/tags are normalized in memory,
never in the source files. Missing gold is annotation-only; explicitly empty
gold remains evaluable. Per-label makes one model call per label/document;
nesting requires the configurable tagger and user-written hierarchy instructions.
Local-library setup, full manifest, preflight, outputs and the extended consumer CLI contract: annotation workflow. On 2026-10-09 the maintainer confirmed a successful live consumer run using a TUI-generated configuration, not blanket support for all providers.
Development
The full suite requires both extras and the development dependencies. No sibling checkout is needed; the compatible annotation library is installed from PyPI:
uv sync --locked --all-extras
uv run --locked --all-extras ruff check .
uv run --locked --all-extras ruff format --check .
uv run --locked --all-extras pytest
uv sync --extra tui alone does not supply library integration-test dependencies.
For development against local library sources, see the annotation workflow;
uv run may replace manually installed editable packages with the locked version.
Build with uv build; see the linked annotation workflow for compatibility and
packaging boundaries.
Citation
If you use this software in academic work, please cite it as follows:
Dresselhaus, Nicole. (2026). annotations-orchestration (Version 0.3.0) [Software]. Humboldt-Universität zu Berlin. https://doi.org/10.5281/zenodo.23495464
Concept DOI: 10.5281/zenodo.22015763 (always resolves to the newest version)
Machine-readable metadata is available in CITATION.cff.
License
MIT.
The metrics are computed by
annotations-evaluate
(MIT, same family), a regular PyPI dependency. This package contains no metric
code of its own: it only adapts a run's records and writes the report.
Metadata
Release files for annotations-orchestration 0.3.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 | Provenance | |
|---|---|---|---|---|
| annotations_orchestration-0.3.0.tar.gz | 4.5 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| annotations_orchestration-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 4.6 MB
Release files / annotations_orchestration-0.3.0.tar.gz
| Download URL | annotations_orchestration-0.3.0.tar.gz |
|---|---|
| Size | 4.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
37b102833d1381ce211f8ebacfa5f2149551b3a4248e818c86fab18e84e2277a
|
|
BLAKE2b-256 checksum How to use checksums |
1278f03c3b2be5c9df3a5584c037f00e8b0d4f78dbc5aa54a0df6adbe8b409dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / annotations_orchestration-0.3.0-py3-none-any.whl
| Download URL | annotations_orchestration-0.3.0-py3-none-any.whl |
|---|---|
| Size | 109.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
09d5a280edf2c1fe66ba2797238660d4c4f3522c17c4c919f2092211280e06be
|
|
BLAKE2b-256 checksum How to use checksums |
114795c30d587b0aede6098bf370b34181bf71c00ec1daca55a293c1b299057f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for annotations-orchestration 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.