Add your description here
Project description
skillbot
An agentic bot powered by skills. Skillbot uses an LLM as its brain and Agent Skills as extensible capabilities, communicating via the A2A protocol.
Tech Stack
| 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 |
Quick Start
Install skillbot from PyPI and pull the pre-built runtime image from GitHub Container Registry. No need to clone this repo.
Prerequisites
- Python >= 3.13
- Podman
1. Install skillbot
pip install skillbot
2. Pull the runtime image
# macOS only: ensure the Podman machine is running
podman machine start
podman pull ghcr.io/madarauchiha-314/skillbot-runtime:latest
3. Initialize and configure
skillbot init
This 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"
}
}
4. Start skillbot
skillbot start --user-id my-user
Architecture
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.
Local Development
Prerequisites
Setup
Clone the repository and install dependencies:
git clone https://github.com/MadaraUchiha-314/skillbot.git
cd skillbot
uv sync --dev
This creates a .venv virtual environment and installs all runtime and dev dependencies.
Installing Pre-commit Hooks
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-msg
You can also run all hooks manually against the entire codebase:
uv run pre-commit run --all-files
Common Commands
# 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-files
Commit Messages
This 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
Project Structure
skillbot/
├── skillbot/
│ ├── agents/ # Agent implementations
│ │ ├── prompts/ # Prompt templates (.prompt.md)
│ │ └── supervisor.py # Default supervisor agent
│ ├── 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
Running the CLI Locally
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.
1. Initialize configuration
# Initialize config in a local directory (avoids writing to ~/.skillbot)
uv run skillbot init --root-dir ./local-config
2. Configure your API key
Edit ./local-config/skillbot.config.json and add your OpenAI API key under model-providers.openai.api-key.
3. Build the container image
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.json
The --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.
4. Start skillbot
# 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.json
If you prefer, you can also activate the virtualenv and run skillbot directly:
source .venv/bin/activate
skillbot --help
Hot-Reload (Development)
Use 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 --reload
The server watches the skillbot/ directory for file changes and restarts automatically, so you don't need to manually stop and restart after each edit.
Skill Permissions and Dependencies
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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skillbot-0.4.1.tar.gz.
File metadata
- Download URL: skillbot-0.4.1.tar.gz
- Upload date:
- Size: 629.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c60e6b6ec20bfbb3b4230488b3711c5bf7996af8bff0ecd654f3df2e06612c0
|
|
| MD5 |
5f63cf06d6e00f3a34a8f32738b33227
|
|
| BLAKE2b-256 |
c673809d522038e48d35309db7641fdc44ba8ee293831d8a7d20cf2c4466c8d1
|
Provenance
The following attestation bundles were made for skillbot-0.4.1.tar.gz:
Publisher:
release.yml on MadaraUchiha-314/skillbot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillbot-0.4.1.tar.gz -
Subject digest:
8c60e6b6ec20bfbb3b4230488b3711c5bf7996af8bff0ecd654f3df2e06612c0 - Sigstore transparency entry: 984893223
- Sigstore integration time:
-
Permalink:
MadaraUchiha-314/skillbot@86c010dd91b5eba96e60457adf117b17579762ad -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MadaraUchiha-314
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@86c010dd91b5eba96e60457adf117b17579762ad -
Trigger Event:
push
-
Statement type:
File details
Details for the file skillbot-0.4.1-py3-none-any.whl.
File metadata
- Download URL: skillbot-0.4.1-py3-none-any.whl
- Upload date:
- Size: 43.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af61ca972452b1d66e63b9610c7ec2b4c4be09c9bd7f7eb5a9cd6c22c3175ef7
|
|
| MD5 |
8c1b20f472de85ed38de148a239c4eb1
|
|
| BLAKE2b-256 |
a11063c32f6575e342c654c88b587f090dd23ba63dc8067349ef2a3b0eabf4be
|
Provenance
The following attestation bundles were made for skillbot-0.4.1-py3-none-any.whl:
Publisher:
release.yml on MadaraUchiha-314/skillbot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillbot-0.4.1-py3-none-any.whl -
Subject digest:
af61ca972452b1d66e63b9610c7ec2b4c4be09c9bd7f7eb5a9cd6c22c3175ef7 - Sigstore transparency entry: 984893228
- Sigstore integration time:
-
Permalink:
MadaraUchiha-314/skillbot@86c010dd91b5eba96e60457adf117b17579762ad -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MadaraUchiha-314
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@86c010dd91b5eba96e60457adf117b17579762ad -
Trigger Event:
push
-
Statement type: