Ahead-of-time compiler/linker for LLM agent prompts — compose instruction sets from interchangeable parts.
Project description
prompt-linker
Compile an LLM agent's instruction set from interchangeable parts — the way a program is linked from objects chosen at build time.
prompt-linker is an ahead-of-time compiler/linker for agent prompts. You write a stable algorithm as skeletons with named slots, write the variable behavior as interchangeable implementations, and declare which implementation fills each slot in a build manifest. The linker inlines the chosen implementations into the skeletons and emits one flat, fully-resolved instruction that the agent runs with zero runtime indirection.
Why
Configurable agent pipelines usually rot in one of two ways:
- inline conditionals (
if mode == X …) entangle every variation into one monolith; - runtime resolution pays a tool-call + tokens for every slot, on every iteration.
prompt-linker pays its indirection once, in deterministic code (zero model tokens), and hands the agent a single readable artifact. "Modes" become data — named presets over a small space of bindings — not branches in the engine. Adding a new behavior is a new implementation + a manifest line; the algorithm is never edited (Open–Closed).
Concepts
| Term | Is |
|---|---|
| Configuration | a self-contained directory (manifest + skeletons/ + contracts/) that compiles independently; a project may hold many |
| Contract | a named, reusable signature (inputs, postcondition, invariant); declared once, with an optional default impl |
| Slot | an occurrence of a contract in a skeleton — {{ slot: <contract-id> }}, the hole to fill |
| Implementation | one concrete block that satisfies a contract and fills its slots |
| Skeleton | a prompt template containing slots |
| Skill | a deliverable bundle (a top-level subdir of skeletons/) — a convention, not required |
| Manifest | Linker.yaml: names the configuration, binds each contract → an impl (+ named presets) |
| Binding / Resolution | a contract → impl pair / the resolved set of them (defaults → preset → overrides) |
| Linker | deterministic step that inlines implementations into skeletons |
| Verifier | proves every slot is bound once and each implementation satisfies its contract |
Quick look
# Linker.yaml
preset: team
overrides: { continuation: spawn-next } # run-local contracts only
presets:
solo: { task-source: local, continuation: stop }
team: { extends: solo, task-source: tracker }
# skeletons/autonomous-agent/run.md
## Phase 1 — Acquire work
{{ slot: task-source }}
prompt-linker compile --preset team → a flat compiled/<name>-<config-hash>/autonomous-agent/run.md
with the tracker implementation inlined — clean text the agent reads with no hint it was assembled
from parts (the output dir is content-addressed so a host can freeze a run by recording its path);
provenance lives in a GENERATED header. (compile --annotated adds per-block markers for an AI
verifier — a debug build, never shipped.) Copy Examples/StarterTemplate
to begin your own configuration, or read Examples/TestConfiguration
for a fuller, runnable one.
Usage
Run a command against a configuration directory (its ROOT). Installed via pipx/uvx the entry
point is prompt-linker; from a source checkout use PYTHONPATH=src python -m prompt_linker.cli.
prompt-linker verify Examples/TestConfiguration # check coherence; writes nothing
prompt-linker compile Examples/TestConfiguration --preset team # → compiled/ (gitignored)
prompt-linker check Examples/TestConfiguration --security # AI verifier (opt-in; needs [ai] extra)
verify and compile are deterministic and fail closed (and include a security scan); check is
the opt-in, model-using AI verifier (conformance, coherence, injection review). Full command
reference: Docs/Commands.md.
Status
🚧 Working implementation. The deterministic linker/verifier and the opt-in AI verifier both run.
Docs: the design in Docs/PromptLinker.md, the CLI in
Docs/Commands.md, verification layers in
Docs/Verification.md, emitted errors in Docs/Errors.md;
open questions and planned work in Roadmap/Roadmap.md.
Implementation: Python 3.11+, distributed via PyPI (pipx run prompt-linker / uvx prompt-linker). The npm name is reserved; a native JS build is deferred until there is demand for
embedding the linker as a JS library.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prompt_linker-0.9.0.tar.gz.
File metadata
- Download URL: prompt_linker-0.9.0.tar.gz
- Upload date:
- Size: 83.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a685769a9f5bc92e854df158bc96d025581c41ba0cefa79191f1968a4495eaed
|
|
| MD5 |
4fe5607e393bd7c3ea81ecf863e5ff67
|
|
| BLAKE2b-256 |
e1e4307f74e056df2c49af2c70d61ed6af4d574ec0603afceae527be9d6ec33a
|
File details
Details for the file prompt_linker-0.9.0-py3-none-any.whl.
File metadata
- Download URL: prompt_linker-0.9.0-py3-none-any.whl
- Upload date:
- Size: 36.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be7476ce55a6dd19128c94bc166525cef99709ad21b825a7f680d928863e8c87
|
|
| MD5 |
603d7c3bf115ab4f2ee0e291b94535af
|
|
| BLAKE2b-256 |
39d0490113e3c856d6486359221f4486e3d027bc0a446de2fd7223bcc2ec43be
|