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

API основных модулей

Данный документ предоставляет краткое руководство по API основных модулей ErisPulse, включая сигнатуры методов и краткие описания. Подробное использование и примеры можно найти, нажав на ссылку "Полная документация" для каждого модуля.

Модуль 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")                          # Включить все логи

Подписка на логи (режим push)

Для модулей, таких как 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)

Модуль адаптера

Менеджер адаптеров, отвечающий за регистрацию, запуск и остановку адаптеров для различных платформ.

Обзор 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

Запрос состояния бота

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 системы адаптеров.

Модуль

Менеджер модулей, отвечающий за регистрацию, загрузку и выгрузку плагинов.

Обзор 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.call() и прямым доступом к атрибутам sdk.module.Chat.get_history(...):

module.call() Прямой доступ к атрибутам
Целевой модуль не зарегистрирован/не включен Выбрасывает ModuleNotAvailableError Выбрасывает AttributeError
Ленивый модуль Автоматически пробуждается Асинхронная инициализация модуля выбрасывает RuntimeError
current_owner Привязывается к целевому модулю Сохраняется вызывающий модуль
Таймаут По умолчанию 30 секунд, может быть переопределён Нет
Аудит scope actions.<вызывающий модуль>.call Нет

Служебный контракт (meta.services)

Поставщик службы объявляет белый список доступных методов в поле services метода get_meta() (аналогично 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 поддерживает словарную форму для описания каждой службы (поддерживает как строки, так и словари i18n), используется для каталога служб / описания точек вызова для ИИ:

return ModuleMeta(
    services=[
        "get_history",                              # Простая форма: описание автоматически берётся из первой строки docstring метода
        {"name": "translate", "description": "Перевод текста на указанный язык"},
        {"name": "summarize", "description": {"i18n": "Chat.meta.svc.summarize", "default": "Суммировать диалог"}},
    ],
)

Приоритет анализа описания: явное описание (i18n разрешается в текущем языке) > первая строка docstring метода > пустая строка.

Каталог служб (services)

sdk.module.services()
# {'Chat': [{'name': 'get_history', 'signature': '(session_id, n=20)',
#            'description': 'Получить историю сессии'}]}

sdk.module.services("Chat")  # Получить только информацию о конкретном модуле

В каталоге перечисляются только модули, явно объявившие meta.services; для каждой службы указываются строка сигнатуры метода и текст описания, что служит основой для MCP (экспозиции точек вызова для ИИ).

Направленная доставка событий относится к слою жизненного цикла: 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-клиента

Единый сетевой клиент, объединяющий 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 Список зарегистрированных/запущенных адаптеров, статус онлайн ботов на каждой платформе
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+

Система хранения переписки

Автоматическая запись и запрос потока последних сообщений для каждой сессии (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+

Связанные документы