{ "_description": "Tunables for core/* modules. Loaded via core.config_loader.load('core').", "brain": { "allowed_callback_prefixes": [ "Project.Sanad.motion.", "Project.Sanad.voice.", "motion.", "voice." ], "gestural_speaking_default": false }, "logger": { "log_level": "INFO", "format": "%(asctime)s [%(name)s] %(levelname)-7s %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", "file_max_bytes": 10485760, "file_backup_count": 7 }, "event_bus": { "emit_timeout_sec": 0.5 }, "paths": { "_comment": "Path roots — resolved against BASE_DIR in core/config.py", "data": "data", "logs": "logs", "scripts": "scripts", "model": "model", "audio_recordings": "data/audio", "motion_recordings": "data/recordings/motion", "motions": "data/motions" }, "gemini_defaults": { "_comment": "Baseline Gemini API config — SINGLE SOURCE OF TRUTH. All voice modules read from here.", "api_key": "AIzaSyDt9Xi83MDZuuPpfwfHyMD92X7ZKdGkqf8", "model_live": "gemini-2.5-flash-native-audio-preview-12-2025", "model_ws_uri": "wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent", "voice_name": "Charon", "ws_timeout_sec": 30, "default_system_prompt": "You are Sanad (Bousandah), a wise and friendly Emirati assistant. Speak strictly in the UAE dialect (Khaleeji). Be helpful, concise, and use local greetings like 'Marhaba' and 'Ya Khoy'." }, "g1_hardware": { "_comment": "G1 humanoid hardware constants — shared by every motion/voice module that talks to the arm.", "num_motor": 29, "enable_arm_sdk_index": 29, "replay_hz": 60.0 }, "script_files": { "_comment": "Filenames (under scripts/) used across voice + dashboard", "persona": "sanad_v2", "rules": "sanad_rule.txt", "arm_phrases": "sanad_arm.txt" }, "dashboard_defaults": { "host": null, "port": 8000, "interface": "wlan0" }, "audio_defaults": { "_comment": "Host PulseAudio fallback only — the G1 deployment uses UDP multicast mic + AudioClient.PlayStream speaker (see SANAD_USE_G1_MIC in config.py LIVE_TUNE). Default here is the Jetson/G1 built-in platform-sound chip.", "send_sample_rate": 16000, "receive_sample_rate": 24000, "chunk_size": 512, "channels": 1, "sink": "alsa_output.platform-sound.analog-stereo", "source": "alsa_input.platform-sound.analog-stereo" }, "dds": { "network_interface_default": "eth0" }, "camera": { "_comment": "Recognition tab camera daemon (parent process reads this). width/height/fps/jpeg_quality + the reconnect knobs configure CameraDaemon. Frames are cached in memory and pushed to the Gemini child over its stdin (no file drop). send_hz/stale_ms are read by the Gemini child via SANAD_VISION_SEND_HZ / SANAD_VISION_STALE_MS env vars (LIVE_TUNE).", "width": 424, "height": 240, "fps": 15, "jpeg_quality": 70, "send_hz": 2, "stale_ms": 1500, "stale_threshold_s": 10.0, "reconnect_min_s": 2.0, "reconnect_max_s": 10.0, "capture_timeout_ms": 5000 }, "faces": { "_comment": "Face gallery for Gemini-side recognition. Folder layout: data/faces/face_{id}/{face_1.jpg, ...} + optional meta.json {\"name\": \"...\"}. Gemini does the matching — no local ML model.", "dir_rel": "data/faces", "max_samples_per_face": 3, "primer_resize_long_side": 256 } }