Telegram Bot API-shaped helpers for agent-framework-hosting.
Project description
agent-framework-hosting-telegram
Telegram Bot API-shaped helpers for app-owned Agent Framework hosting.
This is an alpha, helper-only package: it converts between Telegram's
Update JSON shape and Agent Framework run values in both directions. It
does not provide a bot client, a hosting/channel registry, or a
long-running service. Your app remains fully responsible for:
- Fetching updates -- long polling (
getUpdates) or registering a webhook -- and for verifying webhook authenticity (e.g. Telegram's secret token header, or an IP allowlist). - The Bot API client -- issuing the actual HTTP calls (
sendMessage,sendPhoto,editMessageText,answerCallbackQuery,getFile, ...) with whatever HTTP library you prefer. - Rate limits and retries -- Telegram enforces per-chat and global rate
limits; back off and retry on
429/5xxyourself. - Command dispatch --
telegram_command(...)only parses and normalizes a leading/command; your app decides what each command does. - Sessions/storage -- pair these helpers with
agent-framework-hosting'sAgentState/SessionStore(or your own) to persistAgentSessions across turns.
Helpers
telegram_chat_id(update)-- the chat id an update belongs to.telegram_session_id(update, bot_id=...)-- a bot-scopedAgentStatesession id. Private chats usetelegram:<bot_id>:<user_id>; other chats usetelegram:<bot_id>:<chat_id>.telegram_command(update)-- a leading slash command, with/name@bot argsnormalized to/name args. ReturnsNoneif there is none.telegram_callback_query_id(update)-- a callback query's id, so you can callanswerCallbackQueryyourself.telegram_media_file_id(update_or_message)-- the(file_id, mime_type)of inbound media (largest photo size, document, voice, audio, or video).telegram_to_run(update, *, resolve_file_url=None, stream=False)-- convert amessage,edited_message, orcallback_queryupdate intoAgent.runarguments. Provideresolve_file_url(typically backed bygetFile) to turn inbound media into content; without it (or when it returnsNone), text/caption is preserved and media is otherwise dropped. Media-only input with no resolvable URL raisesValueError.telegram_from_run(result, *, chat_id, parse_mode=None)-- render a finished run as oneTelegramOperation(sendPhotowhen the response has an image, otherwisesendMessage, falling back to"(no response)").telegram_from_streaming_run(stream, *, chat_id, message_id, initial_text=None, parse_mode=None)-- render a streaming run aseditMessageTextoperations with the cumulative text so far, followed by any images in the final response assendPhotooperations. Pass the app-created placeholder text asinitial_textso an identical first edit is omitted. Image-only responses first emitdeleteMessagefor the placeholder.
TelegramOperation is a minimal TypedDict of {"method": str, "payload": dict}
-- your app is responsible for actually calling the Bot API with it.
from agent_framework_hosting import AgentState
from agent_framework_hosting_telegram import (
telegram_chat_id,
telegram_from_run,
telegram_session_id,
telegram_to_run,
)
state = AgentState(agent)
async def handle_update(update: dict) -> None:
chat_id = telegram_chat_id(update)
if chat_id is None:
return # Not a chat update this bot handles.
session_id = telegram_session_id(update, bot_id=bot.id)
session = await state.get_or_create_session(session_id)
run = await telegram_to_run(update, resolve_file_url=resolve_telegram_file_url)
result = await (await state.get_target()).run(run["messages"], session=session, options=run["options"])
await state.set_session(session_id, session) # type: ignore[arg-type]
operation = telegram_from_run(result, chat_id=chat_id)
await call_bot_api(operation["method"], operation["payload"]) # Your HTTP client.
The base execution-state helpers live in
agent-framework-hosting.
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 agent_framework_hosting_telegram-1.0.0a260721.tar.gz.
File metadata
- Download URL: agent_framework_hosting_telegram-1.0.0a260721.tar.gz
- Upload date:
- Size: 11.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84dacdb5047fa965d6aedba64abd42fd542e81b649e26b4db6019972c764a067
|
|
| MD5 |
b763aadc014f2aefeffd40c3a3b6effb
|
|
| BLAKE2b-256 |
d70f8cceedb2058d972bc13cd59c35168bc6dba6321029954e3aac65b073ba61
|
File details
Details for the file agent_framework_hosting_telegram-1.0.0a260721-py3-none-any.whl.
File metadata
- Download URL: agent_framework_hosting_telegram-1.0.0a260721-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3080c0620ae010b25b4a2aa7927bf1dfeb135dd5bc20e74710fee443f6244b60
|
|
| MD5 |
94f81a116c2470b58a1b0b3c3ca524aa
|
|
| BLAKE2b-256 |
04f25b7b3f31503a1c995585f803699710a87fa6109c07241e51aceb6cae3534
|