Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
07c902a
Add Go runtime and plugin scaffolding
openminddev May 29, 2026
7b85bc0
Add GoogleASR, WebSocket client, refactor inputs
openminddev May 29, 2026
a2f4ca0
Add zenoh-c support and TTS speaking flag
openminddev May 29, 2026
0144687
Ignore Zenoh runtime directory in .gitignore
openminddev May 29, 2026
5622b9a
Refactor plugins, schema exports, and logging
openminddev May 29, 2026
da1941d
Add zenoh session, global logger, and arm_g1 plugin
openminddev May 29, 2026
f5cf2a1
Use ./config paths in go/Makefile
openminddev May 29, 2026
50285e7
Switch to zenoh-go client (remove cgo)
openminddev May 29, 2026
918b4d5
Add context cancellation to ws client and fix locks
openminddev May 29, 2026
d469eee
Add Unitree G1 config; update loader & plugin
openminddev May 29, 2026
f8ff0fc
Add zenoh Publisher, use in arm_g1, fix ticks
openminddev May 29, 2026
9e61eef
Add Zenoh CDR helpers and ASR Zenoh publish
openminddev May 29, 2026
b8af125
Switch emotion action connector to zenoh
openminddev May 29, 2026
2ea3fdb
Serialize face_text with explicit length and NUL
openminddev May 29, 2026
b1b1600
Add Emotion action input and export connector
openminddev May 29, 2026
6e8cf3b
Fix CDR padding in avatar request serialization
openminddev May 29, 2026
e114b27
Add AvatarProvider and zenoh subscriber support
openminddev May 29, 2026
b3644a0
Clean up avatar provider comments and logs
openminddev May 29, 2026
5b5b1c5
Add ElevenLabs TTS provider and lifecycle hooks
openminddev May 30, 2026
dfedb0e
Export constructors and add docs to runtime/plugins
openminddev May 30, 2026
8f57797
Refactor orchestrators, plugins, and logger APIs
openminddev May 30, 2026
3052ae6
Add OpenAI helpers and Gemini latency logging
openminddev May 30, 2026
a86b15a
Add context-aware mode transitions & PortAudio refcount
openminddev May 31, 2026
4553a4e
Add greeting conversation and IO providers
openminddev May 31, 2026
4848305
Rename speak action and update connector
openminddev May 31, 2026
cc14290
Add face presence provider and refactor zenoh
openminddev Jun 1, 2026
af64de4
Use in-process ModeContext for transitions
openminddev Jun 1, 2026
f8f72da
Move Go app to repository root; remove Python src
openminddev Jun 1, 2026
6383fc3
Migrate CI & Docker to Go build with zenoh-c
openminddev Jun 1, 2026
304fb80
Swap client/discovery fallback logic
openminddev Jun 1, 2026
1698ddb
Add function hook registry and hooks
openminddev Jun 1, 2026
0685e46
Migrate LLM plugins to Go (providers + DualLLM) (#2592)
shicaih Jun 1, 2026
38d1b42
Add Prometheus metrics server and record metrics
openminddev Jun 1, 2026
a14c863
Ignore coverage.out and remove .python-version
openminddev Jun 1, 2026
08ba63d
Add TTS time-to-first-audio metrics
openminddev Jun 1, 2026
8063a87
Record HTTP timing metrics in ElevenLabs
openminddev Jun 1, 2026
7b9acd5
Migrate om1 Grafana dashboard to Grafana v13
openminddev Jun 1, 2026
eaa4ebb
Remove .typos.toml
openminddev Jun 2, 2026
56d8ff5
Add greeting modes, people TTS & convo history
openminddev Jun 2, 2026
0578684
Add Kokoro TTS provider and connector
openminddev Jun 2, 2026
6a23ffb
Extract Google ASR common code, add RTSP input
openminddev Jun 2, 2026
40684ac
Add doc comment for GoogleASRConfig
openminddev Jun 2, 2026
c271cad
Add knowledgebase support with HNSW embeddings
openminddev Jun 2, 2026
654fd07
Remove redundant comment about bufio.Reader
openminddev Jun 2, 2026
057abe6
Add LLM-driven greeting hook and config fixes
openminddev Jun 2, 2026
0663b44
Add tracing, sensor tick opt-in, and audio warmup
openminddev Jun 2, 2026
206e05b
Rename OM1_CONFIG to OM1_COMMAND and tidy Dockerfiles
openminddev Jun 2, 2026
850e365
Update base image and add PortAudio deps
openminddev Jun 2, 2026
a5591cd
Add ElevenLabs People TTS connector
openminddev Jun 2, 2026
8e08277
update config prompt for microsoft build (#2598)
Prachi1615 Jun 3, 2026
c97e020
Trim trailing spaces in Microsoft Build greeting
openminddev Jun 3, 2026
86dfc73
Add knowledge base Prometheus metrics and dashboard panels (#2599)
shicaih Jun 3, 2026
7a8be9d
Remove CycloneDDS config and env/volume
openminddev Jun 3, 2026
1329d22
Remove config schema generator workflow and script
openminddev Jun 3, 2026
f9db8e7
Add extensive unit tests across packages
openminddev Jun 3, 2026
696384c
Cleanup: ignore Close errors and remove unused field
openminddev Jun 3, 2026
58f590f
Add ResetUserContext and reset on mode init
openminddev Jun 3, 2026
245a851
Migrate ElevenLabs ASR to Go (mic + RTSP inputs) (#2597)
shicaih Jun 3, 2026
79d32ad
Add integration tests and testdata
openminddev Jun 4, 2026
fd73b9e
Remove URID from TestBuildMeta expectations
openminddev Jun 4, 2026
807f30c
Refactor TTS into internal/providers/tts with interrupt handling (#2601)
openminddev Jun 4, 2026
21531bc
Remove Microsoft greeting config; update Unitree
openminddev Jun 4, 2026
40a72ce
Add new arm action enum values
openminddev Jun 4, 2026
68a6889
Handle interrupts while finishing ffplay
openminddev Jun 4, 2026
56e4802
Add model param and escape API key in Google ASR
openminddev Jun 4, 2026
39e85fc
Require ASR transcripts to have 3+ words
openminddev Jun 4, 2026
a0be0fb
Update Unitree G1 identity, gestures, and TTS
openminddev Jun 4, 2026
c9d1596
Migrate documentation to Golang (#2596)
Prachi1615 Jun 4, 2026
d198c07
Adjust ASR tests for three-word transcript
openminddev Jun 4, 2026
2bca280
Add GitHub Actions binary release workflow
openminddev Jun 4, 2026
1daaa84
Update CI push trigger to 'go' branch
openminddev Jun 4, 2026
147cd42
Switch macOS runner and remove Windows build job
openminddev Jun 4, 2026
6d0d9c3
Update nightly release name
openminddev Jun 4, 2026
66da2fe
Format README note and link MIT license
openminddev Jun 4, 2026
c68e64c
Condense README license section
openminddev Jun 4, 2026
8e715ca
Add release environment and summary step
openminddev Jun 4, 2026
72ac1ab
Use 'staging' env for nightly releases
openminddev Jun 4, 2026
93bc774
Add parallel asr (#2604)
shicaih Jun 5, 2026
be395b1
Update README (#2608)
openminddev Jun 5, 2026
69da140
Add VLM video stream provider and utils
openminddev Jun 5, 2026
312d0e4
Add VLM input plugin and response latency metrics
openminddev Jun 5, 2026
d68a79b
Update README VLM support status
openminddev Jun 5, 2026
8b541db
Add VLM describer, latest frame cache & greeting
openminddev Jun 5, 2026
e5376b1
Remove DecodeFormat and add RTSPURL default
openminddev Jun 5, 2026
659ac88
Track pending TTS requests and wait for playback
openminddev Jun 5, 2026
d02dcf5
Add GreetingStatus sensor and final-turn guidance
openminddev Jun 5, 2026
ee988ce
Add VLMGeminiRTSP and adjust ending logic
openminddev Jun 5, 2026
6585974
Remove three persona IDs from greeting config
openminddev Jun 5, 2026
13d0d16
Add cooldown to ASR sensor to suppress rapid transcripts
openminddev Jun 5, 2026
8525d21
Remove redundant comment in ASR test
openminddev Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 1 addition & 19 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,23 +1,5 @@
# This variable is required if you are using the Ethereum wallet integration.
ETH_ADDRESS=

# These variables are required if you are using the Coinbase wallet integration.
COINBASE_WALLET_ID=
COINBASE_API_KEY=
COINBASE_API_SECRET=

# Backup provision of api key and URID if you do not want to modify the config file
# Backup provision of api key if you do not want to modify the config file
OM_API_KEY=
URID=

# These variables are required if you are using the Twitter integration.
TWITTER_API_KEY=
TWITTER_API_SECRET=
TWITTER_ACCESS_TOKEN=
TWITTER_ACCESS_TOKEN_SECRET=

# Robot IP address fallback (used when not specified in config file)
ROBOT_IP=

# Command to run (e.g., unitree_go2_modes). Used by Docker.
OM1_COMMAND=
47 changes: 29 additions & 18 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,44 @@
# Copilot Instructions

## Tooling / Dependencies
- We use **uv** for Python dependency management and execution.
- Dependencies are defined in `pyproject.toml` (do not introduce `requirements.txt` unless explicitly requested).
- Use these commands in docs/examples:
- Install/sync: `uv sync`
- Add deps: `uv add <package>`
- Run commands: `uv run <command>` (e.g., `uv run pytest`)
- If adding a new dependency, prefer a well-maintained package and keep the dependency list minimal.
- Assume a lockfile is used (e.g., `uv.lock`) — do not suggest deleting or bypassing it.
- We use **Make** for building, testing, and running the project.
- Dependencies are managed via Go modules (`go.mod` and `go.sum`).
- Use these make commands:
- Build: `make build`
- Test: `make test`
- Test with coverage: `make test-coverage`
- Run: `make run CONFIG=<config_name>`
- Dev mode: `make dev CONFIG=<config_name>`
- Lint: `make lint`
- Format: `make fmt`
- Check all: `make check` (runs fmt, vet, lint, and test)
- Clean: `make clean`
- When adding a new dependency, use `go get <package>` and run `make deps` to tidy.
- Keep the dependency list minimal and prefer well-maintained packages.

## Coding Style
- Use Python 3.10
- Prefer async/await
- Use type hints everywhere
- Follow PEP8 and Black formatting
- Use Go 1.21+
- Follow Go conventions and idiomatic patterns
- Use proper error handling (never ignore errors)
- Follow the standard Go project layout
- Use `gofmt` for formatting (enforced by `make fmt`)

## Architecture
- Use modular design
- Separate API, service, and data layers
- No business logic inside routes
- Separate concerns: inputs, actions, backgrounds, LLM providers
- Keep business logic out of HTTP handlers
- Use interfaces for abstractions

## Testing
- Use pytest
- Use Go's built-in testing framework
- Add unit tests for all new functions
- Aim for 90% code coverage
- Prefer to use patch and mock for external dependencies
- For patches, patch it using `with (patch("full.path.to.ClassOrFunction1") as mock1, patch("full.path.to.ClassOrFunction2") as mock2):` to ensure the patch is applied in the correct scope.
- Run tests with race detector: `make test`
- Use table-driven tests where appropriate
- Mock external dependencies using interfaces

## Comments
- Write numpy style docstrings
- Write clear package documentation
- Document exported functions and types
- Avoid obvious comments
- Use godoc conventions
210 changes: 210 additions & 0 deletions .github/workflows/binary-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
name: "OM1 Binary Release"

on:
push:
branches: [ "go" ]
tags: [ "v*" ]
workflow_dispatch:
inputs:
version:
description: "Version/tag for naming the archives (e.g. v1.2.3)"
required: true
default: "v0.0.0-dev"
publish:
description: "Create a GitHub Release and upload the archives"
type: boolean
default: false

permissions:
contents: write

env:
ZENOH_C_VERSION: "1.9.0"

jobs:
setup:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.v.outputs.version }}
publish: ${{ steps.v.outputs.publish }}
prerelease: ${{ steps.v.outputs.prerelease }}
steps:
- id: v
shell: bash
run: |
set -euo pipefail
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "version=${{ inputs.version }}" >> "$GITHUB_OUTPUT"
echo "publish=${{ inputs.publish }}" >> "$GITHUB_OUTPUT"
echo "prerelease=false" >> "$GITHUB_OUTPUT"
elif [[ "${GITHUB_REF}" == refs/tags/v* ]]; then
echo "version=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
echo "publish=true" >> "$GITHUB_OUTPUT"
echo "prerelease=false" >> "$GITHUB_OUTPUT"
else
echo "version=nightly" >> "$GITHUB_OUTPUT"
echo "publish=true" >> "$GITHUB_OUTPUT"
echo "prerelease=true" >> "$GITHUB_OUTPUT"
fi

build-unix:
name: Build ${{ matrix.name }}
needs: setup
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- name: linux-amd64
runner: ubuntu-latest
os: linux
- name: linux-arm64
runner: ubuntu-22.04-arm
os: linux
- name: darwin-arm64
runner: macos-14
os: darwin
- name: darwin-amd64
runner: macos-15-intel
os: darwin
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install build dependencies (Linux)
if: matrix.os == 'linux'
run: sudo apt-get update && sudo apt-get install -y portaudio19-dev pkg-config patchelf

- name: Install build dependencies (macOS)
if: matrix.os == 'darwin'
run: brew install portaudio pkg-config

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true

- name: Cache zenoh-c
uses: actions/cache@v4
with:
path: .zenoh-c
key: ${{ runner.os }}-${{ runner.arch }}-zenoh-c-${{ env.ZENOH_C_VERSION }}

- name: Build binary
run: make build

- name: Package archive
id: pkg
shell: bash
env:
VERSION: ${{ needs.setup.outputs.version }}
PLATFORM: ${{ matrix.name }}
run: |
set -euo pipefail
STAGE="dist/om1-${VERSION}-${PLATFORM}"
mkdir -p "$STAGE"

# Binary
cp build/om1 "$STAGE/om1"

# Bundle the zenoh-c shared library next to the binary and make the
# binary look for it via a relative rpath.
if [ "${{ matrix.os }}" = "linux" ]; then
cp .zenoh-c/lib/libzenohc.so* "$STAGE/"
patchelf --set-rpath '$ORIGIN' "$STAGE/om1"
else
cp .zenoh-c/lib/libzenohc.dylib "$STAGE/"
# Drop the CI's absolute build-time rpath and add a relative one.
install_name_tool -delete_rpath "$PWD/.zenoh-c/lib" "$STAGE/om1" 2>/dev/null || true
install_name_tool -add_rpath @executable_path "$STAGE/om1"
fi

# Runtime data the binary expects to find via -config / knowledge base.
cp -R config "$STAGE/config"
[ -d knowledge_base ] && cp -R knowledge_base "$STAGE/knowledge_base" || true

cat > "$STAGE/INSTALL.txt" <<EOF
OM1 ${VERSION} (${PLATFORM})

1. Install runtime prerequisites:
macOS: brew install portaudio ffmpeg
Linux: sudo apt-get install -y libportaudio2 ffmpeg

2. Run:
./om1 -config config/conversation.json5

The bundled libzenohc (in this folder) is loaded automatically via a
relative rpath, so keep it next to the om1 binary.
EOF

ARCHIVE="om1-${VERSION}-${PLATFORM}.tar.gz"
tar -C dist -czf "$ARCHIVE" "om1-${VERSION}-${PLATFORM}"
shasum -a 256 "$ARCHIVE" > "${ARCHIVE}.sha256"
echo "archive=${ARCHIVE}" >> "$GITHUB_OUTPUT"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}
path: |
${{ steps.pkg.outputs.archive }}
${{ steps.pkg.outputs.archive }}.sha256
if-no-files-found: error

release:
name: Publish Release
runs-on: ubuntu-latest
needs: [setup, build-unix]
if: ${{ needs.setup.outputs.publish == 'true' }}
permissions:
contents: write
environment:
name: ${{ needs.setup.outputs.version == 'nightly' && 'staging' || 'production' }}
url: ${{ steps.gh_release.outputs.url }}
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Flatten artifacts
run: |
mkdir -p release
find artifacts -type f \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.sha256" \) -exec cp {} release/ \;
ls -lh release

- name: Move nightly tag to current commit
if: needs.setup.outputs.version == 'nightly'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh api -X PATCH "repos/${{ github.repository }}/git/refs/tags/nightly" \
-f sha="${{ github.sha }}" -F force=true \
|| gh api -X POST "repos/${{ github.repository }}/git/refs" \
-f ref="refs/tags/nightly" -f sha="${{ github.sha }}"

- name: Create / update GitHub Release
id: gh_release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.setup.outputs.version }}
name: ${{ needs.setup.outputs.version == 'nightly' && 'Development Build' || needs.setup.outputs.version }}
prerelease: ${{ needs.setup.outputs.prerelease == 'true' }}
generate_release_notes: true
files: release/*

- name: Write release summary
run: |
{
echo "## OM1 ${{ needs.setup.outputs.version }} published"
echo ""
echo "- **Release:** ${{ steps.gh_release.outputs.url }}"
echo "- **Channel:** ${{ needs.setup.outputs.version == 'nightly' && 'development (prerelease)' || 'production' }}"
echo "- **Commit:** \`${{ github.sha }}\`"
echo ""
echo "### Assets"
echo '```'
ls -1 release/*.tar.gz
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
63 changes: 0 additions & 63 deletions .github/workflows/generate-config-schema.yml

This file was deleted.

Loading
Loading