Skill Development Guide

March 7, 2026 · View on GitHub

This guide explains how to create a new skill for the DeepCamera skill catalog.

What is a Skill?

A skill is a self-contained folder that provides an AI capability to SharpAI Aegis. Skills communicate with Aegis via JSON lines over stdin/stdout.

Skill Structure

skills/<category>/<skill-name>/
├── SKILL.md              # Manifest + setup instructions
├── config.yaml           # Configuration schema for Aegis UI
├── deploy.sh             # Zero-assumption installer
├── requirements.txt      # Default Python dependencies
├── requirements_cuda.txt # NVIDIA GPU dependencies
├── requirements_rocm.txt # AMD GPU dependencies
├── requirements_mps.txt  # Apple Silicon dependencies
├── requirements_cpu.txt  # CPU-only dependencies
├── scripts/
│   └── main.py           # Entry point
├── assets/
│   └── icon.png          # 64×64 icon (optional)
└── tests/
    └── test_main.py      # Tests (optional)

SKILL.md Format

The SKILL.md file has two parts:

  1. YAML frontmatter — machine-readable parameters and capabilities
  2. Markdown body — human/LLM-readable setup instructions
---
name: my-skill
description: "What this skill does"
version: 1.0.0

parameters:
  - name: model
    label: "Model"
    type: select
    options: ["option1", "option2"]
    default: "option1"
    group: Model

capabilities:
  my_capability:
    script: scripts/main.py
    description: "What this capability does"
---

# My Skill

Description of the skill.

## Setup

Step-by-step setup instructions that SharpAI Aegis's
LLM agent can read and execute.

Parameter Types

TypeRenders AsExample
stringText inputEmail, URL, API key
passwordMasked inputPasswords, tokens
numberNumber input with min/maxConfidence threshold
booleanToggle switchEnable/disable feature
selectDropdownModel selection
urlURL input with validationServer address
camera_selectCamera pickerTarget cameras

config.yaml — Configuration Schema

Defines user-configurable options shown in the Aegis Skills UI. Parsed by parseConfigYaml().

params:
  - key: auto_start
    label: Auto Start
    type: boolean
    default: false
    description: "Start automatically on Aegis launch"

  - key: model_size
    label: Model Size
    type: select
    default: nano
    description: "Choose model variant"
    options:
      - { value: nano, label: "Nano (fastest)" }
      - { value: small, label: "Small (balanced)" }

  - key: confidence
    label: Confidence
    type: number
    default: 0.5
    description: "Min confidence (0.1–1.0)"

Reserved Keys

KeyTypeBehavior
auto_startbooleanAegis auto-starts the skill on boot when true

deploy.sh — Zero-Assumption Installer

Bootstraps the environment from scratch. Must handle:

  1. Find Python — check system → conda → pyenv
  2. Create venv — isolated .venv/ inside skill directory
  3. Detect GPU — CUDA → ROCm → MPS → CPU fallback
  4. Install deps — from matching requirements_<backend>.txt
  5. Verify — import test

Emit JSONL progress for Aegis UI:

echo '{"event": "progress", "stage": "gpu", "backend": "mps"}'
echo '{"event": "complete", "backend": "mps", "message": "Installed!"}'

Environment Variables

Aegis injects these into every skill process:

VariableDescription
AEGIS_SKILL_IDSkill identifier
AEGIS_SKILL_PARAMSJSON string of user config values
AEGIS_GATEWAY_URLLLM gateway URL
AEGIS_VLM_URLVLM server URL
AEGIS_LLM_MODELActive LLM model name
AEGIS_VLM_MODELActive VLM model name
PYTHONUNBUFFEREDSet to 1 for real-time output

JSON Lines Protocol

Scripts communicate with Aegis via stdin/stdout. Each line is a JSON object.

Script → Aegis (stdout)

{"event": "ready", "model": "...", "device": "..."}
{"event": "detections", "camera_id": "...", "objects": [...]}
{"event": "error", "message": "...", "retriable": true}

Aegis → Script (stdin)

{"event": "frame", "camera_id": "...", "frame_path": "...", "timestamp": "..."}
{"command": "stop"}

Categories

CategoryDirectoryUse For
detectionskills/detection/Object detection, person recognition
analysisskills/analysis/VLM scene understanding, offline analysis
transformationskills/transformation/Depth estimation, style transfer
annotationskills/annotation/Dataset labeling, COCO export
camera-providersskills/camera-providers/Blink, Eufy, Ring, Reolink, Tapo
streamingskills/streaming/RTSP/WebRTC via go2rtc
channelsskills/channels/Messaging: Matrix, LINE, Signal
automationskills/automation/MQTT, webhooks, HA triggers
integrationsskills/integrations/Home Assistant bridge

Testing Locally

# Test your skill without Aegis by piping JSON:
echo '{"event": "frame", "camera_id": "test", "frame_path": "/tmp/test.jpg"}' | python scripts/main.py

skills.json — Catalog Registration

Register skills in the repo root skills.json:

{
  "skills": [
    {
      "id": "my-skill",
      "name": "My Skill",
      "description": "What it does",
      "category": "detection",
      "tags": ["tag1"],
      "path": "skills/detection/my-skill",
      "status": "testing",
      "platforms": ["darwin-arm64", "linux-x64"]
    }
  ]
}

Status Values

StatusEmojiMeaning
readyProduction-quality, tested
testing🧪Functional, needs validation
experimental⚗️Proof of concept
planned📐Not yet implemented

Reference

See skills/detection/yolo-detection-2026/ for a complete working example.