Skip to content

Skills (tools)

Un skill es una capacidad autocontenida que el LLM puede invocar. El framework de skills auto-deriva el registro de tool para el LLM, la API HTTP, el formulario UI, el gate de permisos y el audit log a partir de un único struct de metadata — añadir un skill nuevo significa escribir un archivo y llamar a Register en init().

Los skills son L2 (device-direct) cuando corren en un agente de edge, L3 (intelligence) cuando corren en el manager. Ambos son first-class.

Anatomía

Cada skill trae:

go
// internal/skill/types.go:99
type Metadata struct {
    Key          string   // lower_snake — id in dedupe keys, audit logs, LLM tool names
    Name         string   // human label
    Description  string   // shown to humans AND to the LLM
    Class        Class    // safe | mutating | dangerous
    Scope        Scope    // host (default) | manager
    Category     string   // free-form group label
    Params       ParamSchema
    ResultPreview string
}

Más un Executor:

go
type Executor interface {
    Metadata() Metadata
    Execute(ctx context.Context, params json.RawMessage) (json.RawMessage, error)
}

El framework hace dispatch basado en Scope:

  • ScopeHost — el manager envuelve la llamada en un RPC de túnel (Caller.Call(ctx, edgeID, "execute_skill", body)), el único handler execute_skill del agente edge hace dispatch por key. El wrapper de tool del LLM inyecta una propiedad entera edge_id requerida en el schema.
  • ScopeManager — corre in-process. Sin edge_id; útil para llamadas a internet público (web_search), APIs externas, packs de skills por subproceso.

Clases de permisos

Integradas en la metadata para que el gate corra en cada invocación, no como un bolt-on:

ClaseEjemplosQuién puede invocar
safeprobe_*, read_file, tail_file, query_promqlLLM, cualquier rol
mutatingrestart_service, kill_processRequiere aprobación human-in-the-loop (parqueado, pero el gate existe)
dangerousrm, reboot, drop_tableRequiere SOP firmado RSA + aprobación dual (parqueado)

La clase default es safe — pero el framework registra un warning en tiempo de registro cuando un autor olvida setear el campo, así que esto no puede colarse silenciosamente. Ver types.go:205.

El skill_bridge.go en el registry de tools de aiops actualmente solo expone skills ClassSafe al LLM — ver skill_bridge.go. Las clases mutating y dangerous esperan al workflow de aprobación PR-G4.

Las tres poblaciones de skills

Builtins Go (edge)

Escritos a mano en internal/skill/builtin/:

KeyQué
probe_http, probe_dns, probe_tcpAlcanzabilidad de red de solo lectura
tail_file, read_journalSuperficie de log
host_netns_inspectInventario de network namespace
web_searchLado del manager; SearXNG default, configurable
restart_serviceMutating; gated

Cada uno es un archivo Go con init() llamando a skill.Register. El binario del edge trae cada builtin horneado — sin install de plugin, sin superficie de ejecución de código remoto.

Packs de skills por subproceso

Para capacidades que quieras dropear sin recompilar el agente edge, distribuye un directorio con un manifest skill.json y un ejecutable. El loader en internal/skill/subprocess.go lee el manifest, registra el skill, hace dispatch de Execute al binario con params por stdin.

Usado para: tools de research de red (ovs-vsctl, nft, bpftool, ethtool, ip netns), helpers de inspect de Kubernetes — cualquier cosa donde el binario ya existe y shellear le gana a reescribirlo en Go.

BaseTools del lado del manager

La población más grande. Viven bajo internal/manager/biz/aiops/tools/ como archivos *_basetool.go. Cada uno lleva su propio JSON Schema escrito a mano (necesario para formas que el ParamSchema declarativo no puede expresar: arrays, objetos anidados, oneOf).

BaseTools seleccionados:

ToolQué hace
bashShell en un edge target (gated; grabado)
query_promql, query_logql, query_traceqlLos tres backends de observabilidad
query_incidents, get_incident_detail, query_alert_rulesSuperficie de alerting
query_edges, query_change_eventsInventario + audit
correlate_incidentFan-out compuesto a prom + log + trace
expand_topology, find_topology_node, get_topologyGrafo
query_knowledgeRAG
find_outlier_edges, rank_edgesComparación multi-host
host_load, host_processes, host_filesTools batch de estado de host
get_edge_summarySnapshot one-shot de salud de edge
restart_serviceWrapper del lado del manager alrededor del skill restart del edge
send_messageComms coordinator → specialist agent
task_stop, agent_toolCiclo de vida del worker

Cerca de 30+ en total. La lista completa es lo que esté registrado en BuildBaseTools en cmd/ongrid/main.go.

El inventory bridge

Dos registries paralelos existían antes del bridge:

  • El skill registry — builtins Go ScopeHost + packs por subproceso. Mostrado en la página /skills de la SPA con audit + gate de clase.
  • El bag de BaseTools — tools del lado del manager escritos a mano. Mostrados al LLM pero NO a /skills.

Los operadores no podían ver qué capacidades cloud-side tenía realmente el agente sin leer el código fuente. El inventory_bridge.go recorre el bag de BaseTool y registra cada tool como un skill con Scope=ScopeManager. La interfaz opt-in RawSchemaProvider se usa para preservar el JSON Schema escrito a mano de cada BaseTool verbatim.

Según el memo del 2026-05-08, 18 BaseTools son puenteados a través de esta ruta — la página /skills ahora lista cada capacidad cloud-side con un chip de scope que indica edge vs manager.

El bridge inverso también está cableado: skill_bridge.go toma cada skill safe y lo registra como un Tool cara-al-LLM, así que el LLM ve los skills como tools de function-calling con un parámetro edge_id auto-antepuesto para los ScopeHost.

Audit

Cada invocación de tool escribe una fila a chat_tool_calls:

  • session_id — la sesión de chatruntime que llamó.
  • tool_name, args_json, result_json, error.
  • device_id — cuando el tool apuntó a un host específico (el campo EdgeID en ExecuteResult).
  • started_at, finished_at, duration_ms.
  • caller_user_id + caller_role — para llamadas originadas por el LLM, el framework usa UserID=0 / Role="system".

El audit log de HLD-010 se sube sobre la misma tabla; la página admin /admin/audit la renderiza con timeline + filtros por-tool.

Ver también

  • WebShell — el skill bash expresado como una terminal interactiva en vez de una llamada de tool one-shot. Mismo sustrato de audit.
  • Conocimiento — deep dive de query_knowledge.
  • Topologíaexpand_topology / find_topology_node.
  • Skill manifest — wire format para packs de skills por subproceso.