Skip to main content

Git-first prompt registry + CI evals + lightweight runtime SDK (ivault).

Project description

InstructVault logo

InstructVault (ivault)

Git‑first prompt hub for teams and individual developers.

InstructVault makes prompts first‑class, governed, testable, versioned artifacts — just like code — while keeping runtime fast and local.

What this does (at a glance)

  • Prompts live in Git as YAML/JSON files
  • CI validates + evaluates prompts on every change
  • Releases are tags/SHAs, reproducible by design
  • Runtime stays lightweight (local read or bundle artifact)

System flow (Mermaid)

flowchart LR
  A[Prompt files<br/>YAML/JSON] --> B[PR Review]
  B --> C[CI: validate + eval]
  C --> D{Release?}
  D -- tag/SHA --> E[Bundle artifact]
  D -- tag/SHA --> F[Deploy app]
  E --> F
  F --> G[Runtime render<br/>local or bundle]

Why this exists

Enterprises already have Git + PR reviews + CI/CD. Prompts usually don’t. InstructVault brings prompt‑as‑code without requiring a server, database, or platform.

Vision

Short version: Git‑first prompts with CI governance and zero‑latency runtime.
Full vision: docs/vision.md

Features

  • ✅ Git‑native versioning (tags/SHAs = releases)
  • ✅ CLI‑first (init, validate, render, eval, diff, resolve, bundle)
  • ✅ LLM‑framework agnostic (returns standard {role, content} messages)
  • ✅ CI‑friendly reports (JSON + optional JUnit XML)
  • ✅ No runtime latency tax (local read or bundle)
  • ✅ Optional playground (separate package)

Install

Users

pip install instructvault

Contributors

git clone <your-repo>
cd instructvault
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

Quickstart (end‑to‑end)

1) Initialize a repo

ivault init

2) Create a prompt

prompts/support_reply.prompt.yml (YAML or JSON)

spec_version: "1.0"
name: support_reply
description: Respond to a support ticket with empathy and clear steps.
model_defaults:
  temperature: 0.2

variables:
  required: [ticket_text]
  optional: [customer_name]

messages:
  - role: system
    content: |
      You are a support engineer. Be concise, empathetic, and action-oriented.
  - role: user
    content: |
      Customer: {{ customer_name | default("there") }}
      Ticket:
      {{ ticket_text }}

tests:
  - name: must_contain_customer_and_ticket
    vars:
      ticket_text: "My order arrived damaged."
      customer_name: "Alex"
    assert:
      contains_all: ["Customer:", "Ticket:"]

3) Validate + render locally

ivault validate prompts
ivault render prompts/support_reply.prompt.yml --vars '{"ticket_text":"My app crashed.","customer_name":"Sam"}'

4) Add dataset‑driven eval

datasets/support_cases.jsonl

{"vars":{"ticket_text":"Order arrived damaged","customer_name":"Alex"},"assert":{"contains_any":["Ticket:"]}}
{"vars":{"ticket_text":"Need refund"},"assert":{"contains_all":["Ticket:"]}}
ivault eval prompts/support_reply.prompt.yml --dataset datasets/support_cases.jsonl --report out/report.json --junit out/junit.xml

Note: Prompts must include at least one inline test. Datasets are optional. Migration tip: if you need to render a prompt that doesn’t yet include tests, use ivault render --allow-no-tests or add a minimal test first.

5) Version prompts with tags

git add prompts datasets
git commit -m "Add support prompts + eval dataset"
git tag prompts/v1.0.0

6) Load by Git ref at runtime

from instructvault import InstructVault

vault = InstructVault(repo_root=".")
msgs = vault.render(
  "prompts/support_reply.prompt.yml",
  vars={"ticket_text":"My order is delayed", "customer_name":"Ava"},
  ref="prompts/v1.0.0",
)

7) Bundle prompts at build time (optional)

ivault bundle --prompts prompts --out out/ivault.bundle.json --ref prompts/v1.0.0
from instructvault import InstructVault
vault = InstructVault(bundle_path="out/ivault.bundle.json")

Notebooks

  • examples/notebooks/instructvault_colab.ipynb Open In Colab
  • examples/notebooks/instructvault_rag_colab.ipynb Open In Colab
  • examples/notebooks/instructvault_openai_colab.ipynb Open In Colab

How teams use this in production

  1. Prompt changes go through PRs
  2. CI runs validate + eval
  3. Tags or bundles become the deployable artifact
  4. Apps load by tag or bundle (no runtime network calls)

Datasets (why JSONL)

Datasets are deterministic eval inputs checked into Git. This makes CI reproducible and audit‑friendly. For cloud datasets, use a CI pre‑step (e.g., download from S3) and then run ivault eval on the local file.

Playground (optional)

A minimal playground exists under playground/ for local or org‑hosted use. It lists prompts, renders with variables, and runs evals — without touching production prompts directly. For local dev, run from the repo root:

export IVAULT_REPO_ROOT=/path/to/your/repo
PYTHONPATH=. uvicorn ivault_playground.app:app --reload

Playground screenshot

Optional auth:

export IVAULT_PLAYGROUND_API_KEY=your-secret

Then send x-ivault-api-key in requests (or keep it behind your org gateway). If you don’t set the env var, no auth is required.

Docs

  • docs/vision.md
  • docs/governance.md
  • docs/ci.md
  • docs/playground.md
  • docs/cookbooks.md
  • docs/dropin_guide.md
  • docs/release_checklist.md
  • docs/ci_templates/gitlab-ci.yml
  • docs/ci_templates/Jenkinsfile
  • CHANGELOG.md
  • CODE_OF_CONDUCT.md

License

Apache‑2.0

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

instructvault-0.2.8.tar.gz (2.0 MB view details)

Uploaded Source

Built Distribution

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

instructvault-0.2.8-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file instructvault-0.2.8.tar.gz.

File metadata

  • Download URL: instructvault-0.2.8.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for instructvault-0.2.8.tar.gz
Algorithm Hash digest
SHA256 bf017fbccdda36aea8027a3dc7f165351d9220f16606aecae93c267a82cc3e79
MD5 ec25a640ec1c8178e793c4e3e9bd3214
BLAKE2b-256 592c3da2f8d673b0482d7116cef3cafd9de7c50aeb0ffb7d5c2b18b90d83b32b

See more details on using hashes here.

File details

Details for the file instructvault-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: instructvault-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for instructvault-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 2cd8c39a09273868bdb9b15962ed4cc8b433cce0497e11eaf6c27689d925b15c
MD5 67d96e7837cabd59bac1e36540f0999c
BLAKE2b-256 badd5e9b434f8cd85d5a798a2da1f72d8d200528a026d72b556cf723dff588ef

See more details on using hashes here.

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