Your AI agent runs a task, reaches a manual-approval skill, and sends you a Telegram message asking for confirmation. Reply yes — the next skill runs. Reply no — it stops. No dashboard, no browser tab, just Telegram.
A three-skill pipeline connected to your Telegram bot. The orchestrator runs skills in sequence — auto skills fire immediately, manual skills pause and ask you first:
The agent runs greeter and followup automatically, then pauses before review. It sends you a Telegram message asking for your approval. Reply yes — review runs. Reply no — the pipeline stops.
npxCreate a folder called chain-telegram/. One root agent.yaml orchestrates all three skills — no separate chain YAML files needed:
The root agent.yaml is the orchestrator. It lists all three skills in order — auto skills run immediately, manual skills pause for your approval.
name: Chain Telegram — Approval Demo
description: Three-skill pipeline with automatic and manual approval stages.
skills:
# Runs first — auto (no approval needed)
- path: ./greeter
trigger_type: auto
# Runs second — auto (fires immediately after greeter)
- path: ./followup
trigger_type: auto
# Runs third — manual (pauses and asks for your approval in Telegram)
- path: ./review
trigger_type: manual
trigger_type: auto fires immediately and passes the output forward as context. trigger_type: manual pauses the pipeline, sends you a Telegram approval message, and waits for your reply before continuing.
---
name: greeter
description: Greets you and shares a fun fact about today in history.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are a helpful assistant.
## Step 1: Greet
Say hello, mention today's date, and give one fun fact about today in history.
followup/SKILL.md
---
name: followup
description: Summarises the greeter's output in one sentence.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are a summarizer assistant.
## Step 1: Summarize
The previous skill just ran. Summarize its output in one sentence
and say "Auto skill complete ✅".
review/SKILL.md
---
name: review
description: Runs only after you approve from Telegram.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are an assistant that confirms tasks.
## Step 1: Confirm
The user approved running you from Telegram.
Acknowledge the approval, briefly reference what the previous skills said,
and say "Manual approval complete ✅".
This file holds your LLM key, server settings, and Telegram connector. Leave publicUrl blank for now — you will fill it in after the Cloudflare tunnel starts.
{
"llm": {
"provider": "openai",
"model": "gpt-4o",
"apiKey": "sk-..."
},
"server": {
"enabled": true,
"port": 3333,
"publicUrl": "",
"webhook": true
},
"connectors": [
{
"connection_name": "My Telegram Bot",
"connection_type": "telegram",
"baseUrl": "https://api.telegram.org/botYOUR_BOT_TOKEN",
"auto_reply": true,
"rate_limit": { "messages_per_minute": 20 },
"history": { "enabled": true, "max_messages": 10 }
}
]
}
Replace sk-... with your LLM API key and YOUR_BOT_TOKEN with the token from @BotFather. Anthropic users: set "provider": "anthropic" and "model": "claude-sonnet-5".
"webhook": true activates the webhook receiver. "auto_reply": true tells the server to reply to Telegram messages automatically — including approval prompts and skill results.
Telegram needs a public HTTPS URL to deliver messages to your server. Cloudflare Tunnel gives you one for free — no account or signup needed.
npx cloudflared tunnel --url http://localhost:3333
Copy that URL. Keep this terminal open — the tunnel must stay running while you test.
Paste the Cloudflare URL into publicUrl:
"publicUrl": "https://purple-mouse-1234.trycloudflare.com"
Make sure there is no leading space before https:// — a space in the URL causes Telegram to reject the webhook registration.
Open a second terminal and start OE Runtime in server mode from inside the chain-telegram/ folder:
cd chain-telegram
npx -y @openenthrium/oe-runtime@latest --serve --config oe-config.json
The server detected the Telegram connector, read the publicUrl, and called Telegram's setWebhook API automatically. Your bot is now live.
Open Telegram, find your bot, and send this command:
The bot ran greeter, fired followup automatically, then paused on the review skill. It is now waiting for your reply.
Reply yes (or /approve) in Telegram:
Reply no (or /cancel) instead:
Both yes and /approve approve the pending skill. Both no and /cancel reject it. The bot remembers the pending skill per chat — you do not need to pass any ID manually.
All standard OE commands work from Telegram once the bot is connected:
| Command | What it does |
|---|---|
| /run <skill-name> | Run a named skill — triggers the full pipeline |
| /skills | List all available skills in your project |
| yes / /approve | Approve a pending manual skill and run it |
| no / /cancel | Reject and discard the pending manual skill |
| /status | Health check — LLM, connectors, uptime |
| /help | Show all commands |
| Any plain message | Routes to the default: true skill |
When the server receives a Telegram message and the agent runs its skill pipeline:
yes, the server looks up the pending skill for your chat, runs it with the previous output as context, and sends the result back to you in Telegram.no, the skill is discarded and you get a cancellation confirmation.Pending skills are held in memory. If the server restarts while a skill is waiting for your approval, it is lost — you will need to run the agent again. Each chat can have at most one pending skill at a time.
yes before sending the digest to your team.The Cloudflare tunnel URL changes every time you run npx cloudflared. Update publicUrl in oe-config.json each time — the server re-registers the webhook automatically on startup. For a permanent setup, run OE Runtime on a server with a fixed domain.
Download OE Runtime and start approving agent skills from Telegram — no code, no backend, no dashboard needed.
Get OE Runtime →