neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Build voice agents you own. Bring a persona and skills — Huxley handles turn coordination, interrupts, proactive speech, and audio bridging.
Developer toolsPython · CGitHub @ma-r-sOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A framework for composable, self-hosted voice AI agents — bring a persona YAML and Python skills; Huxley handles the rest.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A framework for composable, self-hosted voice AI agents — bring a persona YAML and Python skills; Huxley handles the rest.
Open http://localhost:5174, hold the button, speak.Read the full README ↗A framework for composable, self-hosted voice AI agents — bring a persona YAML and Python skills; Huxley handles the rest.
Terminal 1 — server:
git clone https://github.com/ma-r-s/Huxley.git && cd Huxley
echo "HUXLEY_OPENAI_API_KEY=sk-..." > server/runtime/.env
uv sync && cd server/runtime && uv run huxley
Terminal 2 — browser client:
cd clients/pwa && bun install && bun dev
Open http://localhost:5174, hold the button, speak.
persona.yaml, get a different agent; voice, language, personality, skill list, all in one filenever_say_no, confirm_destructive, etc.; skills opt in to respecting themctx.inject_turn())flowchart LR
P["persona.yaml\nidentity · constraints · skills"] --> R
subgraph R["Huxley Runtime"]
direction TB
SES[session] --> TC[turn coordinator]
TC --> FM[focus manager]
end
R --> V["Voice provider\nOpenAI Realtime"]
R --> SK["Skills (huxley_sdk)"]
R --> C["Client\nbrowser · ESP32 · any WebSocket"]
Skills and the voice provider never communicate directly — all routing goes through the runtime. The focus manager prevents audio collisions between model speech, skill audio streams, and full-duplex input claims.
All 9 are independently published to PyPI; install any of them with uv add huxley-skill-<name> and enable with one line in persona.yaml.
| Skill | What it does |
|---|---|
huxley-skill-audiobooks | Local .m4b/.mp3 library — pause, resume, rewind, position persisted |
huxley-skill-radio | HTTP/Icecast radio via ffmpeg, buffered with auto-reconnect |
huxley-skill-news | Weather (Open-Meteo) + headlines (Google News RSS), cached |
huxley-skill-search | DuckDuckGo web search, no API key needed |
huxley-skill-timers | Countdown timers (relative — "in 10 minutes"), SQLite-persisted |
huxley-skill-reminders | Calendar-time reminders with retry escalation if unacknowledged |
huxley-skill-system | Volume control, current time |
huxley-skill-telegram | Full-duplex voice calls + text messages via Telegram |
huxley-skill-stocks | Voice-controlled stock quotes via Alpha Vantage — the reference skill |
Browse the registry feed at huxley-registry/index.json or its human-readable mirror at docs/skills/index.md. The SDK every skill builds against is huxley-sdk — uv add huxley-sdk if you're writing a new one.
Skills are Python packages registered via entry points. The framework never imports skill code directly — it loads them at startup through huxley.skills entry points.
from huxley_sdk import ToolDefinition, ToolResult, SkillContext
class LightsSkill:
@property
def name(self) -> str: return "lights"
@property
def tools(self) -> list[ToolDefinition]:
return [ToolDefinition(
name="set_lights",
description="Turn the lights on or off.",
parameters={"type": "object", "properties": {"on": {"type": "boolean"}}, "required": ["on"]},
)]
async def setup(self, ctx: SkillContext) -> None:
self._api_key = ctx.config["api_key"]
async def handle(self, tool_name: str, args: dict) -> ToolResult:
on = args["on"]
await call_lights_api(self._api_key, on)
return ToolResult(output="Lights turned on." if on else "Lights turned off.")
async def teardown(self) -> None: ...
ToolResult.output is a string the voice model reads aloud — what the agent says after using the tool.
# pyproject.toml
[project.entry-points."huxley.skills"]
lights = "my_package.skill:LightsSkill"
Enable in persona.yaml:
skills:
lights:
api_key: "..."
docs/skills/README.md: every primitive (ctx.storage, ctx.secrets, ctx.inject_turn, InputClaim, ...).docs/skills/authoring.md: annotates huxley-skill-stocks line by line.docs/skills/installing.md: how to drop a skill into a persona.docs/skill-marketplace.md: v1/v2 split, on-disk shapes, conventions you can rely on.brew install opus on macOS, apt install libopus0 on Debian/Ubuntu (Orange Pi). Without it the server still runs and serves those clients PCM.Linux and macOS supported. Windows untested.
uv sync --all-packages
uv run ruff check server/ && uv run mypy server/sdk/src server/runtime/src
uv run pytest server/
cd clients/pwa && bun run check
Full documentation at huxley.ma-r-s.com/docs — architecture, SDK reference, persona guide, wire protocol, observability, and roadmap.
MIT License · pre-1.0 — runs end-to-end, in daily use