02 β O'rnatish va birinchi chaqiruv¶
β¬ οΈ Oldingi: 01 β LLM nima va qanday ishlaydi Β· π README Β· Keyingi: 03 β Messages API chuqur β‘οΈ
Bu bobda: Endi nazariyadan amaliyotga o'tamiz. Birinchi bobda LLM "keyingi token"ni bashorat qiluvchi model ekanini ko'rdik; bu bobda esa shu modelga JavaScript'dan haqiqiy so'rov yuborib, javob olamiz. Avval kichik Node loyihasini tayyorlaymiz (
npm init, ESM yoqamiz), keyin Anthropic konsolidan API kalit olamiz va β eng muhimi β uni xavfsiz saqlashni o'rganamiz: nega kalitni hech qachon kodga yozmaslik va Git'ga yubormaslik kerakligini. So'ng@anthropic-ai/sdkpaketini o'rnatib, birinchimessages.createchaqiruvini yozamiz va har bir qatorini tushuntiramiz. Javob obyektini ochib ko'ramiz β negacontentsatr emas, balki massiv ekanini,stop_reasonvausagenima berishini. Oxirida birinchi xatolarni (401, 404, 400) o'qishni o'rganamiz va arzon eksperiment qilishni β chunki har chaqiruv haqiqiy pul turadi.
Avval β nima kerak?¶
Bu kitobning JavaScript nashri bo'lgani uchun, sizda JavaScript va Node.js asoslari bor deb hisoblaymiz: async/await, modullar (import/export), npm. Agar bular hali tanish bo'lmasa, avval Node.js kitobini ko'rib chiqing β bu yerda ularni qaytadan tushuntirmaymiz.
Texnik talab juda yengil:
- Node.js 18 yoki undan yuqori. Terminalda tekshiring:
Agar v18.0.0 yoki kattaroq raqam chiqsa β yetarli. Bu kitobda biz Node 20.6+ ning bir qulay imkoniyatidan (--env-file) foydalanamiz, shuning uchun iloji bo'lsa Node 20+ o'rnating. node -v umuman ishlamasa, nodejs.org dan LTS versiyasini o'rnating.
- npm β Node bilan birga keladi (
npm -vbilan tekshiring). Boshqa hech narsa kerak emas: AI bilan ishlash uchun maxsus "kuchli kompyuter" yoki GPU shart emas. Sizning ilovangiz shunchaki Anthropic serveriga so'rov yuboradi β og'ir hisob-kitob ularning tomonida bo'ladi.
Loyihani tayyorlash¶
Yangi papka ochib, uni Node loyihasiga aylantiramiz:
npm init -y buyrug'i loyiha papkasida package.json faylini yaratadi β bu loyihangizning "pasporti": nomi, versiyasi, bog'liqliklar (dependencies) ro'yxati shu yerda turadi. -y ("yes") esa barcha savollarga sukut bo'yicha javob beradi, vaqt tejaydi.
Endi bitta muhim qadam: loyihani ESM (ES Modules β zamonaviy import/export sintaksisi) rejimiga o'tkazamiz. Buning uchun package.json ichiga "type": "module" qatorini qo'shing:
Nega? Chunki @anthropic-ai/sdk va bu kitobdagi barcha misollar import Anthropic from "..." ko'rinishidagi ESM sintaksisidan foydalanadi. "type": "module" qo'shmasangiz, Node fayllarni eski CommonJS (require) rejimida o'qishga urinadi va import so'zida xato beradi. Bu qatorni hozir qo'shib qo'ysangiz β keyin hech bir misolda muammo bo'lmaydi.
API kalit olish¶
Claude'ga so'rov yuborish uchun sizga API kalit kerak β bu Anthropic serveriga "men kim ekanimni va kim hisob to'lashini" bildiradigan maxfiy parol. Olish tartibi:
- console.anthropic.com saytiga kiring va ro'yxatdan o'ting.
- Billing (to'lov) bo'limida hisobingizga biroz kredit qo'shing. Anthropic API har token uchun pul oladi (bu haqda quyida va batafsil 14-bobda) β bepul cheksiz emas.
- API Keys bo'limiga o'tib, Create Key tugmasini bosing. Sizga
sk-ant-...bilan boshlanadigan uzun satr beriladi.
β οΈ Kalit faqat bir marta to'liq ko'rsatiladi. Konsol oynasini yopsangiz, kalitni qaytadan ko'ra olmaysiz (faqat yangisini yaratasiz). Shuning uchun darrov nusxalab, xavfsiz joyga (quyidagi
.envfaylga) qo'ying.π‘ Sarf chegarasini belgilang. Konsolning Billing bo'limida oylik spending limit (sarf chegarasi) qo'yib qo'ying β masalan, 5$. Shunda o'rganish jarayonida xato bilan ko'p so'rov yuborib qo'ysangiz ham, hisobingiz himoyalangan bo'ladi. Boshlovchi uchun bu juda foydali tinchlik.
ENG MUHIM: kalitni xavfsiz saqlash¶
Bu bobning eng muhim qismi shu β kodga yoki diqqatga oid bir necha satrdan ham muhimroq. API kalit β bu sizning pulingiz. U o'g'irlansa, begona odam sizning hisobingizdan minglab so'rov yuborib, pulingizni sarflashi mumkin.
Eng keng tarqalgan halokatli xato β kalitni to'g'ridan-to'g'ri kod ichiga yozib qo'yish va keyin loyihani GitHub'ga yuklash:
Nega bu xavfli? GitHub'ga (yoki har qanday ochiq joyga) yuklangan zahoti, kalit butun internetga ko'rinadi. Bundan ham yomoni: maxsus botlar doimo yangi repozitoriylarni skanlab, sk-ant-... ko'rinishidagi kalitlarni qidiradi. Kalit bir necha daqiqada topiladi va ishlatib yuboriladi. Bu β afsona emas, kundalik haqiqat.
To'g'ri yo'l β kalitni koddan tashqarida, .env faylida saqlash.
Loyiha papkasida .env nomli fayl yarating (e'tibor bering β nomi nuqta bilan boshlanadi, kengaytmasi yo'q):
Endi β muhim β .gitignore faylini yaratib (yoki mavjudiga qo'shib), .env ni va node_modules ni Git e'tiboridan tashqariga chiqaramiz:
.gitignore β Git'ga "bu fayllarni kuzatma, commit qilma" deb aytadigan ro'yxat. Shu ikki qator bilan kalitingiz hech qachon repozitoriyga tushmaydi. Endi kalit faqat sizning mashinangizdagi .env faylida yashaydi, kod esa uni ish vaqtida (runtime) o'qiydi.
π Oltin qoida: kalit hech qachon kod fayliga (
.js) yozilmaydi, hech qachon Git'ga tushmaydi. Agar adashib kalitni biror joyga qo'yib yuborsangiz β konsolda darhol o'sha kalitni bekor qiling (revoke) va yangisini yarating. Bekor qilingan kalit endi ishlamaydi, demak o'g'riga foydasiz.
SDK ni o'rnatish¶
Endi Anthropic'ning rasmiy JavaScript paketini o'rnatamiz:
npm i (npm installning qisqasi) paketni internetdan yuklab, loyihangizning node_modules papkasiga qo'yadi va package.json ga bog'liqlik sifatida yozib qo'yadi. Bu paket β Claude API bilan ishlashning eng qulay yo'li: HTTP so'rovlarini, autentifikatsiyani, xatolarni β hammasini siz uchun o'zi boshqaradi. Siz shunchaki JavaScript funksiyasini chaqirasiz.
Bu kitob jonli o'rnatilgan
@anthropic-ai/sdk0.104 versiyasi bilan tekshirilgan. Sizda biroz yangiroq versiya bo'lsa ham, bu yerdagi metodlar (messages.createva boshqalar) aynan ishlaydi.
Birinchi chaqiruv¶
Mana β kutilgan lahza. Loyiha papkasida app.js faylini yarating va shuni yozing:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // ANTHROPIC_API_KEY ni env'dan avtomatik o'qiydi
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [
{ role: "user", content: "JavaScript nima ekanini bir jumlada tushuntir." },
],
});
console.log(msg.content[0].text);
Ishga tushiring β Node 20.6+ ning o'rnatilgan .env o'quvchisi bilan:
--env-file=.env β Node'ga "ishga tushishdan oldin .env faylidagi o'zgaruvchilarni o'qib ol" deydi. Shu tufayli ANTHROPIC_API_KEY muhit o'zgaruvchisi (environment variable) sifatida mavjud bo'ladi, va SDK uni avtomatik topadi.
Bir necha soniyadan keyin terminalda Claude'ning javobini ko'rasiz, masalan:
JavaScript β bu veb-sahifalarni interaktiv qiladigan, brauzerda ham serverda
ham ishlay oladigan dasturlash tili.
Tabriklaymiz β siz hozirgina JavaScript'dan birinchi AI so'rovingizni yubordingiz va javob oldingiz! Endi har bir qatorni ochib tushunaylik.
Har bir qator nima qiladi¶
import Anthropic from "@anthropic-ai/sdk";β paketdan asosiyAnthropicklassini chaqirib olamiz (ESMimport, shuning uchun"type": "module"kerak edi).const client = new Anthropic();β klient obyektini yaratamiz. Bu β API bilan gaplashadigan "telefon". Hech qanday kalit bermadik, chunki klientANTHROPIC_API_KEYmuhit o'zgaruvchisini o'zi qidirib topadi. Mana shuning uchun kalitni koddan tashqarida,.envda saqlash ham xavfsiz, ham qulay.await client.messages.create({ ... })β bu asosiy chaqiruv: Claude'ga xabar yuborib, javob so'raymiz.awaitishlatamiz, chunki bu tarmoq so'rovi β javob kelguncha vaqt ketadi. (awaittop-level'da, ya'ni funksiya ichida bo'lmasdan ishlayapti β bu ESM modulida mumkin.)
Chaqiruvdagi uchta parametrni alohida ko'ramiz:
model: "claude-opus-4-8"β qaysi modelga murojaat qilishimiz.claude-opus-4-8β eng kuchli model. Eksperiment uchun arzonroq modellar ham bor (quyida ko'ramiz).max_tokens: 1024β javobning eng ko'p uzunligi (tokenlarda). Bu ikki vazifani bajaradi: (1) juda uzun javobni cheklaydi, (2) narx tomini ushlab turadi β model bundan ko'p token chiqara olmaydi, demak xarajat ham cheklangan. Diqqat: bu parametr nomi snake_case (max_tokens),maxTokensemas β bu API'ning qoidasi.messages: [...]β suhbat xabarlari massivi. Hozir bitta xabar bor:{ role: "user", content: "..." }.role: "user"β "bu men, foydalanuvchi, gapiryapman" degani;contentβ aytayotgan matnimiz. (Rollar va ko'p bosqichli suhbat haqida 03-bobda batafsil to'xtalamiz.)
So'ng console.log(msg.content[0].text) bilan javobni chop etamiz. Ana shu qatorda eng ko'p chalkashlik bo'ladi β keling, javob obyektini chuqur ochaylik.
Javobni o'qish β content bu MASSIV¶
Yangi boshlovchilar eng ko'p qiladigan xato: msg ni satr (string) deb o'ylash va to'g'ridan-to'g'ri console.log(msg) qilish. Aslida msg β boy obyekt, undagi matn esa ichkarida, bir necha qatlam pastda turadi.
Eng muhim tushuncha: msg.content β bu massiv, satr emas. Nega massiv? Chunki Claude javobi bir nechta "blok"dan iborat bo'lishi mumkin β matn bloki, vosita chaqiruvi bloki (keyingi boblarda) va hokazo. Hozir bizda bitta matn bloki bor, u massivning birinchi elementi:
Shuning uchun matnga yetib borish uchun: msg.content[0].text β "birinchi blok, uning text maydoni". Bu ishladi, lekin professional usul β blok turini tekshirib, barcha matn bloklarini yig'ish:
Bu yondashuv kelajakda javob bir nechta blokli bo'lganda ham, matn bo'lmagan blok aralashganda ham (block.type === "tool_use" kabi) buzilmaydi. block.type === "text" tekshiruvi β "bu blok haqiqatan matnmi?" degan savol.
Obyektda yana ikki foydali maydon bor:
console.log(msg.stop_reason); // "end_turn"
console.log(msg.usage); // { input_tokens: 14, output_tokens: 31, ... }
msg.stop_reasonβ model nega to'xtaganini aytadi."end_turn"β Claude o'z javobini tabiiy ravishda yakunladi (eng yaxshi holat)."max_tokens"β javobmax_tokenschegarasiga yetib, o'rtada kesilib qoldi degani; bundamax_tokensni oshirish kerak bo'lishi mumkin.msg.usageβ nechta token sarflanganini ko'rsatadi:input_tokens(siz yuborgan matn) vaoutput_tokens(Claude qaytargan matn). Mana shu β sizning narxingiz. Har bir chaqiruvdan keyin shu raqamlarga qarab, qancha sarflayotganingizni his qilib borasiz. Tokenlar va narx haqida to'liq hisob-kitobni 14-bobda ko'ramiz.
Birinchi xatolar va ularni o'qish¶
Birinchi chaqiruvda xato chiqsa β xavotir olmang, bu odatiy. SDK xatolarni HTTP status kod bilan beradi; eng ko'p uchraydigan uchtasini tanib oling:
- 401 (Authentication /
AuthenticationError) β kalit noto'g'ri yoki umuman topilmadi. Sabablari:.envfayl noto'g'ri joyda yoki nomi xato;--env-file=.envni unutgansiz; kalitda ortiqcha bo'shliq/tirnoq bor; yoki kalit bekor qilingan. Tekshiruv:console.log(process.env.ANTHROPIC_API_KEY)qatorini vaqtincha qo'shib, kalit haqiqatan yuklanganini ko'ring (keyin bu qatorni o'chiring β kalitni terminalga chiqarish ham yaxshi odat emas). - 404 (
NotFoundError) β odatda model nomida xato.claude-opus-4-8ni xato yozgansiz (masalanclaude-opus-4.8yokiclaude-opus-4-08). Imloni diqqat bilan solishtiring. - 400 (
BadRequestError) β so'rov noto'g'ri tuzilgan. Masalan,max_tokensni umuman bermagansiz (u majburiy), yokimessagesmassivi bo'sh, yoki maydon nominicamelCaseqilib yozgansiz (maxTokens).
Xato xabarini to'liq o'qing β SDK odatda muammoni aniq aytadi (masalan, "max_tokens: Field required"). Xatoni dasturda chiroyli tutish uchun try/catch ishlatamiz (xatolarni, retry va timeout'ni keyingi qismlarda chuqur ko'ramiz); hozircha shuni biling: xato β dushman emas, yo'l ko'rsatkichi.
Ikkinchi misol β o'zgartirib ko'ring¶
Eng yaxshi o'rganish β o'ynab ko'rish. app.js ni biroz o'zgartiramiz: boshqa so'rov va kichikroq max_tokens:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 60, // ataylab kichik β javob qisqaroq bo'ladi yoki kesilishi mumkin
messages: [
{ role: "user", content: "Node.js'da fayl o'qishni 3 ta qadamda ayt." },
],
});
console.log(msg.content[0].text);
console.log("---");
console.log("To'xtash sababi:", msg.stop_reason);
console.log("Tokenlar:", msg.usage.input_tokens, "kirish /", msg.usage.output_tokens, "chiqish");
max_tokens: 60 ni qo'yganimiz uchun javob qisqa bo'ladi, hatto stop_reason "max_tokens" chiqib, o'rtada kesilishi mumkin. max_tokens ni 1024 ga oshirib, qaytadan ishga tushiring β farqni o'z ko'zingiz bilan ko'rasiz. So'rov matnini ham erkin o'zgartiring: undan she'r so'rang, kod yozdiring, savol bering.
π‘ Arzon eksperiment qiling. O'rganish bosqichida har bir mayda o'zgarishni Opus bilan sinash shart emas β bu nisbatan qimmat model. Tezkor, arzon sinov uchun modelni vaqtincha
claude-haiku-4-5ga almashtiring:model: "claude-haiku-4-5". Haiku tezroq va sezilarli arzonroq; sintaksis va oqim to'g'riligini tekshirish uchun ideal. Mantiq ishlaganiga ishonch hosil qilgach, kerak bo'lsa Opus'ga qaytasiz. (Model tanlash va narxlarni 14-bobda solishtiramiz.)
Ishchi sikl (dev loop)¶
Endi sizda AI bilan ishlashning asosiy takrorlanuvchi sikli bor β uni butun kitob davomida ishlatasiz:
- Tahrirlash β
app.jsda so'rov, model yoki parametrlarni o'zgartirasiz. - Ishga tushirish β
node --env-file=.env app.js. - O'qish β javobni,
stop_reasonni vausageni ko'rasiz. - Takrorlash β natijaga qarab so'rovni yaxshilaysiz va yana ishga tushirasiz.
Aynan shu "tahrirla β ishga tushir β o'qi β yaxshilash" aylanasi β AI integratsiyasini o'rganishning yuragi. Ko'proq aylantirsangiz β model bilan qanday "gaplashishni" shunchalik yaxshi his qilasiz.
Xulosa¶
- Talab yengil: Node 18+ (afzal 20.6+,
--env-fileuchun), npm. Maxsus apparat shart emas β og'ir ish Anthropic serverida bo'ladi. - Loyiha:
npm init -y, so'ngpackage.jsonga"type": "module"(ESM uchun), keyinnpm i @anthropic-ai/sdk. - API kalit console.anthropic.com dan olinadi, sarf chegarasi qo'yiladi. Kalit faqat bir marta to'liq ko'rsatiladi.
- Xavfsizlik (eng muhim): kalit
.envda saqlanadi,.envvanode_modules/.gitignorega qo'shiladi. Kalit hech qachon kodga yozilmaydi yoki Git'ga tushmaydi. Sizib chiqsa β darhol bekor qiling. - Birinchi chaqiruv:
new Anthropic()(kalitni env'dan o'qiydi) βawait client.messages.create({ model, max_tokens, messages }). Ishga tushirish:node --env-file=.env app.js. - Javob β obyekt, satr emas:
msg.contentbu massiv; matnmsg.content[0].textda yoki bloklar bo'ylabblock.type === "text"ni tekshirib olinadi. Yanamsg.stop_reason("end_turn"/"max_tokens") vamsg.usage(token soni = narx). - Xatolar: 401 = kalit, 404 = model nomi, 400 = noto'g'ri so'rov. Xato xabarini to'liq o'qing.
- Arzon sinang: o'rganishda
claude-haiku-4-5bilan tajriba qiling, sikl β tahrirla β ishga tushir β o'qi β yaxshilash.
Keyingi bobda Messages APIni chuqurroq ochamiz: user va assistant rollari, system prompt, ko'p bosqichli suhbat (va nega API "holatsiz" β oldingi xabarlarni o'zi eslamaydi), stop_reason va content bloklarining to'liq manzarasi.
Mashqlar¶
Oson¶
- O'z so'zlaringiz bilan tushuntiring: nega API kalitni
.envfaylida saqlash, kod ichiga yozishdan ko'ra xavfsizroq? Kalit GitHub'ga tushib qolsa nima bo'ladi? - Yangi loyiha yarating va uni ESM rejimiga o'tkazing. Qaysi faylga nima qo'shasiz? Nega bu qadam
@anthropic-ai/sdkuchun zarur? msg.contenthaqida quyidagi gaplardan qaysilari to'g'ri: (a) bu satr (string), (b) bu massiv, (c) birinchi matnmsg.content[0].textda, (d)msg.textto'g'ridan-to'g'ri matnni beradi. To'g'rilarini tanlang.node --env-file=.env app.jsbuyrug'idagi--env-file=.envqismi nima vazifani bajaradi? Uni tushirib qoldirsangiz, qaysi xato (status kod) chiqishi ehtimoli yuqori?- Quyidagi xato kodlarini sabablari bilan moslang:
401,404,400β "model nomida xato", "kalit yo'q/noto'g'ri", "so'rov noto'g'ri tuzilgan (masalanmax_tokensyo'q)".
O'rta¶
- Birinchi chaqiruv kodini yozing va ishga tushiring. So'rov sifatida o'zingizning savolingizni bering. Javobni,
msg.stop_reasonni vamsg.usageni konsolga chiqaring. - Kodingizni shunday o'zgartiring:
msg.content[0].texto'rniga bloklar bo'ylabforbilan yurib, faqatblock.type === "text"bo'lganlarini chop etsin. Nega bu usul ishonchliroq? max_tokensni30ga tushirib, uzun javob talab qiladigan so'rov bering (masalan "Node.js tarixini batafsil yoz").msg.stop_reasonqanday qiymat oladi va bu nimani anglatadi? Keyin uni1024ga oshirib, farqni tasvirlang.
Qiyin¶
- Kichik "savol-javob" skripti yozing: u so'rov matnini
process.argv(buyruq qatori argumenti) dan olsin, masalannode --env-file=.env soroq.js "Promise nima?". Javobni va sarflangan jami tokenlar sonini (input_tokens + output_tokens) chiqarsin. Argument berilmasa, foydalanish yo'riqnomasini ko'rsatsin. - Chaqiruvni
try/catchga o'rab, xato yuz berganda dastur yiqilmasin, balki tushunarli xabar chiqarsin (masalan, status kodni va qisqa tavsifni). Maslahat: SDK xatosidaerr.status(HTTP kod) bo'ladi. So'ng kalitni ataylab xato qilib, 401 ni tutib ko'ring.
Yechim β 1
Kalitni .env da saqlash xavfsizroq, chunki .env faylini .gitignore orqali Git e'tiboridan chiqaramiz β demak u repozitoriyga hech qachon tushmaydi va ochiq joyga (GitHub) chiqib ketmaydi. Kalit faqat sizning mashinangizda qoladi, kod esa uni ish vaqtida muhit o'zgaruvchisidan o'qiydi.
Kalitni kod ichiga yozsangiz, u kod bilan birga commit bo'lib, GitHub'ga chiqadi. Kalit GitHub'ga (yoki har qanday ochiq joyga) tushsa β butun internetga ko'rinadi. Maxsus botlar repozitoriylarni doimo skanlab, sk-ant-... kalitlarini bir necha daqiqada topadi va ishlatib yuboradi β hisobingizdan begona pul sarflanadi. Kalit sizib chiqqanini bilsangiz, uni darhol konsolda bekor qilib (revoke), yangisini yaratish kerak.
Yechim β 2
So'ng package.json faylini ochib, "type": "module" qatorini qo'shaman:
Bu qadam zarur, chunki @anthropic-ai/sdk va kitobdagi barcha misollar ESM sintaksisidan (import Anthropic from "...") foydalanadi. "type": "module" bo'lmasa, Node faylni eski CommonJS rejimida o'qishga urinadi va import so'zida xato beradi.
Yechim β 3
To'g'rilari: (b) va (c).
- (a) noto'g'ri β
msg.contentsatr emas, massiv (bloklar ro'yxati). - (b) to'g'ri β bu massiv, chunki javob bir nechta blokli (matn, vosita chaqiruvi va h.k.) bo'lishi mumkin.
- (c) to'g'ri β bitta matn blokli javobda matn
msg.content[0].textda turadi. - (d) noto'g'ri β
msg.textdegan maydon yo'q; matngacontentmassivi orqali yetib borasiz.
Ishonchliroq usul β bloklar bo'ylab yurib, block.type === "text" ni tekshirish.
Yechim β 4
--env-file=.env β Node'ga (20.6-versiyadan boshlab) "dasturni ishga tushirishdan oldin .env faylidagi o'zgaruvchilarni o'qib, muhit o'zgaruvchilariga yuklab qo'y" deydi. Shu tufayli process.env.ANTHROPIC_API_KEY mavjud bo'ladi va new Anthropic() uni avtomatik topadi.
Bu qismni tushirib qoldirsangiz, ANTHROPIC_API_KEY yuklanmaydi, SDK kalit topa olmaydi va ehtimol 401 (Authentication) xatosi chiqadi. (Eski Node versiyalarida --env-file qo'llab-quvvatlanmaydi β u holda npm i dotenv o'rnatib, kodning eng boshiga import "dotenv/config"; qo'shiladi.)
Yechim β 5
- 401 β "kalit yo'q/noto'g'ri" β autentifikatsiya muvaffaqiyatsiz. Kalit yuklanmagan, xato yozilgan yoki bekor qilingan.
- 404 β "model nomida xato" β so'ralgan resurs topilmadi; odatda
modelqiymati noto'g'ri yozilgan (claude-opus-4-8ni tekshiring). - 400 β "so'rov noto'g'ri tuzilgan" β masalan, majburiy
max_tokensberilmagan,messagesbo'sh, yoki maydon nomicamelCase(maxTokens) yozilgan.
Yechim β 6
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [
{ role: "user", content: "Node.js va brauzer JavaScript'i o'rtasidagi asosiy farq nima?" },
],
});
console.log("Javob:", msg.content[0].text);
console.log("To'xtash sababi:", msg.stop_reason);
console.log("Token sarfi:", msg.usage);
Javob: Node.js β brauzerdan tashqarida (server/terminal) ishlaydi va ...
To'xtash sababi: end_turn
Token sarfi: { input_tokens: 20, output_tokens: 88, ... }
stop_reason: "end_turn" β Claude javobini tabiiy yakunladi. usage esa bu chaqiruv qancha tokenga tushganini ko'rsatadi.
Yechim β 7
Bu usul ishonchliroq, chunki msg.content β massiv, va u kelajakda bir nechta blokli bo'lishi mumkin: matn bloklari, vosita chaqiruvi (tool_use) bloklari va boshqalar. msg.content[0].text faqat birinchi element matn bo'lganda ishlaydi; agar birinchi blok matn bo'lmasa (masalan vosita chaqiruvi), content[0].text undefined bo'lib qoladi. Bloklar bo'ylab yurib, block.type === "text" ni tekshirsangiz β faqat haqiqiy matn bloklarini olasiz va kod hech qachon adashmaydi.
Yechim β 8
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 30,
messages: [{ role: "user", content: "Node.js tarixini batafsil yoz." }],
});
console.log(msg.content[0].text);
console.log("Sabab:", msg.stop_reason);
max_tokens: 30 bo'lgani uchun javob 30 token chiqarilgach majburan to'xtaydi, va msg.stop_reason qiymati "max_tokens" bo'ladi. Bu β "javob tugamadi, men chegaraga yetib kesib qo'ydim" degani; matn jumla o'rtasida uzilib qolishi mumkin.
max_tokens ni 1024 ga oshirsangiz, model fikrini to'liq aytishga ulguradi va stop_reason odatda "end_turn" ga aylanadi β javob tabiiy yakunlangan. Demak max_tokens β javob uzunligi (va narx) tomi; uni mavzuga yetarli darajada qo'yish kerak.
Yechim β 9
// soroq.js
import Anthropic from "@anthropic-ai/sdk";
const soroq = process.argv.slice(2).join(" ");
if (!soroq) {
console.log('Foydalanish: node --env-file=.env soroq.js "savolingiz"');
process.exit(1);
}
const client = new Anthropic();
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [{ role: "user", content: soroq }],
});
console.log(msg.content[0].text);
const jami = msg.usage.input_tokens + msg.usage.output_tokens;
console.log(`\n[Jami ${jami} token: ${msg.usage.input_tokens} kirish + ${msg.usage.output_tokens} chiqish]`);
node --env-file=.env soroq.js "Promise nima?"
# Promise β JavaScript'da kelajakda bajariladigan ...
# [Jami 95 token: 12 kirish + 83 chiqish]
node --env-file=.env soroq.js
# Foydalanish: node --env-file=.env soroq.js "savolingiz"
process.argv.slice(2) bilan buyruq qatori argumentlarini olamiz (slice(2) β Node va skript yo'lini kesib tashlaydi), join(" ") bilan bitta matnga birlashtiramiz. Argument bo'sh bo'lsa, yo'riqnoma ko'rsatib process.exit(1) bilan chiqamiz. Jami tokenni input_tokens + output_tokens dan hisoblaymiz β bu chaqiruv narxiga to'g'ridan-to'g'ri bog'liq.
Yechim β 10
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
try {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [{ role: "user", content: "Salom!" }],
});
console.log(msg.content[0].text);
} catch (err) {
if (err.status === 401) {
console.error("Xato 401: kalit noto'g'ri yoki topilmadi. .env va --env-file ni tekshiring.");
} else if (err.status === 404) {
console.error("Xato 404: model nomi noto'g'ri bo'lishi mumkin.");
} else if (err.status === 400) {
console.error("Xato 400: so'rov noto'g'ri tuzilgan.", err.message);
} else {
console.error("Kutilmagan xato:", err.status ?? "", err.message);
}
}
try/catch xatoni tutadi β endi dastur yiqilmaydi, balki tushunarli xabar chiqaradi. SDK xatosida err.status HTTP status kodini, err.message esa tafsilotni beradi. Kalitni .env da ataylab buzib (yoki --env-file ni tushirib) ishga tushiring β Xato 401: ... xabarini ko'rasiz. Bu β ishonchli ilovaning birinchi qadami; retry, timeout va tipli xatolarni keyingi qismlarda to'liq ochamiz.
β¬ οΈ Oldingi: 01 β LLM nima va qanday ishlaydi Β· π README Β· Keyingi: 03 β Messages API chuqur β‘οΈ