Skip to main content
Pre-release

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

ErisPulse

English | 简体中文 | 繁體中文 | 日本語 | Русский

ErisPulse

Write once, deploy on multiple platforms.

An event-driven multi-platform chatbot development framework.

Based on the OneBot12 standard interface, write once and deploy on multiple platforms. With a flexible plugin system, hot reload support, and a complete developer toolchain, it is suitable for various scenarios from simple chatbots to complex automation systems.

PyPI Python Docker License Stars Downloads Ruff Socket 文档 DeepWiki 模块市场 讨论



Core Features


Event-driven Architecture

Event-driven Architecture

A clear event model based on the OneBot12 standard makes message handling logic more intuitive and efficient


Cross-platform Compatibility

Cross-platform Compatibility

Write a plugin module once and use it on all platforms, no need to repeat development for different platforms


Modular Design

Modular Design

A flexible plugin system, easy to extend and integrate, supports hot-plug module management


Hot Reload

Hot Reload

Reload code without restarting during development


AI Assistance

AI Assistance

AI-assisted development allows requirements to be directly translated into usable modules


Simple and Elegant

Simple and Elegant

Intuitive API design, making code as light and readable as feathers

Chainable Send DSL

A single chain call completes all sending logic such as @, reply, retry, timeout, and callback:

yunhu = sdk.adapter.get("yunhu")

# Single send: @user + reply + retry + 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"))

# Batch send: send multiple messages in a single chain
results = await (yunhu.Send.To("user", "123")
                .Build()
                .Text("Notification 1")
                .Image("pic.jpg")
                .Retry(2)
                .send_all())

Supports Hook (success callback), Retry (failure retry), Timeout (timeout cancellation), OnProgress (progress monitoring), Defer (delayed sending), Build (batch construction), and other chainable methods. See SendDSL documentation.


The Same Code. Multiple Platforms.

Identical command handlers. Different platforms. No business logic changes required.

Kook

Kook demo

QQ

QQ demo

Yunhu

Yunhu demo

Ecosystem

ErisPulse is not just a framework. Install and start right away, no need to build from scratch.

Framework

Core runtime

Unified event & message model

Dashboard

Visual management

Plugins · Logs · Configuration

Online demo →

AI Builder

Natural language → usable modules

Experience now →

Module Market

Ready-to-use plugins

Explore modules →

Adapters

Support for 15+ platforms

Documentation

erisdev.com

Docker

Multi-architecture support

erispulse/erispulse

CLI

epsdk scaffolding tool


Project Origin

ErisPulse was not created just to be a framework.

It originated from Amer — a project for message interconnection and synchronization between different platforms.

As more platforms were integrated, we began maintaining the asynchronous version of ryunhusdk2, gradually abstracting a unified event model and adapter system.

These practices eventually evolved into today's ErisPulse.

Its goal has never changed:

Let developers focus on business logic, not platform differences.


Quick Start

One-click installation script (recommended)

