Declarative, developer-friendly library for building Telegram bots
Project description
TeleKit Library
Telekit is a declarative, developer-friendly library for building Telegram bots. It gives developers a dedicated Sender to manage message composition and a Chain to handle user input and responses.
import telekit
class MyBotHandler(telekit.Handler):
@classmethod
def init_handler(cls):
cls.on.command('start').invoke(cls.handle_start)
def handle_start(self):
self.chain.sender.set_text("Hello!")
self.chain.sender.set_photo("robot.png")
self.chain.send()
telekit.Server("BOT_TOKEN").polling()
Example taken out of context
Telekit comes with a built-in DSL for defining scenes, menus, FAQ pages, and multi-step flows, allowing developers to create fully interactive bots with minimal code. The library also handles message formatting, user input, and callback routing automatically, letting you focus on the bot’s behavior instead of repetitive tasks.
@ main {
title = "🎉 Fun Facts Quiz";
message = "Test your knowledge with 10 fun questions!";
buttons {
question_1("Start Quiz");
}
}
See the full example
Even in its beta stage, Telekit accelerates bot development, offering ready-to-use building blocks for commands, user interactions, and navigation. Its declarative design makes bots easier to read, maintain, and extend.
Key features:
- Declarative bot logic with chains for effortless handling of complex workflows
- Ready-to-use DSL for FAQs and other interactive scripts
- Automatic handling of message formatting via Sender and callback routing
- Deep Linking support with type-checked Command Parameters for flexible user input
- Built-in Permission and Logging system for user management
- Seamless integration with pyTelegramBotAPI
- Fast to develop and easy-to-extend code
GitHub PyPi Community Tutorial
Contents
Overview
To get the most out of Telekit, we recommend following the full, step-by-step tutorial that covers everything from installation to advanced features and DSL usage.
Even if you don’t go through the entire guide right now, you can quickly familiarize yourself with the core concepts of Telekit below. This section will introduce you to chains, handlers, message formatting, and some examples, giving you a solid foundation to start building bots right away.
Below is an example of a bot that responds to messages like "My name is {name}":
import telekit
class NameHandler(telekit.Handler):
@classmethod
def init_handler(cls) -> None:
cls.on.text("My name is {name}").invoke(cls.display_name)
def display_name(self, name: str) -> None:
self.chain.sender.set_title(f"Hello {name}!")
self.chain.sender.set_message("Your name has been set. You can change it below if you want")
self.chain.set_inline_keyboard({"✏️ Change": self.change_name})
self.chain.edit()
def change_name(self):
self.chain.sender.set_title("⌨️ Enter your name...")
self.chain.sender.set_message("Please, type your new name below:")
@self.chain.entry_text(delete_user_response=True)
def name_handler(message, name: str):
self.display_name(name)
self.chain.edit()
telekit.Server("TOKEN").polling()
Let’s see how it works in practice 👇
Message formatting:
- You can configure everything manually:
self.chain.sender.set_text("*Hello, user!*\n\nWelcome to the Bot!")
self.chain.sender.set_parse_mode("markdown")
- Or let Telekit handle the layout for you:
self.chain.sender.set_title("👋 Hello, user!") # Bold title
self.chain.sender.set_message("Welcome to the Bot!") # Italic message after the title
Approximate result:
👋 Hello, user!
Welcome to the Bot!
If you want more control, you can use the following methods:
self.chain.sender.set_use_italics(False)
self.chain.sender.set_use_newline(False)
self.chain.sender.set_parse_mode("HTML")
self.chain.sender.set_reply_to(message)
self.chain.sender.set_chat_id(chat_id)
# And this is just the beginning...
Want to add an image, document or an effect in a single line?
self.chain.sender.set_effect(self.chain.sender.Effect.HEART)
self.chain.sender.set_photo("url, bytes or path")
self.chain.sender.set_document("url, bytes or path")
self.chain.sender.set_text_as_document("Hello, this is a text document!")
Telekit decides whether to use bot.send_message or bot.send_photo automatically!
Text Styling with Styles
Telekit provides a convenient style classes to create styled text objects for HTML or Markdown:
Bold("Bold") + " and " + Italic("Italic")
Combine multiple styles:
Strikethrough(Bold("Hello") + Italic("World!"))
Then pass it to set_text, set_title, or other sender methods, and the sender will automatically determine the correct parse_mode.
For more details, see our tutorial
Handling callbacks and Logic
If your focus is on logic and functionality, Telekit is the ideal library:
Inline keyboard with callback support:
# Inline keyboard `label-callback`:
# - label: `str`
# - callback: `Chain` | `str` | `func()` | `func(message)`
self.chain.set_inline_keyboard(
{
"« Change": prompt, # Executes `prompt()` when clicked
"Yes »": lambda: print("User: Okay!"), # Runs this lambda when clicked
"Youtube": "https://youtube.com" # Opens a link
}, row_width=2
)
# Inline keyboard `label-value`:
# - label: `str`
# - value: `Any`
@self.chain.inline_keyboard({
"Red": (255, 0, 0),
"Green": (0, 255, 0),
"Blue": (0, 0, 255),
}, row_width=3)
def _(message, value: tuple[int, int, int]) -> None:
r, g, b = value
self.chain.set_message(f"You selected RGB color: ({r}, {g}, {b})")
self.chain.edit()
Receiving messages with callback support:
# Receive any message type:
@self.chain.entry(
filter_message=lambda message: bool(message.text),
delete_user_response=True
)
def handler(message):
print(message.text)
# Receive text message:
@self.chain.entry_text()
def name_handler(message, name: str):
print(name)
# Inline keyboard with suggested options:
chain.set_entry_suggestions(["Suggestion 1", "Suggestion 2"])
# Receive a .zip document:
@self.chain.entry_document(allowed_extensions=(".zip",))
def doc_handler(message: telebot.types.Message, document: telebot.types.Document):
print(document.file_name, document)
# Receive a text document (Telekit auto-detects encoding):
@self.chain.entry_text_document(allowed_extensions=(".txt", ".js", ".py"))
def text_document_handler(message, text_document: telekit.types.TextDocument):
print(
text_document.text, # "Example\n ..."
text_document.file_name, # "example.txt"
text_document.encoding, # "utf-8"
text_document.document # <telebot.types.Document>
)
Telekit is lightweight yet powerful, giving you a full set of built-in tools and solutions for building advanced Telegram bots effortlessly.
- You can find more information about the decorators by checking their doc-strings in Python.
Quick Start
Telekit is published in PyPI, so it can be installed with one command:
pip install telekit
You can write the entire bot in a single file, but it’s recommended to organize your project using a simple structure like this one:
handlers/
__init__.py
start.py # `/start` handler
help.py # `/help` handler
...
server.py # entry point
Here is a server.py example (entry point) for a project on TeleKit
import telekit
import handlers # Package with all your handlers
telekit.Server("BOT_TOKEN").polling()
Here you can see an example of the handlers/__init__.py file:
from . import (
start, help #, ...
)
Here is an example of defining a handler using TeleKit (handlers/start.py file):
import telekit
class StartHandler(telekit.Handler):
@classmethod
def init_handler(cls) -> None:
...
One-file bot example (Echo Bot):
import telekit
class EchoHandler(telekit.Handler):
@classmethod
def init_handler(cls) -> None:
cls.on.text().invoke(cls.echo) # accepts all text messages
def echo(self) -> None:
self.chain.sender.set_text(f"{self.message.text}!")
self.chain.send()
telekit.Server("TOKEN").polling()
For a full walkthrough, check out Tutorial or see more Examples
Contact
1.7.0 changelog:
Improvements
@ main {
title = "Welcome!"
message = "Enter the password:"
buttons (2) {
suggest("Help", "1111") // suggestion
okay("Skip »")
}
entries {
okay("1111") // on "1111" message
fail // default
}
}
@ okay {
title = "Correct!"
message = `
You entered: {{entry:Nothing, you just clicked 'Skip'}}
Your reward is the following link:
`
buttons (2) {
back()
link("Reward", "https://github.com/Romashkaa/telekit")
}
}
@ fail {
title = "Wrong password: {{entry}}!"
message = "The password you entered is incorrect. Please try again."
buttons {
back("« Try again")
}
}
Entries
The entries { ... } block is used to handle values entered by the user in a scene. It allows you to define actions that occur depending on what the user typed.
Example
entries {
scene_name("text") // scene to open when the user entered "text"
default_scene_name // default scene to open if the entered value does not match any listed
}
"text"- the specific text value expected from the user.scene_name— scene to open when the user entered that text.default_scene_name— scene to open if the entered value does not match any specified values.
Example 2
entries {
okay("1111") // if the user entered "1111", the @okay scene is invoked
okay("idk") // if the user entered "idk", the @okay scene is invoked
fail // all other cases lead to the @fail scene
}
New Variable
{{entry}}stores the value the user typed on the keyboard that caused the transition to the current scene via theentries { ... }block.- If the scene was opened not via
entries(e.g., a button,back,next,link, etc.),{{entry}}has no value. - To safely handle this case, use the default form:
{{entry:DEFAULT}}— if the value is missing,DEFAULTwill be used.
- If the scene was opened not via
[!IMPORTANT] This is not "the last input globally"
{{entry}}stores only the value entered immediately before transitioning to this scene.
Suggestions
The suggest() button type is used to provide a suggested input value for an entries { ... } handler.
buttons {
suggest("Help", "1111")
}
- Label — text displayed on the button
- Value — input value that will be passed to
entries { ... }
buttons {
suggest("1111") // label == value
}
- If only one argument is provided, the button label is automatically set to the same value.
[!NOTE]
The{{entry}}variable will be updated with the value provided by thesuggest()button.
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 telekit-1.7.0.tar.gz.
File metadata
- Download URL: telekit-1.7.0.tar.gz
- Upload date:
- Size: 66.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54872e72bc988fb8e40c3ba9cda6779957ccbc37002da0e92446d82a23c8c9a4
|
|
| MD5 |
ac4518ce1af3e2908c7f682166d8184f
|
|
| BLAKE2b-256 |
ca2d13fbbc6a6edcb38258e680ce85ebaecb300994de8066e0a98e343db3a832
|
File details
Details for the file telekit-1.7.0-py3-none-any.whl.
File metadata
- Download URL: telekit-1.7.0-py3-none-any.whl
- Upload date:
- Size: 76.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01fbda02b92829ad0d2da8b7357038d0567e084220804b416d4436c30a7ea1b8
|
|
| MD5 |
48e6bff85ba4e978e1fd453f3f4222cd
|
|
| BLAKE2b-256 |
efdf795f48b3377bb9180b076820679e2f676d7143cd7b7b128889412a1cd5ce
|