ovos-persona

July 31, 2026 · View on GitHub

ovos-persona is a pipeline plugin that routes utterances to named AI "personas": configurable combinations of LLM, solver, and retrieval plugins. A persona gives OVOS an alternative response personality, beyond normal intent matching.


Concepts

  • Persona: a named configuration that specifies an ordered list of utterance handler plugins (LLMs, solvers, RAG engines). Each persona has its own handler priority order and optional short-term memory.
  • PersonaService: the pipeline stage that loads all personas, matches persona-management intents (summon, ask, list, release), and routes utterances to the active persona.
  • Active persona: when a user summons a persona by name, all subsequent utterances in that session are routed directly to it, bypassing the normal intent pipeline, until released.
  • Default persona: a fallback persona used when handle_fallback: true is set in config, allowing the persona system to act as the last-resort pipeline stage.

Architecture

Pipeline (ConfidenceMatcherPipeline)

    └── PersonaService

            ├── match_high()     ← padatious/padacioso intent matching
            │       └── persona:summon / persona:ask / persona:list / persona:check / persona:release

            ├── match_medium()   ← keyword/voc matching fallback

            └── match_low()      ← active persona passthrough (or default persona if handle_fallback)

                    └── Persona.stream()
                            └── QuestionSolversService
                                    ├── ChatEngine / MultimodalChatEngine   (LLMs)
                                    ├── ChatMessageSolver                    (chat solvers)
                                    ├── QuestionSolver                       (Q&A solvers)
                                    └── RetrievalEngine / DocumentIndexer    (RAG)

DocumentContents
persona-service.mdPersonaService: pipeline integration, intent matching, bus events
persona.mdPersona class: solvers, memory, chat/stream API
solvers.mdQuestionSolversService: plugin types, ordering, completion
memory.mdBasicShortTermMemory: session history, context building
hivemind.mdPersonaProtocol: HiveMind agent integration
defining-personas.mdPersona JSON format, file locations, plugin entry points

Quick Start

from ovos_persona import PersonaService
from ovos_utils.fakebus import FakeBus

svc = PersonaService(bus=FakeBus(), config={
    "default_persona": "MyChatBot",
    "personas_path": "~/.config/ovos_persona"
})

# Query a persona directly
for sentence in svc.query("what is the speed of light", "MyChatBot"):
    print(sentence)

Entry Points

Entry point groupNameClass
opm.pipelineovos-persona-pipeline-pluginPersonaService
opm.agents.memoryovos-agents-short-term-memory-pluginBasicShortTermMemory
hivemind.agent.protocolhivemind-persona-agent-pluginPersonaProtocol

Package Layout

ovos_persona/
├── __init__.py    # Persona, PersonaService
├── solvers.py     # QuestionSolversService, get_utterance_handler_plugins
├── memory.py      # BasicShortTermMemory
└── hpm.py         # PersonaProtocol (HiveMind integration)

Configuration (mycroft.conf)

{
  "intents": {
    "persona": {
      "personas_path": "~/.config/ovos_persona",
      "default_persona": "MyChatBot",
      "handle_fallback": false,
      "ignore_plugin_personas": false,
      "persona_blacklist": [],
      "min_intent_confidence": 0.6,
      "intent_cache": "~/.local/share/mycroft/intent_cache"
    }
  }
}
KeyDefaultDescription
personas_pathXDG config ovos_persona/Directory for user-defined persona JSON files
default_personafirst loadedPersona to use when none is active
handle_fallbackfalseIf true, route all unmatched utterances to the default persona
ignore_plugin_personasfalseIf true, only load user-defined JSON personas
persona_blacklist[]Persona names (or plugin names) to skip when loading
min_intent_confidence0.6Minimum padatious score to act on an intent match
intent_cacheXDG data intent_cache/Directory for padatious intent cache