LLM-Prompts serverseitig versionieren und verwalten
Schluss mit fest eingebauten Prompts. Speichern, versionieren und deployen Sie Prompt-Templates ueber ein Dashboard — Aufloesung zur Laufzeit ohne Redeploys. Handlebars-Templating, Draft/Publish-Workflow.
Das Problem: Prompts versteckt im Code
Ihre System-Prompts stecken in String-Literalen, verstreut ueber Ihre gesamte Codebase. Eine einzige Wortaenderung in einem Prompt bedeutet: PR oeffnen, auf CI warten, deployen. Es gibt keine Versionshistorie, kein Rollback und keine Moeglichkeit fuer Produktmanager oder Prompt-Engineers, ohne Entwicklerbeteiligung zu iterieren.
// Hardcoded in your codebase — changing this requires a deploy
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
role: "system",
content: `You are a friendly support agent for Acme Corp.
Respond in a helpful, concise tone. If the customer is upset,
acknowledge their frustration before solving the problem.`,
},
{
role: "user",
content: ticket.text,
},
],
});
Sie moechten den Ton anpassen? Eine neue Anweisung per A/B-Test pruefen? Nach einer fehlerhaften Aenderung zurueckrollen? Fuer all das sind Code-Deploys noetig.
Die Loesung: Prompt-Management mit Grepture
Grepture ist ein AI-Gateway, mit dem Sie Prompt-Templates in einem Dashboard speichern, sie mit einem Draft/Publish-Workflow versionieren und zur Laufzeit aufloesen koennen — entweder serverseitig ueber den Proxy oder clientseitig ueber das SDK.
Ihre Prompts werden zu einer verwalteten Ressource mit Handlebars-Variablen, unveraenderlichen Versionen und sofortigem Rollback. Ihr Code referenziert lediglich einen Slug.
Einrichtung in 3 Minuten
1. SDK installieren
npm install @grepture/sdk
2. API Key erhalten
Registrieren Sie sich unter grepture.com/en/pricing — der kostenlose Plan umfasst 1.000 Anfragen/Monat. Kopieren Sie Ihren API Key aus dem Dashboard.
3. Prompt im Dashboard erstellen
Gehen Sie zu Prompts und klicken Sie auf New Prompt. Vergeben Sie einen Namen, einen Slug (z. B. support-reply) und beginnen Sie, Nachrichten im Editor zu definieren.
4. Im Code verwenden
import OpenAI from "openai";
import { Grepture } from "@grepture/sdk";
const grepture = new Grepture({
apiKey: process.env.GREPTURE_API_KEY!,
proxyUrl: "https://proxy.grepture.com",
});
const openai = new OpenAI({
...grepture.clientOptions({
apiKey: process.env.OPENAI_API_KEY!,
baseURL: "https://api.openai.com/v1",
}),
});
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: grepture.prompt.use("support-reply", {
variables: { issue: ticket.text, tone: "friendly", company: "Acme" },
}),
});
Der Prompt wird serverseitig durch den Proxy aufgeloest. Keine zusaetzlichen Roundtrips, keine Prompts in Ihrer Codebase.
Prompts im Dashboard erstellen
Jeder Prompt hat bei der Erstellung drei Felder:
| Feld | Beschreibung |
|---|---|
name | Anzeigename (z. B. "Support Reply") |
slug | URL-sicherer Bezeichner fuer API-Aufrufe (z. B. support-reply) |
skip_rules | Wenn aktiviert, umgeht der Prompt die Guardrail-Rule-Pipeline |
Nach der Erstellung gelangen Sie in den Editor. Definieren Sie ein Messages-Array mit den Rollen System, User und Assistant. Verwenden Sie das Variables-Panel, um jede Template-Variable mit Name, Typ (string, number, boolean) und optionalem Standardwert zu dokumentieren.
Hier ein realistisches Beispiel — ein Support-Antwort-Prompt mit drei Variablen:
System-Nachricht:
You are a {{tone}} support agent for {{company}}.
{{#if context}}
Here is the relevant context:
{{context}}
{{/if}}
Please respond to the following issue:
{{issue}}
Variables-Panel:
| Variable | Typ | Standard |
|---|---|---|
tone | string | "friendly" |
company | string | — |
issue | string | — |
context | string | — |
Handlebars-Templating
Prompt-Templates verwenden Handlebars-Syntax fuer dynamische Inhalte.
Variablen-Interpolation
Hello {{name}}, your order {{order_id}} is ready.
Fehlende Variablen werden zu einem leeren String aufgeloest.
Bedingungen
{{#if premium}}
You are a premium customer and qualify for priority support.
{{else}}
Standard support response.
{{/if}}
Werte sind falsy, wenn sie leer, "false" oder "0" sind.
Schleifen
{{#each items}}
- {{this}}
{{/each}}
Uebergeben Sie Arrays als JSON-Strings im Variables-Objekt: { items: '["item1", "item2"]' }.
Draft/Publish-Workflow
Prompts durchlaufen einen vierstufigen Lebenszyklus:
- Draft — bearbeiten Sie frei, speichern Sie so oft Sie moechten. Der Draft wird niemals an den Produktionstraffic ausgeliefert, es sei denn, er wird explizit mit
@draftangefordert. - Publish — erstellt einen Snapshot des aktuellen Drafts als unveraenderliche Version (v1, v2, v3...). Veroeffentlichte Versionen koennen nicht bearbeitet werden.
- Activate — legt fest, welche veroeffentlichte Version "live" ist. Diese wird vom Produktionstraffic aufgeloest, wenn keine Version angegeben wird.
- Rollback — aktivieren Sie eine aeltere Version, um sofort zurueckzurollen. Kein Deploy, keine Ausfallzeit.
Das bedeutet: Sie koennen einen Draft bearbeiten, ihn im Playground testen, veroeffentlichen und aktivieren — alles ohne Ihre Codebase anzufassen. Wenn etwas schiefgeht, aktivieren Sie die vorherige Version und sind in Sekunden zurueck im Normalbetrieb.
Prompts ueber das SDK verwenden
Das SDK stellt einen grepture.prompt-Namespace mit Methoden fuer jede Steuerungsebene bereit.
prompt.use() — serverseitige Aufloesung
Der einfachste Ansatz. Uebergeben Sie grepture.prompt.use() als messages-Feld. Der Proxy loest das Template serverseitig auf — null zusaetzliche Roundtrips:
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: grepture.prompt.use("support-reply", {
variables: { issue: ticket.text, tone: "friendly", company: "Acme" },
// version: "draft", // pin to draft
// version: 3, // pin to v3
// omit for active (live) version
}),
});
prompt.assemble() — clientseitige Aufloesung
Ruft das Template ab und loest es lokal auf. Nuetzlich, wenn Sie Nachrichten vor dem Senden inspizieren oder aendern moechten:
const { messages } = await grepture.prompt.assemble("support-reply", {
variables: { issue: ticket.text, tone: "friendly", company: "Acme" },
});
// Append extra context before sending
messages.push({ role: "user", content: additionalContext });
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages,
});
prompt.get() + prompt.resolve() — einmal abrufen, mehrfach aufloesen
Rufen Sie das Roh-Template einmal ab und loesen Sie es mehrfach mit verschiedenen Variablen auf. Nuetzlich fuer Batch-Operationen:
const template = await grepture.prompt.get("support-reply");
const resolved1 = grepture.prompt.resolve(template.messages, {
issue: tickets[0].text, tone: "friendly", company: "Acme",
});
const resolved2 = grepture.prompt.resolve(template.messages, {
issue: tickets[1].text, tone: "empathetic", company: "Acme",
});
prompt.list() — verfuegbare Prompts entdecken
const prompts = await grepture.prompt.list();
for (const p of prompts) {
console.log(`${p.slug} (v${p.active_version})`);
}
SDK-Methodenreferenz
| Methode | Rueckgabe | Netzwerk | Beschreibung |
|---|---|---|---|
prompt.use(slug, opts?) | PromptMessages | Keine | Marker-Array fuer serverseitige Aufloesung ueber clientOptions() |
prompt.assemble(slug, opts?) | Promise<AssembledPrompt> | 1 Aufruf | Abrufen + clientseitig aufloesen. Gibt { messages, metadata } zurueck |
prompt.get(slug, opts?) | Promise<PromptTemplate> | 1 Aufruf | Roh-Template mit {{handlebars}} abrufen |
prompt.resolve(messages, vars) | PromptMessage[] | Keine | Reine Funktion — Template-Nachrichten lokal aufloesen |
prompt.list() | Promise<PromptListItem[]> | 1 Aufruf | Alle Prompts des Teams auflisten |
Alle Methoden akzeptieren eine optionale version-Option (number | "draft"). Ohne Angabe wird die aktive (live) Version verwendet.
Prompts ueber Headers verwenden
Wenn Sie die Prompt-Methoden des SDK nicht verwenden moechten, koennen Sie Prompts mit zwei Headern bei jeder OpenAI-kompatiblen Anfrage aufloesen:
const response = await openai.chat.completions.create(
{ model: "gpt-4o", messages: [] },
{
headers: {
"X-Grepture-Prompt": "support-reply",
"X-Grepture-Vars": JSON.stringify({
issue: ticket.text,
tone: "friendly",
company: "Acme",
}),
},
},
);
| Header | Beschreibung |
|---|---|
X-Grepture-Prompt | Prompt-Slug. Haengen Sie @draft oder @v3 an, um eine bestimmte Version festzulegen. |
X-Grepture-Vars | JSON-Objekt mit Template-Variablen. |
Der Proxy loest das Template auf und ersetzt das messages-Array der Anfrage, bevor er sie weiterleitet. Das messages-Array im Request Body wird ignoriert.
Testen im Playground
Das Test Panel im Prompt-Editor ermoeglicht es Ihnen, Variablenwerte einzugeben und die aufgeloeste Ausgabe zu sehen — ohne einen API-Aufruf zu machen. Verwenden Sie es, um Ihre Templates vor der Veroeffentlichung zu pruefen: Stellen Sie sicher, dass Bedingungen korrekt gerendert werden, Schleifen sich wie erwartet entfalten und der finale Prompt so liest, wie Sie es beabsichtigen.
Integration in die Rule-Pipeline
Standardmaessig durchlaufen aufgeloeste Prompts Ihre Guardrail-Rules wie jede andere Anfrage. Das bedeutet, dass PII-Schwaerzung, Injection-Erkennung und andere Rules auf die finalen aufgeloesten Nachrichten angewendet werden.
Wenn Sie den Inhalt eines Prompts kontrollieren und nicht moechten, dass Rules eingreifen, aktivieren Sie Skip Rules fuer diesen Prompt. Verwenden Sie dies fuer reine System-Prompts, bei denen jede Variable serverseitig kontrolliert wird:
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: grepture.prompt.use("internal-classifier", {
variables: { text: document.body },
// skip_rules is configured on the prompt in the dashboard, not in code
}),
});
Naechste Schritte
- Preise ansehen — kostenlos fuer bis zu 1.000 Anfragen/Monat
- SDK-Dokumentation lesen — vollstaendige Referenz fuer
clientOptions()und Prompt-Methoden - Prompt-Management-Dokumentation — Template-Syntax, Versionierung und API-Referenz
- Prompts vom Code trennen — das architektonische Argument fuer externalisierte Prompts