Skip to Content

Configuration Reference

Every agent’s runtime behavior is controlled by aether-forge.json in the agent directory.


Full Example

{ "planner": { "mode": "openrouter", "model": "deepseek/deepseek-r1", "baseUrl": "https://openrouter.ai/api/v1", "apiKeyEnv": "OPENROUTER_API_KEY", "temperature": 0.3 }, "runtime": { "cryptoRouter": "paper" }, "tick_interval_seconds": 30, "chain": "base", "data_sources": [ { "name": "elsa", "type": "x402", "priority": 1 }, { "name": "binance", "type": "http", "url": "https://api.binance.com", "priority": 2 }, { "name": "coingecko", "type": "http", "url": "https://api.coingecko.com/api/v3", "priority": 3 } ], "mcp_servers": { "hermes": { "command": "hermes", "args": ["mcp", "serve"] }, "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] }, "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }, "tools": { "include": ["list_issues", "create_issue"] } }, "internal-api": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${API_KEY}" } } }, "x402_budget": { "max_per_call_usd": 0.01, "max_session_usd": 1.00, "max_daily_usd": 5.00 }, "autoresearch": true }

planner — LLM Configuration

FieldTypeDefaultDescription
modestring"heuristic"LLM provider. See modes below.
modelstringautoModel name (e.g., "gemma4:latest", "claude-sonnet-4.5")
baseUrlstringautoAPI endpoint URL
apiKeyEnvstringautoEnvironment variable name containing the API key
temperaturefloatvariesLLM temperature (lower = more deterministic)

Planner Modes

ModeProviderDefault modelDefault endpoint
ollamaOllama (local)gemma4:latesthttp://localhost:11434/v1
anthropicAnthropicclaude-sonnet-4-20250514https://api.anthropic.com
openaiOpenAIgpt-4ohttps://api.openai.com/v1
google / geminiGooglegemini-2.5-flashhttps://generativelanguage.googleapis.com
openrouterOpenRouteranthropic/claude-sonnet-4.5https://openrouter.ai/api/v1
openai-compatibleAnyCustom baseUrl
function-callAny (JSON mode)Uses function-call adapter
heuristicNone (rule-based)No LLM needed
staticTest fixtureReads from staticResponseFile

Auto-Detection Priority

When no planner.mode is specified, Aether Forge probes in order:

  1. Ollama at localhost:11434 → if running, use it
  2. ANTHROPIC_API_KEY env var → Anthropic
  3. OPENAI_API_KEY env var → OpenAI
  4. GEMINI_API_KEY / GOOGLE_API_KEY → Google
  5. OPENROUTER_API_KEY → OpenRouter
  6. Heuristic fallback (no LLM)

runtime — Execution Mode

FieldTypeDefaultDescription
cryptoRouterstring"mock"Execution mode for capabilities

Crypto Router Modes

ModeDescription
mockAll capabilities return mock data
paperReal market data, simulated orders
liveReal market data, real orders
owsUse OWS wallet for all signing
simSimulated wallet
public-market-dataReal read-only market data, no orders
authenticated-paperReal APIs with auth, simulated orders

data_sources — DataRouter Configuration

Array of data source objects. The DataRouter tries them in priority order.

FieldTypeRequiredDescription
namestringYesUnique source name
typestringYes"http", "x402", "mcp", "websocket"
urlstringFor HTTPAPI base URL
prioritynumberYesLower = tried first

mcp_servers — MCP Tool Servers

Object where keys are server names and values are server configs.

Stdio Transport

{ "my-server": { "command": "npx", "args": ["-y", "@mcp/server-something"], "env": { "API_KEY": "${MY_API_KEY}" }, "tools": { "include": ["tool_a", "tool_b"], "exclude": ["dangerous_tool"] } } }
FieldTypeDescription
commandstringExecutable to spawn
argsstring[]Command arguments
envobjectAdditional environment variables (supports ${VAR} expansion)
tools.includestring[]Whitelist of tools (if set, only these are visible)
tools.excludestring[]Blacklist of tools

HTTP Transport

{ "remote-server": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${TOKEN}" } } }
FieldTypeDescription
urlstringMCP endpoint URL
headersobjectHTTP headers (supports ${VAR} expansion)

x402_budget — Payment Caps

FieldTypeDefaultDescription
max_per_call_usdfloat0.10Maximum per individual x402 call
max_session_usdfloat1.00Maximum per session (one forge run)
max_daily_usdfloat5.00Maximum per calendar day

These caps apply to all x402 payments — Elsa endpoints, agent-to-agent payments, everything.

Budget state is tracked atomically in x402_state.json with file locking.


Top-Level Fields

FieldTypeDefaultDescription
tick_interval_secondsnumber30Seconds between ticks
chainstring"base"Default blockchain for on-chain operations
autoresearchbooleanfalseEnable self-improvement loop

Policy Bundle (policy-bundle.json)

Lives in the agent directory alongside aether-forge.json. Defines safety gates the runtime enforces before any side-effecting capability runs.

agentPayments — direct USDC transfers

Required to opt in for agent-to-agent direct USDC transfers via agent_payments.execute_payment(method="transfer"). Without this block, all transfers are denied.

{ "agentPayments": { "directTransferEnabled": true, "maxPerTransferUsd": 0.10, "allowedRecipients": ["0xabc..."], "allowedChains": ["base"] } }
FieldRequiredDescription
directTransferEnabledYesMaster switch (default: missing block = denied)
maxPerTransferUsdYes (>0)Per-transfer USD cap
allowedRecipientsNoWhitelist of EVM addresses (case-insensitive)
allowedChainsNoWhitelist of chains (base, ethereum, etc.)

x402 payments and ERC-8183 escrow are NOT gated by this block — they have their own budget controls in aether-forge.json’s x402_budget.


Environment Variables

These are read at runtime and can override config:

VariablePurpose
ANTHROPIC_API_KEYAnthropic API key
OPENAI_API_KEYOpenAI API key
OPENROUTER_API_KEYOpenRouter API key
GEMINI_API_KEY / GOOGLE_API_KEYGoogle API key
OWS_API_KEYOpen Wallet Standard API key
AETHER_FORGE_REGISTRY_PATHOverride local registry database path

Validate Configuration

forge config-validate ./aether-forge.json # or forge doctor # also validates config
Last updated on