Барлық мақалалар
8 мин оқу

toncenter-дегі 429 «Too Many Requests» қатесін қалай жоямыз

toncenter-дегі 429 «Too Many Requests» қатесі: ЖИ-агенттерге неге қатты соғады, бэкоффпен жылдам фикс және нағыз шешім — кепілді өткізу қабілеті бар өз кілтіңіз.

toncenter429 қатесіTON rate limitMCP TONTONNodeЖИ-агенттер TON

TON-дағы токен-агент дәл ыңғайсыз сәтте құлайды: қолданушы «балансымды және соңғы мәмілелерімді көрсет» деп сұрайды, агент адал түрде toncenter-ге барады — ал жауап ретінде деректері бар JSON емес, құрғақ HTTP 429 Too Many Requests ұшып келеді. Агент бір тик ішінде әмиян балансын, аккаунт күйін, транзакциялар тарихын жинап, бірер get-әдісті шақырмақ болды — ал жария toncenter екінші сұраныста-ақ есікті жауып тастады. Қолданушы «бірдеңе дұрыс болмады» дегенді көреді, ал сіз — бір ғана статус қайталанған қызыл логтар қабырғасын. Бұл сіздің кодыңыздың багы емес. Бұл — toncenter-дің жария rate limit-і, секундына бір сұраныстан жиірек жұмыс істей бастаған кез келген агент соған тіреледі.

toncenter 429 қайдан шығатынын, TON-да Too Many Requests дегенді неге дәл ЖИ-агенттер бәрінен жиі ұстайтынын, бэкоффпен қателер жиілігін қалай тез түсіруге болатынын — және кепілді өткізу қабілеті бар өз кілтіңізге көшіп, бұл төбені қалай мүлдем алып тастауға болатынын талдап көрейік.

toncenter-дегі 429 «Too Many Requests» нені білдіреді

429 коды — бұл «тым көп сұраныс» дегенді білдіретін стандартты HTTP-жауап. Сервер бұзылған да жоқ, деректеріңізді қабылдамай тастаған да жоқ: ол жай ғана рұқсат етілген жүгіну жиілігінен асып кеттіңіз, сондықтан сізді тежеп отыр (rate limiting) дейді. toncenter-де (v2) жауап денесі бұл кезде шамамен былай көрінеді:

{ "ok": false, "error": "Rate limit exceeded", "code": 429 }

Ең бастысы: "ok": false пен "code": 429 — бұл дене ішінде қайталанған HTTP-статус, контрактінің ішкі қате коды емес. Және назар аударыңыз: мұнда аккаунт деректері бар result өрісі мүлдем жоқ — лимит туралы мәтін error өрісінде жатыр. Сондықтан кодыңыз деректерді result-тен алмақ болса, undefined алады да, стектің әріректегі бір жерінде түсініксіз парсинг қатесімен құлайды — ал нағыз себеп error ішінде болып шығады. Ереже қарапайым: ok: false болғанда алдымен code-ты тексеріп, error-ды оқыңыз, жоқ result-ті талдамаңыз.

Фольклор туралы бөлек айта кетейік: TON-қауымдастықта «228 қатесі» деген жүреді. Бұл API коды емес, жай ғана мем — ешбір сервер сізге 228 қайтармайды. Лимиттің нақты коды — дәл 429, құжаттамадан соны іздеу керек. 429 — уақытша қате: дәл сол шақыруды баяуырақ немесе жарамды кілтпен жасасаңыз, ол өтеді.

Кілтсіз toncenter неге ~1 сұраныс/сек береді

API-кілтсіз жария toncenter сізді шамамен секундына бір сұраныспен шектейді. Бұл баг та, сараңдық та емес — бір мезгілде мыңдаған адам пайдаланатын ортақ тегін ресурсты қорғау. Тәжірибелі әзірлеушілердің өзі сүрінетін бірер нюанс бар:

  • Ортақ пул — бұл анонимді трафик туралы. Кілтсіз болсаңыз, шамамен 1 rps-тік бірыңғай жария лимитті бүкіл әлемдегі атаусыз сұраныстардың бәрімен бөлісесіз. Қызу сағатта нақты қолжетімді жиілігіңіз одан да төмен болып шығуы мүмкін.
  • Ақылы кілт төбені көтереді — бірақ ол сұраныста шынымен жіберілген болса ғана. Классикалық тұзақ: кілт бар, ал X-API-Key хедері HTTP-клиентті рефакторинглеу кезінде жоғалып кеткен, сөйтіп сіз қайтадан жария лимитте отырасыз да, ақылы тарифтің неге «жұмыс істемейтінін» сағаттап түсінбейсіз.

