Центр знаний

API для модов и расширений

Локальное API, доступное внутри модов через объект api.

01 · Основы

Структура мода

Каждый мод — отдельный .py файл в папке mods/, обязательно содержащий класс Mod:

class Mod:
    name = "Example Mod"
    version = "1.0"
    author = "Your Name"
    description = "Простой пример мода"

    def on_init(self, api):
        self.api = api
        api.add_sidebar_button("Example", self.on_button_click, icon="🔧")

    def on_button_click(self):
        self.api.add_message("Привет от мода!", is_user=False)

    def register_commands(self):
        return {"hello": self.cmd_hello}

    def cmd_hello(self, args, state):
        return f"Hello, {state.user_name or 'user'}!"

02 · События

Хуки (перехватчики событий)

МетодВызываетсяВозвращает
on_init(api)при загрузке мода—
register_commands()при регистрации команд{"command": callback}
on_user_message(msg, state)после сообщения пользователя, до генерации AIstr (подмена ответа) или None
on_before_generate(messages, state)перед запросом в Ollamaизменённый messages
on_after_generate(response, state)после ответа от Ollamaизменённый response
on_file_upload(filename, content)после загрузки файла—
on_web_search(query, results)после веб-поиска—

03 · API

Методы API

Доступны через api в on_init.

api.ask_ai(prompt, system=None)

Синхронный запрос к AI (без стриминга).

api.add_message(text, is_user=False)

Добавляет сообщение в чат (только отображение).

api.send_user_message(text)

Имитирует отправку сообщения от пользователя.

api.register_command(name, func)

Регистрирует команду. func принимает (args, state).

api.add_sidebar_button(text, callback, icon=None)

Добавляет кнопку на левую панель.

api.get_file_index()

Возвращает объект FileIndex для доступа к загруженным файлам.

api.search_memory(query, limit=5)

Поиск в долговременной памяти (memvid).

api.web_search(query)

Выполняет поиск через DuckDuckGo.

04 · Практика

Примеры модов

Калькулятор

# mods/calc_mod.py
import re

class Mod:
    name = "Calc Mod"
    version = "1.0"

    def register_commands(self):
        return {"calc": self.calc}

    def calc(self, args, state):
        expr = " ".join(args)
        if not re.fullmatch(r'[\d+\-*/(). ]+', expr):
            return "Ошибка: недопустимые символы"
        try:
            return f"Результат: {eval(expr)}"
        except:
            return "Неверное выражение"

Перехват погоды

# mods/weather_mod.py
class Mod:
    name = "Weather Hint"

    def on_user_message(self, user_message, state):
        if "погода" in user_message.lower():
            return "Не забудьте включить Web Search или спросить подробнее про город."
        return None

Кнопка очистки

# mods/clear_btn_mod.py
class Mod:
    name = "Clear Button"

    def on_init(self, api):
        self.api = api
        api.add_sidebar_button("Очистить чат", self.clear_chat, icon="🧹")

    def clear_chat(self):
        self.api.add_message("Чат очищен командой мода.", is_user=False)

Важные замечания

  • Моды выполняются в том же потоке, что и GUI — не блокируйте надолго.
  • Для долгих операций используйте QThread.
  • Не пытайтесь импортировать внутренние модули (app.py) — используйте api.
  • Моды хранятся в папке mods/ и загружаются автоматически при запуске.
  • Ошибки загрузки выводятся в консоль.

Исполнитель: Ерохов Кирилл Александрович, самозанятый. ИНН 780162653155.

По вопросам оплаты и доступа: rufindsruf@gmail.com