Skip to content

Commit 4074840

Browse files
committed
fix: route OVOS-INTENT-4 spec handlers through container-shape hooks
handle_register_template/handle_register_entity/handle_disable_intent/ handle_enable_intent called the flat IntentContainer API directly, which DomainIntentContainer does not implement. Add _container_exclude_keywords and _container_get_intent_samples hooks (with domain-routing overrides) and use the existing hooks everywhere so the spec handlers work for both the flat and hierarchical/domain pipelines.
1 parent 1d2b628 commit 4074840

1 file changed

Lines changed: 32 additions & 8 deletions

File tree

padacioso/opm.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ def _container_has_intent(self, container, name: str) -> bool:
225225
"""Return whether the container already knows ``name`` (reload path)."""
226226
return name in getattr(container, "intent_samples", {})
227227

228+
def _container_exclude_keywords(self, container, name: str,
229+
keywords: List[str]) -> None:
230+
"""Register suppression keywords for ``name`` on the container."""
231+
container.exclude_keywords(name, keywords)
232+
233+
def _container_get_intent_samples(self, container, name: str) -> Optional[List[str]]:
234+
"""Return the live registered samples for ``name``, or ``None``."""
235+
return getattr(container, "intent_samples", {}).get(name)
236+
228237
# ------------------------------------------------------------------
229238

230239
def __detach_intent(self, intent_name):
@@ -440,14 +449,14 @@ def handle_register_template(self, message: Message):
440449
self._template_samples[(lang, name)] = list(samples)
441450
self._store_context_gate(name, data)
442451
try:
443-
self.containers[lang].add_intent(name, samples)
452+
self._container_add_intent(self.containers[lang], name, samples)
444453
except RuntimeError:
445-
if name not in self.containers[lang].intent_samples:
454+
if not self._container_has_intent(self.containers[lang], name):
446455
raise
447456

448457
blacklist = data.get("blacklist")
449458
if blacklist: # §6.1 suppression phrases
450-
self.containers[lang].exclude_keywords(name, list(blacklist))
459+
self._container_exclude_keywords(self.containers[lang], name, list(blacklist))
451460

452461
def handle_register_entity(self, message: Message):
453462
"""OVOS-INTENT-4 §7 — register an entity value-set hint."""
@@ -479,7 +488,7 @@ def handle_register_entity(self, message: Message):
479488
e for e in self.registered_entities
480489
if not (e.get("name") == name and e.get("lang") == lang)]
481490
self.registered_entities.append({"name": name, "lang": lang})
482-
self.containers[lang].add_entity(name, samples)
491+
self._container_add_entity(self.containers[lang], name, samples)
483492

484493
def _intent_langs(self, message: Message) -> List[str]:
485494
"""Resolve which container langs a deregister/enable/disable targets.
@@ -539,20 +548,20 @@ def handle_disable_intent(self, message: Message):
539548
intent_name = message.data.get("intent_name")
540549
name = self._internal_name(skill_id, intent_name)
541550
for lang in self._intent_langs(message):
542-
samples = self.containers[lang].intent_samples.get(name)
551+
samples = self._container_get_intent_samples(self.containers[lang], name)
543552
if samples is not None:
544553
# retain the live samples so a legacy-registered intent (which
545554
# never populated ``_template_samples``) can still be re-armed
546555
self._disabled_intents[(lang, name)] = list(samples)
547-
self.containers[lang].remove_intent(name)
556+
self._container_remove_intent(self.containers[lang], name)
548557

549558
def handle_enable_intent(self, message: Message):
550559
"""OVOS-INTENT-4 §8.5 — re-arm a previously disabled intent."""
551560
skill_id = message.data.get("skill_id")
552561
intent_name = message.data.get("intent_name")
553562
name = self._internal_name(skill_id, intent_name)
554563
for lang in self._intent_langs(message):
555-
if name in self.containers[lang].intent_samples:
564+
if self._container_has_intent(self.containers[lang], name):
556565
self._disabled_intents.pop((lang, name), None)
557566
continue # already enabled, no-op
558567
# prefer the samples stashed at disable time (works for both the
@@ -561,7 +570,7 @@ def handle_enable_intent(self, message: Message):
561570
samples = (self._disabled_intents.pop((lang, name), None)
562571
or self._template_samples.get((lang, name)))
563572
if samples:
564-
self.containers[lang].add_intent(name, samples)
573+
self._container_add_intent(self.containers[lang], name, samples)
565574

566575
def calc_intent(self, utterances: List[str], lang: str = None,
567576
message: Optional[Message] = None) -> Optional[PadaciosoIntent]:
@@ -828,6 +837,21 @@ def _container_has_intent(self, container: DomainIntentContainer,
828837
return False
829838
return name in getattr(sub, "intent_samples", {})
830839

840+
def _container_exclude_keywords(self, container: DomainIntentContainer,
841+
name: str, keywords: List[str]) -> None:
842+
domain = self._domain_of(name)
843+
sub = container.domains.get(domain)
844+
if sub is not None:
845+
sub.exclude_keywords(name, keywords)
846+
847+
def _container_get_intent_samples(self, container: DomainIntentContainer,
848+
name: str) -> Optional[List[str]]:
849+
domain = self._domain_of(name)
850+
sub = container.domains.get(domain)
851+
if sub is None:
852+
return None
853+
return getattr(sub, "intent_samples", {}).get(name)
854+
831855
# ------------------------------------------------------------------
832856
# Matching - delegate to DomainIntentContainer.calc_intent
833857
# ------------------------------------------------------------------

0 commit comments

Comments
 (0)