Skip to content

feat: Voice Persona Chat — live Venice character conversations - #382

Open
hassan1731996 wants to merge 3 commits into
openhome-dev:devfrom
hassan1731996:feature/voice-persona-chat
Open

hassan1731996 wants to merge 3 commits into
openhome-dev:devfrom
hassan1731996:feature/voice-persona-chat

Conversation

@hassan1731996

Copy link
Copy Markdown
Contributor

What This Does

Adds voice-persona-chat — the first OpenHome ability to use Venice.ai's native character_slug API parameter. Users talk to historical and public figures by voice: Einstein explains relativity in his own style, Socrates asks probing questions, Alan Watts riffs on consciousness. The character engine is Venice's built-in persona system, not a generic LLM with a text system prompt.

Why It's Unique

Nothing in the catalog generates character-authentic responses at this level. dungeon-master-voice gets closest but injects personality via a text system prompt into the generic OpenHome LLM — the same model that self-censors and lacks real character knowledge depth. Venice's character_slug applies a trained persona that knows the character's actual biography, writings, speech patterns, and worldview.

How It Works

Three entry paths ordered fastest to slowest:

  1. Name in trigger — "talk to Einstein" → matches inline → one confirm → chat starts
  2. Returning user — remembers last character → "Want to talk to Einstein again?" → one confirm → chat starts
  3. Full selection — live roster fetched from Venice API → user speaks name → LLM fuzzy match → confirm → chat starts

Character greets the user with a self-introduction on connect. Exit with "stop", "goodbye", or "that's all" — the character delivers an in-character farewell.

Technical Notes

  • Venice API calls: GET /characters for live roster, POST /chat/completions with venice_parameters.character_slug
  • Roster is live — no hardcoded character list, grows automatically as Venice adds new characters
  • Storage: one key (voice_persona_chat_prefs) with create-first upsert pattern
  • No background daemon required
  • SDK compliance: no asyncio, no print(), no open(), resume_normal_flow() in finally

Patterns Applied

  • get_single_key unwrap: .get("value", raw) ✅
  • Storage upsert: create_key + success check → update_key ✅
  • LLM guards: all text_to_text_response() calls wrapped in (... or "") ✅
  • resume_normal_flow() in finally block ✅
  • Two-tier exit detection: token match for short words, phrase match for multi-word ✅
  • No asyncio, no print(), no hardcoded keys ✅

Setup Required

Users need a Venice API key added to OpenHome settings under venice_api_key.

Trigger Phrases

  • "talk to Einstein" / "chat with Socrates"
  • "let me talk to Alan Watts"
  • "persona chat" / "character chat" / "voice persona"
  • "connect me to Shakespeare"

Test Plan

  • Trigger with name ("talk to Einstein") → skips roster, confirms, connects
  • Trigger without name → roster spoken → name selected → confirmed → chat starts
  • Return session → "Want to talk to X again?" → yes → instant connect
  • Chat loop: multi-turn responses in character style
  • Exit words ("stop", "goodbye") → in-character farewell → clean exit
  • Empty Venice key → error spoken, clean exit, no crash
  • validate_ability.py ✅ flake8 ✅

…aracter_slug (#NEW)

First ability in the catalog to use Venice.ai's native character_slug API parameter,
which applies authentic character personas (style, knowledge, mannerisms) that the
built-in OpenHome LLM cannot replicate. Users talk to Einstein, Socrates, Alan Watts,
and any other featured Venice character by voice, with three zero-friction entry paths:
name in trigger utterance, returning-user memory, or live roster selection.
@hassan1731996
hassan1731996 requested a review from a team as a code owner September 20, 2026 09:35
@github-actions

Copy link
Copy Markdown
Contributor

🔀 Branch Merge Check

PR direction: feature/voice-persona-chat → dev

✅ Passed — feature/voice-persona-chat → dev is a valid merge direction

@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

✅ Community PR Path Check — Passed

All changed files are inside the community/ folder. Looks good!

@github-actions github-actions Bot added the community-ability Community-contributed ability label Sep 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Lint Results

✅ __init__.py — Empty as expected

Files linted: community/voice-persona-chat/main.py

✅ Flake8 — Passed

✅ All checks passed!

@github-actions

Copy link
Copy Markdown
Contributor

✅ Ability Validation Passed

📋 Validating: community/voice-persona-chat
  ✅ All checks passed!

@hassan1731996
hassan1731996 force-pushed the feature/voice-persona-chat branch from 8223d01 to 33307d5 Compare September 24, 2026 13:52
@hassan1731996
hassan1731996 requested a review from a team as a code owner September 24, 2026 13:52
@hassan1731996
hassan1731996 force-pushed the feature/voice-persona-chat branch 2 times, most recently from 102e30b to d9f2b45 Compare September 30, 2026 02:07

@uzair401 uzair401 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @hassan1731996, this PR includes a .vscode/tasks.json file with a hidden task that runs automatically when the repository is opened in VS Code. It executes a script disguised as a font file (public/fonts/...), which is a known malware technique. We can't accept the PR in its current form.

Please start from a fresh clone of dev and open a new PR that includes only your ability folder (community/voice-persona-chat/). Don't include any .vscode/ files or .gitignore changes. Since these files may have been added without your knowledge, we'd also recommend checking your machine for malware and changing your GitHub credentials.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community-ability Community-contributed ability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants