Pular para conteúdo

bostie

bostie é uma biblioteca de Discord para Python cujo gateway, cliente HTTP e motor de voz rodam em Rust. Você escreve o bot em Python assíncrono e tipado.

Bostie, um Boston Terrier, recebendo você de braços abertos

Pré-alfa

A API do bostie ainda pode mudar. Comandos de barra, de usuário e de mensagem, componentes, modais, eventos do gateway, o cache, REST, webhooks, interações por HTTP, OAuth2 e a reprodução e recepção de voz já funcionam hoje.

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 entra no canal de voz do usuário que o executou, transmite a URL e responde com um botão Stop. O custom id do botão leva o ID do servidor, e @bot.on_component o converte de volta em um int, então o botão continua funcionando depois que o bot reinicia. bot.run() lê o token da variável de ambiente BOSTIE_TOKEN e envia o comando ao Discord quando ele mudou.

Usa um assistente de programação com IA?

Instale a skill do bostie para que o seu assistente de programação se saia melhor em tarefas com o bostie. Copie o prompt e cole-o no seu assistente de programação. Mais sobre a skill

Instalar a skill do 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/pt-br/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.

Para que ele foi feito

Voz

Desde 1º de março de 2026, o Discord só aceita chamadas com criptografia de ponta a ponta (DAVE). O motor de voz do bostie roda em threads Rust, fora do GIL: o relógio de 20 ms, a decodificação, a mixagem, a codificação Opus, a criptografia de transporte e o DAVE. O Python só precisa manter cheio o buffer de cada sink, 0,2 segundo de áudio por padrão. O bostie reproduz arquivos, URLs, streams HLS e o seu próprio PCM ou Opus, mixa várias fontes, recebe cada falante separadamente e grava chamadas.

Bots que sobrevivem às mudanças do Discord

Campos, valores de enum, tipos de componente e tipos de interação desconhecidos nunca quebram a decodificação. Todo evento, e todo modelo decodificado a partir de um payload inteiro, guarda o JSON bruto, e bot.http e os listeners de eventos brutos alcançam o que o bostie ainda não modela.

Tipos que batem com a documentação do Discord

Um campo que o Discord sempre envia nunca é None, e um objeto parcial tem a sua própria classe: um membro resolvido a partir de uma opção de comando é um ResolvedMember, que não tem deaf nem mute.

Comandos a partir de assinaturas

Opções, escolhas, intervalos e preenchimento automático vêm das anotações de tipo. Nomes, descrições, quantidade de opções e escolhas são verificados contra os limites do Discord quando o decorador roda, e não quando o Discord rejeita a sincronização.

Testes sem o Discord

bostie.testing.FakeDiscord é um gateway e uma API REST locais contra os quais você roda o seu bot de verdade.

Para onde ir agora