Секундына бір сұраныс — браузердегі қолмен дебаг үшін немесе минутына бір рет баланс тексеретін скрипт үшін қалыпты жағдай. Кез келген автоматтандыру үшін, әсіресе агент үшін, бұл — өлердей аз.

ЖИ-агенттер 429-ды неге бәрінен жиі ұстайды: burst-паттерн

Мәселенің түйіні осында. Кәдімгі қосымша сұраныстарды азды-көпті бірқалыпты жібереді. ЖИ-агент басқаша жұмыс істейді — burst-термен (қарқынды шоғыр). Ол тиктермен жұмыс істейді: пайымдаудың бір қадамында оған контекст жинау керек, сол үшін ол ондаған шақыруды қатарынан, бір мезгілде дерлік жасайды.

Бір қадамды елестетіңіз: «қолданушы төлем келді ме, соны тексеруді сұрайды». Жауап беру үшін агент секундтың үлесінде қатарынан мыналарды шақырады:

  1. get_masterchain_info — блокчейннің ағымдағы басын білу;
  2. get_balance — әмиян балансы;
  3. get_account_state — аккаунттың статусы мен флагтары;
  4. get_transactions — соңғы транзакциялар;
  5. run_get_method — контрактінің get-әдісін оқу;
  6. get_jetton_balance — сонымен бірге USDT балансы да.

Бір тикте алты шақыру. Лимит — секундына біреу. Біріншісі өтеді, қалғандары 429 қайтарады да, агент не тұрып қалады, не толық емес деректің үстінде галлюцинация жасай бастайды. Оның үстіне бұл «қисық агент» емес — бұл автономды пайымдаудың қалыпты архитектурасы: алдымен контекст жина, содан кейін ойлан. Одан да сорақысы: қателерді ұстаған агент оларды қайталанған шақырулармен «жөндемек» болады — сөйтіп әлдеқашан таусылған квотаны қоса соққылайды. Жария лимит мұндай жүктеме профиліне мүлдем есептелмеген.

TON-ның жаһандық конфигіндегі жария лайтсерверлерде де осындай жағдай — жүктеме астында олар not ready деп жауап береді немесе ADNL-таймаут бойынша үзіледі. Бұл туралы бөлек: лайтсервер неге «not ready» дейді және не істеу керек. Ал tonapi.io-да да дәл сол 429 дерті бар — талдау мұнда.

Жылдам фикс: экспоненциалды бэкоффпен ретрайлар және Retry-After

Дәл қазір істеу керек бірінші нәрсе — қабырғаға толық жылдамдықпен соғуды доғару. Егер 429 бәрібір ұшып келсе, серверді бірден қайта соққылай бермеңіз: бұл бан мерзімін ұзарта түседі ғана. Бұл — паллиатив: ол 429 жиілігін азайтады, бірақ төбені көтермейді. Дұрыс паллиатив төрт бөліктен тұрады.

1. Джиттері бар экспоненциалды бэкофф. Әрбір келесі әрекетке дейін алдыңғысынан ұзағырақ күтіңіз, оның үстіне кездейсоқ қосымша қосыңыз — параллель воркерлер синхрондалып, бір секундқа тоғыспас үшін.

async function fetchWithBackoff(url, opts = {}, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const res = await fetch(url, opts);
    if (res.status !== 429) return res;

    // Басымдық — серверден келген Retry-After, әйтпесе джиттері бар экспонента
    const retryAfter = res.headers.get("Retry-After");
    const baseMs = retryAfter
      ? Number(retryAfter) * 1000
      : Math.min(1000 * 2 ** attempt, 16000);
    const jitter = Math.random() * 300;
    await new Promise((r) => setTimeout(r, baseMs + jitter));
  }
  throw new Error("toncenter: ретрайлардан кейін де 429 кетпеді");
}

2. Retry-After хедері келсе, онымен санасыңыз. toncenter 429-да оны әдетте жібермейді, сондықтан негізгі сенімді өз бэкофф формулаңызға артыңыз. Бірақ сервер қанша күту керегін көрсеткен болса — болжамай, дәл сонша күтіңіз (жоғарыдағы кодта мұны if (retryAfter) тармағы істейді).

3. Қатарлас сұраныстарды шектеңіз. toncenter алдына секундына ~1 сұраныстан артық шығармайтын кезек не семафор қойыңыз. Сонда агенттің burst-і уақыт бойынша созылады: сол алты шақырудан тұратын тізім тізбектей, ~6 секундта орындалады, бірақ бірде-бір 429-сыз.

4. Қайталанатын оқуларды кэштеңіз. get_masterchain_info дегенді бір қадам аясында бір рет сұрап, қайта пайдалануға болады. Жетон метадеректері (decimals, таңбасы) өзгермейді — оларды бір рет оқыңыз. 300 мс бұрын оқыған балансыңыздың өзгеруі екіталай.

