Skip to content

Configuration

Iris is configured through config/iris.php. All settings have sensible defaults, but understanding what they control helps you tune the system for your needs.

How Configuration Works

The base configuration lives in config/iris.php. To customize without modifying core files, create config/iris-custom.php and override specific values. See Customization for the full details on merge strategies.

php
// config/iris-custom.php
return [
    'temporal' => [
        'timezone' => 'America/Chicago',
    ],
];

Agent Settings

These control the core chat behavior.

SettingDefaultDescription
agent.modelclaude-sonnet-4-5The Claude model used for chat
agent.max_steps30Maximum tool iterations per request

What max_steps controls: When Iris uses tools, it can iterate multiple times before responding. A request like "schedule a meeting and remind me later" might use 2-3 tools. The default of 30 allows for complex multi-step tasks while preventing runaway loops.

Context Settings

These control what information Iris has access to when responding.

SettingDefaultDescription
context.history_limit50Recent messages included in context
context.recent_summaries3Number of conversation summaries included

How context builds: Each request includes recent messages (up to history_limit), recent summaries (providing continuity from older conversations), recalled memories, and calendar events. Larger values provide more context but increase token usage.

Truths Settings

Truths are stable, core facts about you that persist across conversations. Unlike memories that are retrieved contextually, Truths represent distilled knowledge earned through behavioral evidence.

SettingDefaultDescription
truths.max_dynamic7Maximum non-pinned Truths included per conversation
truths.percentile_threshold5Top N% of memories by access count are distillation candidates
truths.min_total_memories20Minimum memories required before distillation runs
truths.similarity_threshold0.40Minimum relevance score for a Truth to be included
truths.duplicate_threshold0.80Similarity threshold to detect duplicate Truths
truths.stale_days90Days without access before a Truth is considered stale
truths.crystallization_modelclaude-sonnet-4-5Model for refining Truths with new evidence
truths.promotion_modelclaude-sonnet-4-5Model for analyzing promotion candidates
truths.jobs_per_minute10Rate limit for distillation API calls

Pinned vs Dynamic Truths: You can pin any Truth to ensure it's always included, regardless of relevance scoring. The max_dynamic setting only limits non-pinned Truths - pinned Truths are unlimited.

Run distillation manually:

bash
php artisan iris:distill-truths --queue           # Process all users
php artisan iris:distill-truths --user=1 --queue  # Process specific user
php artisan iris:distill-truths --dry-run         # Preview without changes

Memory Settings

Memory settings control how Iris retrieves contextual information during conversations.

SettingDefaultDescription
memory.max_results7Maximum memories from semantic search
memory.similarity_threshold0.38Minimum similarity score to include a memory
memory.context_turns20Conversation turns used to generate search queries
memory.recall_modelclaude-sonnet-4-5Model for generating memory search queries

How memory retrieval works: When you start a conversation, Iris generates search queries based on recent messages and finds semantically similar memories. Only memories above the similarity threshold are included, keeping context focused on what's relevant.

Scoring Weights

Memories are ranked by a composite score:

(semantic × 0.60) + (recency × 0.25) + (frequency × 0.15)
WeightFactorWhat it means
semantic0.60How relevant to the current conversation
recency0.25Decays linearly over 90 days
frequency0.15How often the memory has been accessed

Certain memory types receive bonuses: relationships (+0.10), preferences and goals (+0.05), and recent events (+0.10).

TIP

If memories seem stale, increase the recency weight. If relevant memories aren't surfacing, increase semantic or lower similarity_threshold.

Extraction Settings

Extraction controls how memories are automatically created from conversations.

SettingDefaultDescription
extraction.threshold10Messages between extraction runs
extraction.max_memories6Maximum memories per extraction
extraction.timeout120API timeout in seconds
extraction.modelclaude-sonnet-4-5Model for analyzing conversations

The quality vs quantity tradeoff: A lower max_memories forces the extraction model to be selective, producing higher-quality memories. Increasing it may capture more information but risks storing trivial details.

Summarization Settings

Summarization compresses older messages to preserve context without consuming too many tokens.

SettingDefaultDescription
summarization.threshold40Unsummarized messages before triggering
summarization.keep_recent50Messages to keep in active conversation
summarization.buffer35Recent messages excluded from summarization
summarization.timeout120API timeout in seconds
summarization.modelclaude-sonnet-4-5Model for generating summaries

How summarization triggers: When unsummarized messages exceed threshold, the system summarizes older messages while keeping the most recent buffer messages intact. The keep_recent setting determines how many total messages remain active before older ones are marked as summarized.

WARNING

Very aggressive summarization (low threshold) may lose conversational nuance. The defaults balance context preservation with token efficiency.

