Built-in templates¶
A template creates a ready-made multi-Orchestrator setup in one call:
a top-level Orchestrator plus two sub-Orchestrators, already linked
agent_tool-style and with their built-in tools already turned on. This
page covers listing the catalog and instantiating one. The result is a
normal Orchestrator object, see Orchestrators for
every field it exposes and how to edit it afterward.
Gated behind a deployment setting, admin session token required
See the two notes at the top of Orchestrators: every endpoint here only exists when your deployment has Orchestrators turned on, and every endpoint here authenticates with an admin session token.
The catalog¶
Requires: Viewer and above.
Returns every built-in template this AiFlow version ships.
| Field | Type | Notes |
|---|---|---|
key |
string | The template's identifier, used as the {key} path segment when instantiating it. |
name |
string | A human-readable display name. |
description |
string | A short summary of what the resulting Orchestrator does. |
sub_templates |
array | The sub-Orchestrators this template creates, see below. |
sub_templates[].key |
string | The sub-Orchestrator's identifier within this template. |
sub_templates[].name |
string | A human-readable display name for the sub-Orchestrator. |
sub_templates[].description |
string | A short summary of the sub-Orchestrator's role. |
sub_templates[].tool_names |
array of strings | The built-in tools this sub-Orchestrator has turned on, matching the name values from Orchestrator tools. |
The three built-in templates¶
Each is adapted from a real Google ADK sample agent, narrowed to what needs nothing beyond Gemini or Vertex AI and never pauses mid-run waiting on a human decision.
key |
What it does | Sub-Orchestrators |
|---|---|---|
content_claim_auditor |
Fact-checks a piece of text against current web sources and returns a corrected version with a changelog. | critic (verifies each claim with google_search), reviser (rewrites the text using the critic's findings) |
research_report_assistant |
Researches a topic and returns a structured, sourced report. | researcher (gathers current information with google_search), synthesizer (turns raw findings into a report) |
marketing_campaign_assistant |
Proposes a brand name and writes launch copy for a product or business. | brand_namer (proposes and checks candidate names with google_search), copywriter (writes the tagline, website copy, and social posts) |
Instantiating a template¶
Requires: Admin and above, the same tier creating an Orchestrator by hand requires.
| Field | Type | Required | Notes |
|---|---|---|---|
slug |
string | Yes | 1 to 60 characters, same pattern as a plain Orchestrator's slug. Capped shorter to leave room for the longest sub-Orchestrator suffix a template derives from it. |
name |
string | Yes | 1 to 120 characters. Used as-is for the top-level Orchestrator; each sub-Orchestrator's own name becomes "{name}: {sub-Orchestrator name}". |
{key} must be one of the key values from the catalog
above; anything else gets a 404 with
{"detail": "Unknown template '<key>'"}. Each sub-Orchestrator's slug is
derived automatically, {slug}-{sub_template_key}, hyphenated (for
example, instantiating content_claim_auditor with slug: "my-auditor"
creates my-auditor, my-auditor-critic, and my-auditor-reviser). If
slug, or any slug it would derive, is already in use, nothing is
created and the request returns a 409:
import httpx
response = httpx.post(
"https://api.your-domain.com/api/v1/orchestrator-templates/content_claim_auditor/instantiate",
headers={"Authorization": f"Bearer {admin_token}"},
json={"slug": "site-copy-auditor", "name": "Site Copy Auditor"},
)
response.raise_for_status()
orchestrator = response.json()
const response = await fetch(
"https://api.your-domain.com/api/v1/orchestrator-templates/content_claim_auditor/instantiate",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${adminToken}`,
},
body: JSON.stringify({ slug: "site-copy-auditor", name: "Site Copy Auditor" }),
},
);
const orchestrator = await response.json();
Returns 201 Created with the top-level Orchestrator object, the same
shape Creating an Orchestrator
returns. Its two sub-Orchestrators are created alongside it, already
linked underneath it and, where the template calls for it, already
tooled: fetch them from
Listing Orchestrators or
Sub-Orchestrator links if you need their own
ids.
Nothing about a template-created row is special¶
A template only runs once, at instantiation time. Afterward, the resulting Orchestrator and its sub-Orchestrators are ordinary rows: edit an instruction, change a model, add or remove a sub-Orchestrator link, enable another tool, or disable one entirely through the same endpoints Orchestrators, Orchestrator links, and Orchestrator tools already document. There's no stored link back to the template that created them, and no re-sync or update-from-template mechanism: a template is a starting point, not an ongoing relationship.