reachy_voice client-loop (Phase 1): motion tools + ovs/voxedge update + daemon pin#10
Merged
Merged
Conversation
Codex-designed, file:line-anchored: 4 motion tools, compositor-safe routing, [Faces:] tag stripping, max ovs reuse (thin app shell). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…phase 1) Bring Wave-1 reachy_voice up to ovs client-loop tool-calling, mirroring the proven legacy clientloop and ovs companion_robot/demo_tools shape: - ReachyMotionToolsPlugin registers move_head/move_antennas/play_emotion/ dance into app.tool_registry; tools_enabled=True -> ovs runner drives the client-loop. reachy_voice stays a thin shell over ovs_agent. - motion.py: compositor-safe command_head/command_antennas/play_dance — enqueue a one-shot cmd drained by the single-writer compositor thread (no direct SDK off-thread writes -> no contention with presence/gaze). - conversation.py/dashboard.py: strip [Faces:] echoes (ovs has no tag stripping); emotion [happy] still routes to _on_emotion. - tests/voice: plugin registration+dispatch, tag stripper, client-loop config. 113 passed, ruff clean. Local only; physical motion untested (no robot). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Refresh the vendored ovs library to seeed-local-voice HEAD, in lockstep with voxedge (co-developed; ovs_agent HEAD's runner imports voxedge.engine.turn_driver, absent in stale pypi voxedge 0.0.1a0): - openvoicestream_agent wheel rebuilt from agent d26b7e1: /v2v deadlock hardening (3231c30) + wake-tone/mic-suppress (cfg-gated, default off). - voxedge wheel vendored from voxedge de3f987 (turn-driver unification + v2v slot-leak fix); pinned via [tool.uv.sources] path wheel. - uv.lock regenerated with uv 0.11.19 + aliyun mirror (revision 3 preserved, only the 2 wheels differ from master — no mirror pollution). import ok; tests/voice 113 passed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.0 installed reachy-mini unpinned -> daemon/app version skew risk. Pin to 1.8.1 to match reachy_voice. Built+pushed reachy-daemon:v1.1 (pin verified in-image). Robot validation deferred (no robot available). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Brings master's Wave-1
reachy_voice(pure conversation) up to client-loop tool-calling, as a thin shell over ovs_agent — plus the ovs-library update and a daemon version pin.Commits
docs(spec)— file:line-anchored Phase-1 spec (docs/specs/2026-06-15-reachy-voice-clientloop-spec.md)feat(reachy_voice)—ReachyMotionToolsPluginregisters 4 tools (move_head/move_antennas/play_emotion/dance) intoapp.tool_registry;tools_enabled=True→ ovsrunner.stream_with_toolsdrives the loop. Motion routed compositor-safe (enqueue → single-writer thread, no direct SDK off-thread).[Faces:]vision-tag stripping ported into the TTS + dashboard paths (ovs has none).build(deps)— lockstep ovs_agent + voxedge wheel bump (the two are co-developed; ovs_agent HEAD's runner importsvoxedge.engine.turn_driver). Pulls in the/v2vdeadlock-hardening + slot-leak fixes.uv.lockregenerated clean (revision 3, aliyun mirror — only the 2 wheels differ).build(deploy)— pinreachy-daemontoreachy-mini==1.8.1to match the app (was unpinned); imagereachy-daemon:v1.1built + pushed.Design principle
reachy_voice stays a thin app over a complete ovs agent — conversation loop, tool registry/dispatch/runner, and
CompanionRobotAppscaffolding are all reused as-is. reachy_voice only contributes the 4 real motion tool bodies (SDK→compositor glue) and tag stripping.Validation
tests/voice113 passed, ruff clean,uv lock --lockedno drift.tool_calls; ovs runner dispatches all 4 tools into the plugin correctly (independent curl + 4-turn harness).Notes
describe_scene/skill_load/ha_*), daemon--no-mediaTODO.🤖 Generated with Claude Code