afai.agent.json — manifest

Manifest — 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.


1. Minimal manifest


{
  "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" }]
}

2. Maydonlar

Asosiy

MaydonTurMajburiyIzoh
manifest_versionint✓Hozircha 1
idstring✓kompaniya.agent — kichik harf, raqam, -, .
versionsemver✓1.2.0. O'zgarmas — har o'zgarishda oshiring
namematn yoki {uz,ru,en}✓
summarymatn yoki obyekt✓Marketplace kartasida chiqadi
descriptionmatn yoki obyektTo'liq tavsif
categoriesstring[]Marketplace filtri
i18nstring[]Qo'llab-quvvatlanadigan tillar

runtime — agent qayerda ishlaydi

webhook — 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 sozlamalar

Manifestdan 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 }
      }
    }
  }
]
MaydonQiymatlarIzoh
namesnake_caseTakrorlanmasin
descriptionmatnModelga yoziladi — qachon ishlatishni tushuntiring
riskread \write \dangerous
confirmnever \dangerous \alwaysQachon 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:

locationQayerda ko'rinadi
agent.pageAgentning to'liq sahifasi
dashboard.cardBosh sahifadagi karta
workspace.sidebarO'ng paneldagi yon oyna
chat.panelSuhbat yonidagi panel
settings.tabSozlamalar ichidagi tab
office.deskPiksel 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.


3. Versiyalash

  • Versiyalar o'zgarmas: bir marta e'lon qilingan 1.0.0 ni qayta
  • yuklab bo'lmaydi.

  • Yangi versiya eski mijozlarni avtomatik ko'chirmaydi —
  • Installation.agent_version_id o'z versiyasida qoladi.

  • Yangi versiya yangi scope so'rasa, mijoz qo'shimcha consent ekranini ko'radi.
  • 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.


    4. To'liq namuna

    examples/hello-agent/afai.agent.json — barcha bo'limlar ishlatilgan, testlar uni har safar tekshiradi (tests/test_manifest.py).