Skip to content

Release 2.2.0a3 - #62

Closed
github-actions[bot] wants to merge 31 commits into
masterfrom
release-2.2.0a3
Closed

github-actions[bot] wants to merge 31 commits into
masterfrom
release-2.2.0a3

Conversation

@github-actions

Copy link
Copy Markdown

Human review requested!

JarbasAl and others added 30 commits June 5, 2026 22:20
#43)

- setup.py -> pyproject.toml (dynamic version + deps from requirements.txt);
  port the hivemind.binary.protocol entry point to [project.entry-points];
  add __version__ to version.py; license Apache-2.0; requires-python >=3.10.
- replace hand-rolled setup.py-based workflows with the gh-automations set
  (incl. opm-check for the plugin entry point).

Verified: python -m build OK (2.1.6a1); entry point present in wheel metadata.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: add hivescope e2e binary audio suite

Stream binary/b64 audio frames from a satellite to a master running the
real AudioBinaryProtocol (with stub STT/TTS/VAD/wakeword plugins) and
assert RAW_AUDIO, STT_AUDIO_TRANSCRIBE/HANDLE, and b64 transcribe/speak
flows are received and decoded intact.

Pin hivescope in the test extra and wire the gh-automations coverage
workflow to run them.

Refs #45

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(license): don't declare AGPL hivemind-core as a runtime dep

hivemind-core (AGPL-3.0 / NetworkCopyleft) was listed in requirements.txt,
so the license check flagged it via the runtime freeze. This protocol
plugin is loaded *by* a hivemind-core host, which provides the package at
runtime (same pattern as the green hivemind-http/websocket-protocol
plugins, which import hivemind_core.protocol without declaring it). Move
it out of runtime deps; the test extra's hivescope already supplies it
for the e2e suite.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
HIVEMIND-AUDIO-1 §2 requires a receiver that can not process the stated
format to reject the payload rather than misinterpret the bytes. The
RAW_AUDIO path did that; STT_AUDIO_TRANSCRIBE and STT_AUDIO_HANDLE did not.
They built an AudioData with whatever rate and width the peer declared and
handed it to the STT plugin, so a peer that declares 44100 Hz gets a
plausible but wrong transcript instead of a rejection - and on the HANDLE
path that wrong transcript is injected into the agent.

Both STT paths now check the format first and answer with
recognizer_loop:speech.recognition.unknown carrying
error=unsupported_audio_format. The supported format (the §2 default,
16 kHz signed 16-bit PCM) is named once as SAMPLE_RATE/SAMPLE_WIDTH and
shared with FakeMicrophone and the RAW_AUDIO check.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This cap was the last link in a chain that made the conformance harness
unresolvable: harness[dev] -> hivemind-audio-binary-protocol ->
hivemind_bus_client<1.0.0, against a hivemind-core that now requires
>=1.0.3a1.

This package's entire bus-client surface is HiveMessage,
HiveMessageType and HiveMindBinaryPayloadType. All three import
unchanged on 1.0.4a1, and the binary payload tags are still 0-6.
HiveMessageType.THIRDPRTY, the one member 1.x removed, is not
referenced anywhere in this package.
There is no listener component: there is only hivemind-core. The name
was shorthand for hivemind-core with the audio binary protocol plugin
enabled. Use hivemind-core, or name the plugin, where the prose called
a listener a thing you run.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
HIVEMIND-AUDIO-1 §2 — a receiver that cannot process the stated format
must reject the payload. The STT tags already do (#51), but a RAW_AUDIO
stream at the wrong sample rate or width was logged and dropped on the
floor. There is no in-band format negotiation in a raw stream, so a
satellite that is never told keeps streaming into a void.

The stream is now refused with the same
`recognizer_loop:speech.recognition.unknown` /
`unsupported_audio_format` reply the STT tags use. A raw stream is
continuous, so the peer is told once rather than once per chunk; the next
supported chunk clears the mark, as does a disconnect. No listener is
started for a format we refuse.

Wire-visible only in that a satellite which today gets silence now gets
an explicit refusal naming the format this node accepts.
…#48)

* refactor: consume transformer runner services from ovos-plugin-manager

The utterance, dialog and metadata transformer runners are now thin
subclasses of the canonical services in
ovos_plugin_manager.transformer_services, keeping the enabled_plugins
constructor contract used by AudioBinaryProtocol.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: audio and tts transformer pipelines

Fills the two transformer gaps in the audio binary protocol:

- audio transformers run before every STT stage
  (handle_stt_transcribe_request, handle_stt_handle_request and the b64
  transcription helper); an AudioLanguageDetector in the chain resolves
  a missing language, and the chain context is merged into the injected
  utterance message context
- tts transformers post-process synthesized audio in get_tts, covering
  get_b64_tts, handle_speak_b64 and handle_speak_synth; they operate on
  a temp copy so the TTS plugin's audio cache is never mutated

Config-gated and opt-in via the audio_transformers / tts_transformers
config sections, same contract as the existing utterance/dialog/metadata
chains.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: audio and tts transformer configuration

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
directory: "/requirements" points at a directory this repo does not have,
so Dependabot has errored on every weekly run. It has never opened a single
PR here; Renovate (renovate.json) does the dependency updates and does open
them. The config was pure red noise, and it masked real dev-branch failures.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* docs: correct claims that no longer match the code

- docs/audio_flow.md, docs/operations.md: an unsupported audio format is not
  only logged. The frame is dropped and the client is sent
  recognizer_loop:speech.recognition.unknown with
  {"error": "unsupported_audio_format", ...}, once per peer for a continuous
  stream.
- README.md: document audio_transformers and tts_transformers in the
  configuration table.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: the once-per-peer refusal covers the mic stream only

handle_microphone_input suppresses via refused_streams; the one-shot STT
paths call _reject_audio_format on every request, so those do log per
request.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@JarbasAl JarbasAl closed this Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant