Configuration Reference¶
Complete reference of all configuration keys available in Lango. Configuration is stored in encrypted profiles managed by lango config commands. Use lango onboard for guided setup or lango settings for the full interactive editor.
All configuration is managed through the lango settings TUI (interactive terminal editor) or by importing a JSON file with lango config import. Lango does not use YAML configuration files. The JSON examples below show the structure expected by lango config import and reflect what lango settings edits behind the scenes.
See Configuration Basics for an introduction to the configuration system.
Server¶
Gateway server settings for HTTP API and WebSocket connections.
Settings:
lango settings→ Server
{
"server": {
"host": "localhost",
"port": 18789,
"httpEnabled": true,
"wsEnabled": true,
"allowedOrigins": []
}
}
| Key | Type | Default | Description |
|---|---|---|---|
server.host | string | localhost | Host address to bind to |
server.port | int | 18789 | Port to listen on |
server.httpEnabled | bool | true | Enable HTTP API endpoints |
server.wsEnabled | bool | true | Enable WebSocket server |
server.allowedOrigins | []string | [] | Allowed origins for CORS. Empty = same-origin only |
Agent¶
LLM agent settings including model selection, prompt configuration, and timeouts.
Settings:
lango settings→ Agent
{
"agent": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"fallbackProvider": "",
"fallbackModel": "",
"maxTokens": 4096,
"temperature": 0.7,
"systemPromptPath": "",
"promptsDir": "",
"requestTimeout": "5m",
"toolTimeout": "2m",
"multiAgent": false,
"agentsDir": "",
"autoExtendTimeout": false,
"maxRequestTimeout": ""
}
}
| Key | Type | Default | Description |
|---|---|---|---|
agent.provider | string | anthropic | Primary AI provider ID (references providers.<id>) |
agent.model | string | Model ID to use (e.g., claude-sonnet-4-20250514) | |
agent.fallbackProvider | string | Fallback provider ID when primary fails | |
agent.fallbackModel | string | Fallback model ID | |
agent.maxTokens | int | 4096 | Maximum tokens per response |
agent.temperature | float64 | 0.7 | Sampling temperature (0.0 - 1.0) |
agent.systemPromptPath | string | Path to a custom system prompt file | |
agent.promptsDir | string | Directory containing .md files for system prompts | |
agent.requestTimeout | duration | 5m | Maximum duration for a single AI provider request |
agent.toolTimeout | duration | 2m | Maximum duration for a single tool call |
agent.multiAgent | bool | false | Enable multi-agent orchestration |
agent.agentsDir | string | "" | Directory containing user-defined AGENT.md agent definitions |
agent.autoExtendTimeout | bool | false | Auto-extend deadline when agent activity is detected |
agent.maxRequestTimeout | duration | Absolute max when auto-extend enabled (default: 3× requestTimeout) |
Agent Memory¶
Per-agent persistent memory for cross-session context retention.
Settings:
lango settings→ Agent Memory
{
"agentMemory": {
"enabled": false
}
}
| Key | Type | Default | Description |
|---|---|---|---|
agentMemory.enabled | bool | false | Enable per-agent persistent memory for sub-agents |
Providers¶
Named AI provider configurations. Referenced by other sections via provider ID.
Settings:
lango settings→ Providers
{
"providers": {
"my-anthropic": {
"type": "anthropic",
"apiKey": "${ANTHROPIC_API_KEY}"
},
"my-openai": {
"type": "openai",
"apiKey": "${OPENAI_API_KEY}",
"baseUrl": "https://api.openai.com/v1"
},
"local-ollama": {
"type": "ollama",
"baseUrl": "http://localhost:11434/v1"
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
providers.<id>.type | string | Provider type: anthropic, openai, google, gemini, ollama | |
providers.<id>.apiKey | string | API key (supports ${ENV_VAR} substitution) | |
providers.<id>.baseUrl | string | Base URL for OpenAI-compatible or self-hosted providers |
Logging¶
Settings:
lango settings→ Logging
{
"logging": {
"level": "info",
"format": "console"
}
}
| Key | Type | Default | Description |
|---|---|---|---|
logging.level | string | info | Log level: debug, info, warn, error |
logging.format | string | console | Output format: console, json |
Session¶
Session storage and lifecycle settings.
Settings:
lango settings→ Session
{
"session": {
"databasePath": "~/.lango/data.db",
"ttl": "24h",
"maxHistoryTurns": 100
}
}
| Key | Type | Default | Description |
|---|---|---|---|
session.databasePath | string | ~/.lango/data.db | Path to the SQLite session database |
session.ttl | duration | Session time-to-live before expiration (empty = no expiration) | |
session.maxHistoryTurns | int | 50 | Maximum conversation turns to retain per session |
Security¶
Signer¶
| Key | Type | Default | Description |
|---|---|---|---|
security.signer.provider | string | local | Signer provider (local) |
Interceptor¶
The security interceptor controls tool execution approval and PII protection. See Tool Approval and PII Redaction.
Settings:
lango settings→ Security
{
"security": {
"interceptor": {
"enabled": true,
"redactPii": false,
"approvalPolicy": "dangerous",
"approvalTimeoutSec": 30,
"notifyChannel": "",
"sensitiveTools": [],
"exemptTools": []
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
security.interceptor.enabled | bool | true | Enable the security interceptor |
security.interceptor.redactPii | bool | false | Enable PII redaction in messages |
security.interceptor.approvalPolicy | string | dangerous | Tool approval policy: always, dangerous, never |
security.interceptor.approvalTimeoutSec | int | 30 | Timeout for approval requests (seconds) |
security.interceptor.notifyChannel | string | Channel to send approval notifications | |
security.interceptor.sensitiveTools | []string | Tools that always require approval | |
security.interceptor.exemptTools | []string | Tools exempt from approval regardless of policy |
PII Detection¶
Settings:
lango settings→ Security
{
"security": {
"interceptor": {
"piiRegexPatterns": [],
"piiDisabledPatterns": [],
"piiCustomPatterns": []
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
security.interceptor.piiRegexPatterns | []string | Built-in PII regex pattern names to enable | |
security.interceptor.piiDisabledPatterns | []string | Built-in PII patterns to disable | |
security.interceptor.piiCustomPatterns | []object | Custom PII regex patterns (name + regex pairs) |
Presidio Integration¶
Settings:
lango settings→ Security
{
"security": {
"interceptor": {
"presidio": {
"enabled": false,
"url": "http://localhost:5002",
"scoreThreshold": 0.7,
"language": "en"
}
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
security.interceptor.presidio.enabled | bool | false | Enable Microsoft Presidio for advanced PII detection |
security.interceptor.presidio.url | string | http://localhost:5002 | Presidio analyzer service URL |
security.interceptor.presidio.scoreThreshold | float64 | 0.7 | Minimum confidence score (0.0 - 1.0) |
security.interceptor.presidio.language | string | en | Language for PII analysis |
Auth¶
Configure OAuth2/OIDC authentication providers for the gateway API.
Settings:
lango settings→ Auth
{
"auth": {
"providers": {
"google": {
"issuerUrl": "https://accounts.google.com",
"clientId": "${GOOGLE_CLIENT_ID}",
"clientSecret": "${GOOGLE_CLIENT_SECRET}",
"redirectUrl": "http://localhost:18789/auth/callback",
"scopes": ["openid", "email", "profile"]
}
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
auth.providers.<id>.issuerUrl | string | OIDC issuer URL | |
auth.providers.<id>.clientId | string | OAuth2 client ID | |
auth.providers.<id>.clientSecret | string | OAuth2 client secret | |
auth.providers.<id>.redirectUrl | string | OAuth2 redirect URL | |
auth.providers.<id>.scopes | []string | OAuth2 scopes to request |
Channels¶
Communication channel configurations.
Telegram¶
| Key | Type | Default | Description |
|---|---|---|---|
channels.telegram.enabled | bool | false | Enable Telegram channel |
channels.telegram.botToken | string | Bot token from BotFather | |
channels.telegram.allowlist | []int64 | [] | Allowed user/group IDs (empty = allow all) |
Discord¶
| Key | Type | Default | Description |
|---|---|---|---|
channels.discord.enabled | bool | false | Enable Discord channel |
channels.discord.botToken | string | Bot token from Discord Developer Portal | |
channels.discord.applicationId | string | Application ID for slash commands | |
channels.discord.allowedGuilds | []string | [] | Allowed guild IDs (empty = allow all) |
Slack¶
| Key | Type | Default | Description |
|---|---|---|---|
channels.slack.enabled | bool | false | Enable Slack channel |
channels.slack.botToken | string | Bot OAuth token | |
channels.slack.appToken | string | App-level token for Socket Mode | |
channels.slack.signingSecret | string | Signing secret for request verification |
Tools¶
Exec Tool¶
| Key | Type | Default | Description |
|---|---|---|---|
tools.exec.defaultTimeout | duration | 30s | Default timeout for shell command execution |
tools.exec.allowBackground | bool | true | Allow background command execution |
tools.exec.workDir | string | Working directory for command execution |
Filesystem Tool¶
| Key | Type | Default | Description |
|---|---|---|---|
tools.filesystem.maxReadSize | int | 10485760 | Maximum file read size in bytes (10 MB) |
tools.filesystem.allowedPaths | []string | Allowed filesystem paths (empty = all) |
Browser Tool¶
| Key | Type | Default | Description |
|---|---|---|---|
tools.browser.enabled | bool | false | Enable browser automation tool |
tools.browser.headless | bool | true | Run browser in headless mode |
tools.browser.sessionTimeout | duration | 5m | Browser session timeout |
Output Manager¶
Token-based tiered compression for large tool outputs. Applied as middleware to all tools.
| Key | Type | Default | Description |
|---|---|---|---|
tools.outputManager.tokenBudget | int | 2000 | Maximum tokens before output is compressed |
tools.outputManager.headRatio | float | 0.7 | Fraction of budget allocated to output head |
tools.outputManager.tailRatio | float | 0.3 | Fraction of budget allocated to output tail |
Hooks¶
Tool execution hooks for security filtering, access control, and event publishing.
Settings:
lango settings→ Hooks
{
"hooks": {
"enabled": false,
"securityFilter": false,
"accessControl": false,
"eventPublishing": false,
"knowledgeSave": false,
"blockedCommands": []
}
}
| Key | Type | Default | Description |
|---|---|---|---|
hooks.enabled | bool | false | Enable the tool execution hook system |
hooks.securityFilter | bool | false | Block dangerous commands via security filter hook |
hooks.accessControl | bool | false | Enable per-agent tool access control |
hooks.eventPublishing | bool | false | Publish tool execution events to the event bus |
hooks.knowledgeSave | bool | false | Auto-save knowledge extracted from tool results |
hooks.blockedCommands | []string | [] | Command patterns to block when security filter is active |
Knowledge¶
| Key | Type | Default | Description |
|---|---|---|---|
knowledge.enabled | bool | false | Enable the knowledge system |
knowledge.maxContextPerLayer | int | 5 | Maximum context items per knowledge layer |
Skill¶
| Key | Type | Default | Description |
|---|---|---|---|
skill.enabled | bool | false | Enable the skill system |
skill.skillsDir | string | ~/.lango/skills | Directory for skill files |
skill.allowImport | bool | false | Allow importing skills from external sources |
skill.maxBulkImport | int | 50 | Maximum skills per bulk import |
skill.importConcurrency | int | 5 | Concurrent import workers |
skill.importTimeout | duration | 2m | Timeout per skill import |
Observational Memory¶
Settings:
lango settings→ Observational Memory
{
"observationalMemory": {
"enabled": false,
"provider": "",
"model": "",
"messageTokenThreshold": 1000,
"observationTokenThreshold": 2000,
"maxMessageTokenBudget": 8000,
"maxReflectionsInContext": 5,
"maxObservationsInContext": 20
}
}
| Key | Type | Default | Description |
|---|---|---|---|
observationalMemory.enabled | bool | false | Enable observational memory |
observationalMemory.provider | string | AI provider for memory extraction (empty = agent default) | |
observationalMemory.model | string | Model for memory extraction (empty = agent default) | |
observationalMemory.messageTokenThreshold | int | 1000 | Minimum tokens in recent messages before triggering observation |
observationalMemory.observationTokenThreshold | int | 2000 | Token threshold to trigger reflection |
observationalMemory.maxMessageTokenBudget | int | 8000 | Max tokens to include from message history |
observationalMemory.maxReflectionsInContext | int | 5 | Max reflections injected into LLM context |
observationalMemory.maxObservationsInContext | int | 20 | Max observations injected into LLM context |
Embedding & RAG¶
Settings:
lango settings→ Embedding & RAG
{
"embedding": {
"providerID": "my-openai",
"provider": "",
"model": "text-embedding-3-small",
"dimensions": 1536,
"local": {
"baseUrl": "http://localhost:11434/v1",
"model": ""
},
"rag": {
"enabled": false,
"maxResults": 5,
"collections": []
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
embedding.providerID | string | References a key in the providers map | |
embedding.provider | string | Embedding provider type (set to local for Ollama) | |
embedding.model | string | Embedding model identifier | |
embedding.dimensions | int | Embedding vector dimensionality | |
embedding.local.baseUrl | string | Local embedding service URL (e.g., Ollama) | |
embedding.local.model | string | Model override for local provider | |
embedding.rag.enabled | bool | false | Enable RAG retrieval |
embedding.rag.maxResults | int | Maximum results per RAG query | |
embedding.rag.collections | []string | Collection names to search (empty = all) |
Graph¶
Settings:
lango settings→ Graph Store
{
"graph": {
"enabled": false,
"backend": "bolt",
"databasePath": "~/.lango/graph.db",
"maxTraversalDepth": 2,
"maxExpansionResults": 10
}
}
| Key | Type | Default | Description |
|---|---|---|---|
graph.enabled | bool | false | Enable the knowledge graph |
graph.backend | string | bolt | Graph storage backend (bolt) |
graph.databasePath | string | Path to the graph database file | |
graph.maxTraversalDepth | int | 2 | Max depth for graph traversal in Graph RAG |
graph.maxExpansionResults | int | 10 | Max results from graph expansion |
A2A Protocol¶
Experimental
The A2A protocol is experimental. See A2A Protocol.
Settings:
lango settings→ A2A Protocol
{
"a2a": {
"enabled": false,
"baseUrl": "",
"agentName": "",
"agentDescription": "",
"remoteAgents": [
{
"name": "code-reviewer",
"agentCardUrl": "https://reviewer.example.com/.well-known/agent.json"
}
]
}
}
| Key | Type | Default | Description |
|---|---|---|---|
a2a.enabled | bool | false | Enable A2A protocol support |
a2a.baseUrl | string | External URL where this agent is reachable | |
a2a.agentName | string | Name advertised in the Agent Card | |
a2a.agentDescription | string | Description in the Agent Card | |
a2a.remoteAgents | []object | List of remote agents to connect to |
Each remote agent entry:
| Key | Type | Description |
|---|---|---|
a2a.remoteAgents[].name | string | Display name for the remote agent |
a2a.remoteAgents[].agentCardUrl | string | URL to the remote agent's agent card |
Payment¶
Experimental
The payment system is experimental. See Payments.
Settings:
lango settings→ Payment
{
"payment": {
"enabled": false,
"walletProvider": "local",
"network": {
"chainId": 84532,
"rpcUrl": "https://sepolia.base.org",
"usdcContract": "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
},
"limits": {
"maxPerTx": "1.00",
"maxDaily": "10.00",
"autoApproveBelow": ""
},
"x402": {
"autoIntercept": false,
"maxAutoPayAmount": ""
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
payment.enabled | bool | false | Enable blockchain payment features |
payment.walletProvider | string | local | Wallet backend: local, rpc, composite |
payment.network.chainId | int | 84532 | EVM chain ID (84532 = Base Sepolia) |
payment.network.rpcUrl | string | JSON-RPC endpoint for the blockchain network | |
payment.network.usdcContract | string | USDC token contract address | |
payment.limits.maxPerTx | string | 1.00 | Maximum USDC per transaction |
payment.limits.maxDaily | string | 10.00 | Maximum daily USDC spending |
payment.limits.autoApproveBelow | string | Auto-approve payments below this amount | |
payment.x402.autoIntercept | bool | false | Enable X402 auto-interception for paid APIs |
payment.x402.maxAutoPayAmount | string | Maximum auto-pay amount for X402 requests |
P2P Network¶
Experimental
The P2P networking system is experimental. See P2P Network.
Settings:
lango settings→ P2P Network
{
"p2p": {
"enabled": false,
"listenAddrs": ["/ip4/0.0.0.0/tcp/9000"],
"bootstrapPeers": [],
"keyDir": "~/.lango/p2p",
"enableRelay": false,
"enableMdns": true,
"maxPeers": 50,
"handshakeTimeout": "30s",
"sessionTokenTtl": "1h",
"autoApproveKnownPeers": false,
"requireSignedChallenge": false,
"firewallRules": [],
"gossipInterval": "30s",
"zkHandshake": false,
"zkAttestation": false,
"zkp": {
"proofCacheDir": "~/.lango/zkp",
"provingScheme": "plonk",
"srsMode": "unsafe",
"srsPath": "",
"maxCredentialAge": "24h"
},
"toolIsolation": {
"enabled": false,
"timeoutPerTool": "30s",
"maxMemoryMB": 512,
"container": {
"enabled": false,
"runtime": "auto",
"image": "lango-sandbox:latest",
"networkMode": "none",
"readOnlyRootfs": true,
"poolSize": 0,
"poolIdleTimeout": "5m"
}
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
p2p.enabled | bool | false | Enable P2P networking |
p2p.listenAddrs | []string | ["/ip4/0.0.0.0/tcp/9000"] | Multiaddrs to listen on |
p2p.bootstrapPeers | []string | [] | Initial peers for DHT bootstrapping |
p2p.keyDir | string | ~/.lango/p2p | Directory for node key persistence |
p2p.enableRelay | bool | true | Act as relay for NAT traversal |
p2p.enableMdns | bool | true | Enable mDNS for LAN discovery |
p2p.maxPeers | int | 50 | Maximum connected peers |
p2p.handshakeTimeout | duration | 30s | Maximum handshake duration |
p2p.sessionTokenTtl | duration | 1h | Session token lifetime |
p2p.autoApproveKnownPeers | bool | false | Skip approval for known peers |
p2p.firewallRules | []object | [] | Static firewall ACL rules |
p2p.gossipInterval | duration | 30s | Agent card gossip interval |
p2p.zkHandshake | bool | false | Enable ZK-enhanced handshake |
p2p.zkAttestation | bool | false | Enable ZK attestation on responses |
p2p.requireSignedChallenge | bool | false | Reject unsigned (v1.0) challenges; require v1.1 signed challenges |
p2p.zkp.proofCacheDir | string | ~/.lango/zkp | ZKP circuit cache directory |
p2p.zkp.provingScheme | string | plonk | ZKP proving scheme: plonk or groth16 |
p2p.zkp.srsMode | string | unsafe | SRS generation mode: unsafe (deterministic) or file (trusted ceremony) |
p2p.zkp.srsPath | string | Path to SRS file (when srsMode = "file") | |
p2p.zkp.maxCredentialAge | string | 24h | Maximum age for ZK credentials before rejection |
Each firewall rule entry:
| Key | Type | Description |
|---|---|---|
firewallRules[].peerDid | string | Peer DID ("*" for all peers) |
firewallRules[].action | string | "allow" or "deny" |
firewallRules[].tools | []string | Tool name patterns (empty = all) |
firewallRules[].rateLimit | int | Max requests/min (0 = unlimited) |
P2P Pricing¶
| Key | Type | Default | Description |
|---|---|---|---|
p2p.pricing.enabled | bool | false | Enable paid P2P tool invocations |
p2p.pricing.perQuery | string | Default price per query in USDC (e.g., "0.10") | |
p2p.pricing.toolPrices | map[string]string | Map of tool names to specific prices in USDC | |
p2p.pricing.trustThresholds.postPayMinScore | float64 | 0.8 | Minimum reputation score for post-pay pricing tier |
P2P Settlement¶
| Key | Type | Default | Description |
|---|---|---|---|
p2p.pricing.settlement.receiptTimeout | duration | 2m | Maximum wait for on-chain receipt confirmation |
p2p.pricing.settlement.maxRetries | int | 3 | Maximum transaction submission retries |
P2P Owner Protection¶
| Key | Type | Default | Description |
|---|---|---|---|
p2p.ownerProtection.ownerName | string | Owner name to block from P2P responses | |
p2p.ownerProtection.ownerEmail | string | Owner email to block from P2P responses | |
p2p.ownerProtection.ownerPhone | string | Owner phone to block from P2P responses | |
p2p.ownerProtection.extraTerms | []string | Additional terms to block from P2P responses | |
p2p.ownerProtection.blockConversations | bool | true | Block conversation data in P2P responses |
P2P Reputation¶
| Key | Type | Default | Description |
|---|---|---|---|
p2p.minTrustScore | float64 | 0.3 | Minimum trust score to accept P2P requests (0.0 - 1.0) |
P2P Tool Isolation¶
| Key | Type | Default | Description |
|---|---|---|---|
p2p.toolIsolation.enabled | bool | false | Enable subprocess isolation for remote peer tool invocations |
p2p.toolIsolation.timeoutPerTool | duration | 30s | Maximum duration for a single tool execution |
p2p.toolIsolation.maxMemoryMB | int | 256 | Soft memory limit per subprocess in megabytes |
p2p.toolIsolation.container.enabled | bool | false | Use container-based sandbox instead of subprocess |
p2p.toolIsolation.container.runtime | string | auto | Container runtime: auto, docker, gvisor, native |
p2p.toolIsolation.container.image | string | lango-sandbox:latest | Docker image for sandbox container |
p2p.toolIsolation.container.networkMode | string | none | Docker network mode for sandbox containers |
p2p.toolIsolation.container.readOnlyRootfs | bool | true | Mount container root filesystem as read-only |
p2p.toolIsolation.container.cpuQuotaUs | int | 0 | Docker CPU quota in microseconds (0 = unlimited) |
p2p.toolIsolation.container.poolSize | int | 0 | Pre-warmed containers in pool (0 = disabled) |
p2p.toolIsolation.container.poolIdleTimeout | duration | 5m | Idle timeout before pool containers are recycled |
Economy¶
Experimental
The P2P economy layer is experimental. See P2P Economy.
Settings:
lango settings→ Economy
{
"economy": {
"enabled": false,
"budget": {
"defaultMax": "10.00",
"alertThresholds": [0.5, 0.8, 0.95],
"hardLimit": true
},
"risk": {
"escrowThreshold": "5.00",
"highTrustScore": 0.8,
"mediumTrustScore": 0.5
},
"negotiate": {
"enabled": false,
"maxRounds": 5,
"timeout": "5m",
"autoNegotiate": false,
"maxDiscount": 0.2
},
"escrow": {
"enabled": false,
"defaultTimeout": "24h",
"maxMilestones": 10,
"autoRelease": false,
"disputeWindow": "1h",
"settlement": {
"receiptTimeout": "2m",
"maxRetries": 3
},
"onChain": {
"enabled": false,
"mode": "hub",
"hubAddress": "",
"vaultFactoryAddress": "",
"vaultImplementation": "",
"arbitratorAddress": "",
"tokenAddress": "",
"pollInterval": "15s"
}
},
"pricing": {
"enabled": false,
"trustDiscount": 0.1,
"volumeDiscount": 0.05,
"minPrice": "0.01"
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
economy.enabled | bool | false | Enable the P2P economy layer |
economy.budget.defaultMax | string | 10.00 | Default maximum budget per task in USDC |
economy.budget.alertThresholds | []float64 | [0.5, 0.8, 0.95] | Budget usage percentages that trigger alerts |
economy.budget.hardLimit | bool | true | Enforce budget as a hard cap (reject overspend) |
economy.risk.escrowThreshold | string | 5.00 | USDC amount above which escrow is forced |
economy.risk.highTrustScore | float64 | 0.8 | Minimum trust score for DirectPay strategy |
economy.risk.mediumTrustScore | float64 | 0.5 | Minimum trust score for non-ZK strategies |
economy.negotiate.enabled | bool | false | Enable P2P negotiation protocol |
economy.negotiate.maxRounds | int | 5 | Maximum counter-offers per negotiation |
economy.negotiate.timeout | duration | 5m | Negotiation session timeout |
economy.negotiate.autoNegotiate | bool | false | Auto-generate counter-offers |
economy.negotiate.maxDiscount | float64 | 0.2 | Maximum discount for auto-negotiation (0-1) |
economy.escrow.enabled | bool | false | Enable milestone-based escrow |
economy.escrow.defaultTimeout | duration | 24h | Escrow expiration timeout |
economy.escrow.maxMilestones | int | 10 | Maximum milestones per escrow |
economy.escrow.autoRelease | bool | false | Auto-release funds when all milestones met |
economy.escrow.disputeWindow | duration | 1h | Time window for disputes after completion |
economy.escrow.settlement.receiptTimeout | duration | 2m | Max wait for on-chain receipt confirmation |
economy.escrow.settlement.maxRetries | int | 3 | Max transaction submission retries |
economy.escrow.onChain.enabled | bool | false | Enable on-chain escrow mode |
economy.escrow.onChain.mode | string | hub | On-chain escrow pattern: hub or vault |
economy.escrow.onChain.hubAddress | string | Deployed LangoEscrowHub contract address | |
economy.escrow.onChain.vaultFactoryAddress | string | Deployed LangoVaultFactory contract address | |
economy.escrow.onChain.vaultImplementation | string | LangoVault implementation address for cloning | |
economy.escrow.onChain.arbitratorAddress | string | Dispute arbitrator address | |
economy.escrow.onChain.tokenAddress | string | ERC-20 token (USDC) contract address | |
economy.escrow.onChain.pollInterval | duration | 15s | Event monitor polling interval |
economy.pricing.enabled | bool | false | Enable dynamic pricing adjustments |
economy.pricing.trustDiscount | float64 | 0.1 | Max discount for high-trust peers (0-1) |
economy.pricing.volumeDiscount | float64 | 0.05 | Max discount for high-volume peers (0-1) |
economy.pricing.minPrice | string | 0.01 | Minimum price floor in USDC |
Smart Account¶
Experimental
Smart Account support is experimental. See Smart Accounts.
Settings:
lango settings→ Smart Account / SA Session Keys / SA Paymaster / SA Modules
{
"smartAccount": {
"enabled": false,
"factoryAddress": "",
"entryPointAddress": "",
"safe7579Address": "",
"fallbackHandler": "",
"bundlerURL": "",
"session": {
"maxDuration": "24h",
"defaultGasLimit": 500000,
"maxActiveKeys": 10
},
"paymaster": {
"enabled": false,
"provider": "circle",
"rpcURL": "",
"tokenAddress": "",
"paymasterAddress": "",
"policyId": "",
"fallbackMode": "abort"
},
"modules": {
"sessionValidatorAddress": "",
"spendingHookAddress": "",
"escrowExecutorAddress": ""
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
smartAccount.enabled | bool | false | Enable ERC-7579 smart account subsystem |
smartAccount.factoryAddress | string | Safe factory contract address | |
smartAccount.entryPointAddress | string | ERC-4337 EntryPoint contract address | |
smartAccount.safe7579Address | string | Safe7579 adapter contract address | |
smartAccount.fallbackHandler | string | Safe fallback handler contract address | |
smartAccount.bundlerURL | string | ERC-4337 bundler RPC endpoint URL | |
smartAccount.session.maxDuration | duration | 24h | Maximum allowed session key duration |
smartAccount.session.defaultGasLimit | uint64 | 500000 | Default gas limit for session key operations |
smartAccount.session.maxActiveKeys | int | 10 | Maximum number of active session keys |
smartAccount.paymaster.enabled | bool | false | Enable paymaster for gasless transactions |
smartAccount.paymaster.provider | string | circle | Paymaster provider (circle, pimlico, alchemy) |
smartAccount.paymaster.mode | string | rpc | Paymaster mode: rpc (API-based) or permit (on-chain EIP-2612) |
smartAccount.paymaster.rpcURL | string | Paymaster provider RPC endpoint (required for rpc mode) | |
smartAccount.paymaster.tokenAddress | string | USDC token contract address | |
smartAccount.paymaster.paymasterAddress | string | Paymaster contract address | |
smartAccount.paymaster.policyId | string | Provider-specific policy ID (optional) | |
smartAccount.paymaster.fallbackMode | string | abort | Behavior when paymaster fails (abort, direct) |
smartAccount.modules.sessionValidatorAddress | string | LangoSessionValidator module contract address | |
smartAccount.modules.spendingHookAddress | string | LangoSpendingHook module contract address | |
smartAccount.modules.escrowExecutorAddress | string | LangoEscrowExecutor module contract address |
Observability¶
Experimental
The observability system is experimental. See Observability.
Settings:
lango settings→ Observability
{
"observability": {
"enabled": false,
"tokens": {
"enabled": true,
"persistHistory": false,
"retentionDays": 30
},
"health": {
"enabled": true,
"interval": "30s"
},
"audit": {
"enabled": false,
"retentionDays": 90
},
"metrics": {
"enabled": true,
"format": "json"
}
}
}
| Key | Type | Default | Description |
|---|---|---|---|
observability.enabled | bool | false | Enable the observability subsystem |
observability.tokens.enabled | bool | true | Enable token usage tracking |
observability.tokens.persistHistory | bool | false | Persist token usage to database |
observability.tokens.retentionDays | int | 30 | Days to retain token usage records |
observability.health.enabled | bool | true | Enable health check monitoring |
observability.health.interval | duration | 30s | Health check probe interval |
observability.audit.enabled | bool | false | Enable audit logging |
observability.audit.retentionDays | int | 90 | Days to retain audit records |
observability.metrics.enabled | bool | true | Enable metrics export endpoint |
observability.metrics.format | string | json | Metrics export format (json, prometheus) |
Cron¶
See Cron Scheduling for usage details and CLI reference.
Settings:
lango settings→ Cron Scheduler
{
"cron": {
"enabled": false,
"timezone": "UTC",
"maxConcurrentJobs": 5,
"defaultSessionMode": "isolated",
"historyRetention": "720h",
"defaultDeliverTo": []
}
}
| Key | Type | Default | Description |
|---|---|---|---|
cron.enabled | bool | false | Enable the cron scheduling system |
cron.timezone | string | UTC | Default timezone for cron expressions |
cron.maxConcurrentJobs | int | 5 | Maximum concurrently executing jobs |
cron.defaultSessionMode | string | isolated | Default session mode: isolated or main |
cron.historyRetention | duration | 720h | How long to retain execution history (30 days) |
cron.defaultDeliverTo | []string | [] | Default delivery channels for job results |
Background¶
Experimental
Background tasks are experimental. See Background Tasks.
Settings:
lango settings→ Background Tasks
{
"background": {
"enabled": false,
"yieldMs": 30000,
"maxConcurrentTasks": 3,
"defaultDeliverTo": []
}
}
| Key | Type | Default | Description |
|---|---|---|---|
background.enabled | bool | false | Enable the background task system |
background.yieldMs | int | 30000 | Auto-yield threshold in milliseconds |
background.maxConcurrentTasks | int | 3 | Maximum concurrently running tasks |
background.defaultDeliverTo | []string | [] | Default delivery channels for task results |
Workflow¶
Experimental
The workflow engine is experimental. See Workflow Engine and CLI reference.
Settings:
lango settings→ Workflow Engine
{
"workflow": {
"enabled": false,
"maxConcurrentSteps": 4,
"defaultTimeout": "10m",
"stateDir": "~/.lango/workflows/",
"defaultDeliverTo": []
}
}
| Key | Type | Default | Description |
|---|---|---|---|
workflow.enabled | bool | false | Enable the workflow engine |
workflow.maxConcurrentSteps | int | 4 | Maximum steps running in parallel |
workflow.defaultTimeout | duration | 10m | Default timeout per workflow step |
workflow.stateDir | string | ~/.lango/workflows/ | Directory for workflow state files |
workflow.defaultDeliverTo | []string | [] | Default delivery channels for workflow results |
Librarian¶
Experimental
The Proactive Librarian is experimental. See Proactive Librarian.
Settings:
lango settings→ Librarian
{
"librarian": {
"enabled": false,
"observationThreshold": 2,
"inquiryCooldownTurns": 3,
"maxPendingInquiries": 2,
"autoSaveConfidence": "high",
"provider": "",
"model": ""
}
}
| Key | Type | Default | Description |
|---|---|---|---|
librarian.enabled | bool | false | Enable the Proactive Librarian |
librarian.observationThreshold | int | 2 | Observations needed before triggering inquiry |
librarian.inquiryCooldownTurns | int | 3 | Minimum turns between inquiries |
librarian.maxPendingInquiries | int | 2 | Maximum pending inquiries at once |
librarian.autoSaveConfidence | string | high | Confidence level for auto-saving: low, medium, high |
librarian.provider | string | AI provider for librarian (empty = agent default) | |
librarian.model | string | Model for librarian (empty = agent default) |
Environment Variable Substitution¶
String configuration values support ${ENV_VAR} syntax for environment variable substitution. This is useful for sensitive values like API keys and tokens:
{
"providers": {
"my-provider": {
"type": "anthropic",
"apiKey": "${ANTHROPIC_API_KEY}"
}
},
"channels": {
"telegram": {
"botToken": "${TELEGRAM_BOT_TOKEN}"
}
}
}