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:

FeldBeschreibung
nameAnzeigename (z. B. "Support Reply")
slugURL-sicherer Bezeichner fuer API-Aufrufe (z. B. support-reply)
skip_rulesWenn 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:

VariableTypStandard
tonestring"friendly"
companystring
issuestring
contextstring

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:

  1. 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 @draft angefordert.
  2. Publish — erstellt einen Snapshot des aktuellen Drafts als unveraenderliche Version (v1, v2, v3...). Veroeffentlichte Versionen koennen nicht bearbeitet werden.
  3. Activate — legt fest, welche veroeffentlichte Version "live" ist. Diese wird vom Produktionstraffic aufgeloest, wenn keine Version angegeben wird.
  4. 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

MethodeRueckgabeNetzwerkBeschreibung
prompt.use(slug, opts?)PromptMessagesKeineMarker-Array fuer serverseitige Aufloesung ueber clientOptions()
prompt.assemble(slug, opts?)Promise<AssembledPrompt>1 AufrufAbrufen + clientseitig aufloesen. Gibt { messages, metadata } zurueck
prompt.get(slug, opts?)Promise<PromptTemplate>1 AufrufRoh-Template mit {{handlebars}} abrufen
prompt.resolve(messages, vars)PromptMessage[]KeineReine Funktion — Template-Nachrichten lokal aufloesen
prompt.list()Promise<PromptListItem[]>1 AufrufAlle 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",
      }),
    },
  },
);
HeaderBeschreibung
X-Grepture-PromptPrompt-Slug. Haengen Sie @draft oder @v3 an, um eine bestimmte Version festzulegen.
X-Grepture-VarsJSON-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