TG Agent
A personal Telegram automation tool built to be driven by coding agents — Claude Code, OpenCode, Codex. Install the CLI, add the skill, and your agent can act on Telegram for you: read and send messages, manage channels and chats, download media, run LLM content pipelines. The content factory (collect → search → generate → publish) is one module among many.
How it works
tg-agentCLI — the product surface: ~250 commands covering the full Telegram spectrum (channel,dialogs,messages,search,pipeline,photo-loader,analytics,scheduler,account, …). Every command is a self-contained one-shot: it opens a Telegram connection, does the work, exits. No daemon required.- Skill for coding agents — this repo ships a skill that teaches your agent the command catalog, the runtime model and safety rules.
tg-agent worker— optional long-lived process for scheduled collection and queued sends.
Quick Start (coding agents)
Prerequisites
- Python 3.11+
- Telegram API credentials from my.telegram.org/apps
1. Install the CLI
pip install tg-agent
Create .env in your working directory (auto-loaded by every command):
TG_API_ID=your_api_id
TG_API_HASH=your_api_hash
SESSION_ENCRYPTION_KEY= # optional: encrypt session strings in the DB
2. Authorize an account (interactive, once)
tg-agent account add
You will receive a Telegram login code — enter it yourself. Verify with tg-agent account list.
3. Add the skill to your agent
Claude Code — both ways are equivalent:
/plugin marketplace add https://github.com/axisrow/tg_content_factory
/plugin install tg-agent@tg-agent-marketplace
The short form (
axisrow/tg_content_factory) clones over SSH — without GitHub SSH keys it fails; use the full HTTPS URL as above. If the marketplace is not visible right aftermarketplace add, run/reload-pluginsbeforeplugin install.
or copy the skill folder:
cp -r skills/tg-agent ~/.claude/skills/tg-agent
OpenCode / Codex / other agents — point the agent at skills/tg-agent/SKILL.md as an instruction file (AGENTS.md include, system-prompt attachment, etc.).
4. Just ask your agent
- "Show yesterday's posts from @durov"
- "Send this draft to my Saved Messages"
- "Collect new messages from my channels and find mentions of <keyword>"
Features
- Built for coding agents — the CLI is the contract: new capabilities land as CLI commands first (tested there), other surfaces follow only if at all
- All chat types — channels, supergroups, gigagroups, forums, public and private
- Multi-account with automatic flood-wait rotation
- 3 search modes — local DB (FTS5), direct Telegram API, AI/LLM-powered
- Scheduled collection — incremental fetching; runs in the background
tg-agent worker - Keyword monitoring — plain text and regex, with Telegram bot notifications
- Content factory — LLM pipelines: generate → moderate → publish, image generation included
- Built-in anti-spam filters — deduplication, low-uniqueness detection, cross-channel spam, subscriber-ratio and non-Cyrillic filters
- Analytics — top posts, trends, activity heatmaps, trending topics and emojis
- Security — session encryption (Fernet + PBKDF2), HMAC-signed web session cookies
- Docker-ready
Legacy surfaces
These still work but are frozen: development is paused indefinitely, and new capabilities must not be built on them. The CLI + skill is the only actively developed interface.
- Web dashboard (FastAPI + Bootstrap 5) —
python -m src.main serve, then http://localhost:8080 (password fromWEB_PASS) - TUI and the embedded agent chat (
tg-agent agent chat;claude-agent-sdk/deepagentsbackends) - MCP server (
python -m src.main mcp-server)
Legacy: split deployment (Docker / k8s)
serve spawns an embedded Telegram worker inside the same process by default.
For split deployments pass --no-worker and run a dedicated worker service:
# container 1 — web UI + API only
python -m src.main serve --no-worker
# container 2 — Telegram worker (shared SQLite volume)
python -m src.main worker
Docker
cp .env.example .env
# fill in your credentials
docker-compose up -d
Semantic Search Roadmap Note
The current semantic and hybrid search implementation was originally built around
runtime sqlite-vec loading. That turned out to be too fragile as a mandatory
foundation: installing the sqlite-vec package alone is not enough, because the
active Python/SQLite build must also support sqlite3.enable_load_extension(...).
In practice, the same pip install can therefore produce different operator
outcomes across machines, including "package installed but semantic search
unavailable."
The roadmap is being corrected toward a portable SQLite-first semantic backend
that works on standard Python builds without enable_load_extension. Until that
backend lands, treat sqlite-vec as a transitional dependency rather than a
guaranteed feature toggle. The public UX stays the same: semantic indexing,
semantic search, and hybrid search remain the target interface.
See docs/semantic-search.md for the architecture
note, migration story, and rationale for de-emphasizing mandatory sqlite-vec.
Configuration
Environment Variables (.env)
| Variable | Required | Description |
|---|---|---|
TG_API_ID |
Yes | Telegram API ID |
TG_API_HASH |
Yes | Telegram API Hash |
SESSION_ENCRYPTION_KEY |
No* | Key for encrypting Telegram session strings in DB |
WEB_PASS |
—† | Web panel password (legacy web dashboard only) |
LLM_API_KEY |
No | API key for AI-powered search |
ANTHROPIC_API_KEY |
—† | claude-agent-sdk only (legacy embedded agent chat) |
CLAUDE_CODE_OAUTH_TOKEN |
—† | Claude Code auth token for claude-agent-sdk (legacy) |
AGENT_MODEL |
—† | Claude SDK model override (legacy embedded agent chat) |
AGENT_FALLBACK_MODEL |
—† | provider:model for deepagents fallback (legacy) |
AGENT_FALLBACK_API_KEY |
—† | Explicit API key for the legacy fallback provider |
* If not set, sessions are stored in plaintext. If the DB already contains encrypted sessions (enc:v*), startup fails until this key is provided.
\† Legacy-only: needed solely by the legacy web panel and embedded agent chat (see Legacy surfaces).
config.yaml
Supports ${ENV_VAR} substitution. Empty env vars are dropped (defaults apply).
| Section | Description |
|---|---|
telegram |
API credentials (api_id, api_hash) |
web |
Host, port, password (default: 127.0.0.1:8080; non-loopback host requires a strong WEB_PASS) — legacy web panel |
scheduler |
Collection interval, delays, limits, max flood wait |
notifications |
admin_chat_id for keyword match alerts |
database |
SQLite path (default: data/tg_search.db) |
llm |
LLM provider, model, API key for AI search and content pipelines |
agent |
Legacy embedded agent chat settings |
security |
Session encryption settings |
Legacy: embedded agent backend rules
/agentusesclaude-agent-sdkwhenANTHROPIC_API_KEYorCLAUDE_CODE_OAUTH_TOKENis configured.- If Claude SDK is not configured,
/agentfalls back todeepagentswhenAGENT_FALLBACK_MODELis set. ANTHROPIC_API_KEYandCLAUDE_CODE_OAUTH_TOKENare never reused bydeepagents.- Developer override for forcing
claude-agent-sdkordeepagentslives on the Settings page and applies only when developer mode is enabled.
CLI reference (selected)
tg-agent restart # managed daemon: worker runtime, no web panel
tg-agent worker # same runtime without the stop-first step
tg-agent channel collect --channel-id ID # one-off incremental collection (no daemon)
tg-agent search "query" --limit 20 # search collected history
tg-agent messages read @channel --format json # read message history
tg-agent dialogs send # real actions in real chats
tg-agent pipeline generate # LLM content factory
tg-agent serve # legacy web panel (deprecated)
Full catalog for agents — skills/tg-agent/reference.md; every
group also has --help.
telethon-cli
telethon-cli is installed with the project and reuses the same TG_API_ID
and TG_API_HASH values from .env.
Optional CLI-only overrides:
TG_SESSIONsets a custom Telethon session path or name.TG_PASSWORDsupplies the Telegram 2FA password for non-interactive runs.
Legacy TELETHON_* environment variable names are still accepted by
telethon-cli for compatibility, but this project standardizes on TG_*.
telethon-cli login
telethon-cli users get-me --output json
Web Interface (legacy)
| Page | Path | Description |
|---|---|---|
| Web login | /login |
Sign in to the web panel with WEB_PASS |
| Dashboard | / |
Stats, scheduler status, connected accounts |
| Telegram auth | /auth/login |
Add Telegram accounts (phone + code + 2FA) |
| Accounts | /accounts |
Manage connected accounts |
| Channels | /channels |
Add/remove channels, keywords, import |
| Search | /search |
Search messages (local / Telegram / AI) |
| Analytics | /analytics |
Top posts leaderboard, engagement by content type, hourly patterns |
| Filters | /filter |
Anti-spam filter report and controls |
| Scheduler | /scheduler |
Start/stop/trigger collection and keyword search |
| Agent | /agent |
Legacy embedded AI chat |
Roadmap
- Portable semantic search on stock Python installs without mandatory runtime SQLite extension loading
- Agent-facing capability growth: every new feature lands in the CLI (and the skill) first
- LLM-powered content factory
- LLM-powered intelligent search
- LLM-based chat spam moderation
- Direct message handling
- Telegram action automation (broadcasts, etc.)
Development
# Install dev dependencies
pip install -e ".[dev]"
# Run parallel-safe tests (all available CPUs minus one worker)
pytest tests/ -v -m "not aiosqlite_serial" -n auto
# Run aiosqlite-backed tests serially
pytest tests/ -v -m aiosqlite_serial
# Run a single test
pytest tests/test_web.py::test_health_endpoint -v
# Benchmark serial vs safe mixed-mode suite execution
python -m src.main test benchmark
# Lint
ruff check src/ tests/ conftest.py
CI Note
pushworkflow checks the branch head only.pull_requestworkflow checks the merge result againstmain.- A branch can therefore be green on
pushand red onpull_requestifmainintroduced a lint/test failure that is pulled into the PR merge ref. - Before rerunning PR checks, fetch and sync with
origin/mainso local verification matches CI.
Metadata
Release files for tg-agent 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tg_agent-0.2.4.tar.gz | 2.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tg_agent-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.9 MB
Release files / tg_agent-0.2.4.tar.gz
| Download URL | tg_agent-0.2.4.tar.gz |
|---|---|
| Size | 2.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c1a959f20404e04403295faf0079f1567c570b508935e603493e00c1d4deb668
|
|
BLAKE2b-256 checksum How to use checksums |
9c707a310b57e7c4e8bfcd402a2882b7d3a323c963eb8312e6a648dbbe1a9457
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / tg_agent-0.2.4-py3-none-any.whl
| Download URL | tg_agent-0.2.4-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ed5e07013c69711b16dbff815f0fab38d32e8343679c746a122e2339091e066b
|
|
BLAKE2b-256 checksum How to use checksums |
52ce45156507a0907bef28d62c74cd70729cbb6d3c62c5297eb4731daa670142
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|