{ "_description": "Tunables for gemini/* modules. Loaded via core.config_loader.load('gemini'). API credentials (api_key, model, voice_name) still live in core_config.json > gemini_defaults — single source of truth shared with config.py.", "client": { "_comment": "gemini/client.py — short-session WebSocket client used by dashboard /generate + typed replay. default_system_prompt comes from core.gemini_defaults.", "recv_timeout_sec": 30, "reconnect_max_attempts": 3, "reconnect_initial_delay_sec": 1.0, "reconnect_max_delay_sec": 10.0 }, "subprocess": { "_comment": "gemini/subprocess.py — GeminiSubprocess supervisor. Spawns voice/sanad_voice.py as a child, tails stdout for Gemini-specific log markers, exposes transcript + state to the dashboard.", "log_tail_size": 2000, "transcript_tail_size": 30, "log_name": "gemini_subprocess", "stop_timeout_sec": 3.0, "terminate_timeout_sec": 2.0, "noisy_prefixes": [ "ALSA lib ", "Expression 'alsa_", "Cannot connect to server socket", "jack server is not running" ], "noisy_fragments": [ "Unknown PCM", "Evaluate error", "snd_pcm_open_noupdate", "PaAlsaStream", "snd_config_evaluate", "snd_func_refer" ] } }