Simple and universal keyboard/message builder for aiogram bots.
Project description
simple_aiogram
Powerful, declarative message and keyboard builder for aiogram bots, powered by Pydantic models.
Send, edit, and manage all kinds of Telegram messages and keyboards — as Python classes.
✨ Features
- Declarative: Describe messages, media, and keyboards as Python models.
- Universal: Works with text, photo, video, documents, and all Telegram keyboards.
- Auto-keyboards: Define buttons as class fields, get reply_markup automatically.
- Flexible: Format any text/callback with runtime variables (
str.format_map). - Async: All methods awaitable and designed for modern aiogram.
- File caching: Smart file_id cache for instant media re-use.
- Extensible: Use as a base class or mixin for your own message types.
🚀 Quick Start
from aiogram.types import Message, InlineKeyboardButton
from aiogram.filters import CommandStart
from simple_aiogram import TelegramWindow, BotModel
from my_routers import example_router
bot = BotModel(token="YOUR_BOT_TOKEN")
dp = bot.dispatcher
bot.include_router(example_router)
class HelloWindow(TelegramWindow):
text: str = "Hello, {username}!"
one: InlineKeyboardButton = InlineKeyboardButton(
text="Click me",
callback_data="clicked_{user_id}"
)
@dp.message(CommandStart())
async def hello_handler(msg: Message):
window = HelloWindow(event=msg)
window.format_buttons(user_id=msg.from_user.id)
await window.answer(username=msg.from_user.username)
if __name__ == "__main__":
bot.run()
🎛️ Keyboard Example
Inline or Reply Keyboard — just declare buttons as class attributes:
from aiogram import Router, F
from aiogram.types import InlineKeyboardButton, Message
from simple_aiogram import TelegramWindow
example_router = Router(name="example")
class KeyboardExample(TelegramWindow):
text: str = "Choose:"
btn1: InlineKeyboardButton = InlineKeyboardButton(text="Yes", callback_data="yes_{user_id}")
btn2: InlineKeyboardButton = InlineKeyboardButton(text="No", callback_data="no_{user_id}")
btn3: InlineKeyboardButton = InlineKeyboardButton(text="Maybe", callback_data="maybe_{user_id}")
# Send with auto-built keyboard
@example_router.message(F.text.contains("some text"))
async def hello_handler(msg: Message):
kb = KeyboardExample(event=msg)
kb.format_buttons(user_id=msg.from_user.id)
await kb.answer()
Or add buttons dynamically:
window = HelloWindow(event=msg)
window.add_buttons(
InlineKeyboardButton(text="Profile", callback_data="profile_{user_id}")
)
window.format_buttons(user_id=msg.from_user.id)
await window.answer(username=msg.from_user.username)
📦 Sending Media with File Caching
Send a photo/document/audio/video and automatically cache file_id:
class MediaWindow(TelegramWindow):
text: str = "Here is your file"
photo: str = "/path/to/image.png"
# First send uploads, next times re-uses file_id!
await MediaWindow(event=msg).answer_photo()
🛠️ Advanced Usage
-
format_buttons(kwargs): Format all buttons and callback_data with dynamic values.
-
edit_text(), edit_reply_markup(), edit_media(): Fully supported for CallbackQuery events.
-
@cache: Decorator for auto file_id management (for InputFile uploads).
-
Easily extend for your own forms (see /models/text.py, /models/files.py).
📚 Documentation
Full API Reference
Examples
Pydantic models
aiogram docs
⚡️ Why simple_aiogram?
-
Cut boilerplate and repetitive keyboard code.
-
Add message logic as Python classes — not spaghetti handlers.
-
Maximum type safety and flexibility.
License
MIT License.
Author: belyankiss
Contributions and stars welcome!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file simple_aiogram-0.1.0b1.tar.gz.
File metadata
- Download URL: simple_aiogram-0.1.0b1.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.0 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
762a086147550c0a4230d682017178d2db69fc035555d50c08a3943d230fca44
|
|
| MD5 |
dff21d92dd114e4a5895bfd5b9be9eaf
|
|
| BLAKE2b-256 |
a68039325cbfdb6b6f50f5f69a2ca01736ed0571449d3f56ce429c1e2ed02554
|
File details
Details for the file simple_aiogram-0.1.0b1-py3-none-any.whl.
File metadata
- Download URL: simple_aiogram-0.1.0b1-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.0 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfd0aed331eea0ba87a9151805759e5c39c122e694e50c34327574ac5156a0ab
|
|
| MD5 |
d5cf6a3c46273bdab04c739a21452a0a
|
|
| BLAKE2b-256 |
2bb8f0a54ff61e8e703b4edf7c56a59cacea67d8e5c4af18e9dd6b6614c02760
|