Both services are pipeline plugins shipped inside ovos-core and registered via its own entry points.
Module: ovos_core.intent_services.converse_service.ConverseService
Pipeline plugin ID: ovos-converse-pipeline-plugin
Stage name: converse
Converse allows active skills to intercept utterances before general intent matching. A skill is "active" if it recently handled an utterance. Active skills are stored in the Session object.
conversestage is hit in the pipelineConverseService.match()iterates active skills in priority order- For each skill, emits
{skill_id}.converse.requestand waits for a response - If the skill returns
True, the utterance is consumed - If not, the next active skill is tried
Controlled by ConverseMode and ConverseActivationMode from ovos-workshop:
- ConverseMode — restricts which skills may participate in converse
- ConverseActivationMode — controls when a skill becomes active (e.g. only when it handled the last utterance)
During skill.get_response, the skill temporarily holds the converse channel:
skill.converse.get_response.enable→ lock converse to this skillskill.converse.get_response.disable→ release lock
| Event | Handler |
|---|---|
intent.service.skills.activate |
handle_activate_skill_request |
intent.service.skills.deactivate |
handle_deactivate_skill_request |
intent.service.active_skills.get |
handle_get_active_skills |
skill.converse.get_response.enable |
handle_get_response_enable |
skill.converse.get_response.disable |
handle_get_response_disable |
converse:skill |
handle_converse |
Alongside the sequential per-skill {skill_id}.converse.request above,
ConverseService also emits one broadcast ovos.converse.ping per round on
the static spec topic. It carries no candidate identity — the session
already names the active skills — and every active skill answers on the
shared pong topic. The legacy per-skill pings still go out alongside it: no
released ovos-workshop vintage binds the broadcast topic yet, so dropping
the legacy leg would silence every skill in the field. Each poll round is
correlated by utterance_id and session, so a late pong from a stale round
is discarded instead of winning the wrong round.
Module: ovos_core.intent_services.fallback_service.FallbackService
Pipeline plugin ID: ovos-fallback-pipeline-plugin
Stage names: fallback_high, fallback_medium, fallback_low
Fallback skills handle utterances that nothing else could match. They register with a priority number (lower = higher priority).
- A fallback stage is hit in the pipeline
FallbackService.match_high/medium/low()filters registered fallbacks by priority range- For each fallback skill (sorted by priority), emits a converse-style request
- First skill that returns
Truewins
| Stage | Priority range |
|---|---|
fallback_high |
0–49 |
fallback_medium |
50–89 |
fallback_low |
90–100+ |
Priority overrides can be set in config:
{
"skills": {
"fallbacks": {
"fallback_priorities": {
"my-skill-id": 10
}
}
}
}Controlled by FallbackMode from ovos-workshop:
- Restricts which skills are allowed to act as fallbacks (e.g. skill owner, anyone, or disabled)
| Event | Handler |
|---|---|
ovos.skills.fallback.register |
handle_register_fallback |
ovos.skills.fallback.deregister |
handle_deregister_fallback |
Module: ovos_core.intent_services.stop_service.StopService
Pipeline plugin ID: ovos-stop-pipeline-plugin
Stage names: stop_high, stop_medium, stop_low
Handles "stop" / "cancel" utterances. Active skills are asked to handle the stop request in priority order. Configured under skills.stop in mycroft.conf.
Skills that participate in converse or fallback inherit from special base classes in ovos-workshop:
| Class | Module | Docs |
|---|---|---|
ConversationalSkill |
ovos_workshop.skills |
ovos-workshop/docs/skill-classes.md |
FallbackSkill |
ovos_workshop.skills |
ovos-workshop/docs/skill-classes.md |
OVOSSkill (base, has self.converse()) |
ovos_workshop.skills.ovos |
ovos-workshop/docs/ovos-skill.md |
ConverseMode, ConverseActivationMode, and FallbackMode control who can participate and when. All three are defined in ovos_workshop.permissions → ovos-workshop/docs/permissions.md.
Active skills are tracked in Session.active_skills — ovos_bus_client.session.Session. The converse service reads and updates this list via sess.activate_skill() / sess.deactivate_skill(). See ovos-bus-client/docs/session.md.
Skills declare converse handlers with @converse_handler from ovos-workshop → ovos-workshop/docs/decorators.md.
See bus-events.md for the Converse and Fallback event reference.
← Transformers · Home · Next →