diff --git a/README.md b/README.md index 343e56d..969c397 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,6 @@ Create `~/.config/lel/config.json`: "backend": "clipboard", "remove_transcription_from_clipboard": false }, - "ai": { "enabled": true }, "vocabulary": { "replacements": [ { "from": "Martha", "to": "Marta" }, @@ -111,7 +110,6 @@ Create `~/.config/lel/config.json`: Recording input can be a device index (preferred) or a substring of the device name. -`ai.enabled` is accepted for compatibility but currently has no runtime effect. AI cleanup is always enabled and uses the locked local Llama-3.2-3B GGUF model downloaded to `~/.cache/lel/models/` on first use. diff --git a/config.example.json b/config.example.json index 6c1dc63..2502ebd 100644 --- a/config.example.json +++ b/config.example.json @@ -13,9 +13,6 @@ "backend": "clipboard", "remove_transcription_from_clipboard": false }, - "ai": { - "enabled": true - }, "vocabulary": { "replacements": [ { diff --git a/src/config.py b/src/config.py index 2b2299c..3810980 100644 --- a/src/config.py +++ b/src/config.py @@ -41,11 +41,6 @@ class InjectionConfig: remove_transcription_from_clipboard: bool = False -@dataclass -class AiConfig: - enabled: bool = True - - @dataclass class VocabularyReplacement: source: str @@ -72,7 +67,6 @@ class Config: recording: RecordingConfig = field(default_factory=RecordingConfig) stt: SttConfig = field(default_factory=SttConfig) injection: InjectionConfig = field(default_factory=InjectionConfig) - ai: AiConfig = field(default_factory=AiConfig) vocabulary: VocabularyConfig = field(default_factory=VocabularyConfig) domain_inference: DomainInferenceConfig = field(default_factory=DomainInferenceConfig) @@ -119,9 +113,6 @@ def validate(cfg: Config) -> None: if not isinstance(cfg.injection.remove_transcription_from_clipboard, bool): raise ValueError("injection.remove_transcription_from_clipboard must be boolean") - if not isinstance(cfg.ai.enabled, bool): - raise ValueError("ai.enabled must be boolean") - cfg.vocabulary.max_rules = _validated_limit(cfg.vocabulary.max_rules, "vocabulary.max_rules") cfg.vocabulary.max_terms = _validated_limit(cfg.vocabulary.max_terms, "vocabulary.max_terms") @@ -151,6 +142,10 @@ def _from_dict(data: dict[str, Any], cfg: Config) -> Config: raise ValueError("logging section is no longer supported; use -v/--verbose") if "log_transcript" in data: raise ValueError("log_transcript is no longer supported; use -v/--verbose") + if "ai" in data: + raise ValueError("ai section is no longer supported") + if "ai_enabled" in data: + raise ValueError("ai_enabled is no longer supported") has_sections = any( key in data @@ -159,7 +154,6 @@ def _from_dict(data: dict[str, Any], cfg: Config) -> Config: "recording", "stt", "injection", - "ai", "vocabulary", "domain_inference", ) @@ -169,7 +163,6 @@ def _from_dict(data: dict[str, Any], cfg: Config) -> Config: recording = _ensure_dict(data.get("recording"), "recording") stt = _ensure_dict(data.get("stt"), "stt") injection = _ensure_dict(data.get("injection"), "injection") - ai = _ensure_dict(data.get("ai"), "ai") vocabulary = _ensure_dict(data.get("vocabulary"), "vocabulary") domain_inference = _ensure_dict(data.get("domain_inference"), "domain_inference") @@ -188,8 +181,6 @@ def _from_dict(data: dict[str, Any], cfg: Config) -> Config: injection["remove_transcription_from_clipboard"], "injection.remove_transcription_from_clipboard", ) - if "enabled" in ai: - cfg.ai.enabled = _as_bool(ai["enabled"], "ai.enabled") if "replacements" in vocabulary: cfg.vocabulary.replacements = _as_replacements(vocabulary["replacements"]) if "terms" in vocabulary: @@ -218,8 +209,6 @@ def _from_dict(data: dict[str, Any], cfg: Config) -> Config: cfg.stt.device = _as_nonempty_str(data["whisper_device"], "whisper_device") if "injection_backend" in data: cfg.injection.backend = _as_nonempty_str(data["injection_backend"], "injection_backend") - if "ai_enabled" in data: - cfg.ai.enabled = _as_bool(data["ai_enabled"], "ai_enabled") return cfg diff --git a/tests/test_config.py b/tests/test_config.py index 365e6c3..d60fd18 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -26,7 +26,6 @@ class ConfigTests(unittest.TestCase): self.assertEqual(cfg.stt.device, "cpu") self.assertEqual(cfg.injection.backend, "clipboard") self.assertFalse(cfg.injection.remove_transcription_from_clipboard) - self.assertTrue(cfg.ai.enabled) self.assertEqual(cfg.vocabulary.replacements, []) self.assertEqual(cfg.vocabulary.terms, []) self.assertEqual(cfg.vocabulary.max_rules, 500) @@ -43,7 +42,6 @@ class ConfigTests(unittest.TestCase): "backend": "injection", "remove_transcription_from_clipboard": True, }, - "ai": {"enabled": False}, "vocabulary": { "replacements": [ {"from": "Martha", "to": "Marta"}, @@ -67,7 +65,6 @@ class ConfigTests(unittest.TestCase): self.assertEqual(cfg.stt.device, "cuda") self.assertEqual(cfg.injection.backend, "injection") self.assertTrue(cfg.injection.remove_transcription_from_clipboard) - self.assertFalse(cfg.ai.enabled) self.assertEqual(cfg.vocabulary.max_rules, 100) self.assertEqual(cfg.vocabulary.max_terms, 200) self.assertEqual(len(cfg.vocabulary.replacements), 2) @@ -84,7 +81,6 @@ class ConfigTests(unittest.TestCase): "whisper_model": "tiny", "whisper_device": "cpu", "injection_backend": "clipboard", - "ai_enabled": False, } with tempfile.TemporaryDirectory() as td: path = Path(td) / "config.json" @@ -98,7 +94,6 @@ class ConfigTests(unittest.TestCase): self.assertEqual(cfg.stt.device, "cpu") self.assertEqual(cfg.injection.backend, "clipboard") self.assertFalse(cfg.injection.remove_transcription_from_clipboard) - self.assertFalse(cfg.ai.enabled) self.assertEqual(cfg.vocabulary.replacements, []) def test_invalid_injection_backend_raises(self): @@ -119,6 +114,24 @@ class ConfigTests(unittest.TestCase): with self.assertRaisesRegex(ValueError, "injection.remove_transcription_from_clipboard"): load(str(path)) + def test_removed_ai_section_raises(self): + payload = {"ai": {"enabled": True}} + with tempfile.TemporaryDirectory() as td: + path = Path(td) / "config.json" + path.write_text(json.dumps(payload), encoding="utf-8") + + with self.assertRaisesRegex(ValueError, "ai section is no longer supported"): + load(str(path)) + + def test_removed_legacy_ai_enabled_raises(self): + payload = {"ai_enabled": True} + with tempfile.TemporaryDirectory() as td: + path = Path(td) / "config.json" + path.write_text(json.dumps(payload), encoding="utf-8") + + with self.assertRaisesRegex(ValueError, "ai_enabled is no longer supported"): + load(str(path)) + def test_removed_logging_section_raises(self): payload = {"logging": {"log_transcript": True}} with tempfile.TemporaryDirectory() as td: diff --git a/tests/test_leld.py b/tests/test_leld.py index d64cbea..dbc23cb 100644 --- a/tests/test_leld.py +++ b/tests/test_leld.py @@ -85,7 +85,6 @@ class FakeAudio: class DaemonTests(unittest.TestCase): def _config(self) -> Config: cfg = Config() - cfg.ai.enabled = False return cfg @patch("leld.stop_audio_recording", return_value=FakeAudio(8))