ChatGPT yoki Claude’ni Telegram botga qanday ulash mumkin
Amaliyot4 daqInnovialabs tahririyati
Qisqacha
Bot backend’i xabarni oladi, foydalanuvchining so‘nggi tarixini yuklaydi, faqat serverda saqlanadigan kalit bilan model API’sini chaqiradi, javobni bitta xabarni tahrirlab striming qiladi va limitlar hamda kiritish tekshiruvlarini qo‘llaydi.
Sxema qanday tuzilgan
Oqim oddiy: Telegram → backend’ingiz → model API’si → yana Telegram. Backend webhook yoki polling orqali update oladi, xabarni foydalanuvchi tarixiga qo‘shadi, tarixni OpenAI yoki Anthropic API’siga yuboradi va javobni chatga qaytaradi.
Sifat, narx va xavfsizlikka ta’sir qiladigan hamma narsa shu o‘rta qatlamda sodir bo‘ladi: kontekstni saqlash, striming, formatlash, limitlar va moderatsiya.
API kalitlar — faqat backend’da
- Kalitni muhit o‘zgaruvchisi yoki sirlar menejerida saqlang, hech qachon repozitoriyda yoki Mini App frontend’ida emas.
- Ishlab chiqish va production uchun alohida kalitlar ishlating, toki test kaliti tarqalib ketsa, asosiy akkaunt ochilib qolmasin.
- Provayder konsolida xarajat limitlari va ogohlantirishlarni sozlang.
- Kalit tarqalib ketsa, uni darhol bekor qiling va yangisini chiqaring — undan foydalanishadimi, deb kutmang.
Har bir foydalanuvchi uchun dialog konteksti
Model API’lari holatni saqlamaydi: har bir so‘rovga yozishmani to‘liq qo‘shish kerak. Uni siz o‘zingiz saqlaysiz.
- Xabarlarni Redis yoki ma’lumotlar bazasida
chat_idkaliti bilan saqlang (guruhlarda — chat va foydalanuvchi bo‘yicha). - Tarixni qisqartiring: oxirgi N ta xabar yoki tokenlar byudjeti doirasida. Eski qismni qisqa xulosa bilan almashtirish mumkin.
- Mavzu o‘zgarganda kontekstni tozalash uchun
/newbuyrug‘ini qo‘shing. - Foydalanuvchilarga yozishmalar saqlanishini va qancha muddat saqlanishini ayting, eski ma’lumotlarni jadval bo‘yicha o‘chiring.
Uzun tarix — xarajatlar sezdirmay o‘sishining asosiy sababi: har bir yangi xabar undan oldingi hamma narsani qayta yuboradi.
Xabarni tahrirlash orqali striming
Uzun javobni hech qanday javob belgisisiz kutish bot buzilgandek tuyuladi. Odatiy usul: vaqtinchalik xabar yuborish va matn kelgan sari uni tahrirlash.
import time
from aiogram.exceptions import TelegramBadRequest
async def stream_reply(message, history):
sent = await message.answer("...")
text, last_edit = "", 0.0
async for chunk in llm_stream(history): # SDK ustidan o‘z o‘ramingiz
text += chunk
if time.monotonic() - last_edit > 1.5:
await safe_edit(sent, text)
last_edit = time.monotonic()
await safe_edit(sent, text)
return text
async def safe_edit(sent, text):
try:
await sent.edit_text(text[:4096])
except TelegramBadRequest:
pass # masalan, "message is not modified"
Asosiy qoidalar:
- Har bir token uchun emas, bir-ikki soniyada bir marta tahrirlang. Telegram tahrirlar chastotasini cheklaydi va haddan oshganda
retry_afterqiymati bilan 429 xatosini qaytaradi. - Bitta xabarga ko‘pi bilan 4096 belgi sig‘adi. Javob undan uzun bo‘lsa, joriy xabarni yakunlang va yangisida davom eting.
- Oddiy matn bilan striming qiling, formatlashni faqat yakuniy versiyaga qo‘llang.
- Bot API’ning yangi versiyalarida shaxsiy chatlarda qoralamalarni o‘rnatilgan striming qilish imkoniyati paydo bo‘lgan — kutubxonangiz nimani qo‘llab-quvvatlashini rasmiy hujjatlardan tekshiring.
Markdown formatlash tuzoqlari
Modellar standart Markdown yozadi: **qalin**, # sarlavhalar, jadvallar. Telegram’dagi MarkdownV2 — boshqa dialekt: qalin matn *matn* ko‘rinishida, _ * [ ] ( ) ~ > # + - = | { } . ! belgilarini esa ekranlash kerak. Bitta ekranlanmagan nuqta yoki yopilmagan yulduzcha — va API «can’t parse entities» qaytaradi.
Ishonchli yondashuv:
- Model Markdown’ini Telegram HTMLga (
<b>,<i>,<code>,<pre>,<a>) aylantiring, matndagi<,>va&ni ekranlang. - Sarlavhalarni qalin qatorlarga, jadvallarni ro‘yxat yoki kod blokiga aylantiring: Telegram’da jadvallar yo‘q.
- Yuborish baribir xato bersa, javobni yo‘qotmasdan oddiy matn yuboring.
- Tizim promptida modeldan jadvallar va chuqur ichma-ichlikdan foydalanmaslikni so‘rang.
Chastota va narx limitlari
| Limit | Nima uchun |
|---|---|
| Bir foydalanuvchiga daqiqasiga so‘rovlar | Spam va skriptlardan himoya |
| Foydalanuvchiga kunlik token byudjeti | Bitta faol foydalanuvchi narxini cheklaydi |
| Javobdagi maksimal tokenlar | Javobning cheksiz o‘sishiga yo‘l qo‘ymaydi |
| Kiritishning maksimal uzunligi | Juda uzun matnlarni to‘xtatadi |
| Foydalanuvchiga bitta faol generatsiya | Ikki marta bosishdan parallel so‘rovlarni istisno qiladi |
| Ogohlantirishli umumiy oylik limit | Butun byudjetni himoya qiladi |
Sarfni taxminan emas, API javoblaridagi usage maydoni bo‘yicha hisoblang va foydalanuvchi limitga yetganda tushunarli xabar ko‘rsating.
Foydalanuvchi kiritgan ma’lumotni moderatsiya qilish
- Modelni chaqirishdan oldin uzunlik va ochiq-oydin spamni tekshiring.
- Bot ommaviy bo‘lsa, kiritilgan matnni moderation endpoint yoki arzon klassifikator model orqali o‘tkazing.
- Prompt injectionni muqarrar deb hisoblang: foydalanuvchilar tizim promptini qayta yozishga urinadi. Unga sirlarni qo‘ymang, model vositalarni chaqirsa, har bir harakatni serverda tekshiring.
- Belgilangan xabarlarni loglang, adminlarga foydalanuvchilarni bloklash imkonini bering va bot ommaviy guruhlarda ishlasa, javoblarni ham tekshiring.