Prompt Templates

View as Markdown

Prompt Templates let you define a system prompt, base conversation turns, and default inference parameters once — then reference them by name from any chat completion request. Instead of hardcoding the same prompt logic in every client, you manage it centrally and inject runtime values using {{variable}} slots.

Authentication

Template management (create, read, update, delete) accepts either authentication method:

MethodHowTypical use
RSK key (rsk_...)Authorization: Bearer rsk_...Direct API access from your backend
Mesh DashboardHandled automaticallyManaging templates through the dashboard UI

Using a template at inference time always uses your rsk_... key, the same as any other chat completion.

See the Authentication guide for details on key types.


Creating a Template

Send a POST /v1/templates request with a name, an optional system prompt, and any variables you want to parameterize.

$curl https://api.meshapi.ai/v1/templates \
> -H "Authorization: Bearer <YOUR_RSK_KEY>" \
> -H "Content-Type: application/json" \
> -d '{
> "name": "support-agent",
> "description": "Customer support assistant with configurable tone",
> "system": "You are a {{tone}} support agent for {{company}}. Help users resolve their issues politely and accurately.",
> "model": "openai/gpt-4o-mini",
> "params": { "temperature": 0.5, "max_tokens": 512 },
> "variables": ["company", "tone"]
> }'

Response:

1{
2 "id": "tmpl_01jt3abc...",
3 "name": "support-agent",
4 "owner": "org_xyz",
5 "description": "Customer support assistant with configurable tone",
6 "system": "You are a {{tone}} support agent for {{company}}. Help users resolve their issues politely and accurately.",
7 "model": "openai/gpt-4o-mini",
8 "params": { "temperature": 0.5, "max_tokens": 512 },
9 "variables": ["company", "tone"],
10 "created_at": "2025-06-01T10:00:00Z",
11 "updated_at": "2025-06-01T10:00:00Z"
12}

Using Variables

Variables use double-brace syntax: {{ variable_name }}. Whitespace inside the braces is trimmed, so {{company}} and {{ company }} are equivalent. Variable names may contain letters, digits, and underscores.

You can place variables in system and in any message content field:

1{
2 "name": "onboarding-guide",
3 "system": "You are onboarding {{user_name}} to {{product_name}}. Be concise and encouraging.",
4 "messages": [
5 {
6 "role": "assistant",
7 "content": "Welcome, {{user_name}}! Let's get you set up with {{product_name}}."
8 }
9 ]
10}

The variables field (list of strings) is informational — it documents which slots the template expects. It doesn’t enforce anything server-side, but it helps callers know what to pass.

Missing variables at inference time cause a 422 error. Extra variables in the request are silently ignored.


Using a Template in Chat Completions

Pass template (name or UUID) and variables alongside your messages in a POST /v1/chat/completions request. The template’s system prompt and base messages are prepended to your messages before the request is forwarded to the model.

$curl https://api.meshapi.ai/v1/chat/completions \
> -H "Authorization: Bearer <YOUR_RSK_KEY>" \
> -H "Content-Type: application/json" \
> -d '{
> "template": "support-agent",
> "variables": { "company": "Acme Corp", "tone": "friendly" },
> "messages": [{ "role": "user", "content": "How do I reset my password?" }]
> }'

The final messages sent to the model look like this:

1[
2 {
3 "role": "system",
4 "content": "You are a friendly support agent for Acme Corp. Help users resolve their issues politely and accurately."
5 },
6 { "role": "user", "content": "How do I reset my password?" }
7]

You can reference a template by name or UUID. Name lookups are scoped to your key’s owner first, then fall back to global (admin-seeded) templates. UUID lookups work across any owner.


Parameter Priority

When a template and a request body both specify inference settings, Mesh resolves them in this order (highest wins):

PrioritySourceExample
3 — highestRequest body"temperature": 0.9 in the POST body
2Key defaultsDefault params configured on your API key
1 — lowestTemplate defaults"params": { "temperature": 0.5 } in the template

This means you can define sensible defaults in the template and still override them per-request without changing the template.


Managing Templates

List all templates

$curl https://api.meshapi.ai/v1/templates \
> -H "Authorization: Bearer <YOUR_RSK_KEY>"

Returns your owned templates plus any global templates, ordered newest first.

Get a single template

$curl https://api.meshapi.ai/v1/templates/tmpl_01jt3abc... \
> -H "Authorization: Bearer <YOUR_RSK_KEY>"

Update a template

Only the fields you include are changed — everything else stays the same.

$curl -X PATCH https://api.meshapi.ai/v1/templates/tmpl_01jt3abc... \
> -H "Authorization: Bearer <YOUR_RSK_KEY>" \
> -H "Content-Type: application/json" \
> -d '{ "params": { "temperature": 0.3, "max_tokens": 1024 } }'

Delete a template

$curl -X DELETE https://api.meshapi.ai/v1/templates/tmpl_01jt3abc... \
> -H "Authorization: Bearer <YOUR_RSK_KEY>"

Returns 204 No Content on success.


Global vs. Owned Templates

OwnedGlobal
Created byYou (via rsk_...)Mesh admins
Name lookup scopeYour owner onlyAvailable to all users
Can edit / deleteYesNo
UUID lookupShareable by IDShareable by ID

Global templates are useful for standard system roles (e.g., a generic coding assistant or translation prompt) that Mesh pre-seeds for all users. If you create a template with the same name as a global one, your owned template takes precedence in name lookups.

UUID-based lookups are intentionally cross-owner — this lets you share a template with another team by passing them the template ID. Name-based lookups are always scoped to your own account, so there’s no risk of accidentally using someone else’s template by name.