Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

ErisPulse

ErisPulse

Write once, deploy on multiple platforms.

An event-driven, multi-platform chatbot development framework based on the OneBot12 standard.

PyPI Python License Docs Stars Downloads Discussions Docker


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 — Iterate on code during development without restarting the bot process.
  • Chainable SendDSL — Express @mention, reply, retry, timeout, progress hook and bulk send as a single fluent chain.
  • Complete toolchainepsdk CLI, 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):

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)
  • CLIepsdk scaffolding, project init, run and reload.
  • Docker — multi-architecture images at erispulse/erispulse.

Documentation & Community

Chat with us on:


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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

erispulse-2.7.0.dev0.tar.gz (365.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

erispulse-2.7.0.dev0-py3-none-any.whl (427.2 kB view details)

Uploaded Python 3

File details

Details for the file erispulse-2.7.0.dev0.tar.gz.

File metadata

  • Download URL: erispulse-2.7.0.dev0.tar.gz
  • Upload date:
  • Size: 365.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for erispulse-2.7.0.dev0.tar.gz
Algorithm Hash digest
SHA256 fba5d1d35e54edcf9236f417c5ec87442766d3a1fd0c8a0e1783deb0a0097c8a
MD5 16555dc5934f72ffc99ac83d9766e6aa
BLAKE2b-256 61621cb5538c4a229715050b22db482b740b2d4decb59bf5720a8e848a861fdc

See more details on using hashes here.

Provenance

The following attestation bundles were made for erispulse-2.7.0.dev0.tar.gz:

Publisher: pypi-publish.yml on ErisPulse/ErisPulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file erispulse-2.7.0.dev0-py3-none-any.whl.

File metadata

  • Download URL: erispulse-2.7.0.dev0-py3-none-any.whl
  • Upload date:
  • Size: 427.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for erispulse-2.7.0.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 f3b2009c4272e6b4474ef51c89742457e9ae134c4faa1c6bd6bda3140d5ae9bb
MD5 18b5ab0300a090c09ade0303a602d187
BLAKE2b-256 260619382196ce41649b8cf44b4d1167ec9c66465c81b93a6407bf53ac68d390

See more details on using hashes here.

Provenance

The following attestation bundles were made for erispulse-2.7.0.dev0-py3-none-any.whl:

Publisher: pypi-publish.yml on ErisPulse/ErisPulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.7.1

2 files

2.7.0

2 files

This release

2.7.0.dev0 This release

2 files

2.6.3

2 files

2.6.2

2 files

2.6.1

2 files

2.6.0

2 files

2.5.5

2 files

2.5.4

2 files

2.5.3

2 files

2.5.2

2 files

2.5.1

2 files

2.5.0

2 files

2.4.8

2 files

2.4.7

2 files

2.4.6

2 files

2.4.5

2 files

2.4.4

2 files

2.4.3

2 files

2.4.2

2 files

2.4.1

2 files

2.4.0

2 files

2.3.9

2 files

2.3.8

2 files

2.3.7

2 files

2.3.6

2 files

2.3.5

2 files

2.3.4

2 files

2.3.3

2 files

2.3.2

2 files

2.3.1

2 files

2.3.0

2 files

2.2.1

2 files

2.2.0

2 files

2.1.15

2 files

2.1.14

2 files

2.1.13

2 files

2.1.12

2 files

2.1.11

2 files

2.1.10

2 files

2.1.9

2 files

2.1.8

2 files

2.1.7.post1

2 files

2.1.7

2 files

2.1.5

2 files

2.1.4

2 files

2.1.3

2 files

2.1.2

2 files

2.1.1

2 files

2.1.0

2 files

1.2.9

2 files

1.2.8

2 files

1.2.7

2 files

1.2.6

2 files

1.2.4

2 files

1.2.3

2 files

1.2.2

2 files

1.1.16

2 files

1.1.15

2 files

1.1.13

2 files

1.1.12

2 files

1.1.11

2 files

1.1.10

2 files

1.1.8

2 files

1.1.7

2 files

1.1.6

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.16

2 files

1.0.15

2 files

1.0.14

2 files

1.0.13

2 files

1.0.12

2 files

1.0.11

2 files

1.0.10

2 files

1.0.9

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

1 file

1.0.5

1 file

1.0.4

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page