Skip to main content

Schema Guide

Human-readable guide to PromptPack entities and their properties. For the auto-generated technical reference, see Schema Reference.

Root Properties

The root object of every PromptPack file. Required fields are id, name, version, template_engine, and prompts.

FieldTypeRequiredDescription
$schemastringNoJSON Schema reference for validation and IDE support. Default: https://promptpack.org/schema/v1/promptpack.schema.json
idstringYesUnique identifier for the pack. Lowercase with hyphens only. Pattern: ^[a-z][a-z0-9-]*$ (1--100 chars).
namestringYesHuman-readable display name for the pack (1--200 chars).
versionstringYesPack version following Semantic Versioning 2.0.0. Optional v prefix. Examples: "1.0.0", "v2.1.3".
descriptionstringNoDetailed description of the pack's purpose. Supports markdown (max 5000 chars).
template_engineTemplateEngineYesTemplate engine configuration shared across all prompts.
promptsobject<string, Prompt>YesMap of task type keys to prompt definitions. Must contain at least one entry.
fragmentsobject<string, string>NoShared template fragments. Keys are fragment names, values are fragment content strings.
toolsobject<string, Tool>NoTool definitions that prompts can reference. Keys are tool names, values are tool specs.
metadataMetadataNoOptional pack-level metadata for categorization and discovery.
compilationCompilationNoInformation about when and how the pack was compiled. Generated by packc.
evalsEval[]NoPack-level eval definitions. Cross-cutting quality checks that apply to all prompts. (v1.2+)
Collections are keyed maps, not arrays

prompts, fragments, and tools are all objects (keyed maps), not arrays. Each key serves as the identifier for the entry. For example, prompts maps task type strings like "support" or "billing" to their Prompt definitions.

Minimal Example

{
"$schema": "https://promptpack.org/schema/v1/promptpack.schema.json",
"id": "my-pack",
"name": "My Pack",
"version": "1.0.0",
"template_engine": {
"version": "v1",
"syntax": "{{variable}}"
},
"prompts": {
"greeting": {
"id": "greeting",
"name": "Greeter",
"version": "1.0.0",
"system_template": "You are a friendly assistant for {{company}}."
}
}
}

Template Engine

Configuration for how variables are substituted and fragments are resolved across all prompts.

FieldTypeRequiredDescription
versionstringYesTemplate engine version (e.g., "v1").
syntaxstringYesVariable substitution syntax pattern (e.g., "{{variable}}").
featuresstring[]NoSupported template features. Allowed values: "basic_substitution", "fragments", "conditionals", "loops", "filters".
"template_engine": {
"version": "v1",
"syntax": "{{variable}}",
"features": ["basic_substitution", "fragments"]
}

Prompt

A single prompt configuration within a pack. Each prompt represents a specific task type (e.g., "support", "sales") with its own template, variables, tools, and validation rules. Prompts can evolve independently with their own version numbers.

FieldTypeRequiredDescription
idstringYesUnique identifier, typically matching the map key. Pattern: ^[a-z][a-z0-9_-]*$.
namestringYesHuman-readable name.
versionstringYesPrompt version following Semantic Versioning, independent from the pack version.
system_templatestringYesThe system prompt template. Use template syntax (e.g., {{variable}}) for variable substitution.
descriptionstringNoDetailed description of the prompt's purpose and behavior.
variablesVariable[]NoVariable definitions for template placeholders.
toolsstring[]NoList of tool names this prompt can use. Tools must be defined in the pack-level tools map.
tool_policyToolPolicyNoPolicy governing how tools can be used.
pipelinePipelineConfigNoPipeline configuration defining processing stages and middleware.
parametersParametersNoLLM generation parameters (temperature, max_tokens, etc.).
validatorsValidator[]NoValidation rules (guardrails) applied to LLM responses.
tested_modelsTestedModel[]NoModel testing results documenting performance across different models.
model_overridesobject<string, ModelOverride>NoModel-specific template modifications. Keys are model names (e.g., "claude-3-opus", "gpt-4").
evalsEval[]NoPrompt-level eval definitions. Override pack-level evals by id. (v1.2+)
mediaMediaConfigNoMultimodal content configuration. Defines supported media types and constraints. (v1.1+)
"prompts": {
"support": {
"id": "support",
"name": "Support Bot",
"version": "1.0.0",
"system_template": "You are a {{role}} assistant for {{company}}.\n\nHelp resolve their issue.",
"variables": [
{ "name": "role", "type": "string", "required": true, "example": "support agent" },
{ "name": "company", "type": "string", "required": true, "default": "TechCo" }
],
"tools": ["lookup_order", "create_ticket"],
"parameters": { "temperature": 0.7, "max_tokens": 1500 }
}
}

