Telegram Setup logo

Telegram Setup

OrganizationPopular
vellum-ai
telegram-setup

Connect a Telegram bot to the Vellum Assistant gateway with automated webhook registration and credential storage

Overview

Publishervellum-ai
Repositoryvellum-assistant
Skill nametelegram-setup
Stars
1.4K
Forks
208
Bundled files
1
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by vellum-ai on GitHub. Read the source before you install it.

Installation

Install the Telegram Setup AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/vellum-ai/vellum-assistant/tree/main/skills/telegram-setup
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git /tmp/vellum-assistant
mkdir -p .claude/skills
cp -r /tmp/vellum-assistant/skills/telegram-setup .claude/skills/telegram-setup
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Telegram Setup in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Telegram Setup on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Telegram Setup is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

You are helping your user connect a Telegram bot. The wizard collects the token, the rest of setup runs automatically, and you confirm it worked.

DO NOT use this skill for runtime Telegram operations (sending, replying, reading). That is the separate messaging skill.

Supported chats

Telegram works in private chats and in groups and supergroups. In a private chat the assistant answers every message. In a group it answers only a message that addresses it: an @mention of the bot's username, a command such as /summary@botname, or a reply to one of its posts. Every other group message is dropped on purpose and never reaches the assistant; the gateway log records each drop with the reason bot_not_mentioned. Broadcast channels are not supported.

Telegram's privacy mode (on by default) already delivers only mentions, replies, and commands to a bot. The assistant applies the same rule itself, so promoting the bot to admin or turning privacy mode off does not make it answer unaddressed messages.

Tell the user this during setup and in the Step 5 summary. When a group message got no reply, first check that it mentioned the bot or replied to it, before diagnosing webhook or credential failures. Forum topics work: a reply lands in the topic the message was in.

What happens without you

Saving the token in the wizard triggers all of this:

StepRuns
Validate the token against getMeAutomatically, on save
Store telegram.botId and telegram.botUsernameAutomatically, on save
Generate the webhook secretAutomatically, on save
Register the platform callback routeAutomatically, on save
Tell Telegram where to send updates (setWebhook)Automatically, after the save
Install the bot commands (setMyCommands)Automatically, after the save

⚠️ CRITICAL: Never run setWebhook, setMyCommands, or assistant webhooks register yourself, and never generate the webhook secret. reconcileTelegramWebhook is idempotent and already runs on the credential change the save produces. Doing it by hand races it, which is how a webhook ends up pointing somewhere stale.

Your job is Steps 1 to 5 below: open the wizard, confirm delivery, link the user's identity.

Step 1: Check existing configuration

⚠️ CRITICAL: If you got here from a wizard-closed notification, or the user just said they finished setup, go straight to Step 3. A successful save leaves both credentials in place, so this step would find them and read it as "already configured" at exactly the moment that means the opposite. Stopping there skips the delivery check and the identity verification, which is the failure this flow exists to prevent.

Otherwise, run assistant credentials list --search telegram (via the bash tool). Note whether bot_token and webhook_secret are present.

  • Neither present → continue to Step 2.
  • Both present → credentials existing does not mean Telegram works, so check before saying so. Run Step 3's assistant channels get telegram --json and read webhook_delivery.
    • passed: true, no indeterminate → already set up and confirmed. Offer to show status or reconfigure, and stop here unless the user wants a reset.
    • passed: true with indeterminate: true → do NOT stop here. Nothing is broken, but nothing is confirmed: the registration record is missing, or Telegram was unreachable just now. Stopping would skip both the recovery in Step 3 and the identity verification in Step 4. Go to Step 3 and re-check.
    • passed: false → configured but not delivering. This is what the Channels page shows as incomplete, and it is why the user may have asked. Go to Step 3 and work the recovery rather than reporting it as already set up.

✓ Checkpoint: You named which fields are present before branching. Do not skip the call and guess.

Step 2: Open the setup wizard

Call ui_show with surface_type: "channel_setup" and data: { channel: "telegram" }. The wizard is non-blocking: the tool returns immediately.

⚠️ CRITICAL: Tool call first, announcement second, in the same turn. Do not write any message saying the wizard is open until ui_show has returned success earlier in the same turn. A message claiming the wizard is open when the tool was never called shows the user an empty side panel.

After it returns success, tell the user:

I've opened the Telegram setup wizard in the side panel. It walks you through creating the bot with @BotFather and brings its token back. Telegram works in private chats and in groups. In a group, mention the bot or reply to it to get an answer; broadcast channels are not supported. It'll let me know when you're done, and I'll check Telegram is actually delivering.

Hand-off notification (phones and narrow windows). On phone-sized clients setup opens on the Contacts page instead of a side drawer and cannot auto-notify. The client sends a hidden message like [User action on channel_setup surface: moved the telegram setup to the Contacts page]. When you receive it:

It looks like setup opened on your Contacts page rather than a side panel, same steps in a different spot. When you've finished, come back and tell me and I'll check it's working.

and rely on their confirmation to trigger Step 3.

