Configuration¶
Each agent and skill has its own config/ directory. Configuration travels with the skill — if you install or move a skill, its config goes with it.
Feature Claims
| ID | Claim | Status |
|---|---|---|
| C-NE-12 | nornir/hosts.yaml defines the device inventory for collection |
✅ v0.10.0 |
| C-NE-13 | blacklisted_commands.yaml supports regex patterns; invalid patterns are skipped with a warning |
✅ v0.10.0 |
| C-NE-14 | cron_schedules.yaml customizes the trace_learner cron schedule |
✅ v0.10.0 |
Configuration Architecture¶
.olav/config/ ← Platform (4 files only)
├── api.json # LLM keys, model config
├── api.json.example # Template
├── services.yaml # Registered API services
└── approval_rules.yaml # HITL approval rules
.olav/workspace/
├── netops/config/ ← NetOps orchestrator (shared)
│ ├── blacklisted_commands.yaml # Command blacklist (all sub-agents)
│ └── netops_settings.yaml # General NetOps settings
│
├── netops/collector/config/ ← collector sub-agent (SSH)
│ ├── nornir/
│ │ ├── hosts.yaml # Device inventory
│ │ ├── groups.yaml # Group credentials
│ │ ├── defaults.yaml # Global defaults
│ │ └── config.yaml # Nornir runner settings
│ └── default_commands.yaml # Commands per platform
│
├── netops/analyzer/references/ ← analyzer sub-agent (change-plan drafter)
│ └── *.guide.yaml # Usage guides / expert knowledge
│
├── netops/simulator/references/ ← simulator sub-agent (Batfish)
│ └── *.guide.yaml # Batfish question recipes / guides
│
├── netops/topology/references/ ← topology sub-agent
│ └── *.guide.yaml # Topology recipes / guides
│
└── audit/profiles/ ← Audit agent
├── bgp_health.md # BGP health check profile
└── health_full_drift.md # Full drift audit profile
Principle: Platform config in .olav/config/. Skill config in each skill's directory. No cross-skill config dependencies.
Probe Agent — SSH & Device Collection¶
nornir/hosts.yaml¶
Device inventory. One entry per device.
R1:
hostname: 192.168.100.101
platform: juniper_junos
groups:
- core_routers
R2:
hostname: 192.168.100.102
platform: cisco_ios
groups:
- core_routers
SW1:
hostname: 192.168.100.105
platform: cisco_ios
groups:
- access_switches
Supported platform values: cisco_ios, cisco_nxos, arista_eos, juniper_junos, etc. (NTC-Templates naming)
nornir/defaults.yaml¶
Global SSH credentials used for all devices (unless overridden per host or group).
# Copy the example file and fill in your credentials
cp defaults.yaml.example defaults.yaml
chmod 600 defaults.yaml
username: your_ssh_username
password: your_ssh_password
port: 22
connection_options:
netmiko:
extras:
device_type: cisco_ios
Plain text passwords
Nornir does not support environment variable expansion (${VAR}) in YAML files. Passwords must be written in plain text. Never commit defaults.yaml to version control — it is gitignored by default. Use chmod 600 to restrict file permissions.
nornir/groups.yaml¶
Group-level settings (platform, role). Credentials can be set per group to override defaults:
cisco_ios:
platform: cisco_ios
connection_options:
netmiko:
extras:
device_type: cisco_ios
juniper_junos:
platform: juniper_junos
connection_options:
netmiko:
extras:
device_type: juniper_junos
To use different credentials per group, add username/password fields:
default_commands.yaml¶
Commands run on every device during collection.
NetOps Orchestrator — Shared Config¶
blacklisted_commands.yaml¶
Regex patterns that block command execution across all agents. Even whitelisted commands are rejected if they match.
Invalid patterns are skipped with a warning log.
netops_settings.yaml¶
General NetOps runtime settings.
Infra Agent — API References¶
References are auto-generated by olav registry register. Do not edit manually — re-run register to update after API schema changes.
olav registry register http://netbox:8000 # generates netbox_*_api.md
olav registry register influxdb_netops # generates influxdb_*_api.md
Each reference contains endpoint paths, parameters, and return fields in a condensed format the agent reads as static context.
DevOps Agent — Script References¶
References provide context for script generation:
| File | Purpose |
|---|---|
BASELINE_SCHEMA.md |
Database schema reference for environment discovery |
OLAV_PLATFORM_HEALTH.md |
Platform health check patterns |
Add custom references to teach the DevOps agent about your environment:
# Example: add Ansible patterns
cp my-ansible-guide.md .olav/workspace/devops/references/ansible_patterns.md
The agent loads all files in references/ as static context.
Audit Agent — Profiles¶
Profiles define reusable health checks. Created by the Designer, executed by the Auditor.
olav --agent audit "Create a BGP health check profile"
# → saves to audit/profiles/bgp_health.md
olav --agent audit "Run the bgp_health audit"
# → reads profile, executes SQL, renders Markdown report
Profile format: YAML frontmatter (jobs + queries) + Markdown body (correlation prompt).
Scheduling¶
OLAV manages scheduled tasks via system crontab.
Natural Language Control¶
olav "schedule a daily snapshot at 2am"
olav "show all scheduled jobs"
olav "cancel the weekly audit"
cron_schedules.yaml¶
Declarative schedule definitions:
schedules:
snapshot:
cron: "0 2 * * *"
agent: config
instruction: "take snapshot"
trace_learner:
cron: "0 3 * * *"
agent: config
instruction: "run trace learner"
audit_weekly:
cron: "0 6 * * 1"
agent: audit
instruction: "generate weekly compliance report"
Apply all:
Platform Config (.olav/config/)¶
Platform-level config (not skill-specific):
| File | Purpose |
|---|---|
api.json |
LLM provider keys, model selection, timeouts |
services.yaml |
Registered API services (endpoints, auth, readonly flags) |
approval_rules.yaml |
HITL approval rules for dangerous operations |
api.json.example |
Template for new installations |
Never commit api.json
Contains LLM API keys and service credentials. Already in .gitignore.
Skill Structure — How Agents Are Registered¶
Workspace Directory¶
Each agent lives in .olav/workspace/<name>/ with a standard structure:
.olav/workspace/netops/ ← Agent name
├── AGENT.md # Agent declaration (name, description)
├── SKILL.md # Tools, intents, static_context, metadata
├── MANIFEST.yaml # Route keywords, version, requirements
├── prompts/
│ └── system.md # System prompt (agent behavior)
├── tools/ # Python @tool files
├── config/ # Agent-specific configuration
├── references/ # Static context files (loaded by agent)
├── analyzer/ # Subagent (nested workspace) — default
├── simulator/ # Subagent
├── collector/ # Subagent
├── topology/ # Subagent
├── importer/ # Subagent
└── learner/ # Subagent
AGENT.md¶
Declares the agent for the platform. Minimal format:
---
name: netops
description: "Network operations — change planning, simulation, drift detection"
subagents:
- path: ./analyzer/SKILL.md
- path: ./simulator/SKILL.md
- path: ./collector/SKILL.md
- path: ./topology/SKILL.md
- path: ./importer/SKILL.md
- path: ./learner/SKILL.md
system_prompt_file: prompts/system.md
---
SKILL.md¶
Declares tools, metadata, and static context:
---
name: analyzer
description: "Change-plan drafter"
metadata:
version: 1.1.0
type: agent
network_isolation: "true"
tools:
- execute_sql
static_context:
- path: ./references/ROUTING_EXPERT_GUIDE.md
---
tools:— List of tool names. Must match.pyfiles intools/.static_context:— Files loaded into the agent's context at startup.metadata.network_isolation— "true" for compute-only agents.
MANIFEST.yaml¶
Used by olav agent install for routing and dependency checks:
kind: Agent
name: netops
version: "0.24.1"
description: "Operations Agent"
route_keywords:
- troubleshoot
- bgp
- ospf
requires:
- olav>=0.24
PLATFORM.md¶
The platform agent registry. Located at .olav/workspace/PLATFORM.md:
active:— Default agent when no--agentflag is used.agents:— List of registered agents.olav agent installadds to this list automatically.olav listreads this file.
Installing a Skill (olav-netops)¶
# From local directory
olav agent install /path/to/olav-netops/
# From Git URL
olav agent install https://github.com/james-olavai/olav-netops
The skill's workspace.yaml declares where workspace files live:
name: netops
version: "0.24.1"
source: .olav/workspace/netops # copy from this subdirectory
requires:
packages:
- nornir>=3.3.0
- nornir-netmiko>=1.0.0
After install:
1. Workspace files copied to .olav/workspace/netops/
2. Agent registered in PLATFORM.md
3. Missing packages reported as warnings
Post-Install Setup¶
# 1. Copy config templates
cp .olav/workspace/netops/collector/config/nornir/hosts.yaml.example \
.olav/workspace/netops/collector/config/nornir/hosts.yaml
# Edit with your device inventory
# 2. Initialize netops
olav --agent netops "/netops_init --dry-run" # verify environment
olav --agent netops "/netops_init" # collect device data
Registering an API Service¶
This:
1. Adds service to .olav/config/services.yaml
2. Parses OpenAPI schema
3. Generates reference markdowns in infra/references/
4. Service is immediately queryable via api_request
services.yaml format¶
services:
netbox:
endpoint: http://netbox:8000
auth:
type: bearer
token_env: NETBOX_TOKEN # reads from environment variable
readonly_only: true # default: no writes allowed
reference_generation:
groups:
- tag: dcim
- tag: ipam
output_dir: .olav/workspace/infra/references
readonly_only: true— Service is read-only. Write attempts are blocked.token_env— Environment variable name (not the actual token).reference_generation— Controls which API groups get reference docs.