Git-first prompt registry + CI evals + lightweight runtime SDK (ivault).
Project description
InstructVault (ivault)
Version prompts in Git, test them in CI, load them locally at runtime.
Prompts live as YAML/JSON files. Changes go through PRs and CI, releases are pinned by tag or SHA, and your app renders them from a local checkout or a bundle artifact — no hosted registry in the request path.
Quickstart
pip install instructvault
ivault init # scaffold prompts/, datasets/, CI workflow
ivault validate prompts # check every prompt spec
ivault render prompts/hello_world.prompt.yml --vars '{"name":"Ava"}'
A prompt looks like this
# prompts/support_reply.prompt.yml
spec_version: "1.0"
name: support_reply
modelParameters:
model: gpt-4o
temperature: 0.3
variables:
required: [ticket_text]
optional: [customer_name]
messages:
- role: system
content: "You are a concise, empathetic support engineer."
- role: user
content: |
Customer: {{ customer_name | default("there") }}
Ticket: {{ ticket_text }}
tests: # at least one test is required
- name: includes_ticket
vars: { ticket_text: "My order arrived damaged." }
assert: { contains_all: ["Ticket:"] }
Use it in your app
render() returns a list of {role, content} messages that also carries the spec's model config, so it drops straight into any client:
from openai import OpenAI
from instructvault import InstructVault
client = OpenAI()
vault = InstructVault(repo_root=".") # or bundle_path="out/ivault.bundle.json"
result = vault.render(
"prompts/support_reply.prompt.yml",
vars={"ticket_text": "My order is delayed", "customer_name": "Ava"},
ref="prompts/v1.0.0", # pin to a tag/SHA (omit for working tree)
)
response = client.chat.completions.create(**result.to_openai())
result is a plain list, so for m in result: m.content still works. Adapters: .to_openai(), .to_anthropic(), .to_litellm(), .to_dict().
CLI
| Command | Purpose |
|---|---|
ivault init |
Scaffold prompts/, datasets/, and a CI workflow |
ivault validate <path> |
Validate prompt specs (add --policy for custom rules) |
ivault render <prompt> --vars '{...}' |
Render messages locally |
ivault eval <prompt> --report out/report.json --junit out/junit.xml |
Run tests/datasets, emit reports |
ivault diff <prompt> --ref1 <a> --ref2 <b> |
Diff a prompt across two refs |
ivault bundle --prompts prompts --out out/ivault.bundle.json --ref <tag> |
Build a deployable bundle |
ivault resolve <ref> / ivault migrate prompts |
Resolve a ref to a SHA / migrate specs |
By default eval asserts against the rendered prompt — fully deterministic, no network. Add --provider openai to instead call a model and assert on its reply (needs OPENAI_API_KEY). Network is strictly opt-in, so CI stays deterministic unless you ask for a provider.
Where it fits
| Approach | Versioned in Git | CI-friendly | Local runtime | Hosted dependency |
|---|---|---|---|---|
| Prompt strings in app code | Partial | Partial | Yes | No |
| Prompts in a database / admin UI | Usually not | Usually not | No | Usually yes |
| Hosted prompt registry/platform | Varies | Varies | Usually no | Yes |
| InstructVault | Yes | Yes | Yes | No |
flowchart LR
A[Prompt files] --> B[PR review] --> C[CI validate + eval] --> D[Tag, SHA, or bundle] --> E[App runtime]
Develop locally
git clone https://github.com/05satyam/instruct_vault.git
cd instruct_vault
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
python -m pytest
Docs & examples
docs/dropin_guide.md— add InstructVault to an existing CI/CD repodocs/cookbooks.md— OpenAI, LangChain, LlamaIndex, RAG, policies, bundlesdocs/spec.md— prompt spec and validation rulesdocs/ci.md·docs/governance.md·docs/stability.md·docs/roadmap.md·docs/performance.md- Examples:
examples/ivault_demo_template,examples/llamaindex_demo,examples/notebooks,examples/policies
License
Apache-2.0
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 instructvault-0.5.0.tar.gz.
File metadata
- Download URL: instructvault-0.5.0.tar.gz
- Upload date:
- Size: 2.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b336f266056e1c3b5c9c6158b9f9ef2fa5637dbde2a442e0e83249bfc74019f
|
|
| MD5 |
588f24bf853acd98e6880a51ad0d8788
|
|
| BLAKE2b-256 |
7104b33a84074a0ad34751e5c7d160bb5f5e9a3069ba063627af7ccfd11e68bc
|
File details
Details for the file instructvault-0.5.0-py3-none-any.whl.
File metadata
- Download URL: instructvault-0.5.0-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58af155cc11fc1eb45c5815177ee841685eb88c0265d6fa2ec03bc7a7372ec28
|
|
| MD5 |
36c5a03add4f4706b2252f382da4750b
|
|
| BLAKE2b-256 |
32865504c46951e291230efad39671527b915d1cfe002fca7804306f95b0ac56
|