Перейти к содержанию

bostie

bostie — библиотека Discord для Python, у которой шлюз, HTTP-клиент и голосовой движок работают на Rust. Сам бот вы пишете на типизированном асинхронном Python.

Бости, бостон-терьер, встречает вас с распростёртыми объятиями

Пре-альфа

API bostie ещё может меняться. Уже сейчас работают слэш-команды, команды пользователя и сообщения, компоненты, модальные окна, события шлюза, кэш, REST, вебхуки, HTTP-взаимодействия, OAuth2, а также воспроизведение и приём голоса.

import bostie
from bostie import ComponentContext, Context, ui, voice

bot = bostie.Bot()


@bot.command
async def play(ctx: Context, url: str) -> None:
    """Play a direct media URL in your voice channel."""
    vc = ctx.voice.current or await ctx.voice.connect()
    await vc.play(voice.Url(url))
    stop = ui.button("Stop", custom_id=stop_playing.id(guild_id=vc.guild_id))
    await ctx.respond(components=[ui.text(f"Playing <{url}>"), ui.row(stop)])


@bot.on_component("stop:{guild_id:int}")
async def stop_playing(ctx: ComponentContext, guild_id: int) -> None:
    if (vc := bot.voice.get(guild_id)) is not None:
        vc.stop()
    await ctx.update(components=[ui.text("Stopped.")])


bot.run()

/play подключается к голосовому каналу пользователя, который запустил команду, проигрывает поток по URL и отвечает кнопкой Stop. В custom id кнопки записан ID сервера, а @bot.on_component разбирает его обратно в int, поэтому кнопка продолжает работать и после перезапуска бота. bot.run() читает токен из переменной окружения BOSTIE_TOKEN и отправляет команду в Discord, если она изменилась.

Пользуетесь ИИ-ассистентом для программирования?

Установите навык bostie, чтобы ваш ассистент лучше справлялся с задачами на bostie. Скопируйте промпт и вставьте его в своего ассистента. Подробнее о навыке

Установите навык bostie
Install the bostie skill for my coding agent so it writes correct bostie code: Discord bots with slash commands, components, events, REST calls, voice and tests.

Use the Agent Skills installer with the bostie repository, https://github.com/nicokim/bostie:

    npx skills add nicokim/bostie --skill bostie --yes

If I ask for a global install instead, use:

    npx skills add nicokim/bostie --skill bostie --yes --global

Detect which agent or editor I am using. If it is one of these and I prefer the plugin path, install the bostie plugin instead, as https://bostie.dev/ru/assistants/ shows:

    Claude Code: /plugin marketplace add nicokim/bostie, then /plugin install bostie@bostie
    Codex CLI: codex plugin marketplace add nicokim/bostie, then codex plugin add bostie@bostie
    GitHub Copilot CLI: copilot plugin marketplace add nicokim/bostie, then copilot plugin install bostie@bostie
    VS Code with GitHub Copilot: run "Chat: Install Plugin from Source" and enter nicokim/bostie
    Devin: devin plugins install nicokim/bostie#docs
    Factory Droid: droid plugin marketplace add nicokim/bostie, then droid plugin install bostie@bostie --scope user
    Qwen Code: qwen extensions install nicokim/bostie:bostie

Do not invent other skill names or install URLs.

Then add this line to the instructions file you read at the start of every session (AGENTS.md at the project root, or your global one for a global install), and create the file if needed:

    Before you write or change code that uses bostie, look at how the project is laid out, then load the bostie skill.

After installing, confirm that the bostie skill is available to you.

Для чего она создана

Голос

С 1 марта 2026 года Discord принимает только звонки со сквозным шифрованием (DAVE). Голосовой движок bostie работает в потоках Rust, вне GIL: такт 20 мс, декодирование, микширование, кодирование Opus, транспортное шифрование и DAVE. Python нужно лишь держать буфер каждого синка заполненным — по умолчанию это 0,2 секунды звука. bostie проигрывает файлы, URL, потоки HLS и ваш собственный PCM или Opus, микширует несколько источников, принимает звук каждого говорящего отдельно и записывает звонки.

Боты, которые переживают изменения Discord

Неизвестные поля, значения перечислений, типы компонентов и типы взаимодействий никогда не ломают декодирование. Каждое событие и каждая модель, декодированная из полной полезной нагрузки, хранят сырой JSON, а bot.http и слушатели сырых событий дают доступ к тому, что bostie ещё не моделирует.

Типы, которые совпадают с документацией Discord

Поле, которое Discord присылает всегда, никогда не бывает None, а у частичного объекта свой класс: участник, полученный из параметра команды, — это ResolvedMember, у которого нет deaf и mute.

Команды из сигнатур

Параметры, варианты, диапазоны и автодополнение берутся из аннотаций типов. Имена, описания, количество параметров и варианты проверяются на соответствие лимитам Discord в момент выполнения декоратора, а не тогда, когда Discord отклонит синхронизацию.

Тесты без Discord

bostie.testing.FakeDiscord — локальный шлюз и REST API, на которых можно запускать вашего настоящего бота.

Что дальше