Ship prompts like config, not code.
Store prompts in Requesty, call them by ID with variables, and change them without a deploy.
One line where the prompt used to be
Reference a prompt by ID and pass variables at request time. The gateway resolves the current version and sends it to whichever model you route to.
response = client.chat.completions.create( model="anthropic/claude-fable-5", messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": question}, ], ) # changing the wording means a pull request, # a review and a deploy
response = client.chat.completions.create( model="anthropic/claude-fable-5", messages=[], extra_body={"requesty": { "prompt_id": "support-triage", "prompt_variables": {"tone": "plain", "question": question}, }}, ) # pin a version with "support-triage:3" # or leave it off to always get the current one
What happens on the way through
The gateway fills the template, renders the messages and prepends them to whatever your request already carried.
Change the prompt, not the codebase
Every save is a version. Roll forward or back from the dashboard, with no release in between.
One library, every team
Prompts live in one place, with access from the same roles that govern models and budgets. Nobody maintains a second list, and nothing gets copied across repos.
| Prompt | Owner | Teams with access | Can edit |
|---|---|---|---|
| support-triage | support | support, platform | admins |
| invoice-extract | finance | finance | admins |
| pr-review-notes | platform | all engineering | admins, platform |
The same prompt, on any model
A prompt in the library is not tied to a provider. Point it at a different model and you are comparing the wording you already ship.
Move your prompts out of the repo
Store them once, call them by ID, and change them without a deploy.