Бұл жұмыс істейді әрі агентті сыпайы етеді, бірақ шынын мойындайық: бэкофф төбені көтермейді. Сіз әлі де 1 rps ішінде қамалып отырсыз, енді жай ғана құлаудың орнына кезекте сыпайы тұрасыз. Қолданушы миллисекунд күтуге болатын жерде секундтап күтеді. Жауап беруі жылдам болуға тиіс агент үшін бұл — аурудың өзін емес, симптомын емдеу. Жария API-лардың басқа айналма жолдары — 2026 жылға арналған toncenter баламалары жинағында.

Нағыз шешім: өз кілтіңіз және MCP арқылы TON

Мәселенің тамыры — сіз тар жария арнаны мыңдаған анонимді сұраныспен бөлісесіз. 429-ды шынымен жоюдың жалғыз жолы — ортақ квотаның орнына өзіңіздің кепілді өткізу қабілетіңізді алу. Сонда агенттің алты шақырудан тұратын burst-і толығымен өтеді, бесіншісінде қабырғаға тірелмейді, әрі агент контексті толық жылдамдықпен жинай алады. Бэкоффпен ретрайлар желі ақаулықтарынан сақтандыру ретінде сақталады, бірақ аман қалудың негізгі механизмі болудан қалады.

Оның үстіне HTTP-статустармен әуре болуды мүлдем жоятын жол бар. Егер TON-дағы деректер дәл ЖИ-агентке керек болса, оларды парсинг жасап, 429-ды өңдеу қажет шикі REST-жауаппен емес, MCP арқылы дайын құралдар түрінде берген әлдеқайда қисынды.

MCP (Model Context Protocol) — бұл ЖИ-агенттер (Claude, Cursor, ChatGPT/Codex, кез келген MCP-клиент) сыртқы құралдарды шақыратын стандарт. Агентті toncenter-ге HTTP-сұранысты дұрыс құрастыруға, 429-ды ұстауға, Retry-After оқуға және JSON парсуға үйретудің орнына, сіз оған типтелген құралдар бересіз, ал желімен байланысты барлық қара жұмысты сервер өз мойнына алады.

TONNode — TON үшін hosted MCP-сервер, дәл 16 құрал. Агент әдетте toncenter лимитін тесіп өтетін сол алты оқу мұнда дайын шақырулар түрінде:

  • get_masterchain_info — мастерчейн басы;
  • get_balance — GRAM балансы;
  • get_account_state — статус, флагтар, соңғы транзакция;
  • get_transactions — транзакциялар тарихы;
  • run_get_method — контрактінің кез келген read-only get-әдісі;
  • get_jetton_balance — жетон немесе USDT балансы (жетон-әмиян мекенжайы он-чейн есептеледі).

(Айтпақшы, GRAM — бұл 2026 жылдың маусымында атауы өзгертілген Toncoin. Желі бұрынғысынша TON деп аталады, тек монетаның аты ғана өзгерді.)

Ішкі жағынан @tonnode/mcp пакеті TON-ның нативті протоколымен жұмыс істейді — ADNL, HTTP-қабаттарсыз. Яғни сіз жай ғана бір REST-эндпоинтті екіншісіне ауыстырып отырған жоқсыз: агент желімен тікелей сөйлеседі, ал сіз лимиттердің HTTP-семантикасын қолмен тарқатуды доғарасыз. Пакет open source (MIT), npm мен GitHub-та жатыр (tonnode/mcp).

Тәжірибедегі айырмашылық: агентке енді 429 деген не, Retry-After немесе ADNL-таймаут деген не — соны білудің қажеті жоқ. Ол «осы мекенжайдың балансы мен соңғы транзакцияларын бер» дейді де, құрылымдалған жауап алады. Сол алты шақырулық burst ортақ жария лимитке емес, сіздің кілтіңіз бойынша өткізу қабілеті бар серверге кетеді.

Қалай қосу керек және неден тегін бастаған жөн

Екі жол бар, әрі мүлдем тіркелмей-ақ бастауға болады.

Тегін әрі локалды

Жария конфиг арқылы оқу құралдарының толық жинағы — MCP-клиентіңіздің баптауларына мынаны қосыңыз:

{
  "mcpServers": {
    "ton": {
      "command": "npx",
      "args": ["-y", "@tonnode/mcp"]
    }
  }
}

Ешқандай кілт керек емес, npx пакетті өзі тартып алады. Агенттің TON-ды бірде-бір 429-сыз оқитынына көз жеткізіп, сынап көру үшін осы жеткілікті. Толық талдау — TON үшін MCP-ді тегін қосу нұсқаулығында.

