An agentic bot powered by skills. Skillbot uses an LLM as its brain and Agent Skills as extensible capabilities, communicating via the A2A protocol.
| Category | Tool |
|---|---|
| Language | Python >= 3.13 |
| Package Manager | uv |
| Build Backend | Hatchling |
| Linter & Formatter | Ruff |
| Type Checker | mypy (strict mode) |
| Testing | pytest |
| Commit Convention | Commitizen (Conventional Commits) |
| Git Hooks | pre-commit |
| CI/CD | GitHub Actions |
| Package Registry | PyPI |
| Agent Framework | LangGraph |
| LLM Provider | LangChain OpenAI |
| Agent Protocol | A2A SDK |
| Web Framework | FastAPI |
| CLI | Click |
| Containerization | Podman |
Install skillbot from PyPI — no need to clone this repo.
- Python >= 3.13
- Podman
pip install skillbot# macOS only: ensure the Podman machine is running
podman machine start
skillbot initThis creates ~/.skillbot/skillbot.config.json. Edit it to add your OpenAI API key under model-providers.openai.api-key.
The generated config points to the GHCR image by default:
{
"container": {
"enabled": true,
"image": "ghcr.io/madarauchiha-314/skillbot-runtime:latest"
}
}skillbot start --user-id my-userThe runtime container image is pulled automatically on first run if it isn't already available locally.
Skillbot follows a structured agent loop:
START -> Find Relevant Skills -> Load Skills -> Load Memories
-> Plan & Execute -> Reflect -> [Complete?]
-> Yes: Create Memories -> END
-> No: Summarize -> loop back to Find Skills
The loop is implemented as a LangGraph StateGraph with persistent checkpointing via SQLite.
Clone the repository and install dependencies:
git clone https://github.com/MadaraUchiha-314/skillbot.git
cd skillbot
uv sync --devThis creates a .venv virtual environment and installs all runtime and dev dependencies.
Pre-commit hooks run linting, type checking, unit tests, and commit message validation automatically on every commit. Install them with:
uv run pre-commit install
uv run pre-commit install --hook-type commit-msgYou can also run all hooks manually against the entire codebase:
uv run pre-commit run --all-files# Run unit tests
uv run pytest
# Run linter
uv run ruff check .
# Auto-fix lint issues
uv run ruff check . --fix
# Format code
uv run ruff format .
# Run type checker
uv run mypy skillbot
# Run all pre-commit hooks
uv run pre-commit run --all-filesThis project follows Conventional Commits. Commit messages are validated by Commitizen via a commit-msg hook. Use the format:
<type>(<optional scope>): <description>
[optional body]
[optional footer]
Examples:
feat: add user authentication
fix(parser): handle empty input gracefully
docs: update README with setup instructions
skillbot/
├── skillbot/
│ ├── agents/ # Agent implementations
│ │ ├── prompts/ # Prompt templates (.prompt.md)
│ │ └── agent_executor.py # Default agent executor
│ ├── channels/ # Communication channels
│ │ └── chat.py # Shared A2A chat primitives
│ ├── cli/
│ │ ├── cli.py # CLI commands (init, start)
│ │ └── tui.py # Rich TUI components
│ ├── config/
│ │ └── config.py # Config loading & dataclasses
│ ├── framework/
│ │ ├── agent.py # AgentFramework (LangGraph graph)
│ │ └── state.py # AgentState TypedDict
│ ├── memory/
│ │ └── memory.py # User memory read/write
│ ├── server/
│ │ └── a2a_server.py # A2A protocol server (FastAPI)
│ ├── container/
│ │ └── manager.py # Podman container management
│ ├── skills/
│ │ └── loader.py # Skill discovery & loading
│ └── tools/ # Tool infrastructure
├── tests/ # Test suite
├── docs/ # Documentation
├── .github/workflows/ # CI/CD pipelines
│ ├── pr.yml
│ └── release.yml
├── Containerfile # Base image for skill execution
├── pyproject.toml
└── .pre-commit-config.yaml
During development, use uv run to invoke the CLI. This uses the editable install from .venv so your local code changes are reflected immediately without reinstalling.
# Initialize config in a local directory (avoids writing to ~/.skillbot)
uv run skillbot init --root-dir ./local-configEdit ./local-config/skillbot.config.json and add your OpenAI API key under model-providers.openai.api-key.
All skill scripts run inside Podman containers. For local development, build the image from the Containerfile instead of pulling from GHCR:
# Ensure the Podman machine is running (macOS only)
podman machine start
# Build the runtime image
podman build -t skillbot-runtime:latest -f Containerfile .Then use --image to point skillbot at your local build:
uv run skillbot start --user-id dev --image skillbot-runtime:latest --config ./local-config/skillbot.config.jsonThe --image flag overrides the GHCR image from the config file for that run. No config edits needed.
Skillbot will refuse to start if container.enabled is set to false.
# Start the server and open the chat interface
uv run skillbot start --user-id my-user --config ./local-config/skillbot.config.json
# Or start the server in the background only (no chat)
uv run skillbot start --background --config ./local-config/skillbot.config.jsonIf you prefer, you can also activate the virtualenv and run skillbot directly:
source .venv/bin/activate
skillbot --helpUse the --reload flag to automatically restart the server whenever you change code under skillbot/. This is the recommended way to run during development:
uv run skillbot start --config ./local-config/skillbot.config.json --reloadThe server watches the skillbot/ directory for file changes and restarts automatically, so you don't need to manually stop and restart after each edit.
Skills can declare network access and dependencies in their SKILL.md frontmatter:
---
name: my-skill
description: Does something useful
permissions:
network: true # allow network access inside the container
dependencies:
pip:
- requests
npm:
- cheerio
---The container is created with --network=none by default. If any configured skill declares permissions.network: true, the container gets network access via slirp4netns. Dependencies from all configured skills are installed inside the container at startup.