Zero Boilerplate
Mulai dengan satu file YAML. Tidak perlu framework atau dependency tambahan.
Buat, publikasikan, dan distribusikan custom skill untuk AI Agent ConAI. Skill Pack SDK memungkinkan developer memperluas kemampuan AI Agent dengan logika bisnis kustom — tanpa mengubah core platform.
Mulai dengan satu file YAML. Tidak perlu framework atau dependency tambahan.
Skill Pack bisa di-install, di-update, dan di-uninstall tanpa restart Agent.
Setiap skill berjalan di sandbox terisolasi dengan permission boundary yang ketat.
Mulai dari nol ke Skill Pack yang siap publikasi dalam 5 langkah.
npm install -g @conai/cliconai sdk init my-skill-packmanifest.yaml dan tulis skill logic di src/index.tsconai sdk test --localconai sdk publishStruktur default yang di-generate oleh conai sdk init.
my-skill-pack/ ├── manifest.yaml # Metadata, permissions, triggers ├── src/ │ ├── index.ts # Entrypoint — handler utama │ ├── handlers/ # Handler per trigger type │ │ ├── keyword.ts # Handler untuk keyword trigger │ │ ├── intent.ts # Handler untuk intent trigger │ │ └── schedule.ts # Handler untuk scheduled trigger │ └── utils/ # Helper functions │ └── api-client.ts # HTTP client wrapper ├── tests/ │ ├── unit.test.ts # Unit tests │ └── integration.test.ts # Integration tests (sandbox) ├── conai.config.ts # SDK configuration ├── package.json └── README.md
Setiap Skill Pack harus memiliki file manifest.yaml di root project.
| Field | Tipe | Required | Deskripsi |
|---|---|---|---|
name | string | Ya | Nama unik skill pack (lowercase, dash-case, max 64 chars) |
version | semver | Ya | Versi semantic versioning (e.g. 1.2.0) |
description | string | Ya | Deskripsi singkat maksimal 256 karakter |
author | string | Ya | Nama atau organisasi pembuat skill |
license | string | Opsional | SPDX license identifier (default: MIT) |
entrypoint | string | Ya | Path ke file utama skill (e.g. src/index.ts) |
permissions | string[] | Ya | Daftar permission yang dibutuhkan (network, database, http, filesystem) |
triggers | Trigger[] | Ya | Daftar trigger: keyword, intent, schedule, webhook, atau manual |
parameters | Parameter[] | Opsional | Definisi parameter konfigurasi yang bisa diisi user |
dependencies | string[] | Opsional | Skill pack lain yang menjadi dependency |
min_platform_version | semver | Opsional | Versi minimum ConAI platform yang dibutuhkan |
tags | string[] | Opsional | Tag untuk discoverability di Marketplace |
# manifest.yaml
name: isp-troubleshoot
version: 1.0.0
description: "Skill Pack untuk troubleshooting ISP — cek bandwidth, latency, dan status ONU."
author: "ConAI Engineering"
license: MIT
entrypoint: src/index.ts
permissions:
- network:http
- database:read
- secret:access
triggers:
- type: keyword
keywords: ["cek bandwidth", "troubleshoot", "status onu"]
- type: intent
intent: "network_diagnostics"
parameters:
- name: mikrotik_host
type: string
required: true
description: "Hostname atau IP MikroTik router"
- name: customer_pppoe
type: string
required: false
description: "Username PPPoE pelanggan untuk cek spesifik"
tags:
- isp
- troubleshooting
- mikrotik
- network
min_platform_version: "2.0.0"Setiap skill handler mengekspor fungsi execute() yang menerima context dan parameters.
// src/index.ts
import { SkillContext, SkillResponse } from "@conai/sdk";
export async function execute(
ctx: SkillContext,
params: Record<string, unknown>
): Promise<SkillResponse> {
const { mikrotik_host, customer_pppoe } = params;
// Invoke ConAI Provisioning API untuk cek bandwidth
const bandwidth = await ctx.api.get(
`${mikrotik_host}/rest/interface/pppoe-active`,
{ headers: ctx.auth.mikroTikHeaders() }
);
const activeSessions = bandwidth.data.filter(
(s: { name: string }) =>
!customer_pppoe || s.name === customer_pppoe
);
return {
status: "success",
message: `Ditemukan ${activeSessions.length} sesi aktif.`,
data: { sessions: activeSessions },
suggest_runbook: activeSessions.length === 0
? "isp-onu-reboot"
: undefined,
};
}Setiap Skill Pack harus mendeklarasikan permission yang dibutuhkan. Permission dievaluasi saat installasi dan saat runtime.
| Permission | Scope | Risk Level |
|---|---|---|
network:http | HTTP request ke endpoint eksternal | Medium |
network:websocket | Koneksi WebSocket real-time | Medium |
database:read | Baca data dari database pelanggan | Low |
database:write | Tulis/update data ke database pelanggan | High |
filesystem:read | Baca file dari workspace terisolasi | Low |
filesystem:write | Tulis file ke workspace terisolasi | Medium |
agent:invoke | Invoke agent/skill lain secara internal | Medium |
secret:access | Akses environment variables tersimpan | High |
Manage Skill Packs melalui REST API. Semua request memerlukan API key di header.
| Method | Endpoint | Deskripsi |
|---|---|---|
| POST | /api/v1/sdk/packs | Upload & publikasi Skill Pack baru |
| GET | /api/v1/sdk/packs | List semua Skill Pack yang tersedia |
| GET | /api/v1/sdk/packs/:id | Detail Skill Pack berdasarkan ID |
| PUT | /api/v1/sdk/packs/:id | Update metadata Skill Pack |
| DELETE | /api/v1/sdk/packs/:id | Hapus Skill Pack dari registry |
| POST | /api/v1/sdk/packs/:id/install | Install Skill Pack ke Agent tertentu |
| DELETE | /api/v1/sdk/packs/:id/install | Uninstall Skill Pack dari Agent |
| POST | /api/v1/sdk/packs/:id/test | Jalankan test suite Skill Pack di sandbox |
| Code | HTTP Status | Deskripsi |
|---|---|---|
PACK_NOT_FOUND | 404 | Skill Pack dengan ID/name tidak ditemukan |
INVALID_MANIFEST | 400 | manifest.yaml tidak valid atau field required hilang |
VERSION_CONFLICT | 409 | Versi yang di-upload sudah ada di registry |
PERMISSION_DENIED | 403 | Skill Pack meminta permission yang tidak diizinkan |
SANDBOX_VIOLATION | 422 | Skill Pack melanggar sandbox boundary saat test |
QUOTA_EXCEEDED | 429 | Batas upload Skill Pack per hari tercapai |
DEPENDENCY_MISSING | 422 | Dependency Skill Pack tidak ditemukan di registry |
PLATFORM_INCOMPATIBLE | 422 | Skill Pack memerlukan versi platform yang lebih baru |
Satu Skill Pack = satu domain masalah. Jangan buat Skill Pack yang menangani terlalu banyak hal.
Deklarasikan hanya permission yang benar-benar dibutuhkan. Ini meningkatkan trust dan mempercepat review.
Pastikan handler bisa dipanggil berulang dengan input yang sama tanpa side effect ganda.
Selalu return SkillResponse dengan status, message, dan data. Ini memudahkan agent reasoning.
Ikuti semver: patch untuk fix, minor untuk fitur baru, major untuk breaking changes.
Sertakan README.md dengan contoh penggunaan, parameter, dan expected output.
Butuh bantuan?
Ikuti workshop interaktif kami di Documentation Hub atau hubungi tim developer relations di [email protected].