bostie¶
bostie es una biblioteca de Discord para Python cuyo gateway, cliente HTTP y motor de voz corren en Rust. Tú escribes el bot en Python asíncrono y tipado.

Pre-alfa
La API de bostie todavía puede cambiar. Hoy ya funcionan los comandos slash, de usuario y de mensaje, los componentes, los modales, los eventos del gateway, la caché, REST, los webhooks, las interacciones por HTTP, OAuth2, y la reproducción y recepción de voz.
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 se une al canal de voz del usuario que lo ejecutó, transmite la URL y responde con un botón Stop. El custom id del botón lleva el id del servidor, y @bot.on_component lo vuelve a convertir en un int, así que el botón sigue funcionando después de reiniciar el bot. bot.run() lee el token de la variable de entorno BOSTIE_TOKEN y envía el comando a Discord cuando cambió.
¿Usas un asistente de programación con IA?
Instala la skill de bostie para que tu asistente de programación trabaje mejor con bostie. Copia el prompt y pégalo en tu asistente de programación. Más sobre la skill
Instalar la skill de 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/es/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 qué está hecha¶
Voz¶
Desde el 1 de marzo de 2026, Discord solo acepta llamadas con cifrado de extremo a extremo (DAVE). El motor de voz de bostie corre en hilos de Rust, fuera del GIL: el reloj de 20 ms, la decodificación, la mezcla, la codificación Opus, el cifrado del transporte y DAVE. Python solo tiene que mantener lleno el búfer de cada sink, 0.2 segundos de audio por defecto. bostie reproduce archivos, URL, streams HLS y tu propio PCM u Opus, mezcla varias fuentes, recibe a cada persona que habla por separado y graba llamadas.
Bots que sobreviven a los cambios de Discord¶
Los campos, valores de enum, tipos de componente y tipos de interacción desconocidos nunca rompen la decodificación. Cada evento, y cada modelo decodificado a partir de un payload completo, conserva el JSON sin procesar, y bot.http y los listeners de eventos sin procesar llegan a lo que bostie todavía no modela.
Tipos que coinciden con la documentación de Discord¶
Un campo que Discord siempre envía nunca es None, y un objeto parcial tiene su propia clase: un miembro resuelto a partir de una opción de comando es un ResolvedMember, que no tiene deaf ni mute.
Comandos a partir de firmas¶
Las opciones, las choices, los rangos y el autocompletado salen de las anotaciones de tipo. Los nombres, las descripciones, la cantidad de opciones y las choices se comprueban contra los límites de Discord cuando se ejecuta el decorador, no cuando Discord rechaza la sincronización.
Pruebas sin Discord¶
bostie.testing.FakeDiscord es un gateway y una API REST locales contra los que puedes ejecutar tu bot real.
Por dónde seguir¶
- Instala bostie y sus requisitos de compilación.
- Escribe un primer bot en el inicio rápido.
- Las guías explican una función por página, desde los comandos slash hasta las pruebas.
- La sección de voz cubre las conexiones, la reproducción, el audio sin procesar y la recepción.
- La referencia enumera cada opción de
Bot, cada evento y la API.