02 β Muhit va birinchi so'rov¶
β¬ οΈ Oldingi: 01 β LLM nima Β· π Kitob boshi Β· Keyingi: 03 β Prompt muhandisligi β‘οΈ
Bu bobda: kompyuteringizni AI bilan ishlashga tayyorlaymiz β PHP va Composer borligini tekshiramiz, Anthropic'ning rasmiy PHP SDK'sini (va u talab qiladigan Guzzle'ni) o'rnatamiz, API kalitini xavfsiz saqlaymiz, so'ng birinchi marta o'z PHP kodimizdan Claude'ga savol yuborib, javobini ekranga chiqaramiz. Bob oxirida sizning kompyuteringizdan haqiqiy AI bilan "salomlashgan" to'liq ishlaydigan skript bo'ladi.
Kirish: nazariyadan amaliyotga¶
Oldingi bobda LLM (katta til modeli) nima ekanligini, token va kontekst oynasi qanday ishlashini o'rgandik. Endi gapdan ishga o'tamiz: o'z PHP kodimizdan turib Claude'ga birinchi savolimizni yuboramiz va uning javobini ekranda ko'ramiz.
Hayotiy o'xshatish. Tasavvur qiling, chet ellik juda bilimdon maslahatchi bilan ishlamoqchisiz. U siz bilan bir xonada o'tirmaydi β boshqa shaharda. Siz unga xat (so'rov) yozasiz, pochta xizmati (internet va API) xatni yetkazadi, u o'qib javob xati qaytaradi. Bu bobda biz aynan shu "pochta liniyasi"ni o'rnatamiz: konvertni qanday yozish, manzilni (model nomini), parolni (API kalitni) qayerga qo'yish va javobni qanday o'qishni o'rganamiz.
Hamma narsa bitta maqsadga xizmat qiladi β kompyuteringizdan Anthropic serverlariga internet orqali so'rov ketsin va javob qaytsin. Bu yo'lni bir marta to'g'ri qursangiz, kitobning qolgan barcha boblari (streaming, JSON chiqish, tool use, agentlar, RAG) xuddi shu poydevor ustiga quriladi.
Provayder haqida
Bu kitobda amaliy kod uchun Claude (Anthropic) ning rasmiy PHP SDK'sidan foydalanamiz. Lekin g'oya β "API kaliti olish, kutubxona o'rnatish, so'rov yuborish, javobni o'qish" β har qanday provayder (OpenAI, Gemini, lokal modellar) uchun bir xil. 19-bobda boshqa provayderlarga ko'chirishni ko'ramiz.
1. Talablarni tekshirish: PHP va Composer¶
AI bilan ishlash uchun maxsus, kuchli kompyuter kerak emas. Og'ir hisob-kitobni Anthropic serverlari bajaradi β sizning kompyuteringiz faqat so'rov yuboradi va javobni qabul qiladi. Bizga atigi ikki narsa kerak:
| Kerak | Versiya | Nima uchun |
|---|---|---|
| PHP | 8.1+ (8.4 tavsiya) | Kodimiz PHP'da yoziladi; SDK zamonaviy PHP imkoniyatlaridan (nomli argument, enum) foydalanadi |
| Composer | 2.x | PHP kutubxonalarini (SDK, Guzzle) o'rnatadigan menejer |
Hayotiy o'xshatish β Composer. Composer β bu PHP dunyosining "ilova do'koni". Telefoningizga App Store'dan dastur o'rnatganingizdek, Composer ham boshqalar yozgan tayyor kutubxonalarni bir buyruq bilan loyihangizga yuklab oladi va versiyalarini boshqaradi. Anthropic SDK'sini ham aynan shu orqali o'rnatamiz.
Tekshirish¶
Terminal (Windows'da PowerShell yoki Terminal, Mac/Linux'da Terminal) oching va quyidagilarni tering:
Taxminan shunday natija chiqishi kerak (versiya raqami sizda boshqacha bo'lishi mumkin):
PHP 8.4.0 (cli) (built: Nov 21 2024) ( NTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.4.0
Endi Composer'ni tekshiramiz:
Agar ikkala buyruq ham versiya raqamini ko'rsatsa β tayyorsiz, keyingi bo'limga o'ting.
Buyruq topilmasa
Agar php yoki composer "command not found" / "buyruq topilmadi" desa, demak ular o'rnatilmagan yoki tizim ularni topa olmayapti (PATH'da yo'q). Bu holda avval PHP'ni o'rnating. Eng oson yo'l β Laragon (Windows), Herd (Mac/Windows) yoki DDEV/Docker kabi tayyor to'plamlar; ular PHP, Composer va boshqalarini birga o'rnatadi. PHP asoslari va o'rnatish bo'yicha PHP kitobiga qarang.
Nega PHP 8.1+ ?
Anthropic'ning rasmiy SDK'si zamonaviy PHP imkoniyatlaridan (jumladan nomli argumentlar β model:, maxTokens:) foydalanadi. Bular PHP 8.0+ da paydo bo'lgan, lekin SDK 8.1+ ni talab qiladi. 8.4 β eng yangi va tavsiya etiladigan versiya; biz shu bilan ishlaymiz.
2. API kaliti olish¶
Claude'ga so'rov yuborish uchun API kaliti kerak. API kaliti β bu sizning shaxsiy maxfiy parolingiz; u orqali Anthropic "bu so'rov aynan sizning hisobingizdan kelyapti" deb biladi va xarajatni sizning hisobingizga yozadi.
Hayotiy o'xshatish β API kaliti. API kaliti β uy kalitiga o'xshaydi. U bilan eshikni (API'ni) ochish mumkin. Kalitni begonaga bermaysiz, ko'cha o'rtasiga tashlab ketmaysiz. Agar kimdir kalitingizni topib olsa, sizning hisobingizdan so'rov yuborib, sizning hisobingizga pul yozdirishi mumkin. Shuning uchun kalit doim maxfiy turishi kerak.
Qadamlar¶
- Brauzerda
console.anthropic.comsaytiga kiring. - Hisob yarating (email bilan ro'yxatdan o'ting) yoki mavjud hisobingizga kiring.
- Menyudan API Keys bo'limini toping va Create Key (yangi kalit yaratish) tugmasini bosing.
- Kalitga nom bering (masalan,
php-kitob-test) va yarating. - Chiqqan kalitni darhol nusxalab oling β u
sk-ant-...bilan boshlanadi va faqat bir marta to'liq ko'rsatiladi. Yopilgandan keyin uni qayta ko'ra olmaysiz (faqat yangisini yaratish mumkin).
Kalitni HECH QACHON kodga yozmang
Bu β eng muhim xavfsizlik qoidasi. Kalitni $client = new Client(apiKey: 'sk-ant-abc123...') deb to'g'ridan kodga yozmang. Sababi: kodni GitHub'ga yuklasangiz yoki birovga bersangiz, kalit butun dunyoga ochiq bo'ladi. Botlar GitHub'dagi ochiq kalitlarni soniyalar ichida topib, sizning hisobingizdan minglab so'rov yuborishi mumkin. Kalitni muhit o'zgaruvchisi yoki .env fayl orqali beramiz (5-bo'limda ko'ramiz).
To'lov haqida
Anthropic'da odatda boshlang'ich bepul kredit beriladi, keyin esa "qancha ishlatsang, shuncha to'laysan" tartibi. Bitta savol-javob arzon (tokenlar haqida 16-bobda batafsil). O'rganish jarayonida xarajat juda kichik bo'ladi β qo'rqmang.
3. Loyiha yaratish¶
Endi AI loyihamiz uchun alohida papka yaratamiz. Papka β barcha fayllarimiz (kod, sozlamalar, kutubxonalar) bir joyda turishi uchun.
Terminalda:
Bu ai-test nomli papka yaratib, ichiga kiradi. Endi shu papkada loyihani sozlaymiz.
Composer loyihasini boshlashning ikki yo'li bor:
1-yo'l β composer init (interaktiv, savol-javob bilan):
Bu sizdan loyiha nomi, tavsifi va boshqalarni so'raydi. Boshlovchi uchun har bir savolda Enter bosib (standart qiymatni qoldirib) o'tib ketsangiz ham bo'ladi.
2-yo'l β to'g'ridan o'rnatish (eng oddiy):
Aslida composer init shart emas. Quyidagi bo'limda composer require buyrug'ini ishlatsak, Composer o'zi composer.json faylini yaratadi. Boshlovchi uchun shuni tavsiya qilamiz β keling, to'g'ridan kutubxonani o'rnatishga o'tamiz.
Hayotiy o'xshatish β
composer.json.composer.jsonβ loyihangizning "xarid ro'yxati"ga o'xshaydi: unda loyihangizga qaysi kutubxonalar va qaysi versiyada kerakligi yozib qo'yiladi. Composer shu ro'yxatga qarab hammasinivendor/papkasiga yuklab oladi.
4. SDK o'rnatish β Anthropic SDK + Guzzle (MUHIM)¶
Bu β bobning eng muhim bo'limi. Ko'p boshlovchilar aynan shu yerda qoqiladi.
Anthropic'ning rasmiy PHP kutubxonasini o'rnatamiz:
Endi juda muhim ikkinchi qadam β Guzzle ni ham o'rnatamiz:
Yoki ikkalasini birga:
Nega Guzzle SHART?¶
Bu savol juda muhim, chunki Guzzle'ni o'rnatishni unutsangiz, kodingiz ishlamaydi va tushunarsiz xato beradi.
Hayotiy o'xshatish β SDK va Guzzle. SDK β bu "xat yozuvchi kotib": u sizning so'rovingizni Anthropic tushunadigan to'g'ri shaklga (HTTP so'rovga) keltiradi va javobni qayta sizga tushunarli obyektga aylantiradi. Lekin kotib xatni o'zi pochtaga eltmaydi β buning uchun "kuryer" kerak. Guzzle β aynan o'sha kuryer: u tayyor HTTP so'rovni internet orqali Anthropic serveriga olib boradi va javobni qaytaradi.
Texnik tilda: Anthropic SDK'si HTTP so'rovni o'zi yubormaydi. U PSR-18 standartiga mos har qanday "HTTP mijoz"ni ishlatishga moslangan. PSR-18 β PHP hamjamiyati kelishgan umumiy standart bo'lib, "HTTP mijoz qanday ko'rinishda bo'lishi kerak"ligini belgilaydi. SDK ishga tushganda, o'rnatilgan kutubxonalar orasidan PSR-18'ga mos mijozni avtomatik izlab topadi. Guzzle β eng mashhur PSR-18 HTTP mijozi.
Qisqasi: SDK = miya (so'rovni tuzadi), Guzzle = qo'l-oyoq (so'rovni internetga yuboradi). Ikkalasi birga kerak.
Guzzle bo'lmasa qanday xato chiqadi
Agar faqat SDK'ni o'rnatib, Guzzle'ni unutsangiz, birinchi so'rovda taxminan shunday xato olasiz:
yokiBu β "men so'rovni yuboradigan kuryerni topa olmadim" degani. Yechimi bitta: composer require guzzlehttp/guzzle.
Guzzle o'rniga boshqa narsa bo'ladimi?
Ha. Guzzle yagona variant emas β masalan nyholm/psr7 + symfony/http-client juftligi ham ishlaydi. Lekin boshlovchi uchun eng oson va keng tarqalgani β Guzzle. Shubha bo'lsa, Guzzle'ni tanlang.
O'rnatish tugagach, papkangizda vendor/ nomli papka va composer.json, composer.lock fayllari paydo bo'ladi. vendor/ β barcha yuklab olingan kutubxonalar shu yerda turadi.
5. API kalitini xavfsiz saqlash (.env)¶
Endi 2-bo'limda olgan kalitimizni xavfsiz joyga qo'yamiz β kodga emas. Eng keng tarqalgan usul β .env fayl.
Hayotiy o'xshatish β
.envfayl..envfayl β uy kalitini saqlaydigan shaxsiy seyfga o'xshaydi. Maxfiy ma'lumotlar (API kalitlar, parollar, baza ulanishlari) shu faylda turadi. Kodingizda esa "seyfdan kalitni ol" deyiladi, kalitning o'zi kodda ko'rinmaydi. Seyfning o'zini esa hech qachon GitHub'ga yuklamaysiz.
5.1 phpdotenv kutubxonasini o'rnatish¶
.env faylni o'qish uchun mashhur vlucas/phpdotenv kutubxonasidan foydalanamiz:
5.2 .env faylni yaratish¶
Loyiha papkasida .env nomli fayl yarating va ichiga kalitingizni yozing:
(sk-ant-... o'rniga 2-bo'limda nusxalagan haqiqiy kalitingizni qo'ying. Atrofiga tirnoq qo'yish shart emas.)
5.3 .gitignore ga .env qo'shish (juda muhim)¶
Agar loyihangizni Git bilan boshqarsangiz (GitHub'ga yuklasangiz), .env fayl hech qachon repozitoriyga tushmasligi kerak. Buning uchun loyiha papkasida .gitignore faylini yarating (yoki mavjudiga qatorni qo'shing):
Bu Git'ga "vendor/ papkani va .env faylni kuzatma, GitHub'ga yuklama" deydi.
Eng ko'p uchraydigan xavfsizlik xatosi
Dunyo bo'ylab dasturchilar .env faylni xatoan GitHub'ga yuklab, API kalitlarini oshkor qilib qo'yishadi. Botlar buni daqiqalar ichida topadi. Doim .env ni .gitignore ga qo'shing β bu birinchi ish bo'lsin.
Namuna fayl β .env.example
Odat shuki, .env ni yashirib, uning yonida .env.example nomli kalitsiz namuna qoldiriladi:
.env.example ni .gitignore ga qo'shmang β u GitHub'da bo'lishi kerak.
5.4 .env siz: to'g'ridan muhit o'zgaruvchisi¶
.env fayl yagona yo'l emas. Kalitni operatsion tizimning muhit o'zgaruvchisi sifatida ham berish mumkin (productionda ko'pincha shunday qilinadi):
# Mac / Linux:
export ANTHROPIC_API_KEY="sk-ant-..."
# Windows PowerShell:
$env:ANTHROPIC_API_KEY="sk-ant-..."
Yoki PHP kodi ichidan putenv('ANTHROPIC_API_KEY=...') bilan ham o'rnatish mumkin (lekin bu holda ham kalitni kodga yozmang β masalan boshqa maxfiy manbadan o'qing).
Ikkala usulda ham kodimiz kalitni bir xil yo'l bilan o'qiydi β getenv('ANTHROPIC_API_KEY'). Bu funksiya muhit o'zgaruvchisini qaytaradi; .env faylni phpdotenv o'qib, qiymatlarni aynan muhit o'zgaruvchilariga joylaydi.
6. Birinchi so'rov β to'liq ishlaydigan skript¶
Hammasi tayyor. Endi birinchi marta Claude'ga savol yuboramiz. Loyiha papkasida birinchi.php nomli fayl yarating:
<?php
// 1) Composer yuklagan barcha kutubxonalarni ulaymiz
require __DIR__ . '/vendor/autoload.php';
use Anthropic\Client;
use Dotenv\Dotenv;
// 2) .env fayldagi maxfiy o'zgaruvchilarni yuklaymiz
// (endi getenv('ANTHROPIC_API_KEY') ishlaydi)
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
// 3) Klient yaratamiz β kalitni .env dan olamiz, kodga YOZMAYMIZ
$client = new Client(apiKey: getenv('ANTHROPIC_API_KEY'));
// 4) So'rov yuboramiz: model, maksimal token, xabarlar
$message = $client->messages->create(
model: 'claude-opus-4-8',
maxTokens: 1024,
messages: [
['role' => 'user', 'content' => 'Salom, Claude! O\'zbek tilida bir jumlada o\'zingni tanishtir.'],
],
);
// 5) Javobni o'qiymiz va ekranga chiqaramiz
echo $message->content[0]->text . "\n";
Skriptni terminalda ishga tushiring:
Agar hammasi to'g'ri bo'lsa, taxminan shunday javob ko'rasiz:
Salom! Men Claude β Anthropic kompaniyasi yaratgan sun'iy intellekt yordamchisiman, sizga turli savollarda yordam berishga tayyorman.
Tabriklaymiz β siz o'z PHP kodingizdan birinchi marta haqiqiy AI bilan gaplashdingiz! Endi kodning har bir qatorini tushunamiz.
Kodni qator-qator tushunamiz¶
require __DIR__ . '/vendor/autoload.php';β Composer barcha o'rnatilgan kutubxonalarni avtomatik ulaydigan "ulagich" fayl. Har bir PHP skriptimiz shu qatordan boshlanadi.__DIR__β joriy fayl turgan papka manzili.Dotenv::createImmutable(__DIR__)->load();β.envfaylni o'qib, ichidagi o'zgaruvchilarni muhitga yuklaydi. Shundan keyingetenv()ular qiymatini qaytaradi. (Agar muhit o'zgaruvchisini boshqa yo'l bilan bergan bo'lsangiz, bu qatorlar shart emas.)new Client(apiKey: getenv('ANTHROPIC_API_KEY'))β SDK klientini yaratamiz.apiKey:β bu nomli argument (PHP 8.0+ imkoniyati: argument tartibini emas, nomini yozamiz). Kalit.envdan keladi.$client->messages->create(...)β bu asosiy buyruq: Claude'ga xabar yuboradi. Uchta majburiy narsa:model(qaysi model),maxTokens(javob eng ko'pi bilan necha tokendan iborat bo'lsin),messages(xabarlar ro'yxati).messages: [['role' => 'user', 'content' => '...']]β xabarlar massivi. Har xabardarole(kim gapiryapti βusersiz,assistantmodel) vacontent(matn) bo'ladi. Birinchi xabar doimuserbo'lishi kerak.$message->content[0]->textβ javobning matni. Nega[0]va->text? Buni keyingi bo'limda batafsil ko'ramiz.
Nomli argument (maxTokens:) β camelCase
Diqqat qiling: SDK'da parametr nomi maxTokens (katta T bilan, camelCase), max_tokens emas. Bu β PHP SDK'sining uslubi. Anthropic'ning to'g'ridan HTTP API'sida max_tokens bo'ladi, lekin biz SDK ishlatganimiz uchun maxTokens: yozamiz. SDK bu kabi nomlarni o'zi to'g'ri shaklga o'giradi.
7. Javob strukturasini tushunish¶
Yuqorida $message->content[0]->text yozdik. Endi $message aslida nima ekanligini ochib beramiz β bu kitobning qolgan qismida juda ko'p kerak bo'ladi.
$message β oddiy matn emas, balki boy obyekt. U javob matnidan tashqari ko'p foydali ma'lumotni o'z ichiga oladi:
$message->content // javob bloklari massivi (eng muhim qism)
$message->stopReason // model nega to'xtadi (masalan "end_turn")
$message->usage // sarflangan tokenlar (xarajatni hisoblash uchun)
$message->model // qaysi model javob berdi
$message->role // har doim "assistant"
$message->id // bu javobning noyob raqami
Nega content β massiv?¶
Eng muhim tushuncha shu: $message->content bitta matn emas, balki "bloklar" massivi. Nega?
Hayotiy o'xshatish β bloklar. Claude'ning javobini gazeta sahifasiga o'xshating. Sahifada faqat matn bo'lmasligi mumkin: bir blok β matn, boshqasi β rasm, yana biri β jadval. Claude ham javobni bloklarga bo'lib qaytaradi. Oddiy savol-javobda odatda bitta matn bloki bo'ladi β shuning uchun
content[0](birinchi blok) yozamiz. Lekin keyinroq (tool use, fikrlash bloklari) bir nechta turli blok bo'lishi mumkin.
Har blokda type (turi) bo'ladi. Matn bloki uchun type === 'text', va matn ->text ichida turadi. Shuning uchun ishonchli yozuvi β bloklarni aylanib chiqib, faqat matn bloklarini olish:
// Barcha matn bloklarini xavfsiz o'qish
foreach ($message->content as $block) {
if ($block->type === 'text') {
echo $block->text;
}
}
echo "\n";
Oddiy holatlarda $message->content[0]->text ham yetarli (birinchi blok matn bo'lganligiga ishonchingiz komil bo'lsa). Lekin foreach bilan yozish β har doim xavfsizroq odat.
stopReason β model nega to'xtadi?¶
$message->stopReason modelning javobni nega yakunlaganini aytadi. Eng ko'p uchraydigani:
stopReason |
Ma'nosi |
|---|---|
end_turn |
Model fikrini tabiiy yakunladi (normal holat) |
max_tokens |
maxTokens chegarasiga yetdi β javob yarmida uzilgan bo'lishi mumkin |
tool_use |
Model tooldan foydalanmoqchi (9-bobda ko'ramiz) |
stop_sequence |
Siz belgilagan to'xtash so'ziga yetdi |
max_tokens bo'lsa β chegarani oshiring
Agar stopReason === 'max_tokens' bo'lsa, javob to'liq tugamagan, ya'ni maxTokens qiymati kichik bo'lgan. Uni oshiring (masalan maxTokens: 4096). Lekin esda tuting β maxTokens faqat chegara; model undan kamroq ishlatishi mumkin va siz faqat haqiqatda ishlatilgan token uchun to'laysiz.
usage β tokenlar va xarajat¶
$message->usage shu so'rovda nechta token sarflanganini ko'rsatadi:
echo "Kirish tokenlari: " . $message->usage->inputTokens . "\n";
echo "Chiqish tokenlari: " . $message->usage->outputTokens . "\n";
inputTokensβ siz yuborgan so'rov (savol + system prompt) necha token edi.outputTokensβ model qaytargan javob necha token.
Bu raqamlar muhim, chunki xarajat shularga bog'liq. Token va narx haqida 16-bobda batafsil to'xtalamiz; hozircha shuni biling: chiqish tokenlari kirishga qaraganda qimmatroq turadi.
8. System prompt qo'shish β modelga rol berish¶
Hozircha biz faqat savol (user xabari) yubordik. Lekin ko'pincha modelga "qanday yordamchi bo'lishi"ni oldindan aytib qo'yish kerak. Buning uchun system prompt ishlatiladi.
Hayotiy o'xshatish β system prompt. Yangi ishchini ishga olganingizni tasavvur qiling. Unga birinchi kuni lavozim yo'riqnomasi berasiz: "Sen mijozlarga yordam beradigan operator'san. Doim xushmuomala bo'l, qisqa javob ber, o'zbek tilida gaplash." Bu yo'riqnoma har bir mijoz savolidan oldin emas, bir marta beriladi va u butun ish davomida amal qiladi. System prompt β aynan shu yo'riqnoma: u modelga rolini, qoidalarini va uslubini belgilaydi.
System prompt β messages ichidagi alohida rol emas, balki create() ning alohida system: parametri:
<?php
require __DIR__ . '/vendor/autoload.php';
use Anthropic\Client;
use Dotenv\Dotenv;
Dotenv::createImmutable(__DIR__)->load();
$client = new Client(apiKey: getenv('ANTHROPIC_API_KEY'));
$message = $client->messages->create(
model: 'claude-opus-4-8',
maxTokens: 1024,
// Modelga rol va qoidalar beramiz:
system: 'Sen foydali PHP yordamchisisan. Doim o\'zbek tilida, qisqa va aniq javob ber. Iloji bo\'lsa kod misol keltir.',
messages: [
['role' => 'user', 'content' => 'PDO nima?'],
],
);
echo $message->content[0]->text . "\n";
system: qo'shilganda, model PDO haqida aynan siz so'ragan uslubda β o'zbekcha, qisqa, kod misolli β javob beradi. System prompt'ni o'zgartirib, modelni mutlaqo boshqacha "shaxs"ga (matematika o'qituvchisi, SQL eksperti, til tarjimoni) aylantirishingiz mumkin.
System prompt vs user xabar
- System = "kim bo'l va qanday gaplash" (rol, qoida, uslub) β bir marta beriladi.
- User = aniq savol/topshiriq β har gal o'zgaradi.
System prompt'ni mohirona yozish β alohida san'at. Buni keyingi bobda (03 β Prompt muhandisligi) chuqur o'rganamiz.
9. Model tanlash β Opus, Sonnet, Haiku¶
Yuqorida hamma misollarda model: 'claude-opus-4-8' yozdik. Lekin Claude'ning bir nechta modeli bor va ular tezlik, aql va narx bo'yicha farq qiladi:
| Model | ID | Kontekst | Qachon ishlatish |
|---|---|---|---|
| Claude Opus 4.8 (eng kuchli) | claude-opus-4-8 |
1M token | Murakkab masala, chuqur fikrlash, eng yuqori sifat |
| Claude Sonnet 4.6 (balans) | claude-sonnet-4-6 |
1M token | Tezlik va aql balansi β ko'p vazifaga eng yaxshi tanlov |
| Claude Haiku 4.5 (eng tez) | claude-haiku-4-5 |
200K token | Oddiy, ko'p sonli, tez/arzon vazifalar |
Hayotiy o'xshatish β modellar. Modellarni transport turlariga o'xshating. Opus β kuchli, qimmat, eng murakkab yo'lni bosib o'tadigan yuk mashinasi. Sonnet β kundalik ishga juda mos yengil avtomobil. Haiku β tez va arzon mototsikl, kichik topshiriqlar uchun. Vazifa qanchalik murakkab bo'lsa, shunchalik kuchli modelni tanlaysiz; oddiy ishga kuchli (va qimmat) modelni sarflash shart emas.
Modelni almashtirish juda oson β faqat model: qiymatini o'zgartiring:
$message = $client->messages->create(
model: 'claude-haiku-4-5', // tez va arzon variantga o'tdik
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Bugun kayfiyat qanday ekanini qisqa so\'ra']],
);
Model ID'siga sana qo'shmang
Model ID aynan jadvaldagidek bo'lishi kerak: claude-opus-4-8 β to'g'ri. claude-opus-4-8-2026-01-15 kabi sana qo'shilgan ko'rinish bu kitobda noto'g'ri va 404 (model topilmadi) xatosiga olib keladi. Sana qo'shmang.
10. Keng tarqalgan xatolar va ularni hal qilish¶
Birinchi so'rovda ko'pincha shu xatolar uchraydi. Quyidagi jadval sizni vaqt yo'qotishdan saqlaydi:
| Xato | Sabab | Yechim |
|---|---|---|
No PSR-17 url factory found / Could not find resource using any discovery strategy |
Guzzle o'rnatilmagan | composer require guzzlehttp/guzzle |
401 Unauthorized / authentication_error |
API kaliti yo'q, noto'g'ri yoki bo'sh | .env da kalit borligini, getenv() qiymat qaytarayotganini tekshiring |
404 / model: ... not found |
Model nomi noto'g'ri (masalan sana qo'shilgan) | Aniq ID: claude-opus-4-8 (sanasiz) |
Class "Anthropic\Client" not found |
vendor/autoload.php ulanmagan yoki SDK o'rnatilmagan |
Skript boshida require __DIR__ . '/vendor/autoload.php'; borligini va composer require anthropic-ai/sdk bajarilganini tekshiring |
getenv() false qaytaryapti |
.env yuklanmagan |
Dotenv::createImmutable(__DIR__)->load(); chaqirilganini, .env to'g'ri papkada ekanini tekshiring |
Kalit yo'qligini oldindan tekshirish. Skript boshida kalit borligini tekshirib, foydalanuvchiga aniq xabar berish β yaxshi odat:
$kalit = getenv('ANTHROPIC_API_KEY');
if (!$kalit) {
exit("Xato: ANTHROPIC_API_KEY topilmadi. .env faylni tekshiring.\n");
}
$client = new Client(apiKey: $kalit);
Xatolarni yashirmang, o'qing
Boshlovchilar ko'pincha xatoni ko'rib qo'rqib ketadi. Aslida xato matni β sizning eng yaxshi do'stingiz: u muammoni aniq aytadi. "401" ko'rsangiz β kalit muammosi; "PSR" yoki "discovery" so'zini ko'rsangiz β Guzzle muammosi; "404" β model nomi. Xatoni o'qishni o'rganish β eng muhim dasturchilik ko'nikmasi. Xatolarni professional boshqarish (try/catch, retry) haqida 08-bobda batafsil ko'ramiz.
11. To'liq misol: AI yordamchidan savol so'rash (CLI)¶
Endi o'rganganlarimizni birlashtiramiz: terminaldan savol qabul qilib, Claude'ga yuboradigan va javobni chiroyli ko'rsatadigan to'liq CLI skripti. sora.php nomli fayl yarating:
<?php
require __DIR__ . '/vendor/autoload.php';
use Anthropic\Client;
use Dotenv\Dotenv;
// 1) .env yuklaymiz
Dotenv::createImmutable(__DIR__)->load();
// 2) Kalit borligini tekshiramiz
$kalit = getenv('ANTHROPIC_API_KEY');
if (!$kalit) {
exit("Xato: ANTHROPIC_API_KEY topilmadi. .env faylni tekshiring.\n");
}
// 3) Savolni terminal argumentidan yoki standart savol
// Ishlatish: php sora.php "Sizning savolingiz"
$savol = $argv[1] ?? 'PHP nima ekanini bir jumlada tushuntir.';
// 4) Klient yaratamiz
$client = new Client(apiKey: $kalit);
echo "Savol: {$savol}\n";
echo "O'ylanmoqda...\n\n";
// 5) So'rov yuboramiz (system prompt bilan rol beramiz)
$message = $client->messages->create(
model: 'claude-opus-4-8',
maxTokens: 1024,
system: 'Sen o\'zbek tilida javob beradigan foydali yordamchisan. '
. 'Aniq, tushunarli va do\'stona bo\'l.',
messages: [
['role' => 'user', 'content' => $savol],
],
);
// 6) Barcha matn bloklarini xavfsiz chiqaramiz
echo "Javob:\n";
foreach ($message->content as $block) {
if ($block->type === 'text') {
echo $block->text;
}
}
echo "\n\n";
// 7) Sarflangan tokenlarni ko'rsatamiz
echo "---\n";
echo "Kirish: {$message->usage->inputTokens} token Β· "
. "Chiqish: {$message->usage->outputTokens} token Β· "
. "To'xtash sababi: {$message->stopReason}\n";
Ishga tushirish:
Natija taxminan shunday ko'rinadi:
Savol: Composer nima va nima uchun kerak?
O'ylanmoqda...
Javob:
Composer β PHP uchun bog'liqliklar (kutubxonalar) menejeri. U boshqalar
yozgan tayyor kodni bir buyruq bilan loyihangizga o'rnatadi va versiyalarini
boshqaradi, shunda hamma narsani qo'lda yuklab o'tirmaysiz.
---
Kirish: 38 token Β· Chiqish: 52 token Β· To'xtash sababi: end_turn
Bu skript β kitobning qolgan boblari uchun poydevor. Unga keyinroq streaming, suhbat tarixi, tool use va boshqalarni qo'shib boramiz. Hozir esa siz uni ishlatib, har xil savollar bilan o'ynab ko'ring β bu AI'ni "his qilish"ning eng yaxshi yo'li.
Sinab ko'ring
sora.php ni ishga tushirib, bir necha xil savol bering: oddiy fakt savoli, kod yozishni so'rash, biror narsani tushuntirishni so'rash. system: matnini o'zgartiring (masalan, "Sen quvnoq matematika o'qituvchisisan") va javob uslubi qanday o'zgarishini kuzating. model: ni claude-haiku-4-5 ga almashtirib, tezlik farqini sezing.
Xulosa¶
- AI bilan ishlash uchun kuchli kompyuter kerak emas β og'ir ish serverda bajariladi; sizga PHP 8.1+ (8.4 tavsiya) va Composer yetarli (
php -v,composer --versionbilan tekshiring). - Anthropic'ning rasmiy SDK'sini o'rnatishda Guzzle SHART:
composer require anthropic-ai/sdk guzzlehttp/guzzle. SDK so'rovni tuzadi (miya), Guzzle uni internetga yuboradi (kuryer β PSR-18 HTTP mijoz). Guzzle bo'lmasa "discovery" / "PSR-17 url factory" xatosi chiqadi. - API kaliti
console.anthropic.comdan olinadi va hech qachon kodga yozilmaydi β.envfayl (vlucas/phpdotenv) yoki muhit o'zgaruvchisi orqali beriladi,.envesa.gitignorega qo'shiladi. - Birinchi so'rov:
new Client(apiKey: getenv(...))β$client->messages->create(model:, maxTokens:, messages:). Parametrlar nomli va camelCase (maxTokens,max_tokensemas). - Javob
$messageβ boy obyekt:content(bloklar massivi, matn blokitype === 'text'da->text),stopReason(nega to'xtadi),usage->inputTokens/outputTokens(xarajat). system:parametri modelga rol va qoida beradi (alohida message roli emas, top-level parametr).- Uchta model:
claude-opus-4-8(kuchli, default),claude-sonnet-4-6(balans),claude-haiku-4-5(tez/arzon). ID'ga sana qo'shilmaydi. - Eng ko'p xatolar: Guzzle yo'q (discovery xatosi), kalit yo'q/noto'g'ri (401), model nomi xato (404) β har birining aniq yechimi bor.
Amaliy mashqlar¶
- Muhitni tayyorlash. Yangi
ai-testpapkasi yarating,composer require anthropic-ai/sdk guzzlehttp/guzzle vlucas/phpdotenvbajaring,.envga kalitingizni qo'ying va.gitignorega.envni qo'shing. So'ngphp -vvacomposer showbilan hammasi joyida ekanini tasdiqlang. - Birinchi so'rov.
birinchi.phpskriptini yozib, Claude'dan o'zini o'zbek tilida tanishtirishini so'rang. Javob bilan birgainputTokensvaoutputTokenssonlarini ham ekranga chiqaring. - System prompt bilan rol. Bitta savolni (masalan, "Massiv nima?") ikki marta yuboring: birinchisida
system:siz, ikkinchisidasystem: 'Sen 10 yoshli bolaga tushuntiradigan o\'qituvchisan'bilan. Javoblar qanday farq qilganini yozma ravishda taqqoslang. - Model almashtirish. Bitta murakkabroq savolni (masalan, qisqa funksiya yozishni so'rash)
claude-opus-4-8,claude-sonnet-4-6vaclaude-haiku-4-5modellarida navbat bilan yuboring. Javob sifati, tezligi vausagetoken sonidagi farqni kuzating. - Xatoni ataylab chiqaring.
.envdagi kalitni vaqtincha noto'g'ri qiymatga o'zgartiring va skriptni ishga tushiring β qanday xato (status kodi) chiqishini ko'ring. So'ng kalitni to'g'rilab,getenv()falseqaytarsa aniq xabar beradigan tekshiruvni skriptingizga qo'shing.
β¬ οΈ Oldingi: 01 β LLM nima Β· π Kitob boshi Β· Keyingi: 03 β Prompt muhandisligi β‘οΈ