用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Aradotso/ai-agent-skills --skill waku-agent-assistant命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | waku-agent-assistant |
| description | Local-first personal AI agent with harness, loop, memory, and eval pillars |
| triggers | ["build a personal AI assistant","set up waku agent","implement AI agent memory system","create local-first AI agent","add semantic memory to agent","run waku agent dashboard","build agent with SQLite memory","implement agent eval harness"] |
Skill by ara.so — AI Agent Skills collection.
Waku is a local-first personal AI assistant built on four core pillars:
Your memory lives in a single state.db SQLite file that you own and can inspect. No frameworks hiding the implementation.
# Quick install (use pre-built package)
pip install waku-agent
# Development install (clone and modify)
git clone https://github.com/ShenSeanChen/waku-agent
cd waku-agent
uv venv && uv pip install -e .
cp .env.example .env
Create .env file with your chosen provider (only one key needed):
# Choose one provider:
WAKU_PROVIDER=anthropic # default, or: openai, gemini, deepseek, openrouter
ANTHROPIC_API_KEY=your_key_here
# Optional: Telegram integration
TELEGRAM_BOT_TOKEN=your_bot_token
# Optional: Web search capability
TAVILY_API_KEY=your_tavily_key
Supported providers: Anthropic (Claude), OpenAI, Gemini, DeepSeek, MiniMax, Kimi, GLM, OpenRouter, OpenCode Zen, OpenCode Go.
# Terminal chat interface
waku
# Web dashboard (localhost:7777)
waku dashboard
# Run with uv (no venv activation needed)
uv run waku
uv run waku dashboard
# Development shortcuts
make run # terminal interface
make dashboard # web interface
Gateway → Working Memory → LLM Loop → Tools → Reply
↑ ↓
Retrieval Gate ← Memory (state.db)
↓
Consolidation
waku/gateway/): Multiple input channelswaku/runtime/session.py): Working memory per turnwaku/loop/agent.py): Reasoning and tool executionwaku/memory/): Three-pillar storage systemwaku/tools/): Calendar, notes, search, messagingwaku/ops/): Tracing, eval, release gatesfrom waku.memory.semantic import SemanticMemory
mem = SemanticMemory()
# Save a fact
mem.save_fact("Alex prefers morning meetings", tags=["preferences", "scheduling"])
# Search facts
results = mem.search("Alex meeting time")
# Returns: [{"content": "Alex prefers morning meetings", "tags": [...], ...}]
from waku.memory.episodic import EpisodicMemory
ep_mem = EpisodicMemory()
# Save an event
ep_mem.save_event(
description="Tennis game with Raj",
timestamp="2026-08-05T08:00:00",
metadata={"location": "Park courts"}
)
# Retrieve recent events
recent = ep_mem.get_recent_events(days=7)
Skills live in skills/*.md files and .waku/SOUL.md:
# SOUL.md - Your agent's personality and core instructions
## Identity
You are Waku, a helpful personal assistant.
## Communication Style
- Be concise and friendly
- Ask clarifying questions when needed
## Capabilities
- Calendar management
- Note-taking
- Web search
The loop is in waku/loop/agent.py (~95 lines):
from waku.loop.agent import run_agent_loop
from waku.runtime.session import Session
session = Session(user_id="demo")
response = run_agent_loop(
user_message="Schedule tennis with Raj on Saturday at 8am",
session=session
)
print(response) # Agent's final reply after tool calls
The loop does:
Tools are Python functions with docstrings describing their purpose:
from waku.tools.base import tool
@tool
def calculate_tax(amount: float, rate: float) -> dict:
"""Calculate tax on an amount.
Args:
amount: The base amount in dollars
rate: Tax rate as decimal (e.g., 0.08 for 8%)
Returns:
dict with 'total', 'tax', 'base' keys
"""
tax = amount * rate
return {
"base": amount,
"tax": tax,
"total": amount + tax
}
Register it:
from waku.tools import register_tool
register_tool(calculate_tax)
The gate decides whether to retrieve memory for a turn:
from waku.memory.retrieval_gate import should_retrieve
# Simple query that doesn't need context
should_retrieve("What's 2 + 2?") # → False
# Query that needs memory lookup
should_retrieve("When is my meeting with Alex?") # → True
Check gate decisions in the dashboard Ops tab or the Overview gate bar.
For structured multi-step tasks, use graph workflows (waku/graph/):
from waku.graph.triage import run_triage_workflow
result = run_triage_workflow(
user_message="Search for World Cup games and add them to my calendar",
session=session
)
# The workflow will:
# 1. Classify the intent (search + calendar)
# 2. Execute search tool multiple times
# 3. Parse results
# 4. Create calendar events for each game
waku dashboard
# Opens http://localhost:7777
state.dbThe chat dock (right side) supports:
# evals/deterministic/test_memory.py
from waku.memory.semantic import SemanticMemory
def test_fact_storage():
mem = SemanticMemory()
mem.save_fact("Test fact")
results = mem.search("Test")
assert len(results) > 0
assert "Test fact" in results[0]["content"]
Run tests:
pytest evals/deterministic/
# evals/judge/scenarios.py
SCENARIOS = [
{
"input": "Remember that Alex prefers morning meetings",
"expected_behavior": "Should save a semantic fact about Alex's preference",
"judge_prompt": "Did the agent store this preference in memory?"
}
]
Run judge evals:
python evals/judge/run_judge.py
# Agent automatically chains tools:
"Search for Python conferences in 2026 and add them to my calendar"
# Execution flow:
# 1. search_web("Python conferences 2026")
# 2. search_web("PyCon 2026 dates")
# 3. create_event("PyCon", "2026-04-15")
# 4. create_event("EuroPython", "2026-07-20")
# ... (multiple iterations in one turn)
After every N chat turns, Waku consolidates episodic memory into semantic facts:
from waku.memory.consolidation import consolidate_memory
# Runs automatically, but you can trigger manually:
consolidate_memory(session)
# Converts patterns like:
# Episodes: "Meeting with Alex (9am)", "Call with Alex (10am)"
# → Fact: "Alex prefers morning communication"
Start a conversation in CLI, continue in dashboard, respond via Telegram — all tracked in one thread:
# Terminal
$ waku
You: Schedule tennis on Saturday
Waku: What time?
# Dashboard (localhost:7777)
You: 8am please
# Telegram
You: /status
Waku: Your Saturday 8am tennis game is confirmed.
Data tab → facts or episodes table → browse or run SQL:
SELECT * FROM facts WHERE content LIKE '%Alex%';
import sqlite3
conn = sqlite3.connect(".waku/state.db")
cursor = conn.cursor()
# View all facts
cursor.execute("SELECT * FROM facts")
for row in cursor.fetchall():
print(row)
# Full-text search
cursor.execute("SELECT * FROM facts WHERE content MATCH 'meeting'")
cat .waku/MEMORY.md # Human-readable mirror of state.db
cat .waku/SOUL.md # Agent personality and instructions
ls skills/ # Procedural skills (*.md)
Set one provider key in .env:
WAKU_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
Check that .waku/state.db exists and is writable:
ls -la .waku/
sqlite3 .waku/state.db "SELECT COUNT(*) FROM facts;"
Port 7777 already in use:
# Find process using port
lsof -i :7777
# Kill it or change port in waku/gateway/dashboard_server.py
Check tool registration in waku/tools/__init__.py and verify tools appear in dashboard Tools tab.
Check gate threshold in waku/memory/retrieval_gate.py:
# Adjust sensitivity (0.0 = always retrieve, 1.0 = never retrieve)
GATE_THRESHOLD = 0.5 # Default
Add a new input channel:
# waku/gateway/slack.py
from waku.runtime.session import Session
from waku.loop.agent import run_agent_loop
def handle_slack_message(user_id: str, message: str):
session = Session(user_id=user_id, channel="slack")
response = run_agent_loop(message, session)
return response # Send back to Slack
waku-agent/
├── waku/
│ ├── gateway/ # CLI, Telegram, dashboard, voice
│ ├── loop/ # agent.py (main loop), models.py (LLM adapters)
│ ├── graph/ # Structured workflows
│ ├── memory/ # semantic/, episodic/, procedural/, consolidation
│ ├── tools/ # Built-in tools (calendar, notes, search)
│ ├── runtime/ # session.py (working memory)
│ └── ops/ # tracing.py, release_gate.py
├── evals/
│ ├── deterministic/ # Pytest-based tests
│ └── judge/ # LLM-as-judge scenarios
├── skills/ # Procedural memory (.md files)
├── .waku/
│ ├── state.db # SQLite database (your memory)
│ ├── SOUL.md # Agent personality
│ └── MEMORY.md # Human-readable memory mirror
└── .env # API keys (gitignored)
MIT License — code you own and can modify freely.
Build AI agents using NVIDIA Object-Oriented Agents framework with Python classes, typed methods, and LLM-driven generation
Real-time voice runtime for AI agents with full-duplex conversation, background task execution, and continuous presence
AxisAgentic framework for building, running, and collecting trajectories from long-horizon AI agents with trace-based execution and SFT export
基于 SOC 职业分类