Skip to main content

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

Project description

InstructVault logo

InstructVault (ivault)

PyPI version Python versions CI Release

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

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.5.0.tar.gz (2.1 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.5.0-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

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

Hashes for instructvault-0.5.0.tar.gz
Algorithm Hash digest
SHA256 4b336f266056e1c3b5c9c6158b9f9ef2fa5637dbde2a442e0e83249bfc74019f
MD5 588f24bf853acd98e6880a51ad0d8788
BLAKE2b-256 7104b33a84074a0ad34751e5c7d160bb5f5e9a3069ba063627af7ccfd11e68bc

See more details on using hashes here.

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

Hashes for instructvault-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 58af155cc11fc1eb45c5815177ee841685eb88c0265d6fa2ec03bc7a7372ec28
MD5 36c5a03add4f4706b2252f382da4750b
BLAKE2b-256 32865504c46951e291230efad39671527b915d1cfe002fca7804306f95b0ac56

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