Consolidation Settings

Consolidation merges semantically similar memories into denser, more useful representations over time.

SettingDefaultDescription
consolidation.similarity_threshold0.80Minimum cosine similarity to cluster
consolidation.days_lookback3Days to look back for daily runs
consolidation.max_memories_per_run100Rate limit per consolidation run
consolidation.max_cluster_size5Max memories per cluster
consolidation.min_cluster_size2Min memories to form a cluster
consolidation.max_generation5Max consolidation generations
consolidation.timeout120API timeout in seconds
consolidation.modelclaude-sonnet-4-5Model for merge decisions
consolidation.jobs_per_minute10Rate limit for API calls

Understanding generations: Original memories are Generation 0. When merged, the result is Generation 1. Memories can be re-consolidated up to Generation 5, allowing them to evolve as more related information is gathered. See Memory Consolidation for details.

Run consolidation manually:

bash
php artisan iris:consolidate-memories
php artisan iris:consolidate-memories --dry-run  # Preview without changes

Truth Consolidation Settings

Truth consolidation merges semantically similar Truths to reduce redundancy. Unlike memory consolidation which runs daily, truth consolidation runs weekly since Truths accumulate more slowly.

SettingDefaultDescription
truth_consolidation.similarity_threshold0.75Minimum cosine similarity to cluster
truth_consolidation.max_cluster_size5Max Truths per cluster
truth_consolidation.min_cluster_size2Min Truths to form a cluster
truth_consolidation.timeout120API timeout in seconds
truth_consolidation.modelclaude-sonnet-4-5Model for merge decisions
truth_consolidation.jobs_per_minute10Rate limit for API calls

Protection model: Only Promoted Truths are eligible for consolidation. User-created, agent-created, and pinned Truths are protected. Truths at the maximum generation are also excluded.

The threshold (0.75) is lower than memory consolidation (0.80) because Truths are already distilled facts - semantic overlap is more likely to be true redundancy.

Run consolidation manually:

bash
php artisan iris:consolidate-truths
php artisan iris:consolidate-truths --dry-run  # Preview without changes

See Truth Consolidation for details on how it works.

Calendar Settings

SettingDefaultDescription
calendar.cache_ttl15Cache duration in minutes
calendar.event_horizon7Days ahead to include in context

Why caching matters: Calendar data is fetched from Google's API and cached to avoid repeated requests. The event_horizon controls how far ahead Iris looks -a larger value gives more scheduling context but increases the data in each request.

Embeddings Settings

SettingDefaultDescription
embeddings.modeltext-embedding-3-smallOpenAI embedding model

Embeddings power semantic search. The text-embedding-3-small model offers a good balance of quality and cost. Changing this affects how memories are stored and retrieved.

Text-to-Speech Settings

NOTE

Text-to-speech is disabled by default. Enable it by setting IRIS_TTS_ENABLED=true in your .env.

SettingDefaultDescription
tts.enabledfalseEnable TTS audio playback
tts.modeleleven_multilingual_v2ElevenLabs model
tts.voice(configured)Voice ID for speech generation

When enabled, assistant messages display a play button that generates audio using ElevenLabs. See Text-to-Speech for setup instructions.

Proactive Messages Settings

NOTE

This is a beta feature. It is enabled by default and can be configured in Settings > Proactive Messages.

SettingDefaultDescription
heartbeat.modelclaude-sonnet-4-5Model for heartbeat decisions
heartbeat.max_steps30Maximum tool iterations when crafting messages
heartbeat.history_limitnullConversation messages included (null = use default)

How it works: Iris runs a heartbeat every 30 minutes, gathering context (calendar, conversations, memories) and deciding whether to proactively reach out. Users configure guidance (soft preferences) and boundaries (hard constraints like quiet hours) through the UI.

See Proactive Messages for detailed usage and configuration.

Temporal Settings

SettingDefaultDescription
temporal.timezoneAmerica/New_YorkTimezone for date/time context

This timezone is injected into the system prompt so Iris knows the current date and time. Set it to match your location.

Shell Settings

WARNING

Shell command execution is disabled by default. Enable only on trusted deployments.

SettingDefaultDescription
shell.enabledfalseEnable shell command execution
shell.default_timeout30Default timeout in seconds
shell.max_timeout300Maximum allowed timeout (5 minutes)
shell.max_output_length50000Maximum output size in bytes
shell.default_working_directorynullDefault directory for commands
shell.blocked_executables['sudo', ...]Blocked command names
shell.blocked_patterns[...]Regex patterns to block
shell.inherit_env_vars['PATH', ...]Environment variables to inherit

Enable via environment variable:

bash
# .env
IRIS_SHELL_ENABLED=true

