Agent Plugins¶
In a nutshell
Agent plugins are the swappable "brains" your assistant can use to do thinking work: holding a conversation, answering a factual question, summarizing a document, picking the best of several answers, remembering what was said earlier, or figuring out who "she" refers to. You don't run them yourself. You list the ones you want in a persona, and OVOS loads them. Think of it like choosing which browser extensions to install, except each "extension" is a different reasoning skill. See Agents & Personas or the Glossary for related terms.
For beginners: agent plugins are the installable building blocks that let a persona think, answer, rank, summarize, remember, or resolve pronouns. You don't call them directly. You list them in a persona and the PersonaService loads them. Each plugin advertises itself to OVOS through an OPM entry-point group.
Version requirement
The agent plugin system (opm.agents.* entry-point groups) requires
ovos-plugin-manager >= 2.4.0a1 (cap below <3.0.0); that floor covers every
group, including opm.agents.option_matcher, which arrived last. Older OPM releases
don't know these groups.
For advanced users: every agent engine subclasses an abstract base in
ovos_plugin_manager.templates.agents and registers under one opm.agents.* group (each with a
parallel *.config group for config metadata). The discovery helpers live in
ovos_plugin_manager.agents. The authoritative group/base-class mapping:
| Entry-point group | Base class | Purpose |
|---|---|---|
opm.agents.chat |
ChatEngine |
Multi-turn conversational LLM |
opm.agents.chat.multimodal |
MultimodalChatEngine |
Chat with image/audio/file input |
opm.agents.multimodal_adapter |
MultimodalAdapter |
Render non-text content as text |
opm.agents.summarizer |
SummarizerEngine |
Condense a document |
opm.agents.summarizer.chat |
ChatSummarizerEngine |
Compress a chat history |
opm.agents.reranker |
ReRankerEngine |
Score/rank candidate answers |
opm.agents.option_matcher |
OptionMatcherEngine |
Match an utterance to a fixed option set |
opm.agents.extractive_qa |
ExtractiveQAEngine |
Extract the answering passage from evidence |
opm.agents.nli |
NaturalLanguageInferenceEngine |
Premise → hypothesis entailment |
opm.agents.yesno |
YesNoEngine |
Classify a response as yes / no / unknown |
opm.agents.coref |
CoreferenceEngine |
Pronoun / coreference resolution |
opm.agents.memory |
AgentContextManager |
Per-session conversation history |
opm.agents.retrieval |
RetrievalEngine |
Retrieval-augmented generation |
opm.agents.retrieval.documents |
DocumentIndexerEngine |
Index + retrieve over a document corpus |
opm.agents.retrieval.qa |
QAIndexerEngine |
Index + retrieve over a Q/A corpus |
opm.agents.toolbox |
none | Tool / function-calling registry |
To write your own engine, see Building Agent Plugins for the base-class decision guide, method contracts, packaging walkthroughs, and the solver migration path.
The legacy opm.solver.* groups (and the QuestionSolver family in
ovos_plugin_manager.templates.solvers) are deprecated. See Deprecated Solver
Types below for the migration map. For per-engine method contracts and
config examples, see Agent Engine Types below and Agents &
Personas.
Agent Engine Types¶
OVOS provides a full suite of specialized agent engine types beyond simple chat. Each type solves a specific NLP sub-problem and registers under its own OPM entry point group. This makes it discoverable, configurable, and usable together with other engine types on its own.
All base classes live in ovos_plugin_manager.templates.agents. The deprecated solver API
(opm.solver.*) is covered in Deprecated Solver Types below. Migrate
to opm.agents.* for all new plugins.
ReRanker: opm.agents.reranker¶
Base class: ReRankerEngine
Scores a list of candidate answers by relevance to a query and returns them ranked highest-first. Used internally by the Common Query pipeline and OCP media search.
from ovos_plugin_manager.templates.agents import ReRankerEngine
# Returns: List[Tuple[float, str]] sorted descending
ranked = engine.rerank("play bohemian rhapsody", ["Bohemian Rhapsody by Queen", "Bohemian Groove Mix"])
best = engine.select_answer("play bohemian rhapsody", candidates)
Score semantics
ReRankerEngine.rerank() returns (score, option) pairs, but the base class does
not fix the score's scale. It is whatever the underlying model produces. There
is no ReRankerEngine implementation shipped by an OpenVoiceOS-org repository yet;
the de-facto reranker, ovos-flashrank-reranker-plugin, still registers only the
legacy opm.solver.multiple_choice group (a MultipleChoiceSolver), which is what
the Common Query pipeline actually loads. Its scores land in [0, 1] because
the underlying FlashRank library normalizes cross-encoder outputs, so
min_reranker_score reads as a probability-like threshold there. A reranker backed
by a raw-logit model would need its own calibration. Check the plugin's docs before
reusing the same threshold.
Common Query pipeline config¶
{
"intents": {
"ovos-common-query-pipeline-plugin": {
"min_self_confidence": 0.5,
"min_reranker_score": 0.2,
"reranker": "<your-reranker-plugin>",
"<your-reranker-plugin>": {}
}
}
}
The reranker key names an installed legacy opm.solver.multiple_choice plugin (see the
note above); it will name an opm.agents.reranker plugin once one ships and the pipeline
migrates its loader.
Extractive QA: opm.agents.extractive_qa¶
Base class: ExtractiveQAEngine
Given a paragraph of evidence text and a question, returns the exact sentence(s) that answer the question. Used by knowledge-retrieval skills (Wikipedia, news reader) to avoid speaking entire documents.
evidence = (
"The Eiffel Tower stands 330 metres tall. "
"It was constructed from 1887 to 1889 as the centrepiece of the 1889 World's Fair."
)
answer = engine.get_best_passage(evidence, "How tall is the Eiffel Tower?")
# "The Eiffel Tower stands 330 metres tall."
No implementation ships in the OVOS org today. The base class and entry-point group exist so a plugin can provide one — see Building Agent Plugins.
Summarizer: opm.agents.summarizer¶
Base class: SummarizerEngine
Condenses a plain-text document into one to three sentences. Used by solvers and skills before passing text to TTS to avoid overwhelming the user with long responses.
Implementations: OpenAISummarizer, and GGUFSummarizer from the GGUF plugin (entry point ovos-summarizer-gguf-plugin).
Chat Summarizer: opm.agents.summarizer.chat¶
Converts a structured List[AgentMessage] chat history into a concise narrative summary. A memory plugin can use one to compress history
when it exceeds max_history turns, keeping the context window manageable.
from ovos_plugin_manager.templates.agents import AgentMessage, MessageRole
messages = [
AgentMessage(MessageRole.USER, "What's the weather?"),
AgentMessage(MessageRole.ASSISTANT, "It's sunny and 22°C."),
]
summary_text = engine.summarize(messages)
No implementation ships in the OVOS org today. The base class and entry-point group exist so a plugin can provide one — see Building Agent Plugins.
NLI: opm.agents.nli¶
Base class: NaturalLanguageInferenceEngine
Predicts whether a premise logically entails a hypothesis. Used for reasoning chains, intent conflict detection, and condition evaluation in skills.
print(engine.predict_entailment("It is raining heavily.", "The weather is wet.")) # True
print(engine.predict_entailment("It is sunny.", "You need an umbrella.")) # False
No implementation ships in the OVOS org today. The base class and entry-point group exist so a plugin can provide one — see Building Agent Plugins.
Yes/No Classifier: opm.agents.yesno¶
Classifies a user's ambiguous confirmation as True (yes), False (no), or None (unclear).
Returns None on API error.
print(engine.yes_or_no("Do you want me to set a timer?", "sure, go ahead")) # True
print(engine.yes_or_no("Shall I call John?", "no, not now")) # False
print(engine.yes_or_no("Ready?", "what do you mean?")) # None
Use this in skills when ask_yesno() receives uncertain phrasing like "I guess" or "maybe".
No implementation ships in the OVOS org today. The base class and entry-point group exist so a plugin can provide one — see Building Agent Plugins.
Option Matcher: opm.agents.option_matcher¶
Base class: OptionMatcherEngine
Resolves a free-form user reply to one entry in a fixed list of options. This is the engine behind a
skill's ask_selection().
The reference implementation,
ovos-option-matcher-fuzzy-plugin
(FuzzyOptionMatcherPlugin), resolves in this order: fuzzy match via ovos-utils match_one (difflib SequenceMatcher ratio) when the score
reaches min_conf (config key, default 0.65), then locale-aware "last option" vocab, then
ordinal/cardinal vocab (longest match wins), then a numeric fallback via ovos-number-parser.
It returns None if nothing matches.
OVOSSkill.ask_selection() loads the engine via skills.ask_selection_plugin (checked in the
skill's settings.json first, then mycroft.conf), defaulting to
ovos-option-matcher-fuzzy-plugin when neither is set.
Coreference Resolution: opm.agents.coref¶
Base class: CoreferenceEngine
Resolves pronouns and ambiguous references in voice commands against recent conversation context.
The base class owns the state (a per-language context vault). The plugin subclass provides the
intelligence (the NLP that rewrites the text). resolve() first calls contains_corefs() to
skip expensive work when no pronouns are present.
# Stateless one-shot resolution:
result = engine.resolve("Turn it off", lang="en")
# With memory: register context, then resolve future turns against it
engine.set_context("it", "Bohemian Rhapsody", lang="en")
result = engine.resolve("Turn it off", lang="en", use_memory=True)
# "Turn Bohemian Rhapsody off"
use_memory (default False) gates the learn/apply-context steps. Pass use_memory=True to
have resolve() apply previously registered context and learn new mappings from each turn.
context_ttl (config key, default 120 s) controls how long a tracked context entry remains
valid before it is pruned.
No implementation ships in the OVOS org today. The base class and entry-point group exist so a plugin can provide one — see Building Agent Plugins.
Memory / Context Manager: opm.agents.memory¶
Base class: AgentContextManager
Manages per-session conversation history. The default implementation (BasicShortTermMemory
from ovos-persona) stores history in RAM with max_history truncation. An LLM-powered
implementation can also compress old history into a SYSTEM summary message when the history
exceeds a configurable threshold; the config below is the shape such a plugin reads.
from ovos_plugin_manager.templates.agents import AgentContextManager, AgentMessage
# Abstract interface
ctx = manager.build_conversation_context(utterance, session_id) # List[AgentMessage]
manager.update_history([user_msg, assistant_msg], session_id)
Compression config:
{
"<your-memory-plugin>": {
"system_prompt": "You are a helpful assistant.",
"max_history": 20,
"compress": true
}
}
The default no-LLM memory plugin ovos-agents-short-term-memory-plugin (BasicShortTermMemory)
needs no API key and is always available when ovos-persona is installed.
Multimodal Chat: opm.agents.chat.multimodal¶
Extends ChatEngine with image input. Images are passed as base64-encoded strings in
MultimodalAgentMessage.image_content. Data-URI headers are stripped automatically.
from ovos_plugin_manager.templates.agents import MultimodalAgentMessage, MessageRole
messages = [
MultimodalAgentMessage(
role=MessageRole.USER,
content="What is in this image?",
image_content=[b64_string],
)
]
reply = engine.continue_chat(messages)
Provided by any installed opm.agents.chat.multimodal plugin.
Deprecated Solver Types¶
The legacy opm.solver.* entry points are deprecated and will be removed in the next major
release. Migrate existing plugins to the corresponding opm.agents.* types.
| Deprecated entry point | Replacement | Why |
|---|---|---|
opm.solver.question (QuestionSolver) |
opm.agents.chat (ChatEngine) |
Single-turn Q&A folds into the general chat contract. No separate type is needed. |
opm.solver.chat (ChatMessageSolver) |
opm.agents.chat (ChatEngine) |
Same engine type as above. The two deprecated solvers converge on one replacement. |
opm.solver.summarization (TldrSolver) |
opm.agents.summarizer (SummarizerEngine) |
Renamed for clarity. Behavior is otherwise equivalent. |
opm.solver.reading_comprehension (EvidenceSolver) |
opm.agents.extractive_qa (ExtractiveQAEngine) |
Renamed to match the standard NLP task name (extractive QA over evidence). |
opm.solver.multiple_choice (MultipleChoiceSolver) |
opm.agents.reranker (ReRankerEngine) |
Choosing among options is really scoring and ranking candidates, so it moved under the reranker contract. |
opm.solver.entailment (EntailmentSolver) |
opm.agents.nli (NaturalLanguageInferenceEngine) |
Renamed to the standard NLI task name. Entailment is one of NLI's three labels. |
opm.coreference |
opm.agents.coref |
Moved under the unified opm.agents.* namespace alongside the other engine types. |
The deprecated classes remain in ovos_plugin_manager.templates.solvers and are still loaded
by PersonaService and QuestionSolversService for backwards compatibility. But no new
plugins should use them.
Plugin catalog¶
| Plugin | Description | License | Maturity |
|---|---|---|---|
| ovos-qdrant-embeddings-plugin | The QdrantEmbeddingsDB plugin integrates with the qdrant database to store, retrieve, and query embeddings. This plugin extends the abstract EmbeddingsDB class, using qdrant's capabilities. |
MIT | Beta |
| ovos-solver-plugin-aiml | A rule-based chatbot answer engine for OVOS, using AIML pattern matching. | MIT | Alpha |
| ovos-persona | The persona pipeline (the PersonaService class) brings multi-persona management to OpenVoiceOS (OVOS), enabling interactive conversations with virtual assistants. With personas, you can customize how queries are handled by assigning specific solvers to each persona. |
Apache-2.0 | Stable |
| ovos-openai-plugin | Uses the OpenAI Completions API to provide a chat engine, a dialog-rewriting transformer, and a summarizer, all pointed at any OpenAI-compatible endpoint. | Apache-2.0 | Beta |
| ovos-messagebus-chat-plugin | OVOSMessagebusChatAgent: a ChatEngine (opm.agents.chat, entry point ovos-messagebus) that proxies each turn through a connected OVOS messagebus pipeline. |
Apache-2.0 | Alpha |
| ovos-wikipedia-plugin | Answers factual questions by querying Wikipedia. | Apache-2.0 | Alpha |
| ovos-chromadb-embeddings-plugin | The ChromaEmbeddingsDB plugin integrates with the ChromaDB database to store, retrieve, and query embeddings. This plugin extends the abstract EmbeddingsDB class, using ChromaDB's capabilities. |
MIT | Beta |
| ovos-wolfram-alpha-plugin | Answers computational and factual questions via the Wolfram Alpha API. | Apache-2.0 | Alpha |
| ovos-ddg-plugin | Answers questions using DuckDuckGo instant-answer results. | Apache-2.0 | Alpha |
| ovos-wordnet-plugin | Answers word-knowledge questions (definitions, synonyms, antonyms, and other relations) from the local WordNet corpus, as both a RetrievalEngine and a toolbox. |
Apache-2.0 | Alpha |
| ovos-solver-YesNo-plugin | A simple tool to indicate whether a user answered "yes" or "no" to a yes/no prompt. | Apache-2.0 | Deprecated |
| ovos-solver-failure-plugin | Extreme fallback, just complains it does not have a brain | MIT | Beta |
| ovos-gguf-plugin | Unified GGUF wrapper for chat, summarization, dialog rewriting, translation, language detection, and text embeddings, all backed by quantized GGUF models via llama-cpp-python. |
MIT | Beta |
| ovos-persona-server | Standalone server that exposes an OVOS persona over an HTTP API. | Apache-2.0 | Stable |
| ovos-solver-plugin-rivescript | A rule-based chatbot answer engine for OVOS, using RiveScript pattern matching. | MIT | Alpha |
Maturity reflects repository health (age, activity, open issues/PRs, in-repo docs), not version. See the Maturity Scale.
ovos-solver-YesNo-plugin is deprecated
Superseded by ovos-YesNo-plugin
(needs ovos-plugin-manager>=2.4.0). See Deprecated Repos.
See Tool Plugins: Available ToolBoxes and
Tool Plugins: Available Chat Engines for the
standalone opm.agents.toolbox and opm.agents.chat plugin registries.
Learn more¶
Full technical detail per plugin (repository link, entry-point group, config keys) lives on the Agent Plugins Reference page linked from the table above.
Read next: Building Agent Plugins Related: Agent Plugins Reference · Personas & PersonaService · Agent Tool Plugins · OpenAI-compatible · GGUF / Local LLM