tinyhumansai/openhuman · error · VoiceNotCompiledError

voice_not_compiled

voice_not_compiled

Error message

Voice transcription is unavailable in this build — the voice module was not compiled into the app. Update OpenHuman to the latest version; restarting will not help.

What it means

Argument-loop error from `openhuman memory graph` (alias `graph-query`). Accepted tokens are only `--namespace/-n`, `--subject`, `--predicate` (each with a value), `-v/--verbose`, `-h/--help`. Anything else — unknown flag or positional — aborts. Note a dangling `--subject`/`--predicate` at end of argv produces the separate `missing value for {flag}` error, not this one.

Source

Thrown at app/src/features/human/voice/sttClient.ts:122

  const rpcStart = Date.now();
  let result: CloudTranscribeResult;
  try {
    result = await callCoreRpc<CloudTranscribeResult>({
      method: 'openhuman.voice_cloud_transcribe',
      params,
    });
  } catch (err) {
    // An "unknown method" error means the core serving this app was built
    // without the `voice` Cargo feature, so the `openhuman.voice_*`
    // controllers were never registered (#4901). This is a compile-time
    // property of the binary — restarting cannot change it, which is why the
    // old #1289-era "restart to pick up the latest core sidecar" copy was
    // unactionable (and the sidecar itself is gone since #1061).
    const msg = err instanceof Error ? err.message : String(err);
    if (msg.includes('unknown method')) {
      sttLog('[voice-stt] transcribe rpc: voice domain absent from core build: %s', msg);
      throw new VoiceNotCompiledError();
    }
    sttLog('transcribe rpc failed (passthrough): %O', err);
    throw err;
  }
  const text = result?.text?.trim() ?? '';
  sttLog('transcribed chars=%d rpc_ms=%d', text.length, Math.round(Date.now() - rpcStart));
  return text;
}

interface FactoryTranscribeOptions {
  /** BCP-47 language hint, e.g. `'en'`. */
  language?: string;
  /** Override the server-side provider resolution: `'cloud'` for the backend
   *  proxy, or a `voice_providers` slug. When unset the core resolves
   *  `voice_server.stt_engine`. */
  provider?: string;
  /** Model id for the selected engine (e.g. `'whisper-1'`, `'scribe_v1'`). */
  model?: string;

View on GitHub (pinned to a221052e0d)

Solutions

  1. Use exactly the three value flags: --namespace, --subject, --predicate
  2. Spell the flags precisely (no --object; the third slot is --predicate)
  3. Run `openhuman memory graph --help` to confirm the usage line

Example fix

# before
openhuman memory graph --object "doc:1"
# after
openhuman memory graph --subject "doc:1"
Defensive patterns

Strategy: validation

Validate before calling

# bash: graph accepts only --namespace/--subject/--predicate (+values), -v, -h
prev=''
for a in "$@"; do
  case "$a" in
    --namespace|-n|--subject|--predicate|-v|--verbose|-h|--help) ;;
    -*) echo "unknown graph arg: $a" >&2; exit 2 ;;
    *) [ -n "$prev" ] || { echo "positional not accepted: $a" >&2; exit 2; } ;;
  esac
  prev="$a"
done
openhuman memory graph "$@"

Try / catch

if ! out=$(openhuman memory graph "$@" 2>&1); then
  case "$out" in *"unknown graph arg"*) openhuman memory graph --help >&2; exit 2;; esac
  printf '%s\n' "$out" >&2; exit 1
fi

Prevention

When it happens

Trigger: `openhuman memory graph --object x` (typo for --subject); `openhuman memory graph mynamespace` (positional namespace not accepted); `openhuman memory graph --json`.

Common situations: Confusing subject/predicate/object vocabulary from RDF tooling; assuming positional forms; automation written against an older CLI revision.

Related errors


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/e420f837f6bc777e. Report an issue: GitHub.