YAML Schema
Complete configuration reference for fleet YAML files. Every field, every option, every constraint.
Root Level
The top-level keys in your fleet.yaml file:
| Field | Type | Description |
|---|---|---|
agents required | AgentConfig[] | Array of agent definitions. Must have at least one. |
shared_blocks optional | SharedBlock[] | Memory blocks shared across multiple agents. |
shared_folders optional | SharedFolder[] | Folders (file collections) shared across agents. |
mcp_servers optional | McpServer[] | Model Context Protocol server definitions. |
root_path optional | string | Base directory for resolving relative file paths. Defaults to the config file's directory. |
root_path: ./my-fleet
shared_blocks:
- name: company_guidelines
description: "Shared operational guidelines"
limit: 5000
from_file: "guidelines.md"
shared_folders:
- name: brand_docs
files:
- "docs/*.md"
mcp_servers:
- name: firecrawl
type: sse
server_url: "https://sse.firecrawl.dev"
agents:
- name: my-agent
# ... (see AgentConfig below)AgentConfig
Each agent is a stateful Letta AI agent with its own memory, tools, and configuration.
Required Fields
| Field | Type | Description |
|---|---|---|
name | string | Unique agent identifier. Must match ^[a-zA-Z0-9_-]+$. Cannot use reserved words: agents, blocks, archives, tools, folders, files, mcp-servers, archival. |
description | string | Human-readable description of the agent's purpose. |
llm_config | LLMConfig | Model and context window settings. |
system_prompt | PromptConfig | The agent's system instructions. |
Optional Fields
| Field | Type | Default | Description |
|---|---|---|---|
embedding | string | openai/text-embedding-3-small | Embedding model for vector operations. |
embedding_config | object | — | Additional embedding model settings. |
reasoning | boolean | true | Enable reasoning/chain-of-thought. |
first_message | string | — | Message sent on first creation for calibration. |
tools | (string | ToolObject)[] | — | Tool names, configs, or glob patterns. |
mcp_tools | McpToolSelection[] | — | Tools provided by MCP servers. |
memory_blocks | MemoryBlock[] | — | Agent-specific memory blocks. |
archives | ArchiveConfig[] | — | Archival memory storage. Max 1 per agent. |
folders | FolderConfig[] | — | Agent-specific file folders for RAG. |
shared_blocks | string[] | — | Names of shared blocks to attach. |
shared_folders | string[] | — | Names of shared folders to attach. |
tags | string[] | — | Tags for multi-tenancy and filtering. Format: key:value. |
LLMConfig
| Field | Type | Description |
|---|---|---|
model required | string | Model identifier in provider/model-name format. |
context_window required | integer | Context window size in tokens. Must be between 1,000 and 200,000. |
llm_config:
model: "google_ai/gemini-2.5-pro"
context_window: 128000google_ai/gemini-2.5-pro, google_ai/gemini-2.0-flash-lite, openai/gpt-4o, openai/gpt-4o-miniPromptConfig
The agent's system instructions. Provide content via exactly one source:
| Field | Type | Description |
|---|---|---|
value | string | Inline prompt text. |
from_file | string | Path to a prompt file (relative to root_path). |
from_bucket | FromBucket | Load from cloud storage. |
disable_base_prompt | boolean | Skip Letta base instructions. Default: false. |
value, from_file, or from_bucket. If none specified, falls back to config/base-letta-system.md.# Inline
system_prompt:
value: "You are a helpful assistant."
# From file
system_prompt:
from_file: "prompts/system.md"
# From cloud storage
system_prompt:
from_bucket:
provider: supabase
bucket: my-bucket
path: "prompts/system.md"
# Skip Letta base instructions
system_prompt:
from_file: "prompts/custom.md"
disable_base_prompt: trueMemoryBlock
Memory blocks give agents persistent, structured memory. Each block is a named text buffer the agent can read and (if agent_owned) write to.
| Field | Type | Description |
|---|---|---|
name required | string | Unique name within the agent. |
description required | string | Human-readable description. |
limit required | integer | Max character limit. Must be a positive integer. |
agent_owned required | boolean | true: agent can modify this block, YAML won't overwrite it on apply. false: YAML syncs content on every apply. |
value / from_file / from_bucket | string / string / FromBucket | Content source. Exactly one required. Falls back to memory-blocks/{name}.md. |
version optional | string | User-defined version tag (e.g., "1.0.0"). |
memory_blocks:
# Agent can modify this block — YAML won't overwrite
- name: user_preferences
description: "What I know about the user"
limit: 5000
value: "No preferences yet."
agent_owned: true
# YAML controls this block — syncs on every apply
- name: brand_guidelines
description: "Brand voice and visual identity"
limit: 3000
from_file: "brand/guidelines.md"
agent_owned: false
version: "2.1.0"ArchiveConfig
Archives provide vector-searchable long-term memory. Max one per agent.
| Field | Type | Description |
|---|---|---|
name required | string | Unique name within the agent. |
description optional | string | Human-readable description. |
embedding optional | string | Embedding model. Inherits from agent if not set. |
embedding_config optional | object | Additional embedding settings. |
archives:
- name: knowledge_base
description: "Long-term knowledge storage"
embedding: "openai/text-embedding-3-small"Tools
Tools extend what an agent can do. Reference built-in tools by name, custom tools by path, or auto-discover from a directory.
tools:
# Built-in tool by name
- archival_memory_insert
- archival_memory_search
# Custom tool from cloud storage
- name: "web_search"
from_bucket:
provider: supabase
bucket: tools
path: "web_search.py"
# Auto-discover all .py files in tools/ directory
- "tools/*"McpServer
Model Context Protocol servers provide tools to agents via external services.
| Field | Type | Description |
|---|---|---|
name required | string | Unique server identifier. |
type required | string | sse, stdio, or streamable_http. |
SSE / Streamable HTTP
| Field | Type | Description |
|---|---|---|
server_url | string | Server endpoint URL. |
auth_header | string | Custom auth header name. |
auth_token | string | Auth token value. Supports ${ENV_VAR} expansion. |
custom_headers | Record<string, string> | Additional headers. |
Stdio
| Field | Type | Description |
|---|---|---|
command | string | Command to execute. |
args | string[] | Command arguments. |
env | Record<string, string> | Environment variables. |
mcp_servers:
# SSE server
- name: firecrawl
type: sse
server_url: "https://sse.firecrawl.dev"
auth_header: "Authorization"
auth_token: "Bearer ${FIRECRAWL_API_KEY}"
# Stdio server
- name: filesystem
type: stdio
command: "npx"
args: ["-y", "@anthropic/mcp-server-filesystem", "/tmp"]
# Streamable HTTP
- name: custom-api
type: streamable_http
server_url: "https://api.example.com/mcp"
custom_headers:
X-Api-Version: "2"McpToolSelection
Select which tools from an MCP server an agent can use.
mcp_tools:
# Specific tools only
- server: firecrawl
tools: ["scrape", "crawl"]
# All tools from this server (default)
- server: filesystemFolders
Folders attach file collections to agents for RAG and context. Files can be local paths, glob patterns, or cloud storage references.
folders:
- name: documentation
files:
# Local file
- "docs/guide.md"
# Glob pattern
- "docs/*.txt"
# Recursive glob
- "knowledge/**/*.md"
# Cloud storage
- from_bucket:
provider: supabase
bucket: my-bucket
path: "docs/important.pdf"
# Cloud storage with glob
- from_bucket:
provider: supabase
bucket: my-bucket
path: "*.txt"SharedBlock
Shared blocks are memory blocks that multiple agents can reference. Define them at the root level, then attach by name.
# Define at root level
shared_blocks:
- name: company_policies
description: "Company-wide policies all agents must follow"
limit: 5000
from_file: "policies.md"
- name: safety_guidelines
description: "Safety and compliance rules"
limit: 3000
value: "Never generate fake testimonials..."
agents:
- name: agent-a
# ... config ...
shared_blocks:
- company_policies
- safety_guidelines
- name: agent-b
# ... config ...
shared_blocks:
- company_policiesSharedFolder
Like shared blocks, but for file collections.
shared_folders:
- name: brand_assets
files:
- "brand/*.md"
- from_bucket:
provider: supabase
bucket: assets
path: "brand/*.pdf"
agents:
- name: agent-a
shared_folders:
- brand_assetsFromBucket
Cloud storage reference used by prompts, memory blocks, folders, and tools.
| Field | Type | Description |
|---|---|---|
provider required | string | Storage provider. Currently only supabase. |
bucket required | string | Bucket name. |
path required | string | File path or glob pattern. |
Tags
Tags enable multi-tenancy and agent filtering. Use key:value format.
agents:
- name: support-agent
tags:
- "tenant:acme-corp"
- "role:support"
- "env:production"# Filter by tag
lettactl get agents --tags "tenant:acme-corp"
lettactl get agents --tags "role:support,env:production"Defaults
| Field | Default Value |
|---|---|
embedding | openai/text-embedding-3-small |
reasoning | true |
disable_base_prompt | false |
context_window | 28000 |
model | google_ai/gemini-2.5-pro |
Complete Example
A fleet config using every available feature:
root_path: ./fleet
# ── Shared Resources ──────────────────────────
shared_blocks:
- name: company_policies
description: "Company-wide operational policies"
limit: 5000
from_file: "policies/company.md"
version: "2.0.0"
- name: safety_guidelines
description: "AI safety and compliance rules"
limit: 3000
value: |
Never generate fake testimonials.
Never impersonate real people.
Always disclose AI-generated content.
shared_folders:
- name: brand_intelligence
files:
- "brand/*.md"
- from_bucket:
provider: supabase
bucket: docs
path: "brand/*.pdf"
# ── MCP Servers ───────────────────────────────
mcp_servers:
- name: firecrawl
type: sse
server_url: "https://sse.firecrawl.dev"
auth_header: "Authorization"
auth_token: "Bearer ${FIRECRAWL_API_KEY}"
- name: filesystem
type: stdio
command: "npx"
args: ["-y", "@anthropic/mcp-server-filesystem", "/tmp"]
# ── Agents ────────────────────────────────────
agents:
- name: brand-researcher
description: "Researches brands and builds customer profiles"
tags:
- "tenant:agency-123"
- "role:research"
llm_config:
model: "google_ai/gemini-2.5-pro"
context_window: 128000
embedding: "openai/text-embedding-3-small"
reasoning: true
system_prompt:
from_file: "prompts/researcher.md"
disable_base_prompt: false
first_message: "Initialize and confirm readiness."
memory_blocks:
- name: current_research
description: "Active research findings"
limit: 10000
value: "No active research."
agent_owned: true
- name: research_methodology
description: "How to conduct brand research"
limit: 3000
from_file: "docs/methodology.md"
agent_owned: false
version: "1.2.0"
archives:
- name: research_history
description: "Past research findings"
embedding: "openai/text-embedding-3-small"
folders:
- name: reference_docs
files:
- "reference/*.md"
- "reference/**/*.txt"
shared_blocks:
- company_policies
- safety_guidelines
shared_folders:
- brand_intelligence
tools:
- archival_memory_insert
- archival_memory_search
- "tools/*"
mcp_tools:
- server: firecrawl
tools: ["scrape", "crawl"]
- name: creative-director
description: "Generates creative concepts and ad directions"
tags:
- "tenant:agency-123"
- "role:creative"
llm_config:
model: "openai/gpt-4o"
context_window: 128000
system_prompt:
from_file: "prompts/creative.md"
memory_blocks:
- name: brand_context
description: "Current brand context and guidelines"
limit: 8000
value: "Awaiting brand assignment."
agent_owned: true
- name: creative_principles
description: "Creative direction principles"
limit: 2000
from_file: "docs/creative-principles.md"
agent_owned: false
shared_blocks:
- company_policies
tools:
- archival_memory_insert
- archival_memory_searchValidation Rules
lettactl validates your config before applying. Here are the rules:
| Rule | Description |
|---|---|
| Unique agent names | No two agents can share a name. |
| Unique block names | Memory block names must be unique within an agent. |
| Max 1 archive | Each agent can have at most one archive. |
| Single content source | Prompts and blocks must use exactly one of value, from_file, or from_bucket. |
| Context window range | Must be between 1,000 and 200,000 tokens. |
| No unknown fields | Strict validation — typos and unknown keys are rejected. |
| No reserved names | Agent names cannot be: agents, blocks, archives, tools, folders, files, mcp-servers, archival. |
| Tags format | Tags cannot contain commas. Non-empty strings. |
# Always preview before applying
lettactl apply -f fleet.yaml --dry-run