Skip to Content
MarshalPrompt management

Prompt management

Centralized system prompts, templates, and format contracts—versioned, reviewed, and rolled out without redeploying every agent.

Marketing: exemplar.dev/marshal/prompt-management .

When to use it

Keep role instructions and output contracts consistent across frameworks and channels instead of scattering prompt text in IDE configs and repos.

Where in Console

Create or update templates in Marshal prompt surfaces; validate format before promotion; gate risky changes with evals.

Use from SDK and CLI

from exemplar_harness import Harness prompts = Harness.from_env().prompts() prompts.create( name="support-summary", title="Support summary", messages=[ {"role": "system", "content": "Be concise."}, {"role": "user", "content": "Summarize topic: {{topic}}."}, ], variables=["topic"], ) built = prompts.build("support-summary", variables={"topic": "returns"}) result = prompts.run("support-summary", variables={"topic": "returns"})
exemplar prompts create support-summary \ --title "Support summary" \ --system "You are a concise support agent." \ --user "Summarize topic: {{topic}}." \ --variables topic exemplar prompts build support-summary --var topic=returns exemplar prompts run support-summary --var topic=returns
APIUse when
build / build()Local {{var}} substitution — hand messages to your agent / SDK
run / run()Execute the stored prompt via Exemplar (gateway-backed model)
run_inlineOne-off messages without a stored prompt

Full patterns: SDK client usage · CLI.

Framework / SDK examples

Prefer build for frameworks: substitute variables once, then pass system/user text into the agent. Use run when Exemplar should call the model for you.

Agno — build, then run agent

pip install "exemplar-harness-sdk[agno]"
from agno.agent import Agent from agno.models.openai import OpenAIChat from exemplar_harness import Harness harness = Harness.from_env() built = harness.prompts().build("support-summary", variables={"topic": "returns"}) system = next((m["content"] for m in built.messages if m["role"] == "system"), "") user = next((m["content"] for m in built.messages if m["role"] == "user"), "") agent = Agent( name="support-bot", model=OpenAIChat(id="gpt-4o-mini"), instructions=[system] if system else None, ) agent.run(user)

LangChain — built messages

pip install "exemplar-harness-sdk[langchain]"
from langchain_core.messages import HumanMessage, SystemMessage from langchain_openai import ChatOpenAI from exemplar_harness import Harness harness = Harness.from_env() built = harness.prompts().build("support-summary", variables={"topic": "returns"}) messages = [] for m in built.messages: if m["role"] == "system": messages.append(SystemMessage(content=m["content"])) elif m["role"] == "user": messages.append(HumanMessage(content=m["content"])) ChatOpenAI(model="gpt-4o-mini").invoke(messages)

OpenAI SDK — build or run

pip install "exemplar-harness-sdk[openai]"
from openai import OpenAI from exemplar_harness import Harness harness = Harness.from_env() prompts = harness.prompts() # A) Your model, Exemplar template built = prompts.build("support-summary", variables={"topic": "returns"}) OpenAI().chat.completions.create(model="gpt-4o-mini", messages=built.messages) # B) Exemplar runs the stored prompt (gateway) result = prompts.run("support-summary", variables={"topic": "returns"}) print(result["content"])

TypeScript — build into OpenAI / Agents

import OpenAI from "openai"; import { Harness } from "@exemplar-dev/exemplar-harness-typescript-sdk"; const harness = Harness.fromEnv({ agentId: "support-bot" }); const built = await harness.prompts().build("support-summary", { variables: { topic: "returns" }, }); const client = new OpenAI(); await client.chat.completions.create({ model: "gpt-4o-mini", messages: built.messages as OpenAI.Chat.ChatCompletionMessageParam[], });
import { Agent, run } from "@openai/agents"; import { Harness } from "@exemplar-dev/exemplar-harness-typescript-sdk"; const harness = Harness.fromEnv({ agentId: "support-bot" }); const built = await harness.prompts().build("support-summary", { variables: { topic: "returns" }, }); const system = built.messages.find((m) => m.role === "system")?.content ?? ""; const user = built.messages.find((m) => m.role === "user")?.content ?? ""; const agent = new Agent({ name: "support-bot", instructions: String(system), }); await run(agent, String(user));

Publish a version, then build

prompts = Harness.from_env().prompts() prompts.publish_version( "support-summary", messages=[ {"role": "system", "content": "Be concise."}, {"role": "user", "content": "Bullet summary for: {{topic}}."}, ], change_notes="Use bullets", ) built = prompts.build("support-summary", variables={"topic": "returns"})

Gate promotions with Evals (Insights + Session Evals on ingested agent runs).

Runnable sample: platform/prompts.py · catalog Live SDK examples.

Last updated on