Blog

Claude API’da Agent Skills: Claude Code’siz tayyor ko‘nikmadan qanday foydalanish mumkin

Markdown

Claude API’ga tayyor pptx ko‘nikmasini qanday ulash: container.skills, kodni bajarish vositasi, javobni tekshirish va Files API orqali taqdimotni yuklab olish.

Maqolani to‘liq o‘qish

Asosiy xulosa

Hujjatlar uchun tayyor Agent Skills’dan to‘g‘ridan-to‘g‘ri Claude API orqali foydalanish mumkin: ko‘nikmani container.skills ichida ko‘rsating va code_execution vositasini yoqing. Birinchi so‘rovingizda rasmiy misoldagi mos model va vosita juftligidan foydalaning. Yaratilgan faylni keyin file_id orqali alohida yuklab oling; misolda so‘rov va yuklab olish uchun bir xil API kaliti ishlatiladi.

Qo‘shimcha ko‘rsatmalarni Ailoot hujjatlaridan topishingiz mumkin.

Sizga nimalar kerak bo‘ladi

Ushbu qo‘llanma ko‘nikmani Claude Code’ga o‘rnatish haqida emas, balki API’ga dasturdan to‘g‘ridan-to‘g‘ri murojaat qilish haqida. Sizga Claude API kaliti, tanlangan modeldan foydalanish ruxsati va Python 3 kerak bo‘ladi. Quyidagi kod Python standart kutubxonasi va HTTP’dan foydalanadi, shuning uchun o‘rnatilgan SDK versiyangiz ahamiyatga ega emas. Kalit ANTHROPIC_API_KEY muhit o‘zgaruvchisi orqali uzatiladi; uni dastur matniga yoki suhbatga joylamang.

API tayyor Anthropic ko‘nikmalarini taklif qiladi: taqdimotlar uchun pptx, elektron jadvallar uchun xlsx, Word hujjatlari uchun docx va PDF’lar uchun pdf. Ular type: "anthropic" orqali ulanadi. Ushbu qo‘llanmada maxsus ko‘nikma yuklamasdan, tayyor ko‘nikma ishlatiladi.

Ushbu material tayyorlangan paytda ochilgan rasmiy tezkor qo‘llanma claude-opus-5-5 modeli va code_execution_20260521 vositasi juftligidan foydalanadi. Quyida ham shu juftlik ishlatiladi. Ushbu misol hujjatlar bilan solishtirib tekshirilgan; u pulli API so‘rovi bajarilgani haqida hisobot emas.

Qaysi beta sarlavhalari kerak

Misol tezkor qo‘llanmadagi joriy HTTP shartlariga amal qiladi: sarlavhalar x-api-key, anthropic-version: 2023-06-01 va content-type: application/json; anthropic-beta yuborilmaydi. Hujjatlarning turli avlodlaridan olingan model, murojaat qilish usuli va javob formatini o‘zaro aralashtirmang.

Files API hujjatlarida API beta bosqichidan chiqqani ham aytilgan. Eski files-api-2025-04-14 sarlavhasi eski javob formatlarini saqlab qoladi; sarlavhani olib tashlash ularni joriy formatlarga o‘tkazadi. Shu sababli client.beta.files ishlatilgan eski misolni yangisi bilan shunchaki birlashtirib bo‘lmaydi.

Bu yerda mavjud xizmatni eski beta shartlaridan ko‘chirmayapmiz. Agar sizda shunday xizmat allaqachon bo‘lsa, avval uning sarlavhalari va javob formatlarini tekshiring. SDK usuli nomida beta so‘zi borligining o‘zi yetarli emas: Files API hujjatlarida SDK’ning turli versiyalari qanday ishlashi alohida tushuntirilgan.

Taqdimot yarating va faylni yuklab oling

Misol qayta tiklanuvchi energiya haqida beshta slayd yaratish vazifasini yuboradi, javobning to‘liq nusxasini skill-response.json fayliga saqlaydi va keyin yaratilgan fayllar ID’larini ajratib oladi. Saqlash yo‘lini model javobidan olmaydi: fayllar yangi mahalliy skill-output jildiga saqlanadi. Agar bu jild allaqachon mavjud bo‘lsa, oldingi natijani ustiga yozmaslik uchun dastur to‘xtaydi. Jild API so‘rovidan oldin yaratiladi, shuning uchun muvaffaqiyatsiz chaqiruvdan keyin ham qoladi. Qayta harakatdan avval shu urinishni tekshirib saqlang; qayta ishga tushirish o‘tishi uchungina uni o‘chirmang.

import json
import os
from pathlib import Path
from urllib.error import HTTPError
from urllib.request import Request, urlopen

API = "https://api.anthropic.com/v1"
KEY = os.environ["ANTHROPIC_API_KEY"]
HEADERS = {
    "x-api-key": KEY,
    "anthropic-version": "2023-06-01",
    "content-type": "application/json",
}

