Skip to main content

Agent Config Reference

Complete reference for all fields in agent.config.json.


Identity

FieldTypeRequiredDescription
seedIdstringYesUnique agent identifier. Must be globally unique across your deployment. Convention: "seed_<name>".
displayNamestringYesHuman-readable name shown in UI and logs.
biostringNoShort description of the agent's purpose or persona.
systemPromptstringNoSystem prompt prepended to every LLM conversation. Defines role, tone, and behavioral constraints.
{
"seedId": "seed_my_agent",
"displayName": "My Agent",
"bio": "A helpful assistant for the Wunderland community.",
"systemPrompt": "You are a helpful assistant. Be concise and friendly."
}

Personality

Models the agent's personality using the HEXACO model. All values are floats in the range 0.01.0. Default for all fields is 0.5.

FieldTypeDefaultRangeDescription
personality.honestynumber0.50.0–1.0Sincerity, fairness, and avoidance of deception. Higher values yield more transparent, direct responses.
personality.emotionalitynumber0.50.0–1.0Sensitivity and emotional expressiveness. Higher values produce more empathetic, emotionally aware replies.
personality.extraversionnumber0.50.0–1.0Sociability and enthusiasm. Higher values yield more energetic, talkative responses.
personality.agreeablenessnumber0.50.0–1.0Patience and tolerance. Higher values reduce confrontational behavior.
personality.conscientiousnessnumber0.50.0–1.0Organization and diligence. Higher values produce more methodical, thorough responses.
personality.opennessnumber0.50.0–1.0Creativity and curiosity. Higher values yield more imaginative, exploratory responses.
{
"personality": {
"honesty": 0.8,
"emotionality": 0.4,
"extraversion": 0.6,
"agreeableness": 0.7,
"conscientiousness": 0.9,
"openness": 0.5
}
}

Personality Toggles

FieldTypeDefaultDescription
personalityEnabledbooleantrueEnable or disable the HEXACO personality system entirely. When false, the agent uses a raw system prompt with no personality-derived behavioral guidelines, mood engine, or trait evolution.
personalityPresetstringHEXACO preset key. One of "HELPFUL_ASSISTANT", "CREATIVE_THINKER", "ANALYTICAL_RESEARCHER", "EMPATHETIC_COUNSELOR", "DECISIVE_EXECUTOR", or "custom". When set, overrides individual personality.* values with the preset's trait profile.
personalityEvolutionbooleanfalseEnable personality evolution. When true, the agent's HEXACO traits slowly drift based on interactions using the TraitEvolution engine (bounded by ±0.15 max drift from baseline).
{
"personalityEnabled": true,
"personalityPreset": "HELPFUL_ASSISTANT",
"personalityEvolution": false
}

When personalityEnabled is false:

  • System prompt builder skips all HEXACO-derived behavioral guidelines
  • MoodEngine is not initialized
  • TraitEvolution is not initialized
  • The agent uses its raw systemPrompt only

When personalityEvolution is true:

  • A TraitEvolution instance tracks interaction patterns
  • Traits drift at a rate of 0.003 per evolution tick, bounded to ±0.15 from baseline
  • Evolution begins after a minimum of 15 interactions
  • Evolution state persists across restarts

LLM Configuration

FieldTypeDefaultDescription
llmProviderstring"openai"LLM backend. One of "openai", "ollama", "anthropic".
llmModelstringvaries by providerModel ID passed directly to the provider.

Model ID examples by provider:

ProviderExample Model IDs
openai"gpt-4o", "gpt-4o-mini", "o1"
ollama"qwen3:8b", "llama3.1:8b", "mistral:7b"
anthropic"claude-sonnet-4-20250514", "claude-opus-4-20250514"
{
"llmProvider": "openai",
"llmModel": "gpt-4o"
}

Security

Top-level shorthand fields control the overall security posture. A security object provides fine-grained control.

Shorthand Fields

FieldTypeDefaultOptionsDescription
securityTierstring"balanced""permissive", "balanced", "strict"Preset that configures multiple security defaults at once.
executionModestring"human-all""autonomous", "human-dangerous", "human-all"Controls when human approval is required before tool execution.
permissionSetstring"default""autonomous", "default", "locked"Determines which actions the agent is allowed to perform.
toolAccessProfilestring"standard""unrestricted", "standard", "restricted"Controls the breadth of tools available to the agent.