Security layers: Privilege escalation commands are blocked (sudo, su, doas, pkexec). Dangerous patterns like rm -rf / and direct disk writes are detected and blocked. Only safe environment variables are inherited.

See Shell Commands for detailed usage and security information.

Broadcasting Settings

Iris uses Laravel Reverb for real-time streaming. Configure via environment variables:

SettingDefaultDescription
BROADCAST_CONNECTIONreverbBroadcasting driver
REVERB_APP_ID-Application identifier
REVERB_APP_KEY-Client authentication key
REVERB_APP_SECRET-Server-side secret
REVERB_HOSTlocalhostReverb server hostname
REVERB_PORT8080Reverb server port
REVERB_SCHEMEhttpProtocol (http or https for production)

Event Storage

Stream events are temporarily stored in Redis for connection recovery. Events remain available for replay, allowing clients to catch up after brief disconnections.

Sub-Agent Settings

WARNING

Task delegation is disabled by default. Requires shell commands to also be enabled.

SettingDefaultDescription
subagent.enabledfalseEnable task delegation
subagent.modelclaude-sonnet-4-5Model for the sub-agent
subagent.max_steps30Maximum tool iterations per task
subagent.default_working_directorynullDefault directory for tasks
subagent.request_timeout120HTTP timeout per API request
subagent.default_timeout300Default task timeout (5 minutes)
subagent.max_timeout600Maximum task timeout (10 minutes)

Enable via environment variables:

bash
# .env
IRIS_SUBAGENT_ENABLED=true
IRIS_SHELL_ENABLED=true
IRIS_SUBAGENT_WORKING_DIR=/home/user/projects  # Optional default directory

How it works: Task delegation spawns an autonomous sub-agent using Prism's agent loop. The sub-agent has access to shell commands and web tools, executing multi-step tasks independently before returning results.

Constraints: One active task per user to prevent resource exhaustion. Inherits all shell security settings.

See Task Delegation for detailed usage information.

Token Usage Tracking

Iris tracks API token consumption across all operations. You can monitor usage by source type:

SourceWhat it tracks
chatMain conversation tokens
summarizationSummary generation tokens
extractionMemory extraction tokens
consolidationMemory consolidation tokens
truth_consolidationTruth consolidation tokens
promotionTruth promotion analysis tokens
crystallizationTruth crystallization tokens
embeddingOpenAI embedding API calls

Token data is stored in the token_usages table and can be queried for cost analysis or monitoring dashboards.

Common Configuration Scenarios

Lower API Costs

php
// config/iris-custom.php
return [
    'extraction' => [
        'threshold' => 20,  // Extract less frequently
    ],
    'summarization' => [
        'threshold' => 60,  // Summarize less often
    ],
    'truths' => [
        'max_dynamic' => 3,  // Fewer dynamic Truths per conversation
    ],
    'memory' => [
        'max_results' => 5,  // Fewer search results
    ],
];

More Responsive Memory

php
// config/iris-custom.php
return [
    'extraction' => [
        'threshold' => 5,    // Extract more frequently
    ],
    'memory' => [
        'max_results' => 10,              // More search results
        'similarity_threshold' => 0.10,   // Lower threshold
    ],
];

Conservative Memory Consolidation

php
// config/iris-custom.php
return [
    'consolidation' => [
        'similarity_threshold' => 0.90,  // Only very similar memories
        'max_generation' => 3,           // Limit consolidation depth
    ],
];

Conservative Truth Consolidation

php
// config/iris-custom.php
return [
    'truth_consolidation' => [
        'similarity_threshold' => 0.85,  // Only very similar truths
    ],
];

Aggressive Truth Promotion

php
// config/iris-custom.php
return [
    'truths' => [
        'percentile_threshold' => 20,    // Wider candidate pool
        'min_total_memories' => 10,      // Start promoting sooner
    ],
];

Enable Shell Commands

php
// config/iris-custom.php
return [
    'shell' => [
        'default_timeout' => 60,
        'default_working_directory' => '/home/user/projects',
    ],
];

Then set IRIS_SHELL_ENABLED=true in your .env.

Enable Task Delegation

php
// config/iris-custom.php
return [
    'subagent' => [
        'max_steps' => 50,
        'default_timeout' => 600,  // 10 minutes for complex tasks
        'default_working_directory' => '/home/user/projects',
    ],
];

Then set both IRIS_SUBAGENT_ENABLED=true and IRIS_SHELL_ENABLED=true in your .env.

Skills Settings

SettingDefaultDescription
skills.enabledtrueEnable agent skills
skills.directory.agents/skillsDirectory to load skills from

Skills extend Iris with specialized knowledge and workflows. See Agent Skills for details.