10 β Adaptiv thinking va effort¶
β¬ οΈ Oldingi: 09 β Vision va hujjatlar Β· π README Β· Keyingi: 11 β Vercel AI SDK bilan tanishuv β‘οΈ
Bu bobda: shu paytgacha biz Claude'dan javobni darhol so'rab keldik. Lekin qiyin masalalarda β ko'p qadamli matematika, mantiq, rejalashtirish, murakkab kod β modelga javob berishdan oldin "o'ylash" imkonini bersangiz, aniqlik keskin oshadi. Bu extended/adaptiv thinking. Claude Opus 4.8'da bu
thinking: { type: "adaptive" }orqali yoqiladi β model qachon va qancha o'ylashni o'zi hal qiladi (eskibudget_tokensg'oyasi olib tashlangan). Keyineffortsozlagichini β modelning qancha "kuch" sarflashini (low/medium/high/xhigh/max) β o'rganamiz. Reasoning matnini qanday ko'rsatish (display: "summarized"), unithinkingbloklaridan ajratish, va streaming'dathinking_deltabilan jonli "o'ylamoqda..." indikatorini chiqarishni ko'ramiz. Eng muhimi: qachon thinking/high effort kerak, qachon yo'q β chunki bu sifat β narx sozlagichi. Yakunda adaptiv thinking + high effort bilan matematik/mantiqiy yechuvchi va low effort'li sodda tasniflagichni quramiz.Halollik eslatmasi: bobdagi API shakllari β
thinking: { type: "adaptive" },thinking: { type: "adaptive", display: "summarized" },output_config: { effort: ... }, javobdagitype === "thinking"bloklari (block.thinking) va streaming'dagithinking_deltaevent β@anthropic-ai/sdkv0.104 va Claude Opus 4.8 ga asoslangan. Eng muhim ogohlantirish: Opus 4.8'dathinking: { type: "enabled", budget_tokens: N }olib tashlangan β uni yuborsangiz 400 xato olasiz. Shuningdektemperature/top_p/top_kham olib tashlangan (400). Bular o'ylab topilgani emas β Opus 4.8 ning haqiqiy talabi.
1. Nega thinking? β qoralama qog'oz analogiyasi¶
Tasavvur qiling, talabaga qiyin matematik masala berildi: "Bir poyezd 3 soatda 240 km, ikkinchisi 2 soatda 180 km yurdi. Qaysi tezroq va necha foizga?"
Bir talaba birinchi xayolga kelgan javobni boltirib yuboradi: "Birinchisi tezroq, chunki ko'proq yurgan." Bu xato β u masofani tezlik bilan aralashtirdi.
Ikkinchi talaba esa avval qoralama qog'ozda ishlaydi: 240/3 = 80 km/soat, 180/2 = 90 km/soat, demak ikkinchisi tezroq, (90β80)/80 = 12.5%. To'g'ri javob.
Model ham xuddi shunday. Standart holatda u "birinchi talaba" kabi β savolni o'qib, darhol javob hosil qila boshlaydi. Oson savollarda bu yetarli. Lekin qiyin, ko'p qadamli masalalarda (matematika, mantiqiy zanjir, rejalashtirish, murakkab kod) bu adashishga olib keladi.
Extended thinking (uzaytirilgan o'ylash) β modelga javobdan oldin ichki ravishda "o'ylash" imkonini berish. Model o'ziga qoralama qog'oz ochib, masalani qadam-baqadam ishlaydi, keyingina yakuniy javobni yozadi. Bu reasoning (mulohaza) bosqichi javobning bir qismi sifatida saqlanadi.
Thinking nimaga yordam beradi:
- Matematika va hisob β ko'p bosqichli arifmetika, foiz, formula.
- Mantiq va xulosa β "agar A bo'lsa, B; B bo'lsa, C; demak..." kabi zanjirlar.
- Rejalashtirish β vazifani bo'laklarga bo'lib, tartibni o'ylash.
- Murakkab kod β algoritm, chekka holatlar (edge case), xatolarni oldindan ko'rish.
Tarixiy eslatma. Eski modellarda (masalan Sonnet 4.5) o'ylashni
budget_tokens(o'ylash uchun aniq token "byudjeti") bilan boshqarardingiz. Zamonaviy Claude'da bu g'oya adaptiv thinking bilan almashtirilgan β model byudjetni o'zi hal qiladi. Opus 4.8'dabudget_tokensbutunlay olib tashlangan, uni yuborish 400 xato beradi.
2. Adaptiv thinking β thinking: { type: "adaptive" }¶
Claude Opus 4.8'da thinking'ni yoqish bitta qator: thinking: { type: "adaptive" }. Adaptiv degani β model qachon o'ylash kerakligini va qancha o'ylashni har bir so'rov uchun o'zi qaror qiladi. Oson savolda u deyarli o'ylamaydi (token tejaydi), qiyin masalada esa chuqurroq o'ylaydi. Sizdan hech qanday "byudjet" sozlash talab qilinmaydi.
Avval β thinkingsiz (standart) qiyin masala:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // ANTHROPIC_API_KEY .env dan (02-bob)
// thinking yo'q β model darhol javob beradi
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [
{
role: "user",
content:
"Bir poyezd 3 soatda 240 km, ikkinchisi 2 soatda 180 km yurdi. " +
"Qaysi tezroq va necha foizga?",
},
],
});
console.log(msg.content[0].text);
Endi xuddi shu so'rov, lekin adaptiv thinking bilan:
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive" }, // β¬
οΈ model javobdan oldin "o'ylaydi"
messages: [
{
role: "user",
content:
"Bir poyezd 3 soatda 240 km, ikkinchisi 2 soatda 180 km yurdi. " +
"Qaysi tezroq va necha foizga?",
},
],
});
// Javob bloklari: avval (ehtimol) thinking, keyin text
for (const block of msg.content) {
if (block.type === "text") console.log(block.text);
}
Farqni bevosita ko'rasiz: thinking bilan model avval 240/3 va 180/2 ni hisoblab, keyin solishtiradi β natija ishonchli. Thinkingsiz esa qiyin masalada u shoshib adashishi mumkin.
Diqqat β
budget_tokensishlatmang. Eng ko'p uchraydigan xato (eski kod yoki eski model odatidan):thinking: { type: "enabled", budget_tokens: 8000 }. Opus 4.8'da bu 400 xato beradi βbudget_tokensbutunlay olib tashlangan. Doimothinking: { type: "adaptive" }ishlating. Xuddi shunday,temperature,top_p,top_kham olib tashlangan (400). Modelni boshqarish uchun prompt vaeffortishlating, sampling parametrlari emas.Eslatma β thinking maydonni qo'shmaslik. Agar
thinkingmaydonini umuman bermasangiz, model o'ylamasdan ishlaydi (standart). Ya'ni thinking o'z-o'zidan yoqilmaydi β uni aniq{ type: "adaptive" }deb yozishingiz kerak.
3. Effort β modelning "kuch" sozlagichi¶
thinking o'ylashni yoqadi; effort esa modelning qancha kuch sarflashini β o'ylash chuqurligini va umumiy token sarfini β boshqaradi. U output_config ichida turadi (yuqori darajada emas):
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive" },
output_config: { effort: "high" }, // low | medium | high | xhigh | max
messages: [{ role: "user", content: "Murakkab masalani qadam-baqadam yech..." }],
});
effort ni radio sozlagich (dial) deb tasavvur qiling β chapdan o'ngga surgan sari model aqlliroq ishlaydi, lekin ko'proq token, pul va vaqt sarflaydi.
Bosqichlarni qachon ishlatish:
effort |
Qachon | Izoh |
|---|---|---|
low |
Oddiy, tez, arzon vazifalar | Tasnif (classification), oddiy qidiruv, sodda javob. Eng kam token. |
medium |
Muvozanat kerak bo'lganda | Sifat va narx o'rtasidagi oltin o'rtalik. |
high |
Standart β intellekt muhim ishlar | Bermasangiz ham shu ishlaydi (default). Ko'p holatlarda to'g'ri tanlov. |
xhigh |
Kod va agentik (ko'p qadamli) ishlar | Aynan shu turdagi ishlar uchun eng yaxshi. |
max |
Eng qiyin masalalar β narx muhim emas | To'g'rilik hamma narsadan ustun bo'lganda. |
Eng muhimi: yuqori effort = aqlliroq, lekin ko'proq token = ko'proq pul + kechikish. Bu to'g'ridan-to'g'ri narxga bog'liq β biz buni 14 β Token, narx va limitlar bobida batafsil ko'ramiz. Hozircha: effort ni vazifaning qiymatiga moslang. Arzon, oddiy vazifaga max qo'yish β bekorga pul; qiyin masalaga low qo'yish β sifat tushadi.
Eslatma β
highstandart.effortni umuman bermasangiz, uhighbo'ladi. Ya'nioutput_config: { effort: "high" }va uni butunlay tashlab ketish β bir xil. Token tejamoqchi bo'lsangiz, ataylablowyokimediumqo'ying.
4. Reasoning'ni ko'rish β display: "summarized"¶
Model o'ylaganda, uning mulohazasi javobda alohida thinking bloki sifatida keladi. Lekin diqqat: Opus 4.8'da bu bloklarning matni standart bo'yicha YASHIRIN (omitted). Ya'ni thinking bloki keladi, lekin block.thinking bo'sh bo'ladi.
Agar siz reasoning'ni foydalanuvchiga ko'rsatmoqchi bo'lsangiz (masalan, "Claude o'ylamoqda..." panelida modelning mulohazasini chiqarish), thinking ga display: "summarized" qo'shasiz:
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive", display: "summarized" }, // β¬
οΈ reasoning matnini KO'RSAT
output_config: { effort: "high" },
messages: [{ role: "user", content: "Ushbu mantiqiy masalani yech: ..." }],
});
// Bloklarni ajratamiz: thinking (reasoning) vs text (yakuniy javob)
for (const block of msg.content) {
if (block.type === "thinking") {
console.log("π§ Mulohaza:", block.thinking); // summarized matn shu yerda
} else if (block.type === "text") {
console.log("β
Javob:", block.text);
}
}
E'tibor bering β response.content bloklar massivi, xuddi 09-bobdagi rasm bloklari kabi. Endi bu massivda thinking va text bloklari aralash bo'lishi mumkin. Siz block.type ni tekshirib, ikkalasini ajratasiz: thinking β modelning "qoralama qog'ozi", text β yakuniy javob.
display ning ikki qiymati bor:
"omitted"(standart) β thinking bloki keladi, lekin matni bo'sh. Foydalanuvchiga reasoning'ni ko'rsatmasangiz, shu yetarli (token kamroq)."summarized"β reasoning'ning qisqartirilgan (xulosalangan) matniblock.thinkingda keladi. "O'ylamoqda..." UI uchun aynan shu kerak.
Eslatma β maydon nomi o'zgarmagan. Reasoning matni doim
block.thinkingda (type === "thinking"blokida).display: "summarized"β bu so'rov parametri, javobni o'qish usuli emas. Agardisplaybermasangiz,block.thinkingbo'sh chiqadi β bu xato emas, shunchaki standart.
5. Streaming'da thinking β jonli "o'ylamoqda..." indikatori¶
04-bobda biz streaming'ni ko'rdik: matn bo'laklari text_delta event sifatida oqib keladi. Thinking yoqilganda, reasoning bo'laklari ham oqadi β lekin alohida thinking_delta event sifatida. Bu bilan siz foydalanuvchiga avval jonli "o'ylamoqda..." indikatorini, keyin yakuniy javobni ko'rsatishingiz mumkin.
const stream = client.messages.stream({
model: "claude-opus-4-8",
max_tokens: 2048,
thinking: { type: "adaptive", display: "summarized" },
output_config: { effort: "high" },
messages: [{ role: "user", content: "Bu algoritmni qadam-baqadam tushuntir: ..." }],
});
for await (const event of stream) {
// Yangi blok ochilganda β bu thinking'mi yoki text'mi?
if (event.type === "content_block_start") {
if (event.content_block.type === "thinking") {
process.stdout.write("\nπ§ [o'ylamoqda] ");
} else if (event.content_block.type === "text") {
process.stdout.write("\n\nβ
[javob] ");
}
}
// Bo'laklar β thinking_delta yoki text_delta
if (event.type === "content_block_delta") {
if (event.delta.type === "thinking_delta") {
process.stdout.write(event.delta.thinking); // reasoning oqimi
} else if (event.delta.type === "text_delta") {
process.stdout.write(event.delta.text); // javob oqimi
}
}
}
const final = await stream.finalMessage();
console.log("\n\nChiqish tokenlari:", final.usage.output_tokens);
Bu yerda content_block_start event blok turini (thinking yoki text) bildiradi, so'ng deltalar oqadi: thinking_delta ichida event.delta.thinking, text_delta ichida event.delta.text. Shunday qilib UI'da avval reasoning, keyin javob jonli ko'rinadi β xuddi ChatGPT'dagi "Thinking..." paneli kabi.
Eslatma β
.on("text")faqat matnni beradi. Agar 04-bobdagi sodda.on("text", delta => ...)ishlatsangiz, SDK siz uchun faqattextdeltalarini ajratib beradi β thinking aralashmaydi. Demak oddiy chat uchun.on("text")baribir xavfsiz. Reasoning'ni alohida ko'rsatmoqchi bo'lsangizginafor awaitbilanthinking_deltani qo'lda ushlaysiz.
6. Qachon thinking/high effort kerak β qachon yo'q¶
Thinking va yuqori effort β bepul emas. Ular qo'shimcha token sarflaydi, demak qo'shimcha pul va kechikish. Shuning uchun ularni har doim emas, kerakli joyda ishlating.
Thinking / high effort YOQING (reasoning-og'ir vazifalar):
- Ko'p qadamli matematika va mantiq.
- Murakkab kod yozish yoki debug qilish.
- Rejalashtirish, ko'p bosqichli tahlil.
- Chekka holatlar muhim bo'lgan vazifalar.
Thinking O'CHIRING yoki low effort (sodda vazifalar):
- Tasnif: "bu ijobiy fikrmi yoki salbiy?"
- Oddiy ma'lumot izlash: "bu matnda telefon raqami bormi?"
- Sodda formatlash, qisqa javob.
- Yuqori hajmli, tez kerak bo'lgan ishlar.
Sodda vazifada thinking yoqish β bekorga token (= pul) va kechikish. Qiyin vazifada thinking'ni o'chirish β sifat tushadi. Bu sof sifat β narx sozlagichi.
Narx haqiqati. Thinking tokenlari chiqish (output) tokeni sifatida hisoblanadi β ya'ni ko'proq o'ylash = ko'proq pul. Opus 4.8 da chiqish tokeni 1M uchun $25 (kirish $5). Shuning uchun
effortni vazifaning qiymatiga moslang: arzon, ommaviy vazifalar (tasnif, teglar)low'da; qimmat, muhim vazifalar (kod, tahlil, hisobot)high/xhigh'da. Batafsil β 14 β Token, narx va limitlar.
7. Amaliyot β yechuvchi vs tasniflagich¶
Endi hammasini birlashtirib, ikkita funksiya quramiz: biri matematik/mantiqiy yechuvchi (adaptiv thinking + high effort, ixtiyoriy reasoning ko'rsatish), ikkinchisi sodda tasniflagich (low effort, thinking yo'q). Ular orasidagi farq β bu kitobning butun "sifat β narx" g'oyasini amalda ko'rsatadi.
// solver-vs-classifier.js
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // ANTHROPIC_API_KEY .env dan
// 1) YECHUVCHI β qiyin masalalar uchun: thinking + high effort
async function yech(masala, { reasoningKorsat = false } = {}) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 2048,
thinking: reasoningKorsat
? { type: "adaptive", display: "summarized" } // reasoning'ni ko'rsatamiz
: { type: "adaptive" }, // o'ylaydi, lekin matni yashirin
output_config: { effort: "high" }, // intellekt muhim
messages: [{ role: "user", content: masala }],
});
let mulohaza = "";
let javob = "";
for (const block of msg.content) {
if (block.type === "thinking") mulohaza += block.thinking;
else if (block.type === "text") javob += block.text;
}
return { mulohaza, javob, tokenlar: msg.usage.output_tokens };
}
// 2) TASNIFLAGICH β sodda, ommaviy ish: thinking YO'Q, low effort
async function tasnifla(matn) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 16, // bir so'z yetarli
// thinking bermaymiz β model o'ylamaydi (tez, arzon)
output_config: { effort: "low" }, // eng kam kuch
messages: [
{
role: "user",
content: `Quyidagi fikrni faqat bitta so'z bilan tasnifla ` +
`(ijobiy / salbiy / neytral): "${matn}"`,
},
],
});
return msg.content[0].text.trim();
}
// --- Sinov ---
const r = await yech(
"Bir poyezd 3 soatda 240 km, ikkinchisi 2 soatda 180 km yurdi. " +
"Qaysi tezroq va necha foizga?",
{ reasoningKorsat: true },
);
console.log("π§ Mulohaza:", r.mulohaza);
console.log("β
Javob:", r.javob);
console.log("Yechuvchi tokenlari:", r.tokenlar);
console.log("\nTasnif:", await tasnifla("Mahsulot zo'r chiqdi, juda mamnunman!"));
// -> "ijobiy" β tez, arzon, thinkingsiz
Bu yerda asosiy dars: bir model, ikki rejim. Qiyin masalaga thinking + high (hatto xhigh/max) berasiz β aniqlik uchun token to'laysiz. Sodda tasnifga thinking yo'q + low berasiz β tez va arzon. Aynan shu farq β production'da pulingizni tejaydi va sifatni saqlaydi.
Maslahat β agentik/kod ishida
xhigh. Agar yechuvchi murakkab kod yozish yoki ko'p qadamli agentik vazifa bo'lsa,effortnihigho'rnigaxhighqiling β aynan shu turdagi ishlar uchun eng yaxshi sozlama.maxni esa faqat eng qiyin, narx muhim bo'lmagan holatda ishlating.
8. Tez-tez uchraydigan xatolar¶
| Xato | Sabab | Yechim |
|---|---|---|
400 xato: thinking |
thinking: { type: "enabled", budget_tokens: N } β Opus 4.8'da olib tashlangan |
thinking: { type: "adaptive" } ishlating |
400 xato: sampling |
temperature / top_p / top_k β olib tashlangan |
Ularni o'chiring; modelni prompt va effort bilan boshqaring |
block.thinking bo'sh |
display berilmagan (standart omitted) |
thinking: { type: "adaptive", display: "summarized" } |
| Thinking umuman ishlamadi | thinking maydoni berilmagan |
Aniq thinking: { type: "adaptive" } qo'shing β o'z-o'zidan yoqilmaydi |
effort yuqori darajada |
effort: "high" to'g'ridan-to'g'ri so'rovda |
U output_config: { effort: "high" } ichida turishi kerak |
| Sodda vazifa qimmat/sekin | Tasnifga ham thinking + high berildi |
low effort, thinking yo'q |
| Streaming'da reasoning chiqmadi | .on("text") faqat matnni beradi |
for await + event.delta.type === "thinking_delta" |
| Qiyin masalada javob xato | Thinking yoqilmagan, model "boltirgan" | thinking: { type: "adaptive" } + kerak bo'lsa xhigh |
Mashqlar¶
Mashqlar uchun client ni 02-bobdagidek sozlang (new Anthropic() + .env da ANTHROPIC_API_KEY). Tokenni tejash uchun kichik max_tokens bilan boshlang, lekin thinking'li so'rovlarda modelga o'ylashga joy bering (masalan 1024+).
Oson¶
- Thinkingsiz vs thinking bilan. Bitta qiyin masala ("Agar 5 ta ishchi 5 ta detalni 5 soatda yasasa, 100 ta ishchi 100 ta detalni necha soatda yasaydi?") ni avval thinkingsiz, keyin
thinking: { type: "adaptive" }bilan yuboring. Javoblarni solishtiring. effortni o'rnating. Bir so'rovgaoutput_config: { effort: "low" }, keyin"high"qo'ying.usage.output_tokensqanday o'zgaradi?budget_tokensxatosi. Atayinthinking: { type: "enabled", budget_tokens: 5000 }yuboring. Qanday xato (400) chiqadi? Keyin{ type: "adaptive" }ga o'zgartiring.
O'rta¶
- Reasoning'ni ko'rsating.
thinking: { type: "adaptive", display: "summarized" }bilan mantiqiy masala yuboring.block.typeni tekshirib,thinkingblokini "π§ Mulohaza:" vatextblokini "β Javob:" deb alohida chop eting. omittedvssummarized. Xuddi shu so'rovni avvaldisplay: "omitted"(yokidisplaysiz), keyin"summarized"bilan yuboring. Birinchisidablock.thinkingbo'sh, ikkinchisida to'la ekanini ko'rsating.- Streaming "o'ylamoqda...".
for awaitbilan streaming'dacontent_block_startda blok turini,thinking_deltada reasoning'ni,text_deltada javobni alohida belgilab chiqaring.
Qiyin¶
- Yechuvchi + tasniflagich. 7-bo'limdagi
yech()vatasnifla()funksiyalarini yozing. Yechuvchinixhigheffort bilan ishlating vausage.output_tokensni tasniflagichniki bilan solishtiring β qaysi qimmatroq va nega? efforttaqqoslagich. Bitta qiyin masalanilow,medium,high,xhighda ketma-ket yuboring. Har biriningoutput_tokensva javob sifatini jadval qiling. Qaysi nuqtada "ko'proq token = sezilarli yaxshiroq javob" to'xtaydi?- Aqlli rejim tanlovchi. Bir funksiya
soraAqlli(savol)yozing: u savol uzunligi yoki kalit so'zlar ("hisobla", "yech", "kod") ga qarab thinking +high(qiyin) yoki thinking yo'q +low(sodda) ni avtomatik tanlasin. Har bir tanlovni izohda asoslang.
Yechimlar
Yechimlar
ANTHROPIC_API_KEY(.env) talab qiladi.clientβnew Anthropic()(02-bob).
1-mashq yechimi¶
const masala =
"Agar 5 ta ishchi 5 ta detalni 5 soatda yasasa, " +
"100 ta ishchi 100 ta detalni necha soatda yasaydi?";
// Thinkingsiz
const a = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 512,
messages: [{ role: "user", content: masala }],
});
console.log("Thinkingsiz:", a.content.find((b) => b.type === "text").text);
// Thinking bilan
const b = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive" },
messages: [{ role: "user", content: masala }],
});
console.log("Thinking bilan:", b.content.find((b) => b.type === "text").text);
// To'g'ri javob: 5 soat (har ishchi 5 soatda 1 detal yasaydi).
Bu klassik "tuzoq" masala β thinking bilan model uni to'g'riroq yechadi.
2-mashq yechimi¶
for (const effort of ["low", "high"]) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive" },
output_config: { effort },
messages: [{ role: "user", content: "Quyosh tizimini qisqacha tushuntir." }],
});
console.log(`${effort}: ${msg.usage.output_tokens} token`);
}
// "high" odatda "low" dan ko'proq token sarflaydi β chuqurroq o'ylaydi.
effort to'g'ridan-to'g'ri token sarfiga (= narxga) ta'sir qiladi.
3-mashq yechimi¶
try {
await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "enabled", budget_tokens: 5000 }, // β Opus 4.8'da olib tashlangan
messages: [{ role: "user", content: "Salom" }],
});
} catch (err) {
console.error("Xato:", err.message); // 400 β budget_tokens qo'llab-quvvatlanmaydi
}
// β
To'g'ri:
const ok = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
thinking: { type: "adaptive" },
messages: [{ role: "user", content: "Salom" }],
});
console.log(ok.content[0].text);
budget_tokens β eski model g'oyasi. Opus 4.8'da faqat adaptive.
4-mashq yechimi¶
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1500,
thinking: { type: "adaptive", display: "summarized" },
output_config: { effort: "high" },
messages: [
{
role: "user",
content:
"Uch do'st β Ali, Vali, Soli β har xil rang kiygan (qizil, ko'k, yashil). " +
"Ali qizil emas. Vali ko'k. Soli qaysi rangda?",
},
],
});
for (const block of msg.content) {
if (block.type === "thinking") console.log("π§ Mulohaza:", block.thinking);
else if (block.type === "text") console.log("β
Javob:", block.text);
}
block.type bilan reasoning va yakuniy javobni ajratamiz. display: "summarized" bo'lgani uchun thinking matni to'la.
5-mashq yechimi¶
const savol = { role: "user", content: "2+2 nechchi va nega?" };
async function sora(display) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 512,
thinking: { type: "adaptive", display },
messages: [savol],
});
const t = msg.content.find((b) => b.type === "thinking");
return t ? t.thinking : "(thinking bloki yo'q)";
}
console.log("omitted:", JSON.stringify(await sora("omitted"))); // "" β bo'sh
console.log("summarized:", JSON.stringify(await sora("summarized"))); // to'la matn
omitted (standart) da thinking matni bo'sh; summarized da reasoning ko'rinadi.
6-mashq yechimi¶
const stream = client.messages.stream({
model: "claude-opus-4-8",
max_tokens: 1500,
thinking: { type: "adaptive", display: "summarized" },
output_config: { effort: "high" },
messages: [{ role: "user", content: "Bubble sort algoritmini qadam-baqadam tushuntir." }],
});
for await (const event of stream) {
if (event.type === "content_block_start") {
if (event.content_block.type === "thinking") process.stdout.write("\nπ§ [o'ylamoqda] ");
if (event.content_block.type === "text") process.stdout.write("\n\nβ
[javob] ");
}
if (event.type === "content_block_delta") {
if (event.delta.type === "thinking_delta") process.stdout.write(event.delta.thinking);
if (event.delta.type === "text_delta") process.stdout.write(event.delta.text);
}
}
await stream.finalMessage();
content_block_start blok turini bildiradi; thinking_delta va text_delta ni alohida oqitamiz β jonli "o'ylamoqda..." indikatori.
7-mashq yechimi¶
async function yech(masala) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 2048,
thinking: { type: "adaptive" },
output_config: { effort: "xhigh" }, // kod/agentik uchun eng yaxshi
messages: [{ role: "user", content: masala }],
});
return {
javob: msg.content.find((b) => b.type === "text").text,
tokenlar: msg.usage.output_tokens,
};
}
async function tasnifla(matn) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 16,
output_config: { effort: "low" },
messages: [{ role: "user", content: `Bir so'z (ijobiy/salbiy/neytral): "${matn}"` }],
});
return { javob: msg.content[0].text.trim(), tokenlar: msg.usage.output_tokens };
}
const y = await yech("Fibonachchi sonlarini hisoblovchi rekursiv funksiya yoz va murakkabligini ayt.");
const t = await tasnifla("Xizmat juda yomon edi.");
console.log("Yechuvchi:", y.tokenlar, "token");
console.log("Tasniflagich:", t.tokenlar, "token");
// Yechuvchi ko'p marta qimmatroq: xhigh + thinking ko'p chiqish tokeni yeydi.
xhigh + thinking aqlli, lekin qimmat; low + thinkingsiz tasnif arzon. Vazifaga moslang.
8-mashq yechimi¶
const masala = "17 ta tuya 3 o'g'ilga 1/2, 1/3, 1/9 nisbatda bo'linsin. Qanday?";
const natija = [];
for (const effort of ["low", "medium", "high", "xhigh"]) {
const msg = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1500,
thinking: { type: "adaptive" },
output_config: { effort },
messages: [{ role: "user", content: masala }],
});
natija.push({
effort,
tokenlar: msg.usage.output_tokens,
javobBoshi: msg.content.find((b) => b.type === "text").text.slice(0, 60),
});
}
console.table(natija);
// Odatda bir nuqtadan keyin token oshadi-yu, javob sifati deyarli o'zgarmaydi β
// o'sha nuqta sizning shu vazifa uchun "oltin" effortingiz.
console.table bilan token β sifat egri chizig'ini ko'rasiz. "Yetarli yaxshi" nuqtani toping.
9-mashq yechimi¶
function rejimTanla(savol) {
const qiyinSozlar = /hisobla|yech|kod|algoritm|isbotla|reja|tahlil/i;
const qiyin = qiyinSozlar.test(savol) || savol.length > 200;
return qiyin
? { thinking: { type: "adaptive" }, output_config: { effort: "high" }, max_tokens: 2048 }
: { output_config: { effort: "low" }, max_tokens: 256 }; // thinking yo'q
}
async function soraAqlli(savol) {
const rejim = rejimTanla(savol);
console.log(rejim.thinking ? "[qiyin rejim: thinking + high]" : "[sodda rejim: low]");
const msg = await client.messages.create({
model: "claude-opus-4-8",
messages: [{ role: "user", content: savol }],
...rejim,
});
return msg.content.find((b) => b.type === "text").text;
}
console.log(await soraAqlli("O'zbekiston poytaxti qaysi?")); // sodda: low
console.log(await soraAqlli("Ikkinchi darajali tenglamani yech: xΒ²-5x+6=0")); // qiyin: thinking + high
Bu β "sifat β narx" sozlagichini avtomatlashtirish: sodda savolga arzon rejim, qiyin savolga aqlli rejim. Production'da aynan shunday qilasiz.
Keyingi qadam. Endi siz Claude'ni qachon chuqurroq "o'ylashga" majburlashni bilasiz:
thinking: { type: "adaptive" }qiyin masalalarda aniqlikni oshiradi,output_config: { effort: ... }esa modelning kuchini (va token/narxini) boshqaradi. Reasoning'nidisplay: "summarized"bilan ko'rsatasiz, streaming'dathinking_deltaorqali jonli "o'ylamoqda..." indikatorini chiqarasiz. Eng muhim dars β bu sifat β narx sozlagichi: qiyin vazifaga thinking +high/xhigh, sodda vazifaga thinking yo'q +low. Narxni chuqur 14 β Token, narx va limitlar bobida ko'ramiz. Keyingi bobda esa Vercel AI SDK bilan tanishamiz β bu Anthropic SDK ustiga qulay abstraksiya qatlami bo'lib,generateText/streamTextbilan kodni soddalashtiradi va provayder almashtirishni osonlashtiradi.
β¬ οΈ Oldingi: 09 β Vision va hujjatlar Β· π README Β· Keyingi: 11 β Vercel AI SDK bilan tanishuv β‘οΈ