Ensembles¶
Ensembles are the recommended way to get started with Sympozium. A Ensemble is a CRD that bundles multiple pre-configured agent personas — each with a system prompt, skills, tool policy, schedule, and memory seeds. Activating a pack is a single action: the Ensemble controller stamps out all the Kubernetes resources automatically.
Why Ensembles?¶
Without Ensembles, setting up even one agent requires creating a Secret, SympoziumInstance, SympoziumSchedule, and memory ConfigMap by hand. Ensembles collapse that into: pick a pack → enter your API key → done.
How It Works¶
Ensemble "platform-team" (3 personas)
│
├── Activate via TUI or Web UI (wizard → API key → confirm)
│
└── Controller stamps out:
├── Secret: platform-team-openai-key
├── SympoziumInstance: platform-team-security-guardian
│ ├── SympoziumSchedule: ...security-guardian-schedule (every 30m)
│ └── ConfigMap: ...security-guardian-memory (seeded)
├── SympoziumInstance: platform-team-sre-watchdog
│ ├── SympoziumSchedule: ...sre-watchdog-schedule (every 5m)
│ └── ConfigMap: ...sre-watchdog-memory (seeded)
├── SympoziumInstance: platform-team-platform-engineer
│ ├── SympoziumSchedule: ...platform-engineer-schedule (weekdays 9am)
│ └── ConfigMap: ...platform-engineer-memory (seeded)
│
└── (if sharedMemory.enabled):
├── PVC: platform-team-shared-memory-db
├── Deployment: platform-team-shared-memory
└── Service: platform-team-shared-memory
All generated resources have ownerReferences pointing back to the Ensemble — delete the pack and everything gets garbage-collected.
Persona Relationships & Workflows¶
Ensembles support typed relationships between personas, enabling coordination patterns beyond independent scheduling:
Relationship Types¶
| Type | Behaviour | Example |
|---|---|---|
delegation |
Source requests target, awaits result, then continues | Researcher delegates to Writer |
sequential |
Source must complete before target starts | Writer finishes → Reviewer begins |
supervision |
Source monitors target (observability only) | Lead supervises Writer and Reviewer |
Workflow Types¶
The workflowType field on a Ensemble describes the overall orchestration pattern:
| Value | Description |
|---|---|
autonomous |
Default. Personas run independently on their own schedules. |
pipeline |
Personas execute in sequence defined by sequential edges. |
delegation |
Personas can actively delegate to each other at runtime. |
Defining Relationships¶
apiVersion: sympozium.ai/v1alpha1
kind: Ensemble
metadata:
name: research-team
spec:
workflowType: delegation
personas:
- name: researcher
systemPrompt: "You are a research analyst..."
- name: writer
systemPrompt: "You are a technical writer..."
- name: reviewer
systemPrompt: "You are a quality reviewer..."
relationships:
- source: researcher
target: writer
type: delegation
timeout: "10m"
resultFormat: markdown
- source: writer
target: reviewer
type: sequential
timeout: "5m"
Shared Workflow Memory¶
By default, each persona in a Ensemble has its own private memory — an isolated SQLite database that only that persona can access. Shared Workflow Memory adds a second, pack-level memory pool that all personas can read from (and optionally write to), enabling cross-persona knowledge sharing.
Enabling Shared Memory¶
apiVersion: sympozium.ai/v1alpha1
kind: Ensemble
metadata:
name: research-team
spec:
sharedMemory:
enabled: true
storageSize: "1Gi"
accessRules:
- persona: lead
access: read-write
- persona: researcher
access: read-write
- persona: writer
access: read-write
- persona: reviewer
access: read-only
How It Works¶
When shared memory is enabled, the Ensemble controller provisions:
- PVC:
<pack>-shared-memory-db— persistent storage for the shared SQLite database - Deployment:
<pack>-shared-memory— the sameskill-memoryserver image used for private memory - Service:
<pack>-shared-memory— ClusterIP service on port 8080
All resources have ownerReferences to the Ensemble and are cleaned up on deletion.
Agent Tools¶
Agents in the pack receive three additional tools alongside their private memory tools:
| Tool | Description | Access |
|---|---|---|
workflow_memory_search |
Search shared team knowledge contributed by any persona | All |
workflow_memory_store |
Store findings for other personas (auto-tagged with source persona) | read-write only |
workflow_memory_list |
List shared entries, filterable by persona or tag | All |
Access Control¶
Each persona can be granted read-write or read-only access via accessRules. If no rules are specified, all personas default to read-write.
- read-write: Can search, list, and store entries
- read-only: Can search and list, but cannot store (the
workflow_memory_storetool is not registered)
Access control is enforced client-side in the agent runner — sufficient because the memory server is in-cluster behind a ClusterIP with no untrusted clients.
Auto-Context Injection¶
When an agent starts, the runner automatically queries both private and shared memory for task-relevant context. The system prompt includes two sections:
- Your Past Findings (Private Memory) — from the persona's own memory
- Team Knowledge (Shared Workflow Memory) — from the pack's shared pool
Attribution¶
Entries stored via workflow_memory_store are automatically tagged with the source persona's instance name. This enables filtering by persona (e.g., "show me what the researcher found") without relying on agents to self-tag correctly.
delegate_to_persona Tool¶
Agents that belong to a Ensemble automatically receive the delegate_to_persona tool. This allows an agent to delegate a task to another persona in the same pack:
Tool: delegate_to_persona
Arguments:
targetPersona: "writer"
task: "Write a report based on these findings: ..."
The tool writes a spawn request to the IPC protocol. The spawner resolves the target persona to the correct SympoziumInstance, validates the relationship edge exists, and creates a child AgentRun.
Visual Canvas¶
The Web UI provides two canvas views for visualising persona relationships:
- Per-pack canvas (Persona detail page → Workflow tab): editable — drag to connect personas, pick relationship type, save back to the CRD
- Global canvas (Ensembles list page → Canvas view): read-only — shows all enabled packs together with live run status
- Dashboard widget (Team Canvas panel): compact view with pack selector dropdown and live run status highlighting
Persona nodes show live run status with animated indicators:
- Running: pulsing blue ring + task preview
- Serving: pulsing violet ring
- AwaitingDelegate: pulsing amber ring
- Failed: red ring
- Succeeded: green ring
Built-in Packs¶
| Pack | Category | Agents | Description |
|---|---|---|---|
platform-team |
Platform | Security Guardian, SRE Watchdog, Platform Engineer | Core platform engineering — security audits, cluster health, manifest review |
devops-essentials |
DevOps | Incident Responder, Cost Analyzer | DevOps workflows — incident triage, resource right-sizing |
developer-team |
Development | Tech Lead, Backend Dev, Frontend Dev, QA Engineer, Code Reviewer, DevOps Engineer, Docs Writer | A 2-pizza software development team that collaborates on a single GitHub repository |
research-team |
Research | Lead, Researcher, Writer, Reviewer | A coordinated research and reporting team demonstrating delegation, sequential, and supervision relationships |
observability-mcp-team |
Observability | Grafana Analyst, Log Investigator | Observability workflows using MCP servers for Grafana and Loki |
Activating a Pack in the Web UI¶
- Navigate to Ensembles in the sidebar
- Click Enable on a pack to open the onboarding wizard
- Choose your AI provider and paste an API key
- Optionally bind channels (Telegram, Slack, Discord, WhatsApp)
- Confirm — the controller creates all instances within seconds
Activating via kubectl¶
# 1. Create the provider secret
kubectl create secret generic my-pack-openai-key \
--from-literal=OPENAI_API_KEY=sk-...
# 2. Patch the Ensemble with authRefs to trigger activation
kubectl patch ensemble platform-team --type=merge -p '{
"spec": {
"authRefs": [{"provider": "openai", "secret": "my-pack-openai-key"}]
}
}'
The controller detects the authRefs change and reconciles — creating SympoziumInstances, Schedules, and memory ConfigMaps for each persona.
Writing Your Own Ensemble¶
apiVersion: sympozium.ai/v1alpha1
kind: Ensemble
metadata:
name: my-team
spec:
description: "My custom agent team"
category: custom
version: "1.0.0"
workflowType: delegation
personas:
- name: planner
displayName: "Planner"
systemPrompt: |
You plan work and delegate to the executor.
skills:
- k8s-ops
- memory
schedule:
type: heartbeat
interval: "1h"
task: "Check for pending work and delegate to the executor."
- name: executor
displayName: "Executor"
systemPrompt: |
You execute tasks assigned by the planner.
skills:
- k8s-ops
- memory
relationships:
- source: planner
target: executor
type: delegation
timeout: "15m"
Apply it with kubectl apply -f my-team.yaml, then activate through the Web UI or TUI.
Tip
See the Developer Team Pack for a detailed example of a complex Ensemble with seven collaborating agents.