
ericwang915/pythonclaw
Developer tools๐ Personal AI agent in pure Python โ OpenClaw reimagined. Memory, RAG, skills marketplace, cron, voice. Telegram/Discord/WhatsApp/Web. Works with DeepSeek, Claude, Gemini, Kimi, GLM, Ollama.
ะะฑะทะพั
A personal AI agent you own โ in pure Python. pip install and talk to it from your terminal, a web dashboard, or Telegram / Discord / WhatsApp. It remembers what matters, learns new skills on demand, and runs tasks on a schedule. The Python reimagining of OpenClaw โ no Node.js, no Rust, no C extensions. Just Python. Quick Start ยท Local with Ollama ยท Docker ยท Providers ยท Skills ยท Config ยท Library - ๐ โ one pip install, no Node/Rust/C toolchain. Import it as a library, not just a CLI. - ๐ โ DeepSeek, Claude, Gemini, Kimi, GLMโฆ or : no API key, nothing leaves your machine. - ๐ก โ the same brain answers from your CLI, a browser dashboard, and group chats, each with isolated memory. - ๐งฉ โ pulls from a 13K-skill marketplace, and can write and install a brand-new skill at runtime when none fits. Prefer to stay fully offline?
README
PythonClaw
A personal AI agent you own โ in pure Python. pip install and talk to it from your terminal, a web dashboard, or Telegram / Discord / WhatsApp.It remembers what matters, learns new skills on demand, and runs tasks on a schedule.
The Python reimagining of OpenClaw โ no Node.js, no Rust, no C extensions. Just Python.
Quickย Start ยท Localย withย Ollama ยท Docker ยท Providers ยท Skills ยท Config ยท Library
Why PythonClaw
- ๐ Pure Python, zero build step โ one
pip install, no Node/Rust/C toolchain. Import it as a library, not just a CLI. - ๐ Any model, or none โ DeepSeek, Claude, Gemini, Kimi, GLMโฆ or 100% local with Ollama: no API key, nothing leaves your machine.
- ๐ก One agent, everywhere โ the same brain answers from your CLI, a browser dashboard, and group chats, each with isolated memory.
- ๐งฉ It grows itself โ pulls from a 13K-skill marketplace, and can write and install a brand-new skill at runtime when none fits.
Quick Start
pip install pythonclaw
pythonclaw onboard # pick a provider, paste an API key (or choose Ollama โ no key)
pythonclaw start # daemon + web dashboard at http://localhost:7788
pythonclaw chat # or just chat in the terminal
Prefer to stay fully offline? One line, no key:
LLM_PROVIDER=ollama pythonclaw chat # needs a local Ollama running
Whatโs inside
| Feature | Details | |
|---|---|---|
| ๐ง | Provider-agnostic | DeepSeek, Grok, Claude, Gemini, Kimi, GLM, Ollama (100% local) โ or any OpenAI-compatible API |
| ๐ ๏ธ | Self-extending skills | Three-tier progressive loading (metadata โ instructions โ resources) + a 13K-skill ClawHub marketplace, and the agent can author its own |
| ๐พ | Persistent memory | Plain-Markdown long-term memory with daily logs and semantic recall โ grep-able, backup-able, no database |
| ๐ | Hybrid RAG | BM25 + dense embeddings + RRF fusion + LLM re-ranking over your own docs |
| ๐ | Web dashboard | Browser UI for chat, config, skill catalog, identity editing, and marketplace |
| ๐๏ธ | Voice input | Speech-to-text via Deepgram, or fully local with Whisper (stt.provider: "whisper") |
| โฐ | Cron jobs | Schedule tasks in config, or let the agent schedule its own and message you |
| ๐ก | Multi-channel | CLI, Web, Telegram, Discord, WhatsApp โ one agent behind every front-end |
CLI Reference
| Command | Description |
|---|---|
pythonclaw onboard |
Interactive setup wizard โ choose LLM provider, enter API key |
pythonclaw start |
Start the agent as a background daemon |
pythonclaw start -f |
Start in foreground (no daemonize) |
pythonclaw start --channels telegram discord whatsapp |
Start with messaging channels |
pythonclaw stop |
Stop the running daemon |
pythonclaw status |
Show daemon status (PID, uptime, port) |
pythonclaw chat |
Interactive CLI chat (foreground REPL) |
pythonclaw skill search |
Search skills on ClawHub |
pythonclaw skill browse |
Browse top-rated skills |
pythonclaw skill install |
Install a community skill |
pythonclaw skill info |
View skill details |
First Run
$ pythonclaw start
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PythonClaw โ Setup Wizard โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Choose your LLM provider:
1. DeepSeek
2. Grok (xAI)
3. Claude (Anthropic)
4. Gemini (Google)
5. Kimi (Moonshot)
6. GLM (Zhipu / ChatGLM)
7. Ollama (100% local โ no API key)
Enter number (1-7): 1
โ DeepSeek
API Key: ********
โ Key set (sk-****)
Validating... โ Valid!
โ Setup complete!
[PythonClaw] Daemon started (PID 12345).
[PythonClaw] Dashboard: http://localhost:7788
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PythonClaw โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ CLI โ Daemon โ Sessions โ Core โ
โ โ โ โ โ
โ onboard โ start / โ Store(MD) โ Agent โ
โ chat โ stop / โ Manager โ โโ Memory (Markdown) โ
โ skill โฆ โ status โ Locks + โ โโ RAG (Hybrid) โ
โ โ โ Semaphore โ โโ Skills (3-tier) โ
โ Web UI โโโค Channels โ โ โโ Compaction โ
โ Voice In โ Telegram โ Per-group โ โโ Soul + Persona โ
โ โ Discord โ Isolation โ โโ Group Context โ
โ โ WhatsApp โ โ โโ Tool Execution โ
โโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ LLM Provider Abstraction Layer โ
โ DeepSeek โ Grok โ Claude โ Gemini โ Kimi โ GLM โ Ollama โ โฆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ClawHub Marketplace (clawhub.com) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Web Dashboard
Start with pythonclaw start and open http://localhost:7788.
- Dashboard โ agent status, soul/persona preview, tool list
- Chat โ real-time chat with voice input (Deepgram)
- Skill Catalog โ browse installed skills by category
- Marketplace โ search and install skills from ClawHub
- Configuration โ edit LLM provider, API keys, and settings in-browser
Configuration
All configuration lives in pythonclaw.json (auto-created by pythonclaw onboard).
See pythonclaw.example.json for the full template.
{
"llm": {
"provider": "grok",
"grok": { "apiKey": "xai-...", "model": "grok-3" }
},
"tavily": { "apiKey": "" },
"deepgram": { "apiKey": "" },
"web": { "host": "127.0.0.1", "port": 7788 },
"channels": {
"telegram": { "token": "" },
"discord": { "token": "" },
"whatsapp": { "phoneNumberId": "", "token": "", "verifyToken": "pythonclaw_verify" }
},
"isolation": { "perGroup": false },
"concurrency": { "maxAgents": 4 }
}
Environment variables (e.g. DEEPSEEK_API_KEY, TAVILY_API_KEY, LLM_PROVIDER) override JSON values.
Security: the dashboard has full agent access, so
web.hostdefaults to127.0.0.1(loopback only). Expose it deliberately โ setweb.hostto0.0.0.0(orPYTHONCLAW_WEB_HOST=0.0.0.0in containers) only behind your own auth/tunnel.
Supported LLM Providers
| Provider | llm.provider |
Default Model | API key |
|---|---|---|---|
| DeepSeek | deepseek |
deepseek-chat |
DEEPSEEK_API_KEY |
| Grok (xAI) | grok |
grok-3 |
GROK_API_KEY |
| Claude (Anthropic) | claude |
claude-sonnet-4-20250514 |
ANTHROPIC_API_KEY (or claude setup-token) |
| Gemini (Google) | gemini |
gemini-2.0-flash |
GEMINI_API_KEY |
| Kimi (Moonshot) | kimi |
moonshot-v1-128k |
KIMI_API_KEY |
| GLM (Zhipu) | glm |
glm-4-flash |
GLM_API_KEY |
| Ollama (local) ๐ | ollama |
llama3.1 |
none โ 100% local |
| Any OpenAI-compatible ๐ | custom |
gpt-4o-mini |
OPENAI_API_KEY |
custom works with OpenAI, OpenRouter, LM Studio, vLLM, llama.cpp server โ anything speaking the chat-completions protocol (set llm.custom.baseUrl).
Run 100% local with Ollama
No API key, no cloud, your data never leaves the machine:
ollama pull llama3.1 # or qwen3, mistral, โฆ
pip install pythonclaw
LLM_PROVIDER=ollama pythonclaw chat # CLI
LLM_PROVIDER=ollama pythonclaw start # daemon + web dashboard
Pick a different model with OLLAMA_MODEL=qwen3, or point at a remote Ollama with OLLAMA_BASE_URL=http://gpu-box:11434/v1.
Troubleshooting: โtimeoutโ errors after binding your API key
Not every error containing the word timeout is an API/network timeout. A common
case: a script the agent generated (or a downloaded skill) calls
subprocess.Popen(cmd, timeout=N) โ Popen has no timeout parameter, so Python
raises TypeError: Popen.__init__() got an unexpected keyword argument 'timeout'.
Your API key and connection are fine; the script just needs
subprocess.run(cmd, timeout=N) instead. PythonClaw now detects this and attaches
a hint to the tool output so the agent fixes the script on the next round.
If you hit a real network timeout (request hangs ~300 s, error mentions your
provider host), check llm..baseUrl โ a missing /v1 suffix is the
most common cause โ and verify the endpoint answers curl $BASEURL/models.
Docker
docker run -p 7788:7788 \
-e LLM_PROVIDER=deepseek -e DEEPSEEK_API_KEY=sk-... \
-v pythonclaw-data:/root/.pythonclaw \
$(docker build -q .)
Or with compose (edit the environment block / use a .env file):
git clone https://github.com/ericwang915/PythonClaw.git && cd PythonClaw
docker compose up -d
Fully local stack: run Ollama on the host and set LLM_PROVIDER=ollama โ the compose file already routes host.docker.internal for you.
Skills
Three-Tier Progressive Loading
| Level | Loaded When | Content |
|---|---|---|
| L1 โ Metadata | Always (startup) | name + description from YAML frontmatter |
| L2 โ Instructions | Agent activates skill | Full SKILL.md body |
| L3 โ Resources | As needed | Bundled scripts, schemas, data files |
---
name: code_runner
description: Execute Python code safely in an isolated subprocess.
---
# Code Runner
## Instructions
Run `python {skill_path}/run_code.py "expression"`
ClawHub Marketplace
Browse and install 13,000+ community skills from ClawHub โ free, no API key required:
pythonclaw skill search "database backup"
pythonclaw skill install
Also accessible from the web dashboard Marketplace tab.
Memory & RAG
Markdown Memory
~/.pythonclaw/context/memory/
โโโ MEMORY.md # Curated long-term memory
โโโ 2026-02-23.md # Daily append-only log
When per-group isolation is enabled ("isolation": { "perGroup": true } in config),
each session (Telegram chat, Discord channel, etc.) gets its own memory/, persona/,
and soul/ under ~/.pythonclaw/context/groups//, while global memories
remain accessible via read-through fallback.
TOOLS.md โ Local Notes
~/.pythonclaw/context/tools/
โโโ TOOLS.md # Your environment-specific cheat sheet
Skills define how tools work. TOOLS.md stores your specifics โ SSH hosts, device
nicknames, project paths, preferred defaults, API endpoints. Keeping them apart means
you can update skills without losing your notes, and share skills without leaking your
infrastructure. Editable from the web dashboard.
Hybrid RAG Pipeline
Query โ BM25 (sparse) + Embeddings (dense) โ RRF Fusion โ LLM Re-ranker โ Top-K
Use as a Library
from pythonclaw import Agent
from pythonclaw.core.llm.openai_compatible import OpenAICompatibleProvider
provider = OpenAICompatibleProvider(
api_key="sk-...",
base_url="https://api.deepseek.com/v1",
model_name="deepseek-chat",
)
agent = Agent(provider=provider)
print(agent.chat("What is the capital of France?"))
Project Structure
PythonClaw/
โโโ pythonclaw/
โ โโโ main.py # CLI entry (onboard/start/stop/status/chat/skill)
โ โโโ onboard.py # Interactive setup wizard
โ โโโ daemon.py # PID-based daemon lifecycle
โ โโโ server.py # Multi-channel daemon server
โ โโโ core/
โ โ โโโ agent.py # Core reasoning loop
โ โ โโโ tools.py # Tool schemas and execution
โ โ โโโ skill_loader.py # Three-tier skill system
โ โ โโโ skillhub.py # ClawHub marketplace client
โ โ โโโ persistent_agent.py
โ โ โโโ compaction.py # Context compaction
โ โ โโโ llm/ # Provider adapters
โ โ โโโ memory/ # Markdown memory
โ โ โโโ knowledge/ # Knowledge-base RAG
โ โ โโโ retrieval/ # BM25 + dense + fusion + reranker
โ โโโ channels/ # Telegram, Discord, WhatsApp
โ โโโ scheduler/ # Cron jobs, heartbeat
โ โโโ web/ # FastAPI dashboard + static assets
โ โโโ templates/ # Built-in skill templates
โโโ context/ # Runtime data (gitignored)
โโโ pyproject.toml
โโโ pythonclaw.example.json # Configuration template
โโโ LICENSE
Development
git clone https://github.com/ericwang915/PythonClaw.git
cd PythonClaw
python -m venv .venv && source .venv/bin/activate
pip install -e .
pytest tests/ -v
Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
Comparison with OpenClaw
| Feature | OpenClaw | PythonClaw |
|---|---|---|
| Language | TypeScript / Node.js | Python |
| Install | npm i -g openclaw |
pip install pythonclaw |
| CLI | openclaw start/stop |
pythonclaw start/stop/status |
| Dashboard | Web UI | Web UI (localhost:7788) |
| Memory | Markdown | Markdown (long-term + daily) |
| Skills | Plugin system | Three-tier + ClawHub marketplace |
| Channels | Discord, Telegram, WhatsApp | CLI, Web, Telegram, Discord, WhatsApp |
| Voice | โ | Deepgram STT + local Whisper |
| LLM Providers | OpenAI, Anthropic, Gemini | DeepSeek, Grok, Claude, Gemini, Kimi, GLM + any OpenAI-compatible |
| Run fully local | โ | Yes โ Ollama, no API key |
| Deploy | npm | pip ยท Docker ยท docker-compose |
| Daemon | Background process | PID-managed (start/stop/status) |
License
If PythonClaw helps you, consider giving it a โญ
ะ ะตะบะพะผะตะฝะดัะตะผัะต ะธะฝััััะผะตะฝัั
ะะพะฟัะพะฑัะนัะต ะดััะณะพะน ะทะฐะฟัะพั ะธะปะธ ัะฑะตัะธัะต ัะธะปััั.
ะฃััะฐะฝะพะฒะบะฐ
npx skillfish add ericwang915/pythonclaw