Pemanggilan
js
aksi: {
gunakan: "utility.text.uppercase",
input: {
text: "{command.args}"
},
simpan: "hasil"
}js
const hasil = await capability.run(
"utility.text.uppercase",
{ input: { text: command.args } }
)
balas(hasil.text)Built-in capability saat ini
| Capability | Output |
|---|---|
| utility.text.uppercase | { text } uppercase |
| utility.text.lowercase | { text } lowercase |
Manifest capability
js
{
id: "ai.chat",
name: "AI Chat",
version: "1.0.0",
plugin: "pn3kn-ai",
permissions: [],
credential: {
required: true,
type: "AI_PROVIDER",
fields: ["apiKey"]
}
}Error handling declarative
js
aksi: {
gunakan: "media.sticker",
input: { sumber: "{media}" },
simpan: "hasil",
simpanError: "stickerError",
gagal: {
pesan: "Sticker gagal dibuat.",
ke: "$selesai"
}
}Jika capability gagal dan `gagal` tidak ditentukan, error diteruskan ke runtime. Jika `gagal` tersedia, flow dapat membalas dan/atau transition.
Output safety
Capability output harus JSON-safe, tidak circular, tidak mengandung function/symbol/bigint/binary mentah, kedalaman dibatasi, dan serialized output dibatasi 512 KB.
Typed contract & runtime policy
Capability trusted dapat mendeklarasikan schema input/output dan runtime policy. Flow tetap memakai aksi yang sama; scheduler menentukan apakah action aman dijalankan realtime atau harus dipindahkan ke capability job worker.
js
{
id: "media.sticker",
input: {
type: "object",
required: ["sumber"],
properties: { sumber: { type: "object" } }
},
runtime: {
execution: "job",
resourceClass: "heavy",
timeoutMs: 45000,
retry: { maxAttempts: 1, backoffMs: 250 }
}
}- realtime: action ringan berjalan langsung pada Automation Worker.
- job: action berat masuk queue Capability Worker agar event loop command/session tetap ringan.
- Schema invalid ditolak dengan error runtime standar sebelum handler plugin menjalankan logic.
- Credential tetap didekripsi hanya di backend saat capability dijalankan.