def request(path, payload=None, binary=False):
    data = None if payload is None else json.dumps(payload).encode("utf-8")
    req = Request(API + path, data=data, headers=HEADERS)
    try:
        with urlopen(req, timeout=600) as result:
            body = result.read()
    except HTTPError as error:
        try:
            details = json.loads(error.read().decode("utf-8"))
        except (ValueError, UnicodeError):
            details = {}
        info = details.get("error", {})
        request_id = error.headers.get("request-id") or details.get("request_id")
        diagnostic = {
            "http_status": error.code,
            "request_id": request_id,
            "error_type": info.get("type"),
            "message": str(info.get("message", "No JSON error message")).replace(KEY, "[REDACTED]")[:1000],
        }
        (out / "skill-error.json").write_text(
            json.dumps(diagnostic, ensure_ascii=False, indent=2), encoding="utf-8"
        )
        raise RuntimeError(
            f"Claude API HTTP {error.code}; request_id={request_id}; inspect skill-error.json"
        ) from None
    return body if binary else json.loads(body)

out = Path("skill-output")
out.mkdir(exist_ok=False)
response = request("/messages", {
    "model": "claude-opus-5-5",
    "max_tokens": 16000,
    "container": {
        "skills": [{"type": "anthropic", "skill_id": "pptx", "version": "latest"}]
    },
    "messages": [{
        "role": "user",
        "content": "Qayta tiklanuvchi energiya haqida men afzal ko‘rgan tilda 5 ta slayddan iborat taqdimot yarating.",
    }],
    "tools": [{"type": "code_execution_20260521", "name": "code_execution"}],
})
(out / "skill-response.json").write_text(
    json.dumps(response, ensure_ascii=False, indent=2), encoding="utf-8"
)
print("stop_reason:", response.get("stop_reason"))

file_ids = []
for block in response["content"]:
    if block["type"] == "bash_code_execution_tool_result":
        result = block["content"]
        if result["type"] == "bash_code_execution_result":
            for item in result["content"]:
                file_id = item.get("file_id")
                if file_id and file_id not in file_ids:
                    file_ids.append(file_id)
if not file_ids:
    raise RuntimeError("No generated file_id; inspect skill-response.json")

for index, file_id in enumerate(file_ids, start=1):
    from urllib.parse import quote
    file_path = "/files/" + quote(file_id, safe="")
    metadata = request(file_path)
    if metadata.get("downloadable") is not True:
        raise RuntimeError("This file cannot be downloaded through Files API")
    target = out / f"result-{index}.pptx"
    target.write_bytes(request(file_path + "/content", binary=True))
    print("Saved:", target)

result-1.pptx va hokazo nomlar ushbu taqdimot vazifasi uchun tanlangan. Fayl kengaytmasi uning ichida nima borligini tasdiqlamaydi: yuklab olingan hujjatni ochib, uning formati, slaydlar soni va matnini tekshiring. Faqat HTTP 200 javobini yoki file_id mavjudligini muvaffaqiyatli natija deb qabul qilmang.

Dastur javobning to‘xtash sababi bo‘lgan stop_reason qiymatini chiqaradi va tekshirish uchun to‘liq javobni saqlaydi. U suhbatni davom ettirmaydi va pulli so‘rovni avtomatik ravishda takrorlamaydi. Yuklab olingan fayl borligi butun vazifa bajarilganini anglatmaydi: yana so‘rov yuborish kerakmi, degan qarorga kelishdan oldin saqlangan javob va hujjatning o‘zini tekshiring.

Urinish xato tugasa, mavjud bo‘lsa skill-error.json’ni tekshiring. Unda HTTP holati, berilgan so‘rov ID’si va sozlangan API kaliti chiqarib tashlangan cheklangan provayder xabari saqlanadi. Ulashishdan oldin xabarda boshqa shaxsiy ma’lumot borligini tekshiring. Autentifikatsiya, ruxsat/model, to‘lov limiti va so‘rov formati xatolarini rasmiy xatolar ma’lumotnomasi bilan solishtiring; har xato yangi pulli generatsiyani talab qilmaydi.

skill-response.json’da yaratilgan file_id qiymatlari bo‘lsa va faqat yuklab olish uzilgan bo‘lsa, javobni saqlang va o‘sha ruxsat etilgan workspace kirishi bilan metadata hamda yuklab olishni tekshiring. Bor natijani olish uchungina generatsiyani qaytarmang. So‘rov natijasi noma’lum bo‘lsa, ID’sini saqlab, yangi generatsiyadan oldin holatini aniqlang. Yangi generatsiya zarur deb topilgandan keyingina band bo‘lmagan yo‘lni tanlang, masalan out = Path("skill-output-attempt-2"), va exist_ok=False’ni saqlang. Yangi jild mahalliy ustiga yozishdan himoya qiladi, lekin takroriy to‘lovni o‘zi to‘xtatmaydi. FileExistsError mahalliy jild to‘qnashuvi, API javobi emas.

