Skip to main content

ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。

Project description

ErisPulse

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

ErisPulse

Event-driven multi-platform robot development framework

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

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



Core Features · AI Module Builder

👉 Describe requirements in natural language, AI generates complete module/adapter code after reviewing official documentation and packages it for download Try it now → https://www.erisdev.com/#builder

Supports building: adapter modules, feature modules, plugin templates

Also supports Vibe Coding workflow — download AI material and send to AI to use View


⚡ Event-driven Architecture

Clear event model based on OneBot12 standard, making message handling logic more intuitive and efficient


🌐 Cross-platform Compatibility

Write plugin modules once and use them on all platforms, no need to repeat development for different platforms


🧩 Modular Design

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


🔄 Hot Reload + AI Assistance

No need to restart during development to reload code; AI-assisted development allows requirements to be directly converted into usable modules


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
Unable to access Docker Hub?

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 contains 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 (whether 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

Enabling 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 one-click via the 1Panel app store, see ErisPulse-1Panel.

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

Using pip Installation

pip install ErisPulse

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

Running Effects

Dashboard:

![Online Demo](https://img.shields.io/badge/Online Demo-Dashboard-FF6B9D?style=for-the-badge&logo=github&logoColor=white)

💡 Online demo dashboard: DashDemo

Dashboard Demo

Same code, multiple platform responses:

Kook

Kook Demo

QQ

QQ Demo

Yunhu

Yunhu Demo

Initialize Project

# Interactive initialization
epsdk init

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

Create First Robot

Create main.py file:

Command Handler

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 robot is online")
async def ping_handler(event):
    await event.reply("Pong! The robot is running normally.")

if __name__ == "__main__":
    import asyncio
    asyncio.run(sdk.run(keep_running=True))

Effect Explanation

Send /hello

Robot replies: Hello, {username}!


Send /ping

Robot replies: Pong! The robot 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 includes a powerful multi-turn conversation engine, easily achieving 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 registration!")
    
    # Multi-step user information collection 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 request
    result = await event.approve()
    if result.get("status") == "ok":
        await event.reply(f"Friend request automatically approved, welcome {user_name}")
See More Conversation API (Branching / Selection / Persistence)
@command("quiz")
async def quiz_handler(event):
    conv = event.conversation(timeout=30)
    
    # Option-based 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, build complex interaction flows
    @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 Adapters

We welcome contributions to adapters!

Adapter Description
Kook Kook Kook (Open Black) instant messaging platform
Matrix Matrix Matrix decentralized communication protocol
OneBot OneBot11 OneBot v11 general robot protocol
OneBot OneBot12 OneBot v12 standard protocol
QQ QQ QQ official robot platform
Sandbox Sandbox Web-based debugging, no need to connect to real platforms
Telegram Telegram Global instant messaging platform
Email Email Email protocol adapter
Yunhu Yunhu Enterprise-level instant messaging platform (robot integration)
Yunhu Yunhu User Yunhu user protocol-based adapter
Flower Maple Cafe 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 public account platform

See Adapter Details


Application Scenarios

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

Contribution Guide

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

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

Join Community Discussions


Star History

Star History Chart


Acknowledgments

Thanks

This project is partially based on sdkFrame · Core adapter standardization layer based on OneBot12 Specification · Thanks to all developers and authors who have contributed to the open-source community

Project details


Release history Release notifications | RSS feed

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.5.0.tar.gz (3.4 MB view details)

Uploaded Source

Built Distribution

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

erispulse-2.5.0-py3-none-any.whl (3.6 MB view details)

Uploaded Python 3

File details

Details for the file erispulse-2.5.0.tar.gz.

File metadata

  • Download URL: erispulse-2.5.0.tar.gz
  • Upload date:
  • Size: 3.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for erispulse-2.5.0.tar.gz
Algorithm Hash digest
SHA256 334bf45593f4ae12195740b9405b308fe9ea9be970ed5b49585f4ebe3f5698fa
MD5 9969d7cef48bc6740276118a62b40129
BLAKE2b-256 5cde2a4a45e73d8b4f7c9ced7b73aef29c2d2f9d83f945bc91279ec636d8fa70

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for erispulse-2.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 75e06d56703abfa58207716799f0784df2daa528e8b79e72e0af2a8f6d39d86e
MD5 e47f6f00e40272cd6b788a95acb7469d
BLAKE2b-256 6cfe8a18aa06ab86bf6d5a4310bb6626c8df35435da0847b9f67ebece1e39dde

See more details on using hashes here.

Provenance

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

Supported by

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