# Via Telegram Setup Guide (Simple V1) This guide gets your bot working on Telegram with: - mocked Paytm-like MCP tools (local only) - Groq inference APIs for LLM (and optional STT) No real Paytm payment APIs are used. ## 1) Prerequisites - Python 3.11+ - A Telegram account - A bot token from [@BotFather](https://t.me/BotFather) - A public HTTPS URL for webhook testing (for local dev use [ngrok](https://ngrok.com/)) - A Groq API key from [Groq Console](https://console.groq.com/keys) ## 2) Install and configure From project root: ```bash python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txt cp .env.example .env ``` Set `.env` values: ```env APP_ENV=dev TELEGRAM_BOT_TOKEN= TELEGRAM_WEBHOOK_SECRET= GROQ_API_KEY= LLM_INFERENCE_URL=https://api.groq.com/openai/v1/chat/completions LLM_INFERENCE_API_KEY= LLM_MODEL=llama-3.3-70b-versatile STT_INFERENCE_URL=https://api.groq.com/openai/v1/audio/transcriptions STT_API_KEY= STT_MODEL=whisper-large-v3-turbo DB_PATH=via.sqlite3 ``` ## 3) Run the API ```bash source .venv/bin/activate uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload ``` Health check: ```bash curl http://127.0.0.1:8000/health ``` Expected: ```json {"status":"ok","env":"dev"} ``` ## 4) Expose local server to Telegram In a second terminal: ```bash ngrok http 8000 ``` Copy the HTTPS forwarding URL, e.g. `https://abc123.ngrok-free.app`. ## 5) Register Telegram webhook Replace placeholders and run: ```bash curl -X POST "https://api.telegram.org/bot/setWebhook" \ -H "Content-Type: application/json" \ -d '{ "url": "https:///telegram/webhook", "secret_token": "" }' ``` Verify webhook: ```bash curl "https://api.telegram.org/bot/getWebhookInfo" ``` `url` should point to `/telegram/webhook` and `last_error_message` should be empty. ## 6) Test from Telegram app Open your bot chat and send: - `show recent orders` - `show settlement summary` - `create payment link 250` - `refund txn-2001 amount 50` - `confirm` - `/debug last_update_type` (shows current Telegram update type and last processed type) Voice test: - Send a voice note like: `refund txn-2001 amount 30` - Bot should reply with transcript + action prompt. ## 7) Expected behavior - Orders/links/refunds/settlements come from local mock DB. - Refund mutation is gated: - first message prepares action - `confirm` executes it - Tool calls are audited in `tool_audit` table. ## 8) Quick troubleshooting - `401 invalid webhook secret` - `.env` secret and Telegram `setWebhook secret_token` must match exactly. - Telegram webhook not hitting local app - ensure ngrok URL is alive and `/telegram/webhook` is reachable. - re-run `setWebhook` each time ngrok URL changes. - LLM fallback generic/error response - verify `GROQ_API_KEY` is valid. - verify `LLM_INFERENCE_URL` is `.../chat/completions`. - check model name in `LLM_MODEL`. - Voice transcription unavailable - verify `STT_INFERENCE_URL` ends with `/audio/transcriptions`. - verify `STT_API_KEY` (or `GROQ_API_KEY`) is present. - ensure your bot received a real Telegram `voice` message (not audio/file attachment). ## 9) Local validation before Telegram Run tests: ```bash python3 -m pytest -q ``` Seed richer mock scenarios (recommended before Telegram testing): ```bash python3 -m scripts.seed_scenarios ``` This seeds multiple situations: - healthy collections day - UPI failure dip day - pending + successful refunds - multiple settlement payouts - active/expired payment links Manual webhook simulation: ```bash curl -X POST http://127.0.0.1:8000/telegram/webhook \ -H "Content-Type: application/json" \ -H "X-Telegram-Bot-Api-Secret-Token: " \ -d '{ "message": { "chat": {"id": 12345}, "text": "show settlement summary" } }' ``` --- If you want, next step can be a production-ready `README.md` with Render deploy instructions and persistent Postgres instead of SQLite.