Asosiy kontentga o‘tish
Innovialabs

ChatGPT yoki Claude’ni Telegram botga qanday ulash mumkin

Amaliyot4 daq

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_id kaliti 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 /new buyrug‘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_after qiymati 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:

  1. Model Markdown’ini Telegram HTMLga (<b>, <i>, <code>, <pre>, <a>) aylantiring, matndagi <, > va &ni ekranlang.
  2. Sarlavhalarni qalin qatorlarga, jadvallarni ro‘yxat yoki kod blokiga aylantiring: Telegram’da jadvallar yo‘q.
  3. Yuborish baribir xato bersa, javobni yo‘qotmasdan oddiy matn yuboring.
  4. Tizim promptida modeldan jadvallar va chuqur ichma-ichlikdan foydalanmaslikni so‘rang.

Chastota va narx limitlari

LimitNima uchun
Bir foydalanuvchiga daqiqasiga so‘rovlarSpam va skriptlardan himoya
Foydalanuvchiga kunlik token byudjetiBitta faol foydalanuvchi narxini cheklaydi
Javobdagi maksimal tokenlarJavobning cheksiz o‘sishiga yo‘l qo‘ymaydi
Kiritishning maksimal uzunligiJuda uzun matnlarni to‘xtatadi
Foydalanuvchiga bitta faol generatsiyaIkki marta bosishdan parallel so‘rovlarni istisno qiladi
Ogohlantirishli umumiy oylik limitButun 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.

Ko‘p beriladigan savollar

Ikkala API ham bir xil sxema bo‘yicha ulanadi. Real vazifalaringizdagi javob sifatini, narxni va ma’lumotlarni qayta ishlash siyosatini solishtiring, bot va provayder o‘rtasida esa yupqa o‘ram saqlang — shunda modelni botni qayta yozmasdan almashtirish mumkin.

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.