|
59 | 59 | <a class="brand" href="#top" aria-label="PromptOpsKit home">PromptOpsKit</a> |
60 | 60 | <nav aria-label="Primary"> |
61 | 61 | <a href="#why">Why</a> |
| 62 | + <a href="#what">What</a> |
| 63 | + <a href="#quickstart">How</a> |
62 | 64 | <a href="#features">Features</a> |
63 | | - <a href="#quickstart">Quick start</a> |
64 | 65 | <a href="#faq">FAQ</a> |
65 | | - <a href="#oss">Open source</a> |
66 | 66 | </nav> |
67 | 67 | <a class="button button-primary" href="https://github.com/PredictabilityAtScale/promptopskit">GitHub</a> |
68 | 68 | </div> |
69 | 69 | </header> |
70 | 70 |
|
71 | 71 | <main id="top"> |
| 72 | + <!-- ─── HERO ─── --> |
72 | 73 | <section class="hero container"> |
73 | 74 | <p class="eyebrow">Open-source prompt infrastructure</p> |
74 | | - <h1>Ship AI prompts with the same rigor as application code.</h1> |
| 75 | + <h1>Version-control your AI prompts like application code.</h1> |
75 | 76 | <p class="lead"> |
76 | | - PromptOpsKit is a developer-first toolkit and CLI for authoring prompts in Markdown, |
77 | | - validating schema and variables before runtime, and rendering provider-specific request bodies |
78 | | - without locking you into a transport stack. |
| 77 | + PromptOpsKit turns prompts into plain Markdown files that live in your repo. |
| 78 | + Model settings, sampling parameters, environment overrides, variable placeholders, |
| 79 | + and shared instructions are all defined in one file — then rendered into ready-to-send |
| 80 | + request bodies for OpenAI, Anthropic, Gemini, or OpenRouter. |
79 | 81 | </p> |
80 | 82 | <div class="hero-actions"> |
81 | 83 | <a class="button button-primary" href="https://www.npmjs.com/package/promptopskit">Install from npm</a> |
82 | | - <a class="button" href="https://github.com/PredictabilityAtScale/promptopskit#quick-start">Read the quick start</a> |
| 84 | + <a class="button" href="#quickstart">Quick start</a> |
83 | 85 | </div> |
84 | | - <pre><code>npm install promptopskit |
85 | | -npx promptopskit init ./prompts |
86 | | -promptopskit validate ./prompts --strict</code></pre> |
| 86 | + <pre><code>npm install promptopskit</code></pre> |
87 | 87 | </section> |
88 | 88 |
|
| 89 | + <!-- ─── THE PROBLEM ─── --> |
89 | 90 | <section id="why" class="container section"> |
90 | | - <h2>Why teams adopt PromptOpsKit</h2> |
| 91 | + <h2>The problem: prompts are invisible infrastructure</h2> |
| 92 | + <p class="section-intro"> |
| 93 | + Most teams embed prompts as string literals scattered across application code. |
| 94 | + Model parameters live in config files. Environment differences are handled with |
| 95 | + if/else branches. When a prompt changes, there is no diff to review, no schema to |
| 96 | + validate, and no way to share instructions across features without copy-pasting. |
| 97 | + </p> |
91 | 98 | <div class="grid three"> |
92 | 99 | <article class="card"> |
93 | | - <h3>Predictable prompt changes</h3> |
94 | | - <p>Store prompts in markdown with front matter so every change is diffable, reviewable, and auditable.</p> |
| 100 | + <h3>Prompts buried in code</h3> |
| 101 | + <p>String constants and template literals are hard to diff, review, or audit. Prompt changes hide inside application commits with no clear ownership.</p> |
95 | 102 | </article> |
96 | 103 | <article class="card"> |
97 | | - <h3>Portable provider output</h3> |
98 | | - <p>Generate request bodies for OpenAI, Anthropic, Gemini, and OpenRouter while keeping network logic in your app.</p> |
| 104 | + <h3>Settings scattered everywhere</h3> |
| 105 | + <p>Model names, temperature, reasoning effort, and max tokens live in separate config objects — disconnected from the prompt they belong to.</p> |
99 | 106 | </article> |
100 | 107 | <article class="card"> |
101 | | - <h3>Safer releases</h3> |
102 | | - <p>Catch invalid schema, unresolved variables, and malformed composition before your production calls fail.</p> |
| 108 | + <h3>Duplication across environments</h3> |
| 109 | + <p>Dev uses a cheaper model. Prod uses a different one. Free-tier caps output tokens. Each variation means another copy of the same prompt.</p> |
103 | 110 | </article> |
104 | 111 | </div> |
105 | 112 | </section> |
106 | 113 |
|
107 | | - <section id="features" class="container section"> |
108 | | - <h2>Prompt management features for engineering teams</h2> |
| 114 | + <!-- ─── THE SOLUTION (WHAT) ─── --> |
| 115 | + <section id="what" class="container section"> |
| 116 | + <h2>The solution: prompts as versioned, composable Markdown files</h2> |
| 117 | + <p class="section-intro"> |
| 118 | + PromptOpsKit gives every prompt a single Markdown file that captures everything — |
| 119 | + model settings, sampling parameters, environment overrides, variable declarations, |
| 120 | + and composable includes — so prompts are diffable, reviewable, and portable. |
| 121 | + </p> |
109 | 122 | <div class="grid two"> |
110 | 123 | <article class="card"> |
111 | | - <h3>Authoring format engineers already trust</h3> |
112 | | - <ul> |
113 | | - <li>Markdown files with YAML front matter</li> |
114 | | - <li>H1 sections for system instructions and prompt template</li> |
115 | | - <li><code>{{ variable }}</code> interpolation and strict checks</li> |
116 | | - </ul> |
| 124 | + <h3>Version-controlled prompts</h3> |
| 125 | + <p>Each prompt is a <code>.md</code> file with YAML front matter. It diffs in pull requests, merges through your normal workflow, and has a clear history in git.</p> |
117 | 126 | </article> |
118 | 127 | <article class="card"> |
119 | | - <h3>Composition and overrides without duplication</h3> |
120 | | - <ul> |
121 | | - <li><code>includes</code> for shared policy, tone, and safety blocks</li> |
122 | | - <li>Environment and tier-specific overrides</li> |
123 | | - <li>Deterministic precedence: base → env → tier → runtime</li> |
124 | | - </ul> |
| 128 | + <h3>Model & parameter settings in one place</h3> |
| 129 | + <p>Model name, temperature, top_p, reasoning effort, max output tokens, and response format are declared in front matter — right next to the prompt text they govern.</p> |
125 | 130 | </article> |
126 | 131 | <article class="card"> |
127 | | - <h3>CLI for local and CI pipelines</h3> |
128 | | - <ul> |
129 | | - <li><code>init</code>, <code>validate</code>, <code>render</code>, <code>inspect</code>, <code>compile</code>, and <code>skill</code></li> |
130 | | - <li>Pre-compile prompts to JSON/ESM artifacts</li> |
131 | | - <li>Use in pre-merge checks and release workflows</li> |
132 | | - </ul> |
| 132 | + <h3>Environment & tier overrides</h3> |
| 133 | + <p>Define <code>environments</code> and <code>tiers</code> in front matter to swap models and parameters for dev/prod or free/pro without duplicating the prompt file.</p> |
133 | 134 | </article> |
134 | 135 | <article class="card"> |
135 | | - <h3>No transport lock-in</h3> |
136 | | - <ul> |
137 | | - <li>Adapters return request body only</li> |
138 | | - <li>You keep control of auth, retries, headers, and observability</li> |
139 | | - <li>Integrates with existing HTTP and infra standards</li> |
140 | | - </ul> |
| 136 | + <h3>Data insertion with variables</h3> |
| 137 | + <p><code>{{ variable }}</code> placeholders inject runtime data into prompts. Declared inputs are validated before rendering — missing or extra variables are caught early.</p> |
| 138 | + </article> |
| 139 | + <article class="card"> |
| 140 | + <h3>Composable shared instructions</h3> |
| 141 | + <p><code>includes</code> lets you define tone, policy, or safety instructions once and prepend them to any prompt. No copy-paste, no drift, with circular dependency detection.</p> |
| 142 | + </article> |
| 143 | + <article class="card"> |
| 144 | + <h3>Provider-portable output</h3> |
| 145 | + <p>Render the same prompt for OpenAI, Anthropic, Gemini, or OpenRouter. Each adapter produces the correct request body shape — you own the HTTP call.</p> |
141 | 146 | </article> |
142 | 147 | </div> |
143 | 148 | </section> |
144 | 149 |
|
| 150 | + <!-- ─── HOW IT WORKS (QUICK START) ─── --> |
145 | 151 | <section id="quickstart" class="container section"> |
146 | | - <h2>PromptOpsKit quick start</h2> |
147 | | - <div class="grid two"> |
| 152 | + <h2>How it works</h2> |
| 153 | + |
| 154 | + <div class="quickstart-steps"> |
148 | 155 | <article class="card"> |
149 | | - <h3>1) Install and scaffold</h3> |
| 156 | + <h3>1. Install and scaffold</h3> |
150 | 157 | <pre><code>npm install promptopskit |
151 | 158 | npx promptopskit init ./prompts</code></pre> |
| 159 | + <p>Creates a <code>prompts/</code> directory with starter files and a shared instructions folder.</p> |
| 160 | + </article> |
| 161 | + |
| 162 | + <article class="card"> |
| 163 | + <h3>2. Write a prompt file</h3> |
| 164 | + <p>One Markdown file defines everything: model, parameters, overrides, variables, includes, and prompt text.</p> |
| 165 | + <pre><code>--- |
| 166 | +id: support.reply |
| 167 | +schema_version: 1 |
| 168 | +provider: openai |
| 169 | +model: gpt-5.4 |
| 170 | +reasoning: |
| 171 | + effort: medium |
| 172 | +sampling: |
| 173 | + temperature: 0.7 |
| 174 | +context: |
| 175 | + inputs: |
| 176 | + - user_message |
| 177 | + - app_context |
| 178 | +includes: |
| 179 | + - ./shared/tone.md |
| 180 | +environments: |
| 181 | + dev: |
| 182 | + model: gpt-5.4-mini |
| 183 | + sampling: |
| 184 | + temperature: 0.2 |
| 185 | + prod: |
| 186 | + model: gpt-5.4 |
| 187 | +tiers: |
| 188 | + free: |
| 189 | + model: gpt-5.4-mini |
| 190 | + pro: |
| 191 | + model: gpt-5.4 |
| 192 | +--- |
| 193 | + |
| 194 | +# System instructions |
| 195 | + |
| 196 | +You are a helpful support assistant working in {{ app_context }}. |
| 197 | + |
| 198 | +# Prompt template |
| 199 | + |
| 200 | +{{ user_message }}</code></pre> |
152 | 201 | </article> |
| 202 | + |
153 | 203 | <article class="card"> |
154 | | - <h3>2) Render for your target provider</h3> |
| 204 | + <h3>3. Render for any provider</h3> |
| 205 | + <p>Load the prompt, supply variables, and get a ready-to-send request body.</p> |
155 | 206 | <pre><code>import { createPromptOpsKit } from 'promptopskit'; |
156 | 207 |
|
157 | 208 | const kit = createPromptOpsKit({ sourceDir: './prompts' }); |
158 | | -const result = await kit.renderPrompt({ |
| 209 | + |
| 210 | +const { request } = await kit.renderPrompt({ |
159 | 211 | path: 'support/reply', |
160 | 212 | provider: 'openai', |
161 | | - variables: { user_message: 'How do I reset my password?' } |
| 213 | + environment: 'prod', |
| 214 | + tier: 'pro', |
| 215 | + variables: { |
| 216 | + user_message: 'How do I reset my password?', |
| 217 | + app_context: 'Account settings page', |
| 218 | + }, |
| 219 | +}); |
| 220 | + |
| 221 | +// request.body is shaped for OpenAI — send it with your own HTTP client |
| 222 | +const res = await fetch('https://api.openai.com/v1/chat/completions', { |
| 223 | + method: 'POST', |
| 224 | + headers: { |
| 225 | + 'Content-Type': 'application/json', |
| 226 | + Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, |
| 227 | + }, |
| 228 | + body: JSON.stringify(request.body), |
162 | 229 | });</code></pre> |
163 | 230 | </article> |
164 | 231 | </div> |
165 | 232 | </section> |
166 | 233 |
|
| 234 | + <!-- ─── FEATURES ─── --> |
| 235 | + <section id="features" class="container section"> |
| 236 | + <h2>Features for engineering teams</h2> |
| 237 | + <div class="grid two"> |
| 238 | + <article class="card"> |
| 239 | + <h3>Validation & schema checks</h3> |
| 240 | + <ul> |
| 241 | + <li>Zod schema validation for front matter</li> |
| 242 | + <li>Levenshtein-based "did you mean?" for field typos</li> |
| 243 | + <li>Variable usage checks — missing and unused inputs</li> |
| 244 | + <li>Strict mode fails on any unresolved placeholder</li> |
| 245 | + </ul> |
| 246 | + </article> |
| 247 | + <article class="card"> |
| 248 | + <h3>CLI for local dev and CI</h3> |
| 249 | + <ul> |
| 250 | + <li><code>init</code> — scaffold starter prompts</li> |
| 251 | + <li><code>validate</code> — check all prompts before merge</li> |
| 252 | + <li><code>compile</code> — pre-compile <code>.md</code> → JSON or ESM</li> |
| 253 | + <li><code>render</code> — preview output with test variables</li> |
| 254 | + <li><code>inspect</code> — print normalized prompt as JSON</li> |
| 255 | + <li><code>skill</code> — deploy AI agent instructions</li> |
| 256 | + </ul> |
| 257 | + </article> |
| 258 | + <article class="card"> |
| 259 | + <h3>Compiled artifacts for production</h3> |
| 260 | + <ul> |
| 261 | + <li>Pre-compile prompts to JSON or ESM — skip parsing at runtime</li> |
| 262 | + <li>Auto mode loads compiled when available, falls back to source</li> |
| 263 | + <li>LRU cache with mtime-based invalidation during development</li> |
| 264 | + </ul> |
| 265 | + </article> |
| 266 | + <article class="card"> |
| 267 | + <h3>No transport lock-in</h3> |
| 268 | + <ul> |
| 269 | + <li>Adapters return request body only — no HTTP client bundled</li> |
| 270 | + <li>You control auth, retries, headers, and observability</li> |
| 271 | + <li>Works with any fetch wrapper, SDK, or infrastructure</li> |
| 272 | + </ul> |
| 273 | + </article> |
| 274 | + </div> |
| 275 | + </section> |
| 276 | + |
| 277 | + <!-- ─── FAQ ─── --> |
167 | 278 | <section id="faq" class="container section"> |
168 | 279 | <h2>Frequently asked questions</h2> |
169 | 280 | <div class="grid two"> |
170 | 281 | <article class="card"> |
171 | 282 | <h3>Is PromptOpsKit only for one model provider?</h3> |
172 | | - <p>No. It supports OpenAI, Anthropic, Gemini, and OpenRouter adapters out of the box.</p> |
| 283 | + <p>No. It ships with adapters for OpenAI, Anthropic, Gemini, and OpenRouter. Each produces the correct request body shape for that API.</p> |
| 284 | + </article> |
| 285 | + <article class="card"> |
| 286 | + <h3>Does it make HTTP requests for me?</h3> |
| 287 | + <p>No. PromptOpsKit returns request-body payloads. Your application owns transport, auth, retries, and headers.</p> |
173 | 288 | </article> |
174 | 289 | <article class="card"> |
175 | | - <h3>Does PromptOpsKit make HTTP requests?</h3> |
176 | | - <p>No. It returns request-body payloads so your app controls auth, transport, retries, and headers.</p> |
| 290 | + <h3>Can I validate prompts in CI?</h3> |
| 291 | + <p>Yes. Run <code>promptopskit validate ./prompts --strict</code> in your pipeline to catch schema errors, missing variables, and broken includes before deploy.</p> |
177 | 292 | </article> |
178 | 293 | <article class="card"> |
179 | | - <h3>Can we validate prompts in CI before deploy?</h3> |
180 | | - <p>Yes. Use the CLI validate and compile commands in your CI pipeline to catch issues before release.</p> |
| 294 | + <h3>How do overrides work?</h3> |
| 295 | + <p>Define <code>environments</code> and <code>tiers</code> in front matter. At render time, pass <code>environment</code> and <code>tier</code> to apply the right model and parameter set. Precedence: base → env → tier → runtime.</p> |
| 296 | + </article> |
| 297 | + <article class="card"> |
| 298 | + <h3>What does composability look like?</h3> |
| 299 | + <p>Add an <code>includes</code> array in front matter pointing to other <code>.md</code> files. Their system instructions are prepended to the current prompt. Circular includes are detected automatically.</p> |
181 | 300 | </article> |
182 | 301 | <article class="card"> |
183 | 302 | <h3>Is PromptOpsKit open source?</h3> |
184 | | - <p>Yes. The project is MIT-licensed and maintained in a public GitHub repository.</p> |
| 303 | + <p>Yes. MIT-licensed, maintained on GitHub, and designed so you never depend on a hosted service.</p> |
185 | 304 | </article> |
186 | 305 | </div> |
187 | 306 | </section> |
188 | 307 |
|
| 308 | + <!-- ─── OPEN SOURCE ─── --> |
189 | 309 | <section id="oss" class="container section"> |
190 | | - <h2>Open source and production-ready defaults</h2> |
191 | | - <p> |
192 | | - PromptOpsKit is MIT-licensed and designed for teams that need testable prompt operations. |
193 | | - Use source prompts in development and pre-compiled artifacts in production for speed and reliability. |
194 | | - </p> |
| 310 | + <h2>Open source and production-ready</h2> |
195 | 311 | <p> |
196 | | - Explore docs, examples, and API details in the repository. |
| 312 | + PromptOpsKit is MIT-licensed and built for teams that treat prompt engineering as a |
| 313 | + first-class engineering discipline. Use source prompts in development, compiled |
| 314 | + artifacts in production, and the CLI in CI — all from one <code>npm install</code>. |
197 | 315 | </p> |
198 | 316 | <a class="button button-primary" href="https://github.com/PredictabilityAtScale/promptopskit">View repository</a> |
199 | 317 | </section> |
|
0 commit comments