executionMode behavior:

ValueBehavior
"autonomous"Agent executes all tools without human confirmation.
"human-dangerous"Human approval required only for high-risk tool calls.
"human-all"Human approval required before every tool call.

security Object

"security": {
"tier": "balanced",
"preLLMClassifier": true,
"dualLLMAudit": false,
"outputSigning": true,
"riskThreshold": 0.7,
"wrapToolOutputs": true
}
FieldTypeDefaultDescription
security.tierstring"balanced"Mirrors the top-level securityTier. One of "permissive", "balanced", "strict".
security.preLLMClassifierbooleantrueRun a classifier on user input before it reaches the LLM to detect and block policy-violating prompts.
security.dualLLMAuditbooleanfalseSend LLM output to a second model for audit before returning to the user. Increases latency.
security.outputSigningbooleantrueCryptographically sign agent outputs for tamper detection in audit logs.
security.riskThresholdnumber0.7Float 0.01.0. Inputs scored above this threshold by the classifier are blocked. Lower = stricter.
security.wrapToolOutputsbooleantrueWrap raw tool outputs in a structured envelope before passing back to the LLM, preventing prompt injection via tool results.

Discovery

Semantic tool selection. When enabled, the agent uses vector embeddings to select the most relevant subset of tools for each query, rather than sending all tools to the LLM.

"discovery": {
"enabled": false,
"embeddingProvider": "ollama",
"embeddingModel": "nomic-embed-text",
"tokenBudget": 4096,
"maxResults": 15,
"graphWeight": 0.3,
"metaToolEnabled": true
}
FieldTypeDefaultDescription
discovery.enabledbooleanfalseEnable semantic tool discovery. When false, all registered tools are sent to the LLM on every request.
discovery.embeddingProviderstring"ollama"Provider for the embedding model. One of "ollama", "openai".
discovery.embeddingModelstring"nomic-embed-text"Model used to generate vector embeddings for tool descriptions and user queries.
discovery.tokenBudgetnumber4096Maximum tokens to spend on tool definitions sent to the LLM per request.
discovery.maxResultsnumber15Maximum number of tools returned by the semantic search.
discovery.graphWeightnumber0.3Weight 0.01.0 given to graph-based tool co-occurrence scores vs. pure semantic similarity.
discovery.metaToolEnabledbooleantrueExpose a meta-tool that lets the LLM explicitly request additional tools by name if the initial selection was insufficient.

When to enable discovery:

  • enabled: false — recommended when you have fewer than ~50 tools. All tools are sent directly; no embedding overhead.
  • enabled: true — recommended for large tool registries (50+ tools) to stay within LLM context limits.
Embedding model requirement

Discovery requires a dedicated embedding model, not a chat model. Models like qwen3, llama3, and mistral are chat models and will not produce usable vector embeddings. Use a model explicitly designed for embeddings, such as nomic-embed-text (Ollama) or text-embedding-3-small (OpenAI).


Pairing

Controls agent pairing — a mechanism for linking users or sessions together via a shared code.

"pairing": {
"enabled": false,
"groupTrigger": "!pair",
"pendingTtlMs": 3600000,
"maxPending": 3,
"codeLength": 8
}
FieldTypeDefaultDescription
pairing.enabledbooleanfalseEnable the pairing feature.
pairing.groupTriggerstring"!pair"Chat command that initiates a pairing request.
pairing.pendingTtlMsnumber3600000Time-to-live in milliseconds for a pending pairing code before it expires. Default is 1 hour.
pairing.maxPendingnumber3Maximum number of concurrent pending pairing requests per user.
pairing.codeLengthnumber8Length of the generated pairing code (alphanumeric characters).

HITL

Human-in-the-loop settings for the web dashboard and approval UIs.

"hitl": {
"secret": "my-persistent-secret"
}
FieldTypeDefaultDescription
hitl.secretstring(auto-generated UUID)Admin secret for the dashboard, HITL approval, and pairing web UIs. If not set, a random UUID is generated on each wunderland start. Set this for a persistent secret across restarts. Can also be set via the WUNDERLAND_HITL_SECRET environment variable (env var takes precedence).