The installation script automatically detects your environment (Docker, Python, uv), guides you to choose the most suitable installation method, and supports multiple languages (Chinese/English/Japanese/Russian/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

Docker Installation Demo

pip Installation Demo

Using Docker (recommended)

docker pull erispulse/erispulse:latest
Docker Hub unavailable?

If Docker Hub is inaccessible, you can use GitHub Container Registry:

docker pull ghcr.io/erispulse/erispulse:latest

When using the ghcr.io image, modify the docker-compose.yml file's image:

image: ghcr.io/erispulse/erispulse:latest
Quick start
# Download docker-compose.yml
curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml

# Set Dashboard login token and start
ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d

The image includes the ErisPulse framework and Dashboard management panel, supporting linux/amd64 and linux/arm64 architectures.

After starting, access http://<host>:<port>/Dashboard and use the set token as the password to log in to the Dashboard management panel.

Using pre-release version (Dev)

Set ERISPULSE_CHANNEL=dev to use the pre-release version:

# Method 1: Use environment variables (recommended)
ERISPULSE_CHANNEL=dev ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d

# Method 2: Build dev image
ERISPULSE_BUILD_TARGET=dev docker compose up -d --build

To automatically update to the latest version at startup (regardless of stable or dev), explicitly set ERISPULSE_UPDATE_ON_START=true:

ERISPULSE_CHANNEL=dev ERISPULSE_UPDATE_ON_START=true docker compose up -d

You can also pull the pre-built dev image:

docker pull erispulse/erispulse:dev
Docker Environment Variables
Variable Default Description
ERISPULSE_CHANNEL stable Version channel: stable (stable) or dev (pre-release)
ERISPULSE_UPDATE_ON_START false Whether to automatically update to the latest version when the container starts (must be explicitly enabled)
ERISPULSE_DASHBOARD_TOKEN empty Dashboard login token
ERISPULSE_PORT 8000 Dashboard port mapping
TZ Asia/Shanghai Container timezone

Setting ERISPULSE_UPDATE_ON_START=true ensures that even if the image is outdated, the container will automatically fetch the latest version at startup.

1Panel App Store

Install ErisPulse with one click via the 1Panel app store, see ErisPulse-1Panel.

bash <(curl -sL https://get-1panel.erisdev.com/install.sh)

ErisPulse is available in the 1Panel third-party app store, and can be installed using the okxlin/appstore third-party repository.

Using pip to install

pip install ErisPulse

You can also use the one-click installation script above, which automatically detects the environment and guides configuration.

Initialize Project

# Interactive initialization
epsdk init

# Quick initialization (specify project name)
epsdk init -q -n my_bot

Create Your First Bot

Create a main.py file:

Command Handler

from ErisPulse import sdk
from ErisPulse.Core.Event import command

@command("hello", help="Send a 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))

Effect Explanation

Send /hello

Bot replies: Hello, {username}!


Send /ping

Bot replies: Pong! The bot is running normally.


Running Method

epsdk run main.py
# Or in development mode
epsdk run main.py --reload

For more detailed instructions, see:

Multi-turn Conversation Example

ErisPulse has a powerful built-in multi-turn conversation engine, easily enabling guided operations, information collection, and other interactive scenarios:

from ErisPulse.Core.Event import command, request

@command("register")
async def register_handler(event):
    conv = event.conversation(timeout=60)
    
    await conv.say("Welcome to register!")
    
    # Multi-step collection of user information, with automatic validation
    data = await conv.collect([
        {"key": "name", "prompt": "Please enter your name"},
        {"key": "age", "prompt": "Please enter your age",
         "validator": lambda e: e.get_text().strip().isdigit(),
         "retry_prompt": "Age must be a number, please re-enter"},
    ])
    
    if data and await conv.confirm(f"Confirm registration? Name: {data['name']}, Age: {data['age']}"):
        # Push notification using SendDSL
        await sdk.adapter.get(event.get_platform()).Send.To(
            "user", event.get_user_id()
        ).Text(f"Registration successful! Welcome {data['name']}")
        # Or await event.reply("Registration successful!")

# Automatically handle friend requests
@request.on_friend_request()
async def handle_friend_request(event):
    user_name = event.get_user_nickname() or event.get_user_id()
    
    # Approve the request
    result = await event.approve()
    if result.get("status") == "ok":
        await event.reply(f"Friend request approved automatically, welcome {user_name}")
See more Conversation API (branching / selection / persistence)
@command("quiz")
async def quiz_handler(event):
    conv = event.conversation(timeout=30)
    
    # Multiple-choice question
    answer = await conv.choose("Who is the creator of Python?", [
        "Guido van Rossum",
        "James Gosling", 
        "Dennis Ritchie",
    ])
    
    if answer == 0:
        await conv.say("Correct!")
    elif answer is None:
        await conv.say("Timed out, try again next time!")
    else:
        await conv.say("Incorrect, the correct answer is Guido van Rossum")

@command("menu")
async def menu_handler(event):
    conv = event.conversation(timeout=60)
    
    # Branching, building complex interaction flow
    @conv.branch("main")
    async def main_menu():
        await conv.say("=== Main Menu ===\n1. Personal Information\n2. Settings\n3. Exit")
        resp = await conv.wait()
        if resp and resp.get_text().strip() == "1":
            await conv.goto("profile")
    
    @conv.branch("profile")
    async def profile():
        await conv.say("Name: Alice\n0. Return")
        resp = await conv.wait()
        if resp and resp.get_text().strip() == "0":
            await conv.goto("main")
    
    await conv.start()

See Conversation Multi-turn Dialogue


Supported Platforms

We welcome contributions to adapters!

Adapter Description
Kook Kook Kook (Kaihei La) instant messaging platform
Matrix Matrix Matrix decentralized communication protocol
OneBot OneBot11 OneBot v11 generic robot protocol
OneBot OneBot12 OneBot v12 standard protocol
QQ QQ Official QQ robot platform
Sandbox Sandbox Web-based debugging, no real platform integration required
Telegram Telegram Global instant messaging platform
Email Email Email protocol adapter for sending and receiving
Yunhu Yunhu Enterprise-level instant messaging platform (robot integration)
Yunhu Yunhu User Access adapter based on the Yunhu user protocol
Hua Feng Coffeehouse Allons! (・ω・) /
Discord Discord Global community communication platform, supports servers, channels, and private messages
Webhook Webhook General HTTP bridge adapter, connects to any system
WechatMp WeChat Official Account Official WeChat official account platform

See Adapter Details


Use Cases

Multi-platform Bot Chat Assistant Automation Tool Message Forwarding
Deploy the same functionality bot on multiple platforms Integrate AI chat module for entertainment and interaction Message notifications, task management, data collection Cross-platform message synchronization and forwarding

Community

Welcome to join the ErisPulse community and build the ecosystem together with developers.

Yunhu

Group ID: 635409929

Join the group chat:

https://yhfx.jwznb.com/share?key=VWJL4fTWXepa&ts=1781889199

QQ Group

https://qm.qq.com/q/TOwnCmypcy

Telegram

https://t.me/ErisPulse


Contribution Guide

The health of the ErisPulse project still needs your contribution! We welcome all forms of contributions:

  1. Report Issues — Submit bug reports on GitHub Issues
  2. Feature Requests — Propose new ideas via Community Discussions
  3. Code Contributions — Read Code Style and Contribution Guide before submitting PRs
  4. Documentation Improvements — Help improve documentation and example code

Join Community Discussions


Acknowledgments

Thanks

Some code in this project is based on sdkFrame.

The core adapter standardization layer refers to and benefits from the OneBot12 specification.

Special thanks to the Yunhu ecosystem and community.

ErisPulse's early exploration and growth would not have been possible without the support of the Yunhu developer community. Many ideas, adapters, and practical experiences originated here.

We also thank all developers and project authors who have contributed to ErisPulse, OneBot, and the open-source community.

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.6.2.dev1.tar.gz (412.9 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.6.2.dev1-py3-none-any.whl (562.8 kB view details)

Uploaded Python 3

File details

Details for the file erispulse-2.6.2.dev1.tar.gz.

File metadata

  • Download URL: erispulse-2.6.2.dev1.tar.gz
  • Upload date:
  • Size: 412.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for erispulse-2.6.2.dev1.tar.gz
Algorithm Hash digest
SHA256 5df0f421dd9adcd5e64c6d0bed973e9ed6cdbe4c601c55946a871adf28737dbe
MD5 d91e4c6c3af1da16d6c5e49b57a733b8
BLAKE2b-256 cf61bb05c418fb9918fc2d63972b953a6ac6362e2819a8eb18b117ebf6eddda0

See more details on using hashes here.

Provenance

The following attestation bundles were made for erispulse-2.6.2.dev1.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.6.2.dev1-py3-none-any.whl.

File metadata

  • Download URL: erispulse-2.6.2.dev1-py3-none-any.whl
  • Upload date:
  • Size: 562.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for erispulse-2.6.2.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 c1876a34a15789cbd5af1b2167f05d6e4cba8d9efa402893864df9383ed6b5d9
MD5 56fa5f843aa5f56271ae509f2b83e184
BLAKE2b-256 84c4926ec2d807ed23ed2144a272c881f0e76d69ae93fdf990c18f7437f1d885

See more details on using hashes here.

Provenance

The following attestation bundles were made for erispulse-2.6.2.dev1-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

2.6.3

2 files

2.6.2

2 files

This release

2.6.2.dev1 This release

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