Fayllar uchun qanday ruxsatlar kerak

Files API fayllarni ilovangizning alohida foydalanuvchisi yoki suhbatga emas, ish maydoniga bog‘laydi. Hujjatlarga ko‘ra, shu ish maydoniga kirish huquqi bo‘lgan har qanday API kaliti undagi fayllarga kira oladi. Misolda yaratish va yuklab olish uchun bir xil kalit ishlatiladi. Yakuniy foydalanuvchilar yoki boshqa ishonchsiz manbalardan file_idni hech qachon qabul qilmang. Bu ID’larni serverda saqlang va o‘z ilovangizda foydalanuvchilar bilan fayllar o‘rtasidagi moslikni yuriting.

Fayl metama’lumotlarini alohida tekshiring: unda downloadable: true bo‘lishi kerak. Hujjatlarda ko‘nikmalar yoki kodni bajarish vositasi yaratgan fayllarni yuklab olishga ruxsat berilgan; siz yuklagan fayllarda downloadable: false bo‘ladi va ularni yuklab olishga urinish 400 xatosini qaytaradi. Ish maydoniga kirish huquqi va muayyan faylni yuklab olish imkoniyati alohida talablar hisoblanadi.

Ko‘p foydalanuvchili ilova uchun Files API hujjatlarida fayllarni ajratib turish chegarasi sifatida har bir mijozga alohida ish maydoni tavsiya etiladi. Bu tavsiya aynan fayllarga taalluqli; tegishli API’ni tekshirmasdan uni barcha obyektlar va ruxsatlarga tatbiq qilmang.

Tayyor va maxsus ko‘nikmalar

Tayyor ko‘nikmalarning ID’lari pptx, xlsx, docx va pdf. Ko‘nikmalar ro‘yxati ma’lumotnomasida custom manbasi ish maydoniga xos, anthropic esa umumiy va faqat o‘qish uchun deb ta’riflangan.

Birinchi misoldagi version: "latest" ko‘nikmaning e’lon qilingan eng so‘nggi versiyasini anglatadi. Takrorlanuvchi integratsiya uchun bu tanlov o‘zgarishi mumkinligini yodda tuting; belgilangan versiyaga o‘tish uchun misoldan o‘ylab topilgan ID’ni emas, foydalanayotgan ko‘nikmaning mavjud versiyasini tanlash kerak.

Cheklovlar va keyingi qadam

Misol faqat tayyor ko‘nikma yordamida taqdimot yaratish va uni yuklab olishni qamrab oladi. Maxsus ko‘nikmalarni yuklash, ularni o‘chirish va uchinchi tomon xizmatlariga kirish bu yerda sinovdan o‘tkazilmagan. Bu vazifalar tegishli API’ni alohida tekshirishni talab qiladi.

Agar vazifangiz Claude interfeysidagi fayllar bilan bog‘liq bo‘lsa, Claude’ga faylni qanday yuklash haqida alohida qo‘llanma bor. To‘g‘ridan-to‘g‘ri murojaatlar uchun API tokenlaridan foydalanishni qanday hisoblash bo‘yicha ko‘rsatmaga qarang. Terminal agentida ishlash uchun esa Claude Code ko‘nikmalarini qanday tanlash bo‘yicha qo‘llanmani o‘qing: ular boshqacha usulda ulanadi.

Birinchi tekshiruv uchun bitta tayyor pptx ko‘nikmasi yetarli: javobni tekshiring, yuklab olishga ruxsat berilgan faylni yuklab oling va oching. Mijozlar o‘rtasida maxsus ko‘nikmalar hamda kirish huquqini ajratishni shu tekshiruvdan keyin qo‘shing.

Tayyor bo‘lsangiz, Ailoot bilan tanishing.

Batafsil

Ko‘p beriladigan savollar

Nega file_id taqdimotni tayyor deb hisoblashga yetmaydi?

ID faqat fayl qaytarilganini bildiradi. Metama’lumotda downloadable: true borligini tekshiring, ish maydoniga kirish huquqi bilan yuklab oling va ochib fayl formati, slaydlar soni hamda matnini tekshiring.

Claude Files API’ga yuklangan har qanday faylni qayta yuklab olsa bo‘ladimi?

Yo‘q. Qo‘llanmada downloadable: true belgili yaratilgan fayllar va downloadable: false belgili yuklangan fayllar ajratilgan. Ish maydoniga kirish va muayyan faylni yuklab olish ruxsati alohida tekshiruvlardir. Yakuniy foydalanuvchidan istalgan fayl ID’sini qabul qilmang.

Barcha maqolalar