Extensions

Declares named extension bundles to load. Extensions add tools, voice processors, and productivity integrations.

"extensions": {
"tools": ["web-search", "weather", "giphy"],
"voice": [],
"productivity": []
}
FieldTypeDefaultDescription
extensions.toolsstring[][]Tool extension bundles to load. Each string is a registered extension ID.
extensions.voicestring[][]Voice processing extensions (e.g., STT/TTS pipelines).
extensions.productivitystring[][]Productivity integrations (e.g., calendar, task management).

Channels

Declares which messaging platforms the agent listens on.

"channels": ["discord", "telegram", "slack"]
TypeValueOptions
string[]"discord", "telegram", "slack"

Each value corresponds to a channel adapter that must be configured with the appropriate credentials in your environment or secrets store.


Observability

OpenTelemetry (OTel) integration for tracing and log export.

"observability": {
"otel": {
"enabled": false,
"exportLogs": false
}
}
FieldTypeDefaultDescription
observability.otel.enabledbooleanfalseEnable OpenTelemetry tracing. Exports spans to the configured OTel collector endpoint.
observability.otel.exportLogsbooleanfalseAlso export structured logs via OTel. Requires enabled: true.

Configure the OTel collector endpoint via the standard OTEL_EXPORTER_OTLP_ENDPOINT environment variable.


Examples

Minimal Config

The minimum viable configuration to start an agent.

{
"seedId": "seed_my_bot",
"displayName": "My Bot",
"llmProvider": "openai",
"llmModel": "gpt-4o",
"channels": ["discord"]
}

Full Config

A complete configuration demonstrating all fields.

{
"seedId": "seed_rabbithole_agent",
"displayName": "Wunderbot",
"bio": "AI assistant for the Rabbit Hole Inc community.",
"systemPrompt": "You are Wunderbot, a helpful and friendly assistant for the Wunderland Discord community. Be concise, accurate, and enthusiastic.",

"personality": {
"honesty": 0.85,
"emotionality": 0.5,
"extraversion": 0.7,
"agreeableness": 0.75,
"conscientiousness": 0.8,
"openness": 0.65
},

"llmProvider": "openai",
"llmModel": "gpt-4o",

"securityTier": "balanced",
"executionMode": "human-dangerous",
"permissionSet": "default",
"toolAccessProfile": "standard",

"security": {
"tier": "balanced",
"preLLMClassifier": true,
"dualLLMAudit": false,
"outputSigning": true,
"riskThreshold": 0.7,
"wrapToolOutputs": true
},

"discovery": {
"enabled": false,
"embeddingProvider": "ollama",
"embeddingModel": "nomic-embed-text",
"tokenBudget": 4096,
"maxResults": 15,
"graphWeight": 0.3,
"metaToolEnabled": true
},

"pairing": {
"enabled": false,
"groupTrigger": "!pair",
"pendingTtlMs": 3600000,
"maxPending": 3,
"codeLength": 8
},

"extensions": {
"tools": ["web-search", "weather"],
"voice": [],
"productivity": []
},

"channels": ["discord"],

"observability": {
"otel": {
"enabled": false,
"exportLogs": false
}
}
}

Local LLM Config (Ollama)

{
"seedId": "seed_local_bot",
"displayName": "Local Bot",
"llmProvider": "ollama",
"llmModel": "qwen3:8b",
"channels": ["discord"],
"discovery": {
"enabled": true,
"embeddingProvider": "ollama",
"embeddingModel": "nomic-embed-text",
"tokenBudget": 2048,
"maxResults": 10
}
}

Strict Security Config

{
"seedId": "seed_secure_bot",
"displayName": "Secure Bot",
"llmProvider": "anthropic",
"llmModel": "claude-sonnet-4-20250514",
"securityTier": "strict",
"executionMode": "human-all",
"permissionSet": "locked",
"toolAccessProfile": "restricted",
"security": {
"tier": "strict",
"preLLMClassifier": true,
"dualLLMAudit": true,
"outputSigning": true,
"riskThreshold": 0.4,
"wrapToolOutputs": true
},
"channels": ["discord"]
}