{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Rex AI Assistant Configuration", "description": "Runtime configuration for Rex AI Assistant (non-secret settings)", "type": "object", "properties": { "active_profile": { "type": "string", "description": "Active profile name to load from the profiles directory", "default": "default" }, "profiles_dir": { "type": "string", "description": "Directory containing profile JSON files", "default": "profiles" }, "audio": { "type": "object", "description": "Audio device and sampling configuration", "properties": { "input_device_index": { "type": ["integer", "null"], "description": "Audio input device index (null for system default)", "minimum": 0 }, "output_device_index": { "type": ["integer", "null"], "description": "Audio output device index (null for system default)", "minimum": 0 }, "sample_rate": { "type": "integer", "description": "Audio sample rate in Hz", "default": 16000, "minimum": 8000, "maximum": 48000 } }, "required": ["sample_rate"] }, "wakeword": { "type": "object", "description": "Wake word detection settings", "properties": { "backend": { "type": "string", "description": "Wake word detection backend (openwakeword, custom_onnx, custom_embedding)", "default": "openwakeword" }, "wakeword": { "type": "string", "description": "Wake word phrase", "default": "rex" }, "keyword": { "type": ["string", "null"], "description": "Alternative wake word keyword (overrides wakeword if set)" }, "model_path": { "type": ["string", "null"], "description": "Custom wake word model path for custom_onnx backend" }, "embedding_path": { "type": ["string", "null"], "description": "Custom wake word embedding path for custom_embedding backend" }, "fallback_to_builtin": { "type": "boolean", "description": "Fall back to a built-in wake word when custom model is missing", "default": true }, "fallback_keyword": { "type": "string", "description": "Preferred built-in fallback keyword", "default": "hey jarvis" }, "threshold": { "type": "number", "description": "Detection threshold (0.0 to 1.0)", "default": 0.5, "minimum": 0, "maximum": 1 }, "window": { "type": "number", "description": "Detection window in seconds", "default": 1.0, "minimum": 0.1 }, "poll_interval": { "type": "number", "description": "Poll interval in seconds", "default": 0.01, "minimum": 0.001 }, "wake_sound_path": { "type": ["string", "null"], "description": "Path to wake acknowledgment sound file" } } }, "models": { "type": "object", "description": "AI model configuration", "properties": { "llm_provider": { "type": "string", "description": "LLM provider (transformers, openai, openrouter, anthropic, ollama)", "default": "transformers" }, "llm_backend": { "type": ["string", "null"], "description": "LLM backend (alias for llm_provider)" }, "llm_model": { "type": ["string", "null"], "description": "LLM model name or path" }, "llm_max_tokens": { "type": "integer", "description": "Maximum tokens to generate", "default": 120, "minimum": 1 }, "llm_temperature": { "type": "number", "description": "Sampling temperature", "default": 0.7, "minimum": 0, "maximum": 5 }, "autonomy_mode": { "type": "string", "description": "Assistant autonomy level used by Settings > AI and runtime planning", "enum": ["manual", "supervised", "full-auto"], "default": "manual" }, "llm_top_p": { "type": "number", "description": "Top-p (nucleus) sampling parameter", "default": 0.9, "minimum": 0, "maximum": 1 }, "llm_top_k": { "type": ["integer", "null"], "description": "Top-k sampling parameter", "minimum": 1 }, "llm_seed": { "type": ["integer", "null"], "description": "Random seed for reproducibility" }, "stt_model": { "type": "string", "description": "Whisper model size (tiny, base, small, medium, large)", "default": "base" }, "stt_device": { "type": "string", "description": "Device for STT model (cpu, cuda)", "default": "cpu" }, "tts_provider": { "type": "string", "description": "TTS provider (xtts, edge, piper, pyttsx3)", "default": "xtts" }, "tts_model": { "type": ["string", "null"], "description": "TTS model name" }, "tts_voice": { "type": ["string", "null"], "description": "TTS voice name" }, "tts_speed": { "type": "number", "description": "XTTS speaking rate multiplier", "default": 1.08, "minimum": 0.5, "maximum": 2.0 }, "windows_tts_voice_index": { "type": ["integer", "null"], "description": "Windows TTS voice index" } } }, "runtime": { "type": "object", "description": "Runtime behavior settings", "properties": { "log_level": { "type": "string", "description": "Logging level", "enum": ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], "default": "INFO" }, "file_logging_enabled": { "type": "boolean", "description": "Enable file logging", "default": false }, "background_voice_enabled": { "type": "boolean", "description": "Start persistent background wake-word listening after setup; false unless the household explicitly opts in", "default": false }, "transcripts_enabled": { "type": "boolean", "description": "Enable conversation transcripts", "default": true }, "transcripts_dir": { "type": "string", "description": "Directory for transcript files", "default": "transcripts" }, "active_user": { "type": ["string", "null"], "description": "Active user profile name" }, "user_id": { "type": "string", "description": "User identifier", "default": "default" }, "memory_max_turns": { "type": "integer", "description": "Maximum conversation turns to remember", "default": 50, "minimum": 1 }, "warm_runtime_max_cost_mb": { "type": "number", "description": "Approximate retained-cache accounting ceiling for managed warm components; not an exact RSS/VRAM limit", "default": 6144.0, "minimum": 0 }, "warm_runtime_idle_timeout_s": { "type": "number", "description": "Idle seconds before an unused managed warm component becomes evictable", "default": 900.0, "minimum": 0 }, "command_duration": { "type": "number", "description": "Command recording duration in seconds", "default": 5.0, "minimum": 0.5 }, "capture_seconds": { "type": "number", "description": "Audio capture duration in seconds", "default": 5.0, "minimum": 0.5 }, "detection_frame_seconds": { "type": "number", "description": "Detection frame duration in seconds", "default": 1.0, "minimum": 0.1 }, "conversation_export": { "type": "boolean", "description": "Enable conversation export", "default": true }, "speak_language": { "type": "string", "description": "TTS language code", "default": "en" } } }, "voice_identity": { "type": "object", "description": "Voice identity speaker-recognition scaffolding settings", "properties": { "enabled": { "type": "boolean", "description": "Enable voice identity before STT in the voice loop", "default": false }, "accept_threshold": { "type": "number", "description": "Cosine similarity threshold for recognized speaker", "default": 0.85, "minimum": 0, "maximum": 1 }, "review_threshold": { "type": "number", "description": "Cosine similarity threshold for review decision", "default": 0.65, "minimum": 0, "maximum": 1 }, "embedding_dim": { "type": "integer", "description": "Expected embedding vector dimensionality", "default": 192, "minimum": 1 }, "model_id": { "type": "string", "description": "Identifier for active embedding model", "default": "synthetic" } } }, "search": { "type": "object", "description": "Web search configuration", "properties": { "providers": { "type": "string", "description": "Comma-separated list of search providers", "default": "serpapi,brave,duckduckgo,google" } } }, "home_assistant": { "type": "object", "description": "Home Assistant integration", "properties": { "base_url": { "type": ["string", "null"], "description": "Home Assistant base URL" }, "verify_ssl": { "type": "boolean", "description": "Verify SSL certificates", "default": true }, "timeout": { "type": "number", "description": "Request timeout in seconds", "default": 10.0, "minimum": 1 } } }, "ollama": { "type": "object", "description": "Ollama configuration", "properties": { "base_url": { "type": "string", "description": "Ollama base URL", "default": "http://localhost:11434" }, "use_cloud": { "type": "boolean", "description": "Use cloud-hosted Ollama", "default": false } } }, "openai": { "type": "object", "description": "OpenAI configuration", "properties": { "model": { "type": ["string", "null"], "description": "OpenAI model name" }, "base_url": { "type": ["string", "null"], "description": "OpenAI API base URL (for compatible APIs)" } } }, "openrouter": { "type": "object", "description": "OpenRouter configuration using its OpenAI-compatible API", "properties": { "model": { "type": ["string", "null"], "description": "OpenRouter model slug, for example openai/gpt-4o" }, "base_url": { "type": "string", "description": "Official OpenRouter API base URL", "const": "https://openrouter.ai/api/v1", "default": "https://openrouter.ai/api/v1" } } }, "api": { "type": "object", "description": "API server configuration", "properties": { "rate_limit": { "type": "string", "description": "Rate limit (e.g., '30/minute')", "default": "30/minute" }, "allowed_origins": { "type": "array", "description": "Allowed CORS origins", "items": { "type": "string" }, "default": ["*"] } } }, "ui": { "type": "object", "description": "User interface settings", "properties": { "start_minimized": { "type": "boolean", "description": "Start GUI minimized", "default": false } } }, "model_routing": { "type": "object", "description": "Maps task categories to LLM model identifiers. Empty string means fall back to models.llm_model.", "properties": { "default": { "type": "string", "description": "Default model for unclassified requests (empty = use models.llm_model)", "default": "" }, "coding": { "type": "string", "description": "Model for code generation and debugging tasks", "default": "" }, "reasoning": { "type": "string", "description": "Model for complex multi-step reasoning tasks", "default": "" }, "search": { "type": "string", "description": "Model for web search and research tasks", "default": "" }, "vision": { "type": "string", "description": "Model for image description and visual tasks", "default": "" }, "fast": { "type": "string", "description": "Model for simple factual questions requiring low latency", "default": "" } } } }, "required": ["audio", "wakeword", "models", "runtime"] }