ErisPulse
Write once, deploy on multiple platforms.
An event-driven, multi-platform chatbot development framework based on the OneBot12 standard.
Overview
ErisPulse is an event-driven, modular async framework for building chatbots that run on multiple platforms from a single codebase. It implements the OneBot12 standard event model, so you write command handlers, conversation flows and message senders once — then deploy them to QQ, Telegram, Discord, Kook, Yunhu, Matrix, Email, WeChat and more without touching business logic.
It ships with a flexible plugin system, hot reload, a visual Dashboard, an AI Builder that turns natural-language prompts into modules, and the epsdk CLI scaffolding tool — suitable for everything from a simple chatbot to a complex automation pipeline.
Key Features
- Event-driven architecture — Clear event model based on OneBot12, making message handling intuitive and consistent across platforms.
- Cross-platform compatibility — Write handlers once, deploy to 15+ platforms without rewriting business logic.
- Modular design — Flexible plugin system with hot-plug module management and per-module configuration.
- Hot reload — Local plugins reload on save; any module (including PyPI-installed ones) hot-reloads via a single
sdk.reload_module()call — no process restart, even after pip upgrades. - Unified Event Overrides — Override message triggers, command params and user permissions for every event type with a single config — no module code changes, takes effect instantly.
- Scope Control — Three-dimensional scope (module availability / event admission / outbound limits) with runtime-adjustable fine-grained control.
- Chainable SendDSL — Express
@mention, reply, retry, timeout, progress hook and bulk send as a single fluent chain. - Complete toolchain —
epsdkCLI, visual Dashboard, AI Builder and Module Market included out of the box.
Installation
Option 1 — pip (for library / module developers)
pip install ErisPulse
Option 2 — Docker (recommended for production)
docker pull erispulse/erispulse:latest
Quick start with docker-compose.yml:
curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml
ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
The image bundles the ErisPulse framework and the Dashboard management panel, supporting linux/amd64 and linux/arm64. After startup, visit http://<host>:<port>/Dashboard and log in with the token you set.
Docker Hub unavailable? Use GitHub Container Registry
docker pull ghcr.io/erispulse/erispulse:latest
And update the image in your docker-compose.yml:
image: ghcr.io/erispulse/erispulse:latest
Docker environment variables
| Variable | Default | Description |
|---|---|---|
ERISPULSE_CHANNEL |
stable |
Version channel: stable or dev (pre-release) |
ERISPULSE_UPDATE_ON_START |
false |
Auto-update to the latest version on container start |
ERISPULSE_DASHBOARD_TOKEN |
empty | Dashboard login token |
ERISPULSE_PORT |
8000 |
Dashboard port mapping |
TZ |
Asia/Shanghai |
Container timezone |
Option 3 — One-click install script (auto-detects environment)
The installer detects Docker / Python / uv and guides you through the most suitable setup. Supports Chinese, English, Japanese, Russian and Traditional Chinese.
Windows (PowerShell):
irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -ExecutionPolicy Bypass -File install.ps1
macOS / Linux:
curl -fsSL https://get.erisdev.com/install.sh -o install.sh && chmod +x install.sh && ./install.sh
Quick Start
Initialize a new project:
# Interactive initialization
epsdk init
# Quick initialization with a project name
epsdk init -q -n my_bot
Create a main.py file:
from ErisPulse import sdk
from ErisPulse.Core.Event import command
@command("hello", help="Send greeting message")
async def hello_handler(event):
user_name = event.get_user_nickname() or "friend"
await event.reply(f"Hello, {user_name}!")
@command("ping", help="Test if the bot is online")
async def ping_handler(event):
await event.reply("Pong! The bot is running normally.")
if __name__ == "__main__":
import asyncio
asyncio.run(sdk.run(keep_running=True))
Run it:
epsdk run main.py
# Or in development mode with hot reload
epsdk run main.py --reload
Now send /hello or /ping to the bot on any connected platform — the same handlers work everywhere.
For the full walkthrough (multi-turn conversations, request handlers, adapter configuration), see the Quick Start guide.
The SendDSL — fluent message sending
Compose the entire send flow — @mention, reply, retry, timeout, progress hook and bulk dispatch — as one readable chain:
yunhu = sdk.adapter.get("yunhu")
# Single send: @user + reply + retry + timeout + success callback
await (yunhu.Send.To("group", "123")
.At("456").Reply("msg_789")
.Retry(3).Timeout(10)
.Hook(lambda r: print("Send successful!"))
.Text("Hello"))
# Bulk send: build multiple messages, then dispatch in one chain
results = await (yunhu.Send.To("user", "123")
.Build()
.Text("Notification 1")
.Image("pic.jpg")
.Retry(2)
.send_all())
Supported chainable methods include Hook (success callback), Retry (failure retry), Timeout (timeout cancellation), OnProgress (progress monitoring), Defer (delayed send) and Build (batch construction).
Full reference: SendDSL documentation
Supported Platforms
Officially maintained adapters (community contributions welcome):
- Kook — instant messaging platform
- Matrix — decentralized communication protocol
- OneBot11 — universal OneBot v11 protocol
- OneBot12 — OneBot v12 standard protocol
- QQ Bot — official QQ bot platform
- Telegram — global instant messaging
- Discord — community communication platform
- Yunhu / Yunhu User — enterprise IM
- Email — email protocol adapter
- WeChat Official Account
- Webhook — HTTP bridge to any system
- Sandbox — in-browser debugging, no real platform needed
- HuaFeng Coffee House
See the adapter guide for configuration details.
Ecosystem
- Framework — core runtime with a unified event & message model.
- Dashboard — visual management for plugins, logs and configuration. (live demo)
- AI Builder — natural-language prompts → ready-to-use modules. (try it)
- Module Market — plug-and-play community plugins. (browse)
- CLI —
epsdkscaffolding, project init, run and reload. - Docker — multi-architecture images at
erispulse/erispulse.
Documentation & Community
- 📖 Documentation & API reference: erisdev.com
- 💬 GitHub Discussions: ErisPulse/ErisPulse/discussions
- 📋 Changelog: CHANGELOG.md
- 🤝 Contributing: CONTRIBUTING.md
- 🐛 Bug reports: GitHub Issues
- 🧠 DeepWiki: deepwiki.com/ErisPulse/ErisPulse
Chat with us on:
- Telegram: https://t.me/ErisPulse
- QQ Group: https://qm.qq.com/q/TOwnCmypcy
- Yunhu Group: https://yhfx.jwznb.com/share?key=VWJL4fTWXepa&ts=1781889199
Why ErisPulse? Because platform differences should never be your bottleneck — focus on business logic, and let the framework handle the rest. Write once, deploy everywhere.
Metadata
Release files for ErisPulse 2.8.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| erispulse-2.8.5.tar.gz | 643.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| erispulse-2.8.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.4 MB
Release files / erispulse-2.8.5.tar.gz
| Download URL | erispulse-2.8.5.tar.gz |
|---|---|
| Size | 643.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f8b1f9a4b1f13a763c566704f82551abeeb9e60a316250d3be84b1d3e576f50c
|
|
BLAKE2b-256 checksum How to use checksums |
f41dd4c5169b449c993e4e9685ef04262066825c37a29d05260a069bf62e9af1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / erispulse-2.8.5-py3-none-any.whl
| Download URL | erispulse-2.8.5-py3-none-any.whl |
|---|---|
| Size | 721.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1ba46c5f95eb3c38e9492c42ae203310b60dbb091de9450e9dc7af8fb0f7a19f
|
|
BLAKE2b-256 checksum How to use checksums |
63257f77e566a1be18e55a1ada422c59564f86652b0e66585a79baf429b3451e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log