Variable

A template variable definition with type information and validation rules.

FieldTypeRequiredDescription
namestringYesVariable name used in templates (e.g., {{name}}). Pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$.
typestringYesData type. One of: "string", "number", "boolean", "object", "array".
requiredbooleanYesWhether this variable must be provided at runtime.
defaultanyNoDefault value when the variable is not provided.
descriptionstringNoHuman-readable description of the variable's purpose.
exampleanyNoExample value showing expected format and content.
validationValidationNoValidation rules applied to the variable value at runtime.

Validation

Rules applied to variable values at runtime.

FieldTypeDescription
patternstringRegular expression pattern (for string types).
min_lengthintegerMinimum string length. Minimum value: 0.
max_lengthintegerMaximum string length. Minimum value: 1.
minimumnumberMinimum numeric value (for number types).
maximumnumberMaximum numeric value (for number types).
enumany[]List of allowed values.
{
"name": "priority",
"type": "string",
"required": true,
"description": "Support ticket priority level",
"validation": {
"enum": ["low", "medium", "high", "urgent"]
}
}

Tool

A tool definition following the function calling convention. Tools enable the LLM to call external functions. Tools are defined at the pack level and referenced by name in each prompt's tools array.

FieldTypeRequiredDescription
namestringYesTool name. Pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$.
descriptionstringYesWhat the tool does. The LLM uses this to decide when to call it.
parametersobjectNoJSON Schema object defining the tool's input parameters (see below).

Tool Parameters (JSON Schema Format)

Tool parameters use standard JSON Schema format. The parameters object must have type: "object" with a properties map and an optional required array.

FieldTypeRequiredDescription
typestringYesMust be "object".
propertiesobjectYesMap of parameter names to their JSON Schema definitions.
requiredstring[]NoList of required parameter names.
"tools": {
"create_ticket": {
"name": "create_ticket",
"description": "Create a support ticket with title, description, and priority",
"parameters": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Ticket title"
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high", "urgent"]
}
},
"required": ["title"]
}
}
}

Tool Policy

Governance policy for tool usage. Controls when and how tools can be called by the LLM.

FieldTypeRequiredDescription
tool_choicestringNo"auto" (LLM decides), "required" (must use tools), or "none" (tools disabled). Default: "auto".
max_roundsintegerNoMaximum number of LLM-tool-LLM cycles per turn. Minimum: 1. Default: 5.
max_tool_calls_per_turnintegerNoMaximum tool calls allowed in a single turn. Minimum: 1. Default: 10.
blockliststring[]NoTool names that are not allowed for this prompt (overrides the tools list).

Parameters

LLM generation parameters controlling the model's behavior and output characteristics.

FieldTypeRequiredDescription
temperaturenumberNoSampling temperature (0--2). Higher values increase randomness.
max_tokensintegerNoMaximum number of tokens to generate. Minimum: 1.
top_pnumberNoNucleus sampling parameter (0--1). Alternative to temperature.
top_kinteger or nullNoTop-k sampling. null means no limit. Minimum: 1.
frequency_penaltynumberNoPenalty for token frequency (-2 to 2). Positive values reduce repetition.
presence_penaltynumberNoPenalty for token presence (-2 to 2). Positive values encourage new topics.
"parameters": {
"temperature": 0.7,
"max_tokens": 1500,
"top_p": 0.9
}

Validator

A validation rule (guardrail) applied to LLM responses.

FieldTypeRequiredDescription
typestringYesValidation type. One of: "banned_words", "max_length", "min_length", "regex_match", "json_schema", "sentiment", "toxicity", "pii_detection", "custom".
enabledbooleanYesWhether this validator is active.
fail_on_violationbooleanNoIf true, violations cause an error. Default: false.
paramsobjectNoValidator-specific parameters (e.g., word lists, character limits).
"validators": [
{
"type": "banned_words",
"enabled": true,
"fail_on_violation": true,
"params": {
"words": ["impossible", "can't help"]
}
},
{
"type": "pii_detection",
"enabled": true,
"fail_on_violation": true
}
]

Tested Model

Documents which models have been tested with a prompt and their performance metrics.

