Skip to content

reachy_voice client-loop (Phase 1): motion tools + ovs/voxedge update + daemon pin#10

Merged
suharvest merged 4 commits into
masterfrom
feat/reachy-voice-clientloop
Jun 15, 2026
Merged

reachy_voice client-loop (Phase 1): motion tools + ovs/voxedge update + daemon pin#10
suharvest merged 4 commits into
masterfrom
feat/reachy-voice-clientloop

Conversation

@suharvest

Copy link
Copy Markdown
Owner

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)ReachyMotionToolsPlugin registers 4 tools (move_head/move_antennas/play_emotion/dance) into app.tool_registry; tools_enabled=True → ovs runner.stream_with_tools drives 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 imports voxedge.engine.turn_driver). Pulls in the /v2v deadlock-hardening + slot-leak fixes. uv.lock regenerated clean (revision 3, aliyun mirror — only the 2 wheels differ).
  • build(deploy) — pin reachy-daemon to reachy-mini==1.8.1 to match the app (was unpinned); image reachy-daemon:v1.1 built + pushed.

Design principle

reachy_voice stays a thin app over a complete ovs agent — conversation loop, tool registry/dispatch/runner, and CompanionRobotApp scaffolding are all reused as-is. reachy_voice only contributes the 4 real motion tool bodies (SDK→compositor glue) and tag stripping.

Validation

  • tests/voice 113 passed, ruff clean, uv lock --locked no drift.
  • On-device client-loop validated on orin-nx: the real edge-LLM (now Qwen3.5-4B vanilla GDN) emits OpenAI tool_calls; ovs runner dispatches all 4 tools into the plugin correctly (independent curl + 4-turn harness).
  • ⚠️ Not yet validated on a physical robot — servo motion, full audio path (ASR→tool→TTS), and daemon v1.1 need real hardware (blocked on the robot box). Mergeable as code; on-hardware pass to follow.

Notes

  • New ovs behaviors (wake-tone / mic-suppress) are config-gated, default-off.
  • Deferred: Phase-2 tools (vision describe_scene / skill_load / ha_*), daemon --no-media TODO.

🤖 Generated with Claude Code

suharvest and others added 4 commits June 16, 2026 03:00
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>
@suharvest suharvest merged commit 21d054b into master Jun 15, 2026
4 checks passed
@Love4yzp Love4yzp deleted the feat/reachy-voice-clientloop branch June 17, 2026 07:06
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