ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
Project description
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.
👉 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/#builderSupports building: adapter modules, feature modules, plugin templates
Also supports Vibe Coding workflow — download AI material and send to AI to use View
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/amd64andlinux/arm64architectures.
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=trueensures 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 dashboard: DashDemo
|
|
Same code, multiple platform responses:
|
Kook |
|
Yunhu |
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 Robot replies: Send Robot replies: 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()
Supported Adapters
We welcome contributions to adapters!
| Adapter | Description |
|---|---|
| Kook (Open Black) instant messaging platform | |
| Matrix decentralized communication protocol | |
| OneBot v11 general robot protocol | |
| OneBot v12 standard protocol | |
| QQ official robot platform | |
| Web-based debugging, no need to connect to real platforms | |
| Global instant messaging platform | |
| Email protocol adapter | |
| Enterprise-level instant messaging platform (robot integration) | |
| Yunhu user protocol-based adapter | |
| Flower Maple Cafe | Allons! (・ω・) / |
| Global community communication platform, supports servers, channels, and private messages | |
| General HTTP bridge adapter, connects to any system | |
| 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:
- Report Issues — Submit bug reports in GitHub Issues
- Feature Requests — Propose new ideas through Community Discussions
- Code Contributions — Please read Code Style and Contribution Guide before submitting PRs
- Documentation Improvements — Help improve documentation and example code
Star History
Acknowledgments
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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
334bf45593f4ae12195740b9405b308fe9ea9be970ed5b49585f4ebe3f5698fa
|
|
| MD5 |
9969d7cef48bc6740276118a62b40129
|
|
| BLAKE2b-256 |
5cde2a4a45e73d8b4f7c9ced7b73aef29c2d2f9d83f945bc91279ec636d8fa70
|
Provenance
The following attestation bundles were made for erispulse-2.5.0.tar.gz:
Publisher:
pypi-publish.yml on ErisPulse/ErisPulse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
erispulse-2.5.0.tar.gz -
Subject digest:
334bf45593f4ae12195740b9405b308fe9ea9be970ed5b49585f4ebe3f5698fa - Sigstore transparency entry: 1871337437
- Sigstore integration time:
-
Permalink:
ErisPulse/ErisPulse@4856bb9e7deb80d3ebad5c448e6fa7bc5f433279 -
Branch / Tag:
refs/heads/Develop/v2 - Owner: https://github.com/ErisPulse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@4856bb9e7deb80d3ebad5c448e6fa7bc5f433279 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75e06d56703abfa58207716799f0784df2daa528e8b79e72e0af2a8f6d39d86e
|
|
| MD5 |
e47f6f00e40272cd6b788a95acb7469d
|
|
| BLAKE2b-256 |
6cfe8a18aa06ab86bf6d5a4310bb6626c8df35435da0847b9f67ebece1e39dde
|
Provenance
The following attestation bundles were made for erispulse-2.5.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on ErisPulse/ErisPulse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
erispulse-2.5.0-py3-none-any.whl -
Subject digest:
75e06d56703abfa58207716799f0784df2daa528e8b79e72e0af2a8f6d39d86e - Sigstore transparency entry: 1871337493
- Sigstore integration time:
-
Permalink:
ErisPulse/ErisPulse@4856bb9e7deb80d3ebad5c448e6fa7bc5f433279 -
Branch / Tag:
refs/heads/Develop/v2 - Owner: https://github.com/ErisPulse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@4856bb9e7deb80d3ebad5c448e6fa7bc5f433279 -
Trigger Event:
workflow_dispatch
-
Statement type: