简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

核心模块 API

本文档提供 ErisPulse 核心模块的 API 快速参考,包含方法签名和简要说明。详细用法和示例请点击各模块的"完整文档"链接。

Storage 模块

基于 SQLite 的键值存储系统,支持通用 SQL 链式查询。

基本操作

from ErisPulse import sdk

sdk.storage.set("key", "value")
value = sdk.storage.get("key", default_value)
keys = sdk.storage.keys()
sdk.storage.delete("key")

批量操作

sdk.storage.set_multi({"key1": "val1", "key2": "val2"})
values = sdk.storage.get_multi(["key1", "key2"])
sdk.storage.delete_multi(["key1", "key2"])

事务操作

with sdk.storage.transaction():
    sdk.storage.set("key1", "value1")
    sdk.storage.set("key2", "value2")

属性访问

sdk.storage.my_key          # 等价于 sdk.storage.get("my_key")
sdk.storage.my_key = "val"  # 等价于 sdk.storage.set("my_key", "val")

SQL 链式查询

Storage 模块提供链式调用风格的通用 SQL 查询构建器,支持自定义表的 CRUD 操作。

sdk.storage.CreateTable("users", {
    "id": "INTEGER PRIMARY KEY AUTOINCREMENT",
    "name": "TEXT NOT NULL",
})

sdk.storage.Table("users").Insert({"name": "Alice"}).Execute()
rows = sdk.storage.Table("users").Select("name").Where("id > ?", 0).Execute()

完整的链式查询 API(Select/Insert/Update/Delete/Where/OrderBy/Limit、AlterTable、事务等)请参考 SQL 查询构建器。

存储后端抽象

StorageManager 继承自 BaseStorage 抽象基类,支持扩展其他存储介质(Redis、MySQL 等)。

from ErisPulse.Core.Bases.storage import BaseStorage, BaseQueryBuilder

异步接口

Storage 和 Config 模块均提供异步方法(前缀 a),可在异步处理器中安全调用。同步方法继续保留,无需修改现有代码。

# 异步存储
value = await sdk.storage.aget("key")
await sdk.storage.aset("key", "value")
await sdk.storage.adelete("key")
keys = await sdk.storage.aget_all_keys()
await sdk.storage.aclear()

# 异步批量操作
values = await sdk.storage.aget_multi(["k1", "k2"])
await sdk.storage.aset_multi({"k1": "v1", "k2": "v2"})
await sdk.storage.adelete_multi(["k1", "k2"])

# 异步配置
value = await sdk.config.agetConfig("MyModule.key")
await sdk.config.asetConfig("MyModule.key", "value")
await sdk.config.aforce_save()
await sdk.config.areload()

Config 模块

TOML 格式的配置文件管理,支持点号分隔的键路径。

API 概览

方法 说明
getConfig(key, default) 读取配置,支持点号路径如 "MyModule.subkey"
setConfig(key, value, immediate=False) 写入配置。immediate=True 时立即保存到文件
force_save() 强制将内存中的配置写入文件
reload() 从文件重新加载配置
agetConfig(key, default) 异步读取配置
asetConfig(key, value, immediate) 异步写入配置
aforce_save() 异步强制保存
areload() 异步重新加载

示例

config = sdk.config.getConfig("MyModule", {})
value = sdk.config.getConfig("MyModule.timeout", 30)

sdk.config.setConfig("MyModule", {"key": "value"})
sdk.config.setConfig("MyModule.timeout", 60, immediate=True)

setConfig 默认采用延迟写入(每 5 秒批量保存),设置 immediate=True 可立即持久化到配置文件。配置变更会触发 config.set 生命周期事件。

Logger 模块

模块化日志系统,基于 Rich 输出,支持子日志器和模块级别控制。

基本用法

sdk.logger.debug("调试信息")
sdk.logger.info("运行信息")
sdk.logger.warning("警告信息")
sdk.logger.error("错误信息")
sdk.logger.critical("致命错误")

子日志器

child_logger = sdk.logger.get_child("MyModule")
child_logger.info("子模块日志")

child_logger.get_child("utils")  # 支持嵌套

日志级别控制

sdk.logger.set_level("DEBUG")                          # 全局级别
sdk.logger.set_module_level("MyModule", "DEBUG")       # 模块级别

# 支持的级别(从低到高):
# TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL
# TRACE 为最低级别,输出框架内部详细调试信息(事件分发、路由注册等)
sdk.logger.set_level("TRACE")                          # 开启全部日志

日志订阅(推模式)

供 Dashboard 等模块实时接收结构化日志,支持等级筛选和历史补发。

显式订阅低级别日志:订阅器的 min_level 可低于全局日志级别。此时低级别日志仅推送给匹配的订阅器,不会输出到控制台,也不会写入内存,从而避免污染主日志流。

# 全局为 INFO,仍可单独订阅 DEBUG 日志
@sdk.logger.handler("debug-tracer", min_level="DEBUG")
def on_debug(log_data: dict): ...
# 装饰器方式
@sdk.logger.handler("my-handler", min_level="INFO")
def on_log(log_data: dict):
    # log_data = {
    #     "timestamp": "2026-06-29T22:00:00.123456",
    #     "level": "WARNING", "level_num": 30,
    #     "module": "ErisPulse.Core.adapter",
    #     "message": "严格模式:...",
    # }
    pass

# 直接调用方式
sdk.logger.handler("my-handler", min_level="INFO")(on_log)
sdk.logger.remove_handler("my-handler")
方法 说明
handler(id, *, min_level)(func) 装饰器/直接调用两用。id 为空时取函数名。min_level 可低于全局级别(低级别日志仅推送订阅器,不进控制台/内存)。注册时自动补发历史日志
remove_handler(id) 移除订阅器

输出控制

sdk.logger.set_output_file("app.log")
sdk.logger.save_logs("log.txt")
sdk.logger.get_logs("MyModule")
sdk.logger.set_memory_limit(1000)

Adapter 模块

适配器管理器,管理多平台适配器的注册、启动和关闭。

API 概览

方法 说明
get(platform) 获取适配器实例
exists(platform) 检查适配器是否已注册
enable(platform) / disable(platform) 启用/禁用适配器
is_enabled(platform) 检查是否启用
startup(platforms) / shutdown(platforms) 启动/关闭适配器
is_running(platform) 检查适配器是否正在运行
list_running() 列出所有正在运行的适配器
platforms 获取所有平台名称列表

适配器事件

@sdk.adapter.on("message")
async def handle_message(event):
    pass

@sdk.adapter.on("message", platform="yunhu")
async def handle_yunhu_message(event):
    pass

Bot 状态查询

sdk.adapter.get_bot_info("telegram", "123456")
sdk.adapter.list_bots("telegram")
sdk.adapter.is_bot_online("telegram", "123456")
sdk.adapter.get_status_summary()

完整的适配器管理 API 请参考 适配器系统 API。

Module 模块

模块管理器,管理插件的注册、加载和卸载。

API 概览

方法 说明
get(name) 获取模块实例或懒加载代理(已注册但未加载时返回代理)
exists(name) 检查是否已注册
is_loaded(name) 检查是否已加载
is_enabled(name) 检查是否启用
enable(name) / disable(name) 启用/禁用模块
load(name) / unload(name) 加载/卸载模块
call(module, method, *args, timeout=None, **kwargs) 跨模块调用目标模块的服务方法(协议化 RPC)
list_registered() 列出已注册模块
list_loaded() 列出已加载模块
get_info(name) 获取模块信息
get_status_summary() 获取模块状态摘要

属性访问

module = sdk.module.get("ModuleName")
module = sdk.module.ModuleName
module = sdk.ModuleName  # 等价快捷方式

模块间调用(RPC)

# 协议化调用:类型化错误 / 懒模块自动唤醒 / owner 归因 / 超时语义
result = await sdk.module.call("Chat", "get_history", session_id, n=20)

与服务方裸属性访问 sdk.module.Chat.get_history(...) 的差异:

module.call() 裸属性访问
目标未注册/未启用 抛 ModuleNotAvailableError 抛 AttributeError
懒加载模块 自动唤醒 异步初始化模块抛 RuntimeError
current_owner 归因到目标模块 保持调用方
超时 默认 30s,可覆盖 无
scope 审计 actions.<调用方>.call 无

服务契约(meta.services)

服务方在 get_meta() 的 services 字段声明对外白名单(与 commands 对称),声明后调用面收紧:

class ChatModule(BaseModule):
    @staticmethod
    def get_meta() -> ModuleMeta:
        return ModuleMeta(services=["get_history", "translate"])

    async def get_history(self, session_id, n=20): ...

服务介绍(description):services 支持 dict 形态为每个服务声明介绍 (支持纯字符串或 i18n 字典),供服务目录 / AI 调用点描述消费:

return ModuleMeta(
    services=[
        "get_history",                              # 简单形态:介绍自动取方法 docstring 首行
        {"name": "translate", "description": "把文本翻译成指定语言"},
        {"name": "summarize", "description": {"i18n": "Chat.meta.svc.summarize", "default": "摘要对话"}},
    ],
)

介绍解析优先级:显式 description(i18n 解析为当前语言)> 方法 docstring 首行 > 空串。

服务目录(services)

sdk.module.services()
# {'Chat': [{'name': 'get_history', 'signature': '(session_id, n=20)',
#            'description': '获取会话历史'}]}

sdk.module.services("Chat")  # 仅查询指定模块

仅列出显式声明 meta.services 的模块;每个服务附方法签名字符串 与介绍文本,为 MCP 化(调用点暴露给 AI)提供数据基础。

定向事件投递属于生命周期层:lifecycle.emit(event, data, to="ModuleName"), 详见 模块间通信。

Lifecycle 模块

事件驱动的生命周期管理器,提供事件提交和监听功能。

API 概览

方法 说明
on(event, priority=0) 装饰器注册事件处理器,支持点号匹配和通配符 *
register(event, handler, priority=0) 函数式注册处理器
unregister(event, handler=None) 移除处理器
emit(event, data, to=None) 异步触发事件;to 指定 owner 时定向投递
emit_sync(event, data, to=None) 同步触发事件(异步处理器以 create_task 调度)
submit_event(event_type, msg, data, source, to=None) 提交标准格式事件(兼容旧版)
start_timer(id) / stop_timer(id) 性能计时器

示例

@sdk.lifecycle.on("module.init")
async def handle_module_init(event_data):
    print(f"模块初始化: {event_data}")

@sdk.lifecycle.on("module")
async def handle_any_module_event(event_data):
    print(f"模块事件: {event_data}")

await sdk.lifecycle.emit("custom.event", {"key": "value"})

# 定向投递:仅分发给 Chat 模块注册的钩子
await sdk.lifecycle.emit("message_received", {"text": "hi"}, to="Chat")

完整的标准事件列表和详细用法请参考 生命周期管理。

Router 模块

HTTP/WebSocket 路由管理器,基于 FastAPI + Uvicorn,支持装饰器路由、中间件、分组、限流、CORS。

完整的路由 API 文档(装饰器路由、WebSocket、中间件、速率限制、CORS、安全头等)请参考 路由管理器。

快速参考

# HTTP 路由
@sdk.router.get("MyModule", "/api")
async def handler(request: HttpRequest):
    return {"status": "ok"}

# WebSocket 路由
@sdk.router.ws("MyModule", "/ws")
async def ws_handler(ws: WebSocketConnection):
    async for text in ws.iter_text():
        await ws.send_text(f"Echo: {text}")

# 路由分组
group = sdk.router.group("MyModule", prefix="/v1")
@group.get("/users")
async def list_users(request: HttpRequest):
    return {"users": []}

HTTP Client 模块

统一网络客户端,聚合 HTTP 请求、WebSocket 连接、连接池管理、自动重试、请求统计和生命周期事件集成。

完整的网络客户端文档(请求方法、响应对象、WebSocket 客户端、异常体系等)请参考 网络客户端。

快速参考

from ErisPulse.Core import client

# HTTP 请求
resp = await client.get("https://api.example.com/users")
data = await resp.json()

# WebSocket
ws = await client.ws_connect("wss://example.com/ws")
async for text in ws.iter_text():
    await ws.send_text(f"Echo: {text}")

SDK 调试

dump_state()

导出框架当前运行状态的快照,用于调试和诊断。

import json
state = sdk.dump_state()
print(json.dumps(state, indent=2, ensure_ascii=False, default=str))

返回结构包含以下子系统的状态:

字段 说明
sdk SDK 初始化状态、Python 版本、运行平台、时间戳
adapters 已注册/已启动的适配器列表、各平台 Bot 在线状态
modules 已注册/已启用/已禁用/懒加载的模块列表
events 各类事件处理器数量(message/notice/request/meta/commands)
router 服务器运行状态、HTTP/WebSocket 路由数量

Note

新增于 ErisPulse 2.5.2+

Interaction 交互会话

管理 wait_reply 挂起等待与会话互斥租约(sdk.interaction)。

常用方法

# 会话定时提醒:5 分钟无回复则提醒,用户回复自动取消
reminder = event.remind(300, "还在吗?")
reminder.cancel()  # 手动取消

# 超时升级:到点必达(不被回复取消)
event.escalate(1800, lambda e: notify_master("30 分钟未处理"))

# 多路等待:先到先得
which, reply = await event.select(
    event.expect(pattern="同意*", user="A"),
    event.expect(pattern="拒绝*", user="B"),
    timeout=60,
)

# 会话级等待:同群任何人的回复均可命中
reply = await event.wait_reply(session=True, prompt="谁能帮忙答一下?")

# 查询会话当前归属(谁正在与该用户交互)
owner = sdk.interaction.get_owner_of(event)

# 声明会话互斥租约(被占用返回 None)
lease = sdk.interaction.acquire(event)
if lease:
    try:
        ...  # 独占交互
    finally:
        lease.release()

# 上下文管理器形式(被占用抛 SessionOccupiedError)
with sdk.interaction.hold(event) as lease:
    ...

# 挂起会话统计
sdk.interaction.counts()  # {'waits': 2, 'leases': 1, 'timers': 3, 'owners': {'Chat': 3}}

模块卸载 / 适配器关闭时其挂起的等待与定时器自动取消(等待方立即返回 None), 回复命中时自动复查 scope 权限(用户被拉黑 / 模块被解绑则终止等待)。

Note

本节能力新增于 ErisPulse 2.8.0+

Transcript 会话收件箱

每会话近期消息流的自动记录与查询(sdk.transcript),作为 AI 对话、 防复读等上下文记忆类模块的公共底座。

常用方法

# 便捷查询(推荐):当前会话最近 20 条(含用户与机器人,时间升序)
messages = await event.history(20)
for m in messages:
    print(m["role"], ":", m["text"])

# 管理器 API
sdk.transcript.append(event, "user", "文本")
sdk.transcript.get(event, n=20)
sdk.transcript.clear(event)

配置(ErisPulse.transcript):enabled(默认开启)、max_per_session(每会话上限,默认 50)、 ttl_hours(全局过期时间,默认 168 小时)。数据存独立 SQLite 表,超限/过期惰性清理。

Note

本节能力新增于 ErisPulse 2.8.0+

相关文档