FieldTypeRequiredDescription
providerstringYesLLM provider name (e.g., "openai", "anthropic").
modelstringYesSpecific model identifier (e.g., "gpt-4", "claude-3-opus").
datestringYesDate tested in YYYY-MM-DD format.
success_ratenumberNoSuccess rate from test runs (0--1).
avg_tokensnumberNoAverage tokens used per response.
avg_costnumberNoAverage cost per execution in USD.
avg_latency_msnumberNoAverage response latency in milliseconds.
notesstringNoAdditional observations about model performance.

Model Override

Model-specific template modifications. Allows customizing prompts for specific models without changing the base template.

FieldTypeRequiredDescription
system_template_prefixstringNoText prepended to the system template for this model.
system_template_suffixstringNoText appended to the system template for this model.
system_templatestringNoComplete replacement system template (overrides the base template entirely).
parametersParametersNoModel-specific parameter overrides.
"model_overrides": {
"claude-3-opus": {
"system_template_prefix": "<thinking>\n",
"parameters": { "temperature": 0.5 }
}
}

Pipeline Config

Pipeline configuration defining processing stages and middleware.

FieldTypeRequiredDescription
stagesstring[]YesOrdered list of pipeline stages (e.g., ["template", "provider", "validator"]).
middlewareMiddlewareConfig[]NoMiddleware components applied in order.

Middleware Config

FieldTypeRequiredDescription
typestringYesMiddleware type identifier (e.g., "template", "provider", "validator").
configobjectNoType-specific configuration.

Metadata

Optional pack-level metadata for categorization and discovery.

FieldTypeRequiredDescription
domainstringNoDomain or category (e.g., "customer-service", "healthcare").
languagestringNoPrimary language code (ISO 639-1, e.g., "en"). Pattern: ^[a-z]{2}$.
tagsstring[]NoTags for categorization and discovery.
cost_estimateobjectNoCost estimation with min_cost_usd, max_cost_usd, and avg_cost_usd.

Compilation

Compiler-generated information about when and how the pack was built.

FieldTypeRequiredDescription
compiled_withstringYesVersion of the packc compiler (e.g., "packc-v0.1.0").
created_atstringYesISO 8601 timestamp when the pack was compiled.
schemastringYesPack format schema version (e.g., "v1").
sourcestringNoSource configuration file path.

Evals (v1.2+)

Evals are automated quality checks on LLM outputs. Unlike validators (which run inline and can block responses), evals run asynchronously and produce scores or metrics. Evals can be defined at both pack level (cross-cutting) and prompt level (prompt-specific). Prompt-level evals with the same id override pack-level evals.

Eval

FieldTypeRequiredDescription
idstringYesUnique identifier for this eval within its scope.
typestringYesAssertion type determining how the eval runs. Not an enum — runtimes register their own types (e.g., "contains", "regex", "json_valid", "llm_judge").
triggerstringYesWhen this eval fires. One of: "every_turn", "on_session_complete", "sample_turns", "sample_sessions".
descriptionstringNoHuman-readable description of what this eval measures.
enabledbooleanNoWhether this eval is active. Default: true.
sample_percentagenumberNoPercentage of turns/sessions to sample (0–100). Only used with sample_turns and sample_sessions triggers. Default: 5.
paramsobjectNoType-specific configuration. Structure depends on the eval type.
metricMetricDefNoPrometheus-style metric declaration for exposing eval results.

Metric Def

FieldTypeRequiredDescription
namestringYesMetric name following Prometheus conventions (snake_case). Pattern: ^[a-zA-Z_:][a-zA-Z0-9_:]*$.
typestringYesMetric type. One of: "gauge", "counter", "histogram", "boolean".
rangeobjectNoOptional value bounds with min and/or max fields.

The metric object uses additionalProperties: true, so runtimes can attach extra fields (e.g., labels, help, buckets).

"evals": [
{
"id": "json_format",
"type": "json_valid",
"trigger": "every_turn",
"description": "Verify the assistant always returns valid JSON",
"metric": {
"name": "promptpack_json_valid",
"type": "boolean"
}
},
{
"id": "tone-check",
"type": "llm_judge",
"trigger": "sample_turns",
"sample_percentage": 10,
"params": {
"judge_prompt": "Rate the response tone on a 1-5 scale for professionalism.",
"model": "gpt-4o",
"passing_score": 4
},
"metric": {
"name": "promptpack_tone_score",
"type": "gauge",
"range": { "min": 1, "max": 5 }
}
}
]
Validators vs Evals

