AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证一个用于可组合、自托管语音 AI 代理的框架——提供 persona YAML 和 Python 技能;其余工作由 Huxley 处理。
AI 翻译
A framework for composable, self-hosted voice AI agents — bring a persona YAML and Python skills; Huxley handles the rest.
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
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.查看完整 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