Nebulento

August 11, 2026 · View on GitHub

A lightweight fuzzy-matching intent parser built on rapidfuzz.

Overview

Nebulento finds the closest matching intent by comparing an utterance against all registered training sentences using configurable fuzzy similarity strategies. It handles spelling errors, word-order variation, contractions, and natural phrasing that exact-match parsers miss.

Key design choices:

  • No training step: intents are registered as template strings and are available immediately. There is no model to train or reload.
  • Template expansion at registration time: (a|b) alternation and [optional] syntax are fully expanded into concrete strings when add_intent is called.
  • Configurable similarity strategy: nine MatchStrategy values map to distinct rapidfuzz scorers (plus a difflib fallback), each with a different precision/recall trade-off.
  • Entity extraction: {slot} placeholders in templates are paired with registered entity samples. When a registered value appears in the utterance, the confidence is boosted and the value is returned in entities.
  • Context gating: intents can be conditionally suppressed or required based on named active contexts, or blocked when specific keywords appear in the query.

The package ships both a standalone Python library and an OVOS pipeline plugin (NebulentoPipeline) that integrates with the OpenVoiceOS skill framework.


Architecture

                   ┌─────────────────────────────────────┐
                   │           IntentContainer            │
                   │                                      │
  utterance ──────►│  normalize_utterance()               │
                   │         │                            │
                   │         ▼                            │
                   │  _filter()  ◄── context gates        │
                   │             ◄── keyword exclusions   │
                   │         │                            │
                   │         ▼                            │
                   │  match_entities()  ◄── entity store  │
                   │         │                            │
                   │         ▼                            │
                   │  match_one() per intent              │
                   │   (rapidfuzz scorer)                 │
                   │         │                            │
                   │         ▼                            │
                   │  confidence boost if entity found    │
                   │         │                            │
                   │         ▼                            │
  result ◄─────────│  tie-break → best MatchResult        │
                   └─────────────────────────────────────┘
                   ┌─────────────────────────────────────┐
                   │     HierarchicalIntentContainer      │
                   │                                      │
  utterance ──────►│  domain_engine.calc_intent()         │
                   │         │                            │
                   │         ▼                            │
                   │  domains[name].calc_intent()         │
                   │         │                            │
  result ◄─────────│  MatchResult                         │
                   └─────────────────────────────────────┘

Key Classes

ClassPurposeSource
IntentContainerRegister intents/entities, score utterancesnebulento/container.py:17
HierarchicalIntentContainerTwo-stage domain→intent matchingnebulento/hierarchical.py:10
MatchStrategyEnum of nine fuzzy similarity algorithmsnebulento/fuzz.py:15
NebulentoPipelineOVOS pipeline plugin wrapping IntentContainernebulento/opm.py:51
HierarchicalNebulentoPipelineTwo-stage pipeline wrapping HierarchicalIntentContainernebulento/opm.py:262
NebulentoIntentResult object returned by the pipeline pluginnebulento/opm.py:21

Utility functions

FunctionPurposeSource
expand_templateExpand (a|b) / [opt] syntaxnebulento/bracket_expansion.py:101
expand_slotsFill {slot} with entity sample valuesnebulento/bracket_expansion.py:148
normalize_utteranceApostrophe + whitespace normalisation for queriesnebulento/bracket_expansion.py:86
normalize_exampleNormalisation + padatious translation for templatesnebulento/bracket_expansion.py:69
translate_padatiousConvert :0 word-slot tokens to {wordN}nebulento/bracket_expansion.py:45
clean_bracesNormalise {{entity}}{entity}nebulento/bracket_expansion.py:33
fuzzy_matchScore two strings with a chosen strategynebulento/fuzz.py:51
match_oneBest-match from a list of candidatesnebulento/fuzz.py:82
match_allAll candidates sorted by scorenebulento/fuzz.py:101

Contents

PageDescription
Installationpip install, from source, optional deps
Quick Start5-minute guide: add intent, entity, calc_intent
Intent APIFull IntentContainer and HierarchicalIntentContainer reference
Match StrategiesAll nine MatchStrategy values: what they measure, when to use
Template SyntaxExpansion rules, entity slots, padatious compat
Entity ExtractionHow entity registration and slot filling works
NormalisationApostrophe handling, case folding, whitespace
OVOS PluginNebulentoPipeline: events, config, confidence tiers
Hierarchical MatchingHierarchicalIntentContainer two-stage guide
ConfigurationAll OVOS plugin config keys
BenchmarkAccuracy table, how to reproduce
TroubleshootingCommon issues and solutions