# yaml-language-server: $schema=https://github.com/looplj/axonhub/releases/latest/download/config.schema.json # AxonHub Configuration Example # Copy this file to config.yml and modify as needed # Server configuration server: host: "0.0.0.0" # Server host (env: AXONHUB_SERVER_HOST) port: 8090 # Server port (env: AXONHUB_SERVER_PORT) name: "AxonHub" # Server name (env: AXONHUB_SERVER_NAME) base_path: "" # Base path for API routes (env: AXONHUB_SERVER_BASE_PATH) # pid_file: "~/.config/axonhub/axonhub.pid" # PID file for axonhub reload (env: AXONHUB_SERVER_PID_FILE) request_timeout: "30s" # Request timeout duration (env: AXONHUB_SERVER_REQUEST_TIMEOUT) llm_request_timeout: "600s" # LLM request timeout duration (env: AXONHUB_SERVER_LLM_REQUEST_TIMEOUT) trace: thread_header: "AH-Thread-Id" # Thread ID header name (env: AXONHUB_SERVER_TRACE_THREAD_HEADER) trace_header: "AH-Trace-Id" # Trace ID header name (env: AXONHUB_SERVER_TRACE_TRACE_HEADER) extra_trace_headers: [] # Extra trace headers (env: AXONHUB_SERVER_TRACE_EXTRA_TRACE_HEADERS) response_trace_headers: [] # Response headers for the resolved trace ID (env: AXONHUB_SERVER_TRACE_RESPONSE_TRACE_HEADERS) extra_trace_body_fields: [] # Extra trace body fields (env: AXONHUB_SERVER_TRACE_EXTRA_TRACE_BODY_FIELDS) claude_code_trace_enabled: false # Enable extracting trace IDs from Claude Code request metadata (env: AXONHUB_SERVER_TRACE_CLAUDE_CODE_TRACE_ENABLED) codex_trace_enabled: false # Enable extracting trace IDs from Codex Session_id header (env: AXONHUB_SERVER_TRACE_CODEX_TRACE_ENABLED) debug: false # Enable debug mode (env: AXONHUB_SERVER_DEBUG) disable_ssl_verify: false # Disable SSL certificate verification for self-signed certificates (env: AXONHUB_SERVER_DISABLE_SSL_VERIFY) cors: enabled: true # Enable CORS middleware (env: AXONHUB_SERVER_CORS_ENABLED) debug: false # Enable CORS debug logging (env: AXONHUB_SERVER_CORS_DEBUG) allowed_origins: # Allowed origins for CORS (env: AXONHUB_SERVER_CORS_ALLOWED_ORIGINS) - "http://localhost:3000" - "http://localhost:5173" allowed_methods: # Allowed HTTP methods (env: AXONHUB_SERVER_CORS_ALLOWED_METHODS) - "GET" - "POST" - "DELETE" - "PATCH" - "PUT" - "OPTIONS" - "HEAD" allowed_headers: # Allowed headers (env: AXONHUB_SERVER_CORS_ALLOWED_HEADERS) - "Content-Type" - "Authorization" - "X-API-Key" - "X-Goog-Api-Key" - "X-Project-ID" - "AH-Thread-Id" - "AH-Trace-Id" # Add any other headers your frontend sends exposed_headers: [] # Exposed headers (env: AXONHUB_SERVER_CORS_EXPOSED_HEADERS) allow_credentials: true # Allow credentials (env: AXONHUB_SERVER_CORS_ALLOW_CREDENTIALS) max_age: 1m # Max age for preflight cache in seconds (env: AXONHUB_SERVER_CORS_MAX_AGE) api: auth: allow_no_auth: false # Allow requests without API key (env: AXONHUB_SERVER_API_AUTH_ALLOW_NO_AUTH) key_prefix: "ah" # API key prefix (env: AXONHUB_SERVER_API_AUTH_KEY_PREFIX) # Default: "ah" # Examples: "sk" generates "sk-<64hex>", "myapp" generates "myapp-<64hex>" # IP Access Control - Whitelist mode # When enabled, only requests from allowed IPs/CIDRs can access the server. # Non-allowed requests are redirected to the configured URL. # Edit this section, then send SIGHUP to apply it without restarting. ip_access_control: enabled: false # Enable IP whitelist (env: AXONHUB_SERVER_IP_ACCESS_CONTROL_ENABLED) allowed_ips: # Allowed IPs or CIDR ranges (env: AXONHUB_SERVER_IP_ACCESS_CONTROL_ALLOWED_IPS) - "192.168.1.0/24" - "10.0.0.1" redirect_url: "https://example.com/unauthorized" # Redirect target for non-allowed IPs (env: AXONHUB_SERVER_IP_ACCESS_CONTROL_REDIRECT_URL) # Database configuration db: dialect: "sqlite3" # Database dialect: sqlite3, postgres, mysql (env: AXONHUB_DB_DIALECT) dsn: "file:axonhub.db?cache=shared&_fk=1&_pragma=journal_mode(WAL)" # Database connection string (env: AXONHUB_DB_DSN) disable_auto_migration: false # Disable auto-migration (env: AXONHUB_DB_DISABLE_AUTO_MIGRATION) disable_sqlite_auto_wal: false # Disable auto-enabling WAL mode for SQLite (env: AXONHUB_DB_DISABLE_SQLITE_AUTO_WAL) debug: false # Enable database debug logging (env: AXONHUB_DB_DEBUG) max_open_conns: 20 # Maximum open DB connections shared by the app (env: AXONHUB_DB_MAX_OPEN_CONNS) max_idle_conns: 10 # Maximum idle DB connections kept in the pool (env: AXONHUB_DB_MAX_IDLE_CONNS) conn_max_lifetime: "30m" # Recycle DB connections before server/network timeouts (env: AXONHUB_DB_CONN_MAX_LIFETIME) conn_max_idle_time: "10m" # Close long-idle pooled connections (env: AXONHUB_DB_CONN_MAX_IDLE_TIME) read_replica: # Optional read replica for read-write separation (env: AXONHUB_DB_READ_REPLICA_*) read_dsn: "" # Read replica DSN; leave empty to disable (env: AXONHUB_DB_READ_REPLICA_READ_DSN) read_max_open_conns: 0 # Max open connections for replica (env: AXONHUB_DB_READ_REPLICA_READ_MAX_OPEN_CONNS) read_max_idle_conns: 0 # Max idle connections for replica (env: AXONHUB_DB_READ_REPLICA_READ_MAX_IDLE_CONNS) # Cache configuration cache: # One of: memory, redis, two-level (memory + redis) mode: "memory" # (env: AXONHUB_CACHE_MODE) # Memory cache configuration memory: expiration: "5s" # Memory cache TTL (env: AXONHUB_CACHE_MEMORY_EXPIRATION) cleanup_interval: "10m" # Memory cache cleanup interval (env: AXONHUB_CACHE_MEMORY_CLEANUP_INTERVAL) # Redis cache configuration redis: # Simple mode: Use addr for plain host:port addr: "" # Deprecated. Redis address (host:port) (env: AXONHUB_CACHE_REDIS_ADDR) # URL mode: Use url for full redis:// or rediss:// URLs (takes priority over addr) # Supported formats: # - "redis://127.0.0.1:6379" # - "rediss://127.0.0.1:6380" (auto-enables TLS) # - "redis://user:pass@127.0.0.1:6379/0" url: "" # Redis URL (env: AXONHUB_CACHE_REDIS_URL) # Optional overrides (apply to both addr and url modes) addrs: [] # Overrides URL host (env: AXONHUB_CACHE_REDIS_ADDRS) username: "" # Overrides URL username (env: AXONHUB_CACHE_REDIS_USERNAME) password: "" # Overrides URL password (env: AXONHUB_CACHE_REDIS_PASSWORD) db: 0 # Overrides URL /db (env: AXONHUB_CACHE_REDIS_DB) master_name: "" # Redis Sentinel Mode master_name (env: AXONHUB_CACHE_REDIS_MASTER_NAME) sentinel_username: "" # Redis Sentinel Mode sentinel_username (env: AXONHUB_CACHE_REDIS_SENTINEL_USERNAME) sentinel_password: "" # Redis Sentinel Mode sentinel_password (env: AXONHUB_CACHE_REDIS_SENTINEL_PASSWORD) route_by_latency: false # Redis v8 feature, NewFailoverClusterClient by route_by_latency (env: AXONHUB_CACHE_REDIS_ROUTE_BY_LATENCY) route_randomly: false # Redis v8 feature, NewFailoverClusterClient by route_randomly (env: AXONHUB_CACHE_REDIS_ROUTE_RANDOMLY) is_cluster_mode: false # Enable Redis Cluster Mode (env: AXONHUB_CACHE_REDIS_IS_CLUSTER_MODE) tls: false # Enable TLS for addr mode (env: AXONHUB_CACHE_REDIS_TLS) tls_insecure_skip_verify: false # Skip TLS cert verification (env: AXONHUB_CACHE_REDIS_TLS_INSECURE_SKIP_VERIFY) expiration: "30m" # Redis cache TTL (env: AXONHUB_CACHE_REDIS_EXPIRATION) # Logging configuration log: name: "axonhub" # Logger name (env: AXONHUB_LOG_NAME) debug: false # Enable debug logging (env: AXONHUB_LOG_DEBUG) level: "info" # Log level: debug, info, warn, error, panic, fatal (env: AXONHUB_LOG_LEVEL) level_key: "level" # Key name for log level field (env: AXONHUB_LOG_LEVEL_KEY) time_key: "time" # Key name for timestamp field (env: AXONHUB_LOG_TIME_KEY) caller_key: "label" # Key name for caller info field (env: AXONHUB_LOG_CALLER_KEY) function_key: "" # Key name for function field (env: AXONHUB_LOG_FUNCTION_KEY) name_key: "logger" # Key name for logger name field (env: AXONHUB_LOG_NAME_KEY) encoding: "json" # Log encoding: json, console, console_json (env: AXONHUB_LOG_ENCODING) includes: [] # Logger names to include (env: AXONHUB_LOG_INCLUDES) excludes: [] # Logger names to exclude (env: AXONHUB_LOG_EXCLUDES) output: "stdio" # Output target: file or stdio (env: AXONHUB_LOG_OUTPUT) file: # File-based logging configuration (env prefix: AXONHUB_LOG_FILE_*) path: "logs/axonhub.log" # Log file path (env: AXONHUB_LOG_FILE_PATH) max_size: 100 # Max size in MB before rotation (env: AXONHUB_LOG_FILE_MAX_SIZE) max_age: 30 # Max age in days to retain (env: AXONHUB_LOG_FILE_MAX_AGE) max_backups: 10 # Max number of old log files to retain (env: AXONHUB_LOG_FILE_MAX_BACKUPS) local_time: true # Use local time for rotated files (env: AXONHUB_LOG_FILE_LOCAL_TIME) # Metrics configuration metrics: enabled: false # Enable metrics collection (env: AXONHUB_METRICS_ENABLED) exporter: type: "otlphttp" # Metrics exporter type: prometheus, console (env: AXONHUB_METRICS_EXPORTER_TYPE) endpoint: "localhost:8080" # Metrics exporter endpoint (env: AXONHUB_METRICS_EXPORTER_ENDPOINT) insecure: true # Enable insecure connection (env: AXONHUB_METRICS_EXPORTER_INSECURE) # Garbage Collection configuration gc: cron: "0 2 * * *" # Cron expression for GC execution (env: AXONHUB_GC_CRON) # This example runs daily at 2:00 AM # Format: minute hour day month day_of_week # Examples: # "0 2 * * *" - Daily at 2:00 AM # "0 3 * * 0" - Weekly on Sunday at 3:00 AM # "0 4 1 * *" - Monthly on 1st day at 4:00 AM vacuum_enabled: false # Enable VACUUM after cleanup (env: AXONHUB_GC_VACUUM_ENABLED) # Supported for SQLite and PostgreSQL # SQLite: Rebuilds database file to reclaim space # PostgreSQL: Reclaims space from dead tuples vacuum_full: false # Use VACUUM FULL for PostgreSQL (env: AXONHUB_GC_VACUUM_FULL) # true = VACUUM FULL (reclaims more space but locks tables) # false = VACUUM (allows concurrent operations) # Note: SQLite always uses plain VACUUM # Provider Quota configuration provider_quota: check_interval: "5m" # Interval for checking provider quota status (env: AXONHUB_PROVIDER_QUOTA_CHECK_INTERVAL) # Supported values: 1m, 2m, 3m, 4m, 5m, 6m, 10m, 12m, 15m, 20m, 30m, 1h, 2h, etc. # Default: 5m # Longer intervals reduce API calls but show less fresh quota data warning_check_interval_ratio: 4 # Ratio for reduced warning-state check interval (env: AXONHUB_PROVIDER_QUOTA_WARNING_CHECK_INTERVAL_RATIO) # Warning channels are checked at check_interval / ratio # Default: 4 (warning channels checked every 20m with 5m base interval) # Environment Variable Examples: # export AXONHUB_SERVER_PORT=8080 # export AXONHUB_DB_DSN="postgres://user:pass@localhost/axonhub?sslmode=disable" # export AXONHUB_LOG_LEVEL="debug" # export AXONHUB_LOG_ENCODING="console" # export AXONHUB_LOG_OUTPUT="stdio" # or "file" # export AXONHUB_LOG_FILE_PATH="/var/log/axonhub/axonhub.log" # export AXONHUB_LOG_FILE_MAX_SIZE=200 # export AXONHUB_LOG_FILE_MAX_AGE=14 # export AXONHUB_LOG_FILE_MAX_BACKUPS=7 # export AXONHUB_SERVER_TRACE_HEADER="X-Trace-ID" # export AXONHUB_METRICS_ENABLED=false # export AXONHUB_GC_CRON="0 3 * * 0" # Run weekly on Sunday at 3:00 AM