Both sit on the quality spectrum: validators run inline on every response and can block output (fail_on_violation), while evals run asynchronously and produce scores/metrics without blocking. Use validators for hard guardrails, evals for quality measurement and monitoring.


Fragments

Fragments are shared, reusable template text blocks defined at the pack level. They are simple string values keyed by name.

"fragments": {
"customer_context": "Customer: {{customer_name}}\nAccount Type: {{account_type}}",
"greeting": "Hello! How can I help you today?",
"escalation_notice": "I'm going to connect you with a specialist."
}

Prompts reference fragments in their system_template using template syntax: {{fragments.customer_context}}.


Multimodal Support (v1.1+)

PromptPack v1.1 adds multimodal content support through media configuration on individual prompts.

Media Config

FieldTypeRequiredDescription
enabledbooleanYesWhether multimodal content is enabled for this prompt.
supported_typesstring[]NoSupported media types (e.g., "image", "audio", "video", "document"). Custom types allowed.
imageImageConfigNoImage-specific constraints.
audioAudioConfigNoAudio-specific constraints.
videoVideoConfigNoVideo-specific constraints.
documentDocumentConfigNoDocument-specific constraints.
examplesMultimodalExample[]NoExample multimodal messages.

Image Config

FieldTypeDescription
max_size_mbintegerMaximum file size in MB.
allowed_formatsstring[]Allowed formats: "jpeg", "jpg", "png", "webp", "gif", "bmp".
default_detailstringDetail level: "low", "high", or "auto" (default: "auto").
require_captionbooleanWhether captions are required (default: false).
max_images_per_msgintegerMaximum images per message.

Audio Config

FieldTypeDescription
max_size_mbintegerMaximum file size in MB.
allowed_formatsstring[]Allowed formats: "mp3", "wav", "opus", "flac", "m4a", "aac".
max_duration_secintegerMaximum duration in seconds.
require_metadatabooleanWhether metadata is required (default: false).

Video Config

FieldTypeDescription
max_size_mbintegerMaximum file size in MB.
allowed_formatsstring[]Allowed formats: "mp4", "webm", "mov", "avi", "mkv".
max_duration_secintegerMaximum duration in seconds.
require_metadatabooleanWhether metadata is required (default: false).

Document Config

FieldTypeDescription
max_size_mbintegerMaximum file size in MB.
allowed_formatsstring[]Allowed formats (e.g., "pdf", "docx", "csv").
max_pagesintegerMaximum pages/sheets.
require_metadatabooleanWhether metadata is required (default: false).
extraction_modestringContent extraction: "text", "structured", or "raw" (default: "text").

Generic Media Type Config

For custom media types not covered by the specific configs above.

FieldTypeDescription
max_size_mbintegerMaximum file size in MB.
allowed_formatsstring[]Allowed file formats/extensions.
require_metadatabooleanWhether metadata is required (default: false).
validation_paramsobjectCustom validation parameters specific to this media type.

Multimodal Example

FieldTypeRequiredDescription
namestringYesName identifying this example.
descriptionstringNoWhat this example demonstrates.
rolestringYesMessage role: "user", "assistant", or "system".
partsContentPart[]YesMessage content parts (text and/or media).

Content Part

FieldTypeRequiredDescription
typestringYesPart type (e.g., "text", "image", "audio").
textstringNoText content (when type is "text").
mediaMediaReferenceNoMedia reference (when type is a media type).

Media Reference

FieldTypeRequiredDescription
mime_typestringYesMIME type (e.g., "image/jpeg", "audio/mp3").
file_pathstringNoPath to media file.
urlstringNoURL to media file.
base64stringNoBase64-encoded media data.
detailstringNoDetail level for images: "low", "high", or "auto".
captionstringNoCaption or description for the media.
"media": {
"enabled": true,
"supported_types": ["image"],
"image": {
"max_size_mb": 20,
"allowed_formats": ["jpeg", "png", "webp"],
"default_detail": "high",
"max_images_per_msg": 5
}
}

Data Types

Supported Variable Types

  • string -- Text data
  • number -- Numeric values (integers and floats)
  • boolean -- True/false values
  • array -- Ordered lists of values
  • object -- Key-value maps

Template Variables

Variables in templates use the syntax defined in template_engine.syntax. With the default {{variable}} syntax:

{{variable_name}}

Fragments are referenced similarly:

{{fragments.fragment_name}}