afai.agent.json — manifestManifest — agentning e'loni: nima qila oladi, nimaga ruxsat kerak, qayerda ko'rinadi. Platforma faqat shu yerda e'lon qilingan narsaga ruxsat beradi.
Tekshirish (hisobsiz — kalit ham, hisob ham kerak emas, CI'da ham ishlaydi):
curl -X POST $AFAI_BASE_URL/api/v1/dev/manifest/validate \
-H "Content-Type: application/json" -d @afai.agent.json
Har bir xato path, message va fix bilan qaytadi.
{
"manifest_version": 1,
"id": "acme.invoice-bot",
"version": "1.0.0",
"name": "Invoice Bot",
"summary": "Suhbatdagi xabarlardan hisob-faktura yasaydi",
"runtime": { "type": "webhook", "endpoint": "https://acme.uz/afai" },
"triggers": [{ "type": "manual" }]
}
| Maydon | Tur | Majburiy | Izoh |
manifest_version | int | ✓ | Hozircha 1 |
id | string | ✓ | kompaniya.agent — kichik harf, raqam, -, . |
version | semver | ✓ | 1.2.0. O'zgarmas — har o'zgarishda oshiring |
name | matn yoki {uz,ru,en} | ✓ | |
summary | matn yoki obyekt | ✓ | Marketplace kartasida chiqadi |
description | matn yoki obyekt | To'liq tavsif | |
categories | string[] | Marketplace filtri | |
i18n | string[] | Qo'llab-quvvatlanadigan tillar |
runtime — agent qayerda ishlaydiwebhook — kod sizning serveringizda (ko'pchilik shuni tanlaydi):
"runtime": {
"type": "webhook",
"endpoint": "https://acme.uz/afai",
"timeout_ms": 30000
}
endpoint HTTPS bo'lishi shart (ishlab chiqishda http://localhost:* mumkin). timeout_ms: 1000–120000. Uzoqroq ish uchun 202 qaytaring va keyin /runs/{id}/complete chaqiring.
inline — kod umuman yozmaysiz:
"runtime": {
"type": "inline",
"prompt": "Sen buxgalteriya yordamchisisan. Foydalanuvchi so'rovidan hisob-faktura ma'lumotlarini ajratib ol va notify_user bilan xabar ber.",
"allowed_tools": ["workspace_info", "notify_user"],
"model": "default"
}
Platforma modelni o'zi chaqiradi va faqat allowed_tools dagi tool'larni beradi. Server ko'tarmaysiz, imzo tekshirmaysiz.
hosted — kodingiz bizning sandbox'da (v1.2 da to'liq ishlaydi).
scopes
"scopes": ["workspace:read", "runs:write", "chat:write"]
Bu yerdagilar integratsiyaning requested_scopes idan oshmasligi kerak. Ro'yxat: GET /oauth/scopes. Minimalini so'rang — consent ekranida har bir ruxsat odam tilida ko'rinadi, ortiqchasi o'rnatishdan qaytaradi.
config — mijozdan olinadigan sozlamalarManifestdan avtomatik forma yasaladi:
"config": [
{
"key": "api_key",
"type": "secret",
"label": { "uz": "API kaliti", "en": "API key" },
"help": { "uz": "Hisobingizdagi Sozlamalar → API bo'limidan oling" },
"required": true
},
{
"key": "mode",
"type": "select",
"label": "Rejim",
"options": [{ "value": "fast", "label": "Tez" }, { "value": "full", "label": "To'liq" }],
"default": "fast"
}
]
Turlar: string, secret, number, boolean, select, url, textarea.
secret maydonlar shifrlangan holda saqlanadi, UI'da •••••••• bo'lib ko'rinadi va agentga faqat run.execute payloadida ochiq yuboriladi.
tools — agentingiz e'lon qiladigan qobiliyatlar
"tools": [
{
"name": "create_invoice",
"description": "Mijoz uchun hisob-faktura yaratadi. Summa va mijoz nomi aniq bo'lganda ishlating.",
"risk": "write",
"confirm": "dangerous",
"input_schema": {
"type": "object",
"required": ["customer", "amount"],
"properties": {
"customer": { "type": "string" },
"amount": { "type": "number", "minimum": 0 }
}
}
}
]
| Maydon | Qiymatlar | Izoh | ||
name | snake_case | Takrorlanmasin | ||
description | matn | Modelga yoziladi — qachon ishlatishni tushuntiring | ||
risk | read \ | write \ | dangerous | |
confirm | never \ | dangerous \ | always | Qachon odam tasdiqlaydi |
risk: "dangerous"+confirm: "never"— rad etiladi. Qaytarib
bo'lmaydigan amal tasdiqsiz bajarilmasligi kerak.
triggers — agent qachon ishga tushadi
"triggers": [
{ "type": "manual" },
{ "type": "event", "event": "run.failed" },
{ "type": "schedule", "cron": "0 9 * * *", "input": { "report": "daily" } },
{ "type": "chat" }
]
cron — 5 qismli, tashkilot vaqt mintaqasida (default Asia/Tashkent).
surfaces — AFAI ichidagi UI
"surfaces": [
{ "id": "main", "location": "agent.page", "url": "https://acme.uz/panel", "height": "auto" }
]
Joylar:
location | Qayerda ko'rinadi |
agent.page | Agentning to'liq sahifasi |
dashboard.card | Bosh sahifadagi karta |
workspace.sidebar | O'ng paneldagi yon oyna |
chat.panel | Suhbat yonidagi panel |
settings.tab | Sozlamalar ichidagi tab |
office.desk | Piksel ofisdagi stol |
Sahifa sandbox iframe'da ochiladi. Batafsil: [SURFACES.md](SURFACES.md).
office — piksel ofisga qo'shilish
"office": { "desk_label": "Invoice Bot", "sprite": "analyst", "room": "finance" }
O'rnatilgan agent AFAI'ning virtual ofisida stol egallaydi — mijoz uchun «jonli xodim» bo'lib ko'rinadi. desk_label 24 belgidan oshmasin.
webhooks
"webhooks": { "events": ["run.succeeded", "run.failed"] }
O'rnatishda avtomatik obuna taklif qilinadi. Obunani API orqali ham yaratsa bo'ladi.
1.0.0 ni qaytayuklab bo'lmaydi.
Installation.agent_version_id o'z versiyasida qoladi.
Bu amoCRM'da yo'q va u yerda og'riq: widget yangilanishi barcha mijozlarga bir vaqtda tushadi va biror narsa buzilsa hamma bir vaqtda buziladi.
examples/hello-agent/afai.agent.json — barcha bo'limlar ishlatilgan, testlar uni har safar tekshiradi (tests/test_manifest.py).