FPO Templates
An FPO template is a wrapper around the canonical Full Product Object (FPO) format. It lets you publish a reusable product definition while leaving specific values for the importer to fill in later.
Use an FPO template when:
- the product structure is stable
- the deployer needs to supply names, URLs, API keys, or environment-specific values
- you want a
/nowpreview before the product is created
Template Shape
An FPO template has three top-level keys:
version: the template document format version. Current value:1.0productObject: a normal Full Product Objecttemplate.variables: metadata for every variable referenced inside the FPO
The nested productObject must also declare its own version ("1.0", "1.1", or "2.0"; "2.0" is the current default). At "2.0" (the default), each inline agent’s runtime fields (model, systemPrompt, tools, …) live under agent.config; at "1.0"/"1.1" they sit directly on the agent object.
Variable references are allowed in string leaves inside the FPO:
The full example used in this guide is available at docs/templates/quick-start/customer-support-fpo-template.json.
Variable Manifest
Each variable must be declared in template.variables with:
Resolution Rules
- Every
{{variableName}}reference must be declared in the manifest - Inline defaults such as
{{apiKey|default}}are not supported - Defaults must be defined with
template.variables[].defaultValue - Secret variables cannot define defaults
- If a field value is exactly
{{variableName}}and the variable type isnumberorboolean, the resolved value keeps that scalar type - Otherwise, substitutions resolve to strings
Example Template
Scheduled jobs in templates
Use the top-level productObject.schedules[] array for executable cron or one-time automation. A schedule points directly at the capability that should run through capabilityId; importing the FPO creates the schedule record.
Do not add a type: "schedule" surface just to make a scheduled capability reachable. Schedule surfaces are optional management or presentation containers; they are not the trigger by themselves, and the validator counts schedules[].capabilityId as a reachable capability.
Use a schedule surface only when the product needs a dedicated surface for users or operators to inspect and manage schedule-related behavior.
Eval suites in templates
Use the optional top-level productObject.evals[] array to ship eval suites with a product. Each suite points at the capability it tests through capabilityId; importing the FPO creates the suite, its graders, and its example cases alongside the capability’s flow or agent.
Re-importing or converging a product replaces only the cases that originally came from the FPO. Cases you author manually or save from a run in the dashboard are preserved, and those platform-authored cases are not exported back into the FPO when you pull the product definition.
See What are Evals? for how graders and cases work, and Managing eval suites for editing imported suites in the dashboard.
Skills in templates
Use the optional top-level productObject.skills[] array to ship agent skills with a product. A skill is a loadable context bundle: a markdown body plus optional capabilities the agent activates when it loads the skill. Importing the FPO publishes each skill and binds it to the agents listed in bindTo.
A skill’s capabilities cannot declare mcpServers. The key is rejected at validation time with an explicit error rather than silently dropped; bind MCP tools through a saved tool id or an inline tool instead.
Validate a Template Before Publishing
Use POST /v1/public/products/validate-template before shipping a template to users.
The validation response reports:
- structural template errors
- undeclared variable references
- unused manifest variables
- normalized variable metadata
- whether defaults are enough to produce a valid resolved FPO without extra input
Creation Workflow
Once a template validates:
- Preview it with
POST /v1/quick-start/imports/preview - Collect missing variable values from the preview response
- Create the product with
POST /v1/quick-start/create
See Importing Products for the full import-session flow.
Secret variables are part of the manifest, but their values should only be provided at create time. Do not put live secrets into template files or default values.