If ui_show fails, do NOT send that message. Tell the user the wizard could not be opened and troubleshoot (e.g. no connected client) before retrying.

⚠️ CRITICAL: Do NOT collect the token in chat. Do NOT use assistant credentials prompt. The wizard's secure input field is the only path for credential entry.

Step 3: Confirm Telegram is delivering

Triggered by the wizard-closed notification, [User action on channel_setup surface: closed the telegram setup wizard]. Closing the drawer sends it automatically, so do not wait for the user to type a confirmation. If they say they're done or ask you to check, proceed the same way.

  1. Run assistant credentials list --search telegram. Confirm bot_token and webhook_secret are both present.

    If bot_token is missing the user closed the wizard without saving. Say so and offer to reopen it. When the notification triggered this, the panel is closed and re-running Step 2's ui_show is right. When the user asked manually, the wizard may still be open, so point them back to it instead: a second ui_show over a live wizard resets their progress.

  2. Ask whether Telegram is delivering:

    bash
    assistant channels get telegram --json

    get is always live: it invalidates the cached snapshot and re-runs the remote checks, so it reflects the state now rather than before the save.

    Find the webhook_delivery check in remoteChecks. It has three outcomes, and the third is the one that matters:

    • passed: true, no indeterminate → confirmed. Telegram is registered at the address this assistant set. Continue to Step 4.
    • passed: false → the channel is not live. Its message already names the cause and the fix, including whether this deployment can set its own webhook URL, so relay it rather than diagnosing yourself.
    • passed: true with indeterminate: true → nothing is broken, and nothing is confirmed either. Telegram could not be reached, or no registration was recorded to compare against. Do NOT report success. Say plainly that setup is stored but delivery could not be confirmed yet, relay the message, and offer to check again.

    Registration is asynchronous. If the first check reports no webhook registered, or reports indeterminate, wait a few seconds and run the command once more before treating that as the answer: the recorded registration lands when reconciliation completes.

⚠️ CRITICAL: passed: true alone is not confirmation. An unreachable Telegram API and a missing registration record both report passed: true, because neither found a fault, and both set indeterminate. Treating the boolean alone as proof is precisely how this flow used to tell users their channel was live when nothing had verified it.

⚠️ CRITICAL: Do not report success on stored credentials alone. Credentials existing is what you would expect the moment the wizard closes and says nothing about whether messages arrive. webhook_delivery is the check that does, and it is the same signal the channel indicator uses.

⚠️ CRITICAL: Do not run setWebhook or suggest a tunnel yourself. If webhook_delivery fails, the message says what to do. Registration re-runs by itself whenever credentials or the ingress URL change, so a fix applied elsewhere takes effect without you calling Telegram.

Step 4: Verify identity

This links the user's Telegram identity so the assistant can deliver to them. Without it the channel works but has nobody to talk to, so do not skip it silently.

Load the guardian-verify-setup skill:

  • Call skill_load with skill: "guardian-verify-setup".

If the user wants to skip, continue to Step 5 and tell them they can verify later by saying "verify me on Telegram".

Step 5: Report success

Read the bot username from config rather than calling Telegram again:

bash
assistant config get telegram.botUsername

Summarize:

  • Bot connected: @{botUsername}
  • Telegram delivery: {confirmed | stored, not yet confirmed}
  • Guardian identity: {verified | skipped}
  • Supported chats: private chats, groups, and supergroups. In a group, mention the bot or reply to it. Broadcast channels are not supported.

Use "confirmed" only for a webhook_delivery that passed without indeterminate. If it was indeterminate, say so in the summary rather than rounding it up, and tell the user they can ask you to check again.

⚠️ CRITICAL: Never post the summary with a literal {botUsername} placeholder. Read the config value first and substitute it.

Completion checklist

  • assistant credentials list --search telegram was called and the existing-state branch named explicitly (Step 1).
  • ui_show returned success before any message claiming the wizard is open (Step 2).
  • The token was never requested in chat.
  • assistant channels get telegram reported webhook_delivery as passed: true without indeterminate before any delivery success was claimed (Step 3).
  • setWebhook, setMyCommands, assistant webhooks register and getWebhookInfo were not run by hand.
  • guardian-verify-setup was loaded and either completed or explicitly declined (Step 4).

Clearing credentials

To disconnect Telegram:

bash
assistant credentials delete --service telegram --field bot_token
assistant credentials delete --service telegram --field webhook_secret
assistant config set telegram.botUsername ""

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Telegram Setup AI skill do?

Connect a Telegram bot to the Vellum Assistant gateway with automated webhook registration and credential storage

Why use Telegram Setup on TypingMind?

Because you install it once and use it with any model. Telegram Setup is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Telegram Setup in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/vellum-ai/vellum-assistant/tree/main/skills/telegram-setup. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Telegram Setup?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Telegram Setup?

As many as you like. As long as a model supports skills, you can use Telegram Setup with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Telegram Setup AI skill free?

Yes. It is published on GitHub by vellum-ai under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