Өз кілтіңізбен hosted-эндпоинт

Нақты жүктемеге кепілді өткізу қабілеті керек болғанда, өз кілтіңізбен hosted-эндпоинт қосасыз:

{
  "mcpServers": {
    "ton": {
      "type": "http",
      "url": "https://mcp.tonnode.io/mcp",
      "headers": { "Authorization": "Bearer tn_live_…" }
    }
  }
}

Әрі қарай агентпен адам тілінде сөйлесе бересіз — қажет құралды ол өзі таңдайды:

«EQC… мекенжайын тексер: балансты get_balance арқылы, аккаунт статусын get_account_state арқылы және соңғы 10 транзакцияны get_transactions арқылы ал. Содан кейін get_jetton_balance арқылы USDT балансын қара.»

Агент қажет құралдарды қажет ретпен шақырады — rate limit-ке көзсіз соғылмайды.

Тарифтер

Барлық тарифте 16 құралдың бәрі қолжетімді — сіз тек өткізу қабілеті үшін төлейсіз:

Тариф Бағасы Өткізу қабілеті
Hobby мәңгілікке тегін 60 сұраныс/мин
Pro $29/ай 300 сұраныс/мин
Scale $199/ай 1200 сұраныс/мин

Тіпті 60 сұраныс/мин беретін тегін Hobby-дің өзі ~1 rps-тік жария toncenter-ден мүлдем басқа режим: минутына сол ~60 сұраныс, бірақ енді олар анонимдер тобымен ортақ емес, кепілді түрде сіздікі. Агенттің ондаған шақырулық burst-і толығымен, бірде-бір 429-сыз өтеді. Hobby кілті кіргеннен кейін бірден, картасыз беріледі.

Ақылы тарифтерді TON желісіндегі GRAM немесе USDT-мен TonConnect арқылы, не болмаса Telegram-дағы xRocket шоты арқылы BTC/ETH/SOL және басқаларымен төлеуге болады.

Артық үміт болмас үшін бірер адал ескертпе: TONNode қазір оқу және транзакция құрастыру міндеттерін жабады, бірақ дайын өнім ретінде pay-per-request, REST-API v2, вебхуктар, SSE-стримдер немесе аптайм пайызы жазылған SLA ұсынбайды. Терең тарихы бар архивтік нода әлі синхрондалуда — бұл роадмап тармағы, бүгінгі кепілдік емес. Жоғарыда сипатталғанның бәрі қазірдің өзінде жұмыс істейді.

Көшудің практикалық жоспары

  1. Тегін Hobby кілтін алыңыз (60 сұраныс/мин, картасыз): tonnode.io/dashboard?plan=hobby.
  2. Жоғарыдағы hosted-конфигті өз MCP-клиентіңізге жазыңыз.
  3. toncenter-ге қолмен жасалатын шақыруларды get_balance, get_account_state, get_transactions, run_get_method, get_jetton_balance құралдарына ауыстырыңыз.
  4. Агент жүктеме астында 60 сұраныс/мин шегіне тірелген бойда — айына $29 тұратын Pro-ға көшіңіз (300 сұраныс/мин): tonnode.io/pricing.

Қорытынды

  • toncenter-дегі 429 «Too Many Requests» — бұл сіздің кодыңыздың бұзылғаны емес, ~1 rps-тік жария лимитке тірелу. (Әрі бұл «228» емес екені анық — ондай код мүлдем жоқ.)
  • ЖИ-агенттер оны burst-паттерн салдарынан бәрінен жиі ұстайды: пайымдаудың бір тигінде ондаған шақыру.
  • Экспоненциалды бэкоффпен ретрайлар, Retry-After, семафор және кэш 429 жиілігін азайтады, бірақ төбені жылжытпайды — жылдамдық есебінен.
  • Нағыз шығар жол — кепілді өткізу қабілеті бар өз кілтіңіз. Ал деректер дәл агентке керек болса, TONNode сол TON-оқуларын MCP-құралдары түрінде береді, сөйтіп «429-ды қалай өңдеу керек» деген сұрақ кодыңыздан мүлдем жоғалады.

Тегін бастаңыз: Hobby кілтін алу — 60 сұраныс/мин, картасыз. Агентте нақты жүктеме болып, burst-тер тығыз болса — бірден айына $29 тұратын Pro, 300 сұраныс/мин.

Агентіңізге TON-ға қолжетімділік беріңіз

16 MCP-құрал: оқу, кастодиалды емес сваптар, кроссчейн және әмияндар. Тегін тариф — 60 сұрау/